|
Programmieren
Visual Basic 5.0
Christian Zahler
LEHRGANG
christian.zahler@telecom.at
5 Dateizugriff
Hier unterscheidet man drei Möglichkeiten:
l Sequentieller Zugriff: geht von der Annahme aus, daß es sich um reine Textdateien handelt, bei dem jedes Byte der Datei einem ANSI-Zeichen entspricht. Natürlich können so auch Datensätze gespeichert und gelesen werden.
l Wahlfreier (direkter) Zugriff: geht von der Annahme aus, daß in einer Datei Datensätze fester Länge gespeichert sind. Anwendung bei Erstellung kleiner Datenbanken. Die Bezeichnung wahlfrei" ist eigentlich nicht ganz korrekt, da es sich in Wirklichkeit um einen relativen Zugriff handelt. Die Datensatznummer wird aufgrund der (fixen) Länge ermittelt (wenn ein Datensatz etwa 80 Zeichen lang ist, dann muss der dritte Datensatz an der Position 161 beginnen!).
l Binärer Zugriff: Die Datei besteht lediglich aus einer Folge beliebiger Zeichen. Es gibt dabei keine Ordnung mehr und damit auch keine Regeln. Bei solchen Dateien kann es sich um Textdateien, Datensätze oder Programme handeln.
Da meist bei Datenbanken der wahlfreie Zugriff angewandt wird, möchte ich diesen etwas genauer besprechen.
Vorgangsweise:
1. Festlegen eines "Records als Datensatztyp:
Type Kundentyp
Nachname As String * 20
Vorname As String * 20
Titel As String * 10
End Type
Wichtig: Die Länge der Einzelstrings muss angegeben werden!
2. Definition einer Record-Variablen
Public Kunde As Kundentyp
3. Festlegen der Datei
Dim Dateiname As String
Dim FileHandle As Integer
Zunächst muss eine interne Nummer festgelegt werden, über die die Datei angesprochen werden kann, ein so genannter File Handle. (Anmerkung: Die Anzahl maximaler File Handles wird in DOS durch die Anweisung files=XX in der Datei config.sys begrenzt.)
Die nächste freie Dateinummer ermittelt man durch
FileHandle = FreeFile
Dann legt man einen Dateinamen fest:
Dateiname = "C:\DATEN.TXT"
Das Öffnen der nun festgelegten Datei zum wahlfreien Zugriff geschieht mit dem Befehl:
Open Dateiname For Random Access Read As FileHandle Len=Len(Kunde)
Die Länge eines einzelnen Datensatzes muss bereits beim Öffnen festgelegt werden.
Dann stehen für das Lesen und Schreiben folgende Befehle zur Verfügung:
Get FileHandle, nr%, Person
liest einen kompletten Datensatz. nr% gibt die Nummer des Datensatzes an. Wird nr% nicht angegeben, so wird der nächste Datensatz gelesen.
Put FileHandle, nr%, Person
schreibt einen kompletten Datensatz in die Datei. nr% gibt die Nummer des Datensatzes an. Wird nr% nicht angegeben, so wird der nächste Datensatz geschrieben.
Beispiel 5: Adreßdatenbank (B05)
ADRESS.VBP
Diese Datei gibt an, aus welchen Dateien das Projekt zusammengesetzt ist. (Diese Datei "erstellt sich selbst, sie muss nicht extra codiert werden!)
Rahmen2Man erkennt die Form ARBEITSO.FRM sowie ein Modul KUNDMOD1.BAS.
KUNDMOD1.BAS
Type person
nname As String * 30
Vorname As String * 30
Strasse As String * 30
PLZ As String * 30
Ort As String * 30
TelNr As String * 30
End Type
Public Kunde As person
Es erweist sich als günstig, die Typdefinition für die Recordvariable sowie die Deklaration der Recordvariable in einem Modul durchzuführen, da alle Formen auf dieses Modul zugreifen können.
ARBEITSO.FRM (frm_Datenbank)
Diese Form ist die Hauptform des Projekts.
General Declarations":
Dim Dateiname As String
Globale Variablen für ARBEITSO.FRM
Dim filehandle As Integer
Nummer des DOS-File Handles
Dim mox
Anzahl vorhandener Datensätze
Dim Aktuell As Integer
Nummer des aktuellen Datensatzes
Private Sub Ausgeben()
Txt_Nachname.Text = Kunde.nname
Txt_Strasse = Kunde.Strasse
Txt_Postleitzahl.Text = Kunde.PLZ
Txt_Wohnort.Text = Kunde.Ort
Txt_Telefonnummer.Text = Kunde.TelNr
End Sub
Private Sub Einlesen()
Kunde.nname = Txt_Nachname.Text
Kunde.Strasse = Txt_Strasse.Text
Kunde.PLZ = Txt_Postleitzahl.Text
Kunde.Ort = Txt_Wohnort.Text
Kunde.TelNr = Txt_Telefonnummer.Text
End Sub
Private Sub DatNumBerechnen()
Berechnet die Anzahl der bereits
gespeicherten Datensätze
mox = LOF(filehandle) / Len(Kunde)
End Sub
Private Sub Form_Load()
Msg = "In diesem Programm wird mit einer"
Msg = Msg & "Datei mit dem Namen "
Msg = Msg & "DATEN.TXT gearbeitet. Öffnen"
Msg = Msg & "Sie die Datei mit "
Msg = Msg & "dem folgenden Eingabefeld."
MsgBox Msg, 64, "Information"
Dialogfeld.Action = 1
Dateiname = Dialogfeld.filename
Hier wird überprüft, ob schon Datensätze
|
|
gespeichert sind. Wenn ja, so wird der
1. Datensatz gleich angezeigt.
Wenn nein, so wird eine entsprechende
Meldung ausgegeben und
die leere Maske angezeigt.
filehandle = FreeFile
Open Dateiname For Random As filehandle _
Len = Len(Kunde)
DatNumBerechnen
Aktuell = 1
If mox = 0 Then
MsgBox "Noch keine Datensätze angelegt."
Else
Seek filehandle, Aktuell
Get filehandle, , Kunde
Ausgeben
End If
Close filehandle
End Sub
Private Sub cmd_aenderung_speichern_Click()
filehandle = FreeFile
If Txt_Nachname.Text <> " And _
Val(Txt_Nachname) = 0 Then
Open Dateiname For Random _
As filehandle Len = Len(Kunde)
DatNumBerechnen
Einlesen
Seek filehandle, Aktuell
Put filehandle, Aktuell, Kunde
Close filehandle
End If
End Sub
Private Sub Cmd_Beenden_Click()
Unload Frm_Datenbank
End Sub
Private Sub cmd_Naechste_Click()
filehandle = FreeFile
Open Dateiname For Random As filehandle _
Len = Len(Kunde)
DatNumBerechnen
If mox = 0 Then
MsgBox "Noch keine Datensätze angelegt."
Else
If Aktuell < mox Then
Aktuell = Aktuell + 1
Seek filehandle, Aktuell
Get filehandle, Aktuell, Kunde
Ausgeben
Else
Msg = "Kein weiterer Datensatz "
Msg = Msg & "vorhanden!"
MsgBox Msg, 64, "Information"
End If
End If
Close filehandle
End Sub
Private Sub cmd_Neue_Adresse_Click()
Open Dateiname For Random Access Write _
As filehandle Len = Len(Kunde)
DatNumBerechnen
Aktuell = Val(mox) + 1
Einlesen
Seek filehandle, Aktuell
Springt zur letzten Position + 1
Put filehandle, , Kunde
Speicherung
Close filehandle
Leeren der Bildschirmmaske
Txt_Nachname = "
Txt_Strasse = ""
Txt_Wohnort = ""
Txt_Postleitzahl = ""
Txt_Telefonnummer = ""
End Sub
Private Sub cmd_Suchen_Click()
sucht nach bereits vorhandenem Datensatz
Dim eingabe As String * 30
filehandle = FreeFile
Msg = "Bitte geben Sie den Nachnamen ein:"
eingabe = InputBox(Msg)
If eingabe <> "" And Val(eingabe) = 0 Then
Open Dateiname For Random Access Read _
As filehandle Len = Len(Kunde)
DatNumBerechnen
For i = mox To 1 Step -1
Seek filehandle, i
Get filehandle, , Kunde
If Kunde.nname = eingabe Then
Aktuell = i
Ausgeben
End If If Kunde.nname ...
Next i
Close filehandle
If Txt_Nachname.Text <> eingabe Then
Msg = "Es wurde kein Datensatz unter "
Msg = Msg & "diesem Namen gefunden!"
MsgBox Msg, , "Achtung!"
End If If Txt_Nachname.Text ...
End If
End Sub
Private Sub cmd_vorherige_Click()
filehandle = FreeFile
Open Dateiname For Random As filehandle _
Len = Len(Kunde)
DatNumBerechnen
If mox = 0 Then
MsgBox "Noch keine Datensätze angelegt."
Else
If Aktuell > 1 Then
Aktuell = Aktuell - 1
Seek filehandle, Aktuell
Get filehandle, Aktuell, Kunde
Ausgeben
Else
Msg = "Der Dateianfang wurde & _
erreicht!"
MsgBox Msg, 64, "Information"
End If
End If
Close filehandle
End Sub
Vorschläge zum Weitermachen
Dieses Programm eignet sich optimal zum Erweitern!
l Überlegen Sie, wie man einen Datensatz löschen könnte! (Hinweis: Man kann Datensätze aus einer Datei lesen und in eine andere Datei schreiben. Dabei könnte man ja auf einen Datensatz "vergessen" ...)
l Erstellen Sie aus diesem Programm eine Lagerverwaltung, eine CD-Verwaltung, ein Bibliotheksprogramm ...
Rahmen1 (2) Rahmen4 Rahmen4 (2) Rahmen4 (3)
|