|
Karel típek
Office
CD-Verzeichnisse archivieren
BUCH
106076.701@compuserve.com
MS Access 97
CD-Verzeichnisse archivieren
Daten im MS-Access 97 speichern und abfragen
Karel típek prg/cdarc.mdb
Verwendung
Das Programm ermöglicht das Einlesen von Verzeichnissen mehrerer CDs in eine Tabelle. Die gespeicherten Daten können nach verschiedenen Kriterien gesucht und angezeigt werden. So kann schnell festgestellt werden, auf welcher CD sich eine bestimmte Datei befindet, ohne dass mehrere CDs durchgesucht werden müssen.
Datenanalyse
Für jede Datei werden folgende Angaben gespeichert:
l Titel der CD
l Der komplette Pfad
l Name der Datei
l Erweiterung
l Eigendefinierte Notiz
l Alle oben genannten Attribute außer dem Pfad können auch als Suchkriterien auftreten.
Damit der CD-Titel nicht in jedem Datensatz gespeichert wird (unnötiger Speicherbedarf), werden die Titel in der Tabelle tblCD gespeichert. Diese steht mit der Dateien-Tabelle tblDatei in einer Beziehung 1:N, die Verknüpfung erfolgt durch den Schlüssel lCD.
Die gesamte Datenstruktur können Sie dem folgenden Bild entnehmen. Die Präfixe bei den Feldnamen bezeichnen die Datentypen. (Mehr über Datenanalyse und Namenskonventionen z.B. in PCNEWS-53, Seite 85 - Kartei im MS-Access).
Programmentwurf
Das Programm besteht aus einem einzigen Formular frmHaupt, das im unteren Teil das Unterformular fsubDatei für die Anzeige der detaillierten Datei-Informationen enthält.
Im oberen Teil rechts kann die logische Bezeichnung des CD Laufwerks eingegeben werden. Mit der Schaltfläche CD einlesen wird der Titel der CD abgefragt und das gesamte Verzeichnis in die Tabelle gefüllt.
Im mittleren Teil des Formulars können die Abfragekriterien eingegeben werden. Die CD kann in einem Kombobox ausgewählt werden, bei der Auswahl des Dateinamen, Erweiterung, bzw. Notiz können die Zeichen ? und * wie üblich verwendet werden. Wenn in einem Auswahlfeld nichts eingegeben wird, wird das jeweilige Kriterium als alle interpretiert.
Die Suche wird mit der Schaltfläche Suchen gestartet. Mit Kriterien entfernen werden alle Kriterien gelöscht und alle gespeicherten Datensätze angezeigt.
Im Unterformular können alle Datensätze geändert, gelöscht (oder auch neue eingegeben) werden. Zu jeder Datei kann auch eine eigene Notiz hinzugefügt werden.
Realisierung
Der gesamte Programmcode ist im Klassenmodul des Hauptformulars gespeichert.
CD einlesen
Die Ereignisprozedur der Schaltfläche CD einlesen ermöglicht zuerst die Eingabe des CD-Titels in einem standardmäßigen Dialogfenster und testet anschließend, ob das Laufwerk bereit ist. Wenn ein Fehler auftritt, kann nach Abfrage der Vorgang wiederholt werden.
Private Sub cmdEinlesen_Click()
...
On Error GoTo err_einlesen
cdtitel = _
InputBox(Titel der eingelesenen CD, _
Neue CD)
If cdtitel = Then Exit Sub
Test, ob Laufwerk bereit
startpfad = Dir$(Me!txtlaufwerk & :\*.*)
...
err_einlesen:
If Err.Number = 76 Then
If MsgBox _
(Das CD-Laufwerk ist nicht bereit, _ vbRetryCancel) = vbRetry Then
Resume
End If
...
Der CD-Titel wird in als ein neuer Datensatz in die Tabelle tblCD geschrieben und der neue Wert des Schlüsselfelds wird in der privaten Variablen cdkey gespeichert. Dieser Schlüssel muss nämlich später in alle neu angelegten Datensätze der Tabelle tblDatei geschrieben werden.
Set db = CurrentDb
Set rec = db.OpenRecordset(tblCD)
rec.AddNew
rec!sCDTitel = cdtitel
rec.Update
rec.MoveLast
cdkey = rec!lCD
rec.Close
Das Einlesen der gesamten Verzeichnisstruktur ist ein rekursiver Vorgang,
der in PCNEWS51, Seite 102 - Verzeichnisstruktur im EXCEL-VBA bearbeiten
ausführlich beschrieben wurde.
Zuerst wird die Tabelle tblDatei geöffnet
und die Funktion LesePfad() mit dem Hauptverzeichnis als Parameter aufgerufen.
Set recDatei = db.OpenRecordset(tblDatei)
startpfad = Me!txtlaufwerk & :\
LesePfad (startpfad)
Die Funktion Dir$() bildet den Kern der Funktion LesePfad(). Dir$() kann nicht rekursiv aufgerufen werden, deswegen müssen zuerst alle Einträge eines Unterverzeichnisses im Array datfeld gespeichert werden.
|
|
Wenn das Element des Arrays datfeld ein Verzeichnis darstellt, wird die Funktion rekursiv aufgerufen, wenn es sich um eine Datei handelt, wird ein neuer Satz in der Tabelle tblDatei erstellt. Der Dateiname und die Erweiterung werden in getrennte Felder gespeichert.
Private Sub LesePfad(startpfad$)
.....
ReDim datfeld(0)
dateiname = Dir$(startpfad & *.*, vbDirectory)
Do While dateiname
Aktuelles und
übergeordnetes Verzeichnis ignorieren.
If dateiname <> . And _
dateiname <> .. Then
i = i + 1
ReDim Preserve datfeld(i)
datfeld(i) = dateiname
End If
dateiname = Dir
Loop
For i = 1 To UBound(datfeld)
dateiname = datfeld(i)
If (GetAttr(startpfad & dateiname) And _
vbDirectory) = vbDirectory Then
LesePfad (startpfad & dateiname & \)
Else
recDatei.AddNew
recDatei!lCD = cdkey
recDatei!sPfad = Mid$(startpfad, 3)
j = InStr(dateiname, .)
If j 0 Then
recDatei!sDatei = _
Left$(dateiname, j - 1)
recDatei!sErweiterung = _
Mid$(dateiname, j + 1)
Else
recDatei!sDatei = dateiname
End If
recDatei.Update
End If
Next i
End Sub
Dateien suchen
Das Unterformular fsubDatei, wo alle gefundenen Datensätze angezeigt werden, ist an die Abfrage qryDiskDatei gebunden. Diese Abfrage erfüllt zwei Aufgaben:
1. Zeigt zu jedem Datensatz der Tabelle tblDatei den zugehörigen CD-Titel an.
2. Selektiert die Daten je nach den eingegebenen Selektionskriterien.
Die Funktionalität einer Abfrage besteht eigentlich in der Interpretation eines SQL-Ausdrucks. SQL (Structured Query Language) ist eine Sprachdefinition, die in fast allen Datenbanksystemen implementiert ist.
Der SQL Ausdruck in unserer Abfrage enthält folgende Teile:
l Definition der selektierten Felder
SELECT tblCD.lCD, tblCD.sCDTitel, tblDatei.sPfad, tblDatei.sDatei, tblDatei.sErweiterung, tblDatei.sNotiz
l Verbindung der Tabellen durch den CD-Schlüssel lCD
FROM tblCD LEFT JOIN tblDatei ON tblCD.lCD = tblDatei.lCD
l Selektieren der Daten, die den eingegebenen Kriterien entsprechen. Ein leeres Formularfeld hat den Wert Null, die entsprechende Bedingung ist dann für alle Inhalte des Tabellenfelds erfüllt.
WHERE
((tblCD.lCD=forms!frmHaupt!cboCDTitel)
OR forms!frmHaupt!cboCDTitel is null) _
AND ((tblDatei.sDatei like _ forms!frmHaupt!txtDatei)
OR forms!frmHaupt!txtDatei is null) _
AND ((tblDatei.sErweiterung like _ forms!frmHaupt!txtErweiterung) _
OR forms!frmHaupt!txtErweiterung is null) _
AND ((tblDatei.sNotiz like _ forms!frmHaupt!txtNotiz) _
OR forms!frmHaupt!txtNotiz is null);
Nach dem Aktivieren der Schaltfläche Suchen wird das Unterformular aktualisiert.
Private Sub cmdSuchen_Click()
Me!subDatei.Requery
End Sub
Die Ereignis-Prozedur der Schaltfläche Kriterien entfernen löscht zuerst die Inhalte aller Abfragefelder und aktualisiert dann das Unterformular.
Private Sub cmdInit_Click()
Me!cboCDTitel = Null
Me!txtDatei = Null
Me!txtErweiterung = Null
Me!txtNotiz = Null
Me!subDatei.Requery
End Sub
Weiterführende Literatur
Die Technik der Arbeit mit den Daten im MS-Access und eine Übersicht des Visual Basics for Applications findet man im unten abgebildeten Buch.
Das Buch beschäftigt sich nicht nur mit MS-Access, sondern geht auch komplexere Probleme an. Alle im Office97-Paket integrierten Anwendungen (Access, Word, Excel, PowerPoint, Outlook) werden aus der Sicht des gegenseitigen Datenaustausches behandelt. Sehr brauchbar finde ich auch die Kapitel über die Windows95-Registrierung, Win32API-Funktionen und Entwicklung einer Hilfe.
|