|
Das nachfolgende Visual Basic Beispiel demonstriert die Verwendung der von FATS bereitgestellten  Index-Befehle:
"C" Create Indexfile (Indexdatei definieren, erstellen und öffnen.) | |
"B" Build Record ((Haupt)-Schlüssel über den Cachepuffer in die Indexdatei einfügen und Datensatznummer besetzen.) | |
"W" Write Page Map (Zurückschreiben im Cache befindlicher Daten.) | |
"I" Insert Record ((Haupt)-Schlüssel in Indexdatei einfügen und Datensatznummer besetzen.) | |
"D" Delete Record ((Haupt)-Schlüssel aus Indexdatei löschen und Datensatznummer freigeben.) | |
"R" Replace Single Key (Ersetzt einen Schlüssel durch einen neuen Schlüsselwert.) | |
"G" Search Generic (Suchen eines Datensatzes über einen unvollständig angegebenen Schlüssel.) | |
"F" Search First (Suchen des ersten Schlüssels.) | |
"L" Search Last (Suchen des letzten Schlüssels.) | |
"A" Search Next After (Suchen des auf den angegebenen Schlüssel folgenden Schlüssels.) | |
"E" Search Previous Before (Suchen des dem angegebenen Schlüssel vorangehenden Schlüssels.) |
VERSION 4.00 Begin VB.Form Kundenstamm Appearance = 0 'Flat BackColor = &H80000005& BorderStyle = 1 'Fixed Single Caption = "Fats-Testprogramm" ClientHeight = 4308 ClientLeft = 1632 ClientTop = 1920 ClientWidth = 5376 BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "MS Sans Serif" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 4680 Left = 1584 LinkTopic = "KunStamm" ScaleHeight = 4308 ScaleWidth = 5376 Top = 1596 Width = 5472 Begin VB.ListBox Liste Appearance = 0 'Flat BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 240 Left = 120 TabIndex = 26 Top = 1440 Visible = 0 'False Width = 5172 End Begin VB.OptionButton Option3 Appearance = 0 'Flat BackColor = &H80000005& Caption = "Plz/Ort" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 375 Left = 2760 TabIndex = 25 Top = 960 Visible = 0 'False Width = 1215 End Begin VB.OptionButton Option2 Appearance = 0 'Flat BackColor = &H80000005& Caption = "Branche" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 372 Left = 1440 TabIndex = 24 Top = 960 Visible = 0 'False Width = 1332 End Begin VB.OptionButton Option1 Appearance = 0 'Flat BackColor = &H80000005& Caption = "Name" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 375 Left = 120 TabIndex = 23 Top = 960 Visible = 0 'False Width = 1215 End Begin VB.CommandButton Listen Appearance = 0 'Flat Caption = "Listen" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 3240 TabIndex = 21 Top = 0 Width = 1060 End Begin VB.CommandButton SatzLoeschen Appearance = 0 'Flat Caption = "Löschen" Enabled = 0 'False BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 2160 TabIndex = 20 Top = 0 Width = 1060 End Begin VB.CommandButton SatzSichern Appearance = 0 'Flat Caption = "Sichern" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 1080 TabIndex = 19 Top = 0 Width = 1060 End Begin VB.CommandButton SatzNeu Appearance = 0 'Flat Caption = "Neu" Enabled = 0 'False BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 0 TabIndex = 18 Top = 0 Width = 1065 End Begin VB.CommandButton SatzLetzter Appearance = 0 'Flat Caption = "Letzter" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 4320 TabIndex = 17 Top = 370 Width = 1060 End Begin VB.CommandButton SatzNaechster Appearance = 0 'Flat Caption = ">>" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 3240 TabIndex = 16 Top = 370 Width = 1060 End Begin VB.CommandButton SatzSuchen Appearance = 0 'Flat Caption = "Suchen" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 2160 TabIndex = 15 Top = 370 Width = 1060 End Begin VB.CommandButton SatzVoriger Appearance = 0 'Flat Caption = "<<" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 1080 TabIndex = 14 Top = 370 Width = 1060 End Begin VB.CommandButton SatzErster Appearance = 0 'Flat Caption = "Erster" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 0 TabIndex = 13 Top = 370 Width = 1060 End Begin VB.CommandButton Create Appearance = 0 'Flat Caption = "Create" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 8.4 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 4320 TabIndex = 12 Top = 0 Width = 1060 End Begin VB.TextBox Ort Appearance = 0 'Flat BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 324 Left = 2280 MaxLength = 20 TabIndex = 11 Top = 3240 Width = 2655 End Begin VB.TextBox PLZ Appearance = 0 'Flat BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 324 Left = 1440 MaxLength = 5 TabIndex = 10 Top = 3240 Width = 735 End Begin VB.TextBox Strasse Appearance = 0 'Flat BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 324 Left = 1440 MaxLength = 25 TabIndex = 9 Top = 2880 Width = 3495 End Begin VB.TextBox Branche Appearance = 0 'Flat BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 324 Left = 1440 MaxLength = 25 TabIndex = 8 Top = 2520 Width = 3495 End Begin VB.TextBox KName Appearance = 0 'Flat BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 324 Left = 1440 MaxLength = 25 TabIndex = 7 Top = 2160 Width = 3495 End Begin VB.TextBox Anrede Appearance = 0 'Flat BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 324 Left = 1440 MaxLength = 5 TabIndex = 6 Top = 1800 Width = 735 End Begin VB.Label Status Appearance = 0 'Flat BackColor = &H80000005& BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 255 Left = 120 TabIndex = 22 Top = 3960 Width = 5175 End Begin VB.Label txtPLZOrt Appearance = 0 'Flat BackColor = &H80000005& Caption = "Plz/Ort" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 255 Left = 120 TabIndex = 5 Top = 3240 Width = 1215 End Begin VB.Label txtStrasse Appearance = 0 'Flat BackColor = &H80000005& Caption = "Straße" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 255 Left = 120 TabIndex = 4 Top = 2880 Width = 1215 End Begin VB.Label txtBranche Appearance = 0 'Flat BackColor = &H80000005& Caption = "Branche" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 255 Left = 120 TabIndex = 3 Top = 2520 Width = 1215 End Begin VB.Label txtName Appearance = 0 'Flat BackColor = &H80000005& Caption = "Name" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 255 Left = 120 TabIndex = 2 Top = 2160 Width = 1215 End Begin VB.Label txtAnrede Appearance = 0 'Flat BackColor = &H80000005& Caption = "Anrede" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 9.6 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H80000008& Height = 255 Left = 120 TabIndex = 1 Top = 1800 Width = 1215 End Begin VB.Label Ueberschrift Alignment = 2 'Center Appearance = 0 'Flat BackColor = &H80000005& Caption = "Kundenstamm" BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851} Name = "Courier New" Size = 12 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H00800000& Height = 375 Left = 1080 TabIndex = 0 Top = 960 Width = 3255 End End Attribute VB_Name = "Kundenstamm" Attribute VB_Creatable = False Attribute VB_Exposed = False Option Explicit Dim kunden As kdat Dim dwCurrentRecno As Long Dim nListmode As Integer Private Sub Create_Click() Dim szDemoFile As String Dim szIndexFile As String Dim szCmnd As String Dim szMsg As String If MsgBox("Wollen Sie die Datei wirklich neu aufbauen ?", 4) <> 6 Then Exit Sub szDemoFile = App.Path + "\..\..\..\DEMODATA\" + "KUNDEN.ANS" szIndexFile = App.Path + "\" + "KUNDEN.KEY" If Dir$(szDemoFile) = "" Then szMsg = "Datei " + szDemoFile + " nicht gefunden" MsgBox (szMsg) Exit Sub End If ' "C" Create Indexfile ' ' Mit diesem Befehl erstellen Sie eine Indexdatei, wobei eine ' eventuell bereits vorhandene Datei mit demselben Dateinamen ' gelöscht wird. ' Die Indexdatei wird dabei gleichzeitig mit den über den ' Befehl Auto Refresh (Y) definierten Öffnungsflags geöffnet ' und der Dateinummer "FileNo" zugewiesen. Diese Nummer muß bei ' allen nachfolgenden FATS-Befehlen angegeben werden, um mit ' der Indexdatei zu arbeiten. ' ' Maximal 200 Schlüssel pro Datensatz können in einer Indexdatei ' verwaltet werden, wobei die maximale Schlüssellänge 240 Zeichen ' beträgt. ' ' Beachten Sie bei der Dateipfadangabe, daß der Backslash (\) von ' FATS als Trennzeichen behandelt wird und daher im Pfad durch ' einen normalen Schrägstrich ersetzt werden sollte. ' Alternativ dazu können Sie auch das Trennzeichen umdefinieren, ' indem Sie dieses als erstes Zeichen im Befehlsstring angeben, ' z.B. szCmnd = "&C&C:\ARTIKEL.KEY&1&1&A&1" (das Trennzeichen muß ' ein ASCII-Zeichen kleiner als 48 sein). ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "C\{Filename}\{KeyLength}\{KeyCount}\{KeyType}\{FileNo}" ' ' FileName Name der Datei, eventuell mit Pfadangabe ' (z.B. C:/DATEN/ARTIKEL.KEY oder ARTIKEL.KEY) ' ' KeyLength Maximale Länge der Schlüssel ' ' KeyCount Anzahl Schlüssel (1-200) ' ' KeyType Art der Schlüssel (A=ASCII Textschlüssel, I=Integer) ' ' FileNo Nummer der Indexdatei (1-40) szCmnd = "&C&" + szIndexFile + "&25&3&A&1" Call FATSCall (szCmnd) Open szDemoFile For Random As #2 Len = 105 Dim szDemoData As String * 105 Dim nCounter As Integer For nCounter = 1 To 222 Get #2, nCounter, szDemoData LSet kunden.Loeschkennz$ = " " LSet kunden.Anrede$ = Mid(szDemoData, 1, 5) LSet kunden.Name$ = Mid(szDemoData, 6, 25) LSet kunden.Branche$ = Mid(szDemoData, 31, 25) LSet kunden.Strasse$ = Mid(szDemoData, 56, 25) LSet kunden.PLZ$ = Mid(szDemoData, 81, 5) LSet kunden.Ort$ = Mid(szDemoData, 86, 20) ' "B" Build Record ' ' Dieser Befehl entspricht dem Befehl Insert Record (I), ' die Daten werden jedoch nicht sofort nach dem Befehl auf ' die Platte geschrieben, sondern solange in den FATS ' internen Cachepuffern behalten, bis diese überlaufen. ' ' Da das Zurückschreiben veränderter Daten bei heutigen ' Festplatten einen Großteil der Verarbeitungszeit in ' Anspruch nimmt, wird das Einfügen von Schlüsseln mit ' diesem Befehl erheblich beschleunigt und eignet sich ' daher besonders zum Reorganisieren von Indexdateien. ' ' Beachten Sie jedoch, daß dieser Befehl im normalen ' Netzwerkbetrieb nicht erlaubt ist, da die Indexdatei ' einen undefinierten Zustand hat. Im Netzwerk sollten Sie ' die Datei daher mit exklusiven Zugriffsrechten öffnen, ' bevor Sie mit diesem Befehl arbeiten (siehe Auto Refresh "Y"). ' Das Zurückschreiben der Cachepuffer kann auch jederzeit ' durch den Befehl Write Page Map (W) oder durch das ' Schließen der Datei erreicht werden. Wenn die internen ' Cachepuffer überlaufen und FATS Daten auf die Platte ' schreiben muß, dann ist sichergestellt, daß dabei sämtliche ' relevanten Daten berücksichtigt werden, d.h. die Indexdatei ' konsistent bleibt. ' ' Mit Ausnahme dieses Befehles werden nach jedem FATS-Befehl ' sämtliche veränderten Daten auf die Platte geschrieben, wenn ' dies nicht ausdrücklich mit dem Befehl Auto Refresh (Y) ' abgeschaltet wurde. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "B\{FileNo}\{KeyStr1}[\{KeyStr2}[\{KeyStr3}]]" ' ' FileNo Nummer der Indexdatei ' ' KeyStr# Schlüssel szCmnd = "B\1\" + UCase$(RTrim$(kunden.Name$)) + "\" + UCase$(RTrim$(kunden.Branche$)) + "\" + kunden.PLZ$ + UCase$(RTrim$(kunden.Ort$)) Call FATSCall (szCmnd) If uFATSError <> 0 Then szMsg = "Fats-Fehler: " + Str$(uFATSError) MsgBox (szMsg) Exit For End If Kundenstamm.Status = Str$(dwFATSRecno) + " Datensätze" If (dwFATSRecno And 8) Then Kundenstamm.Status.Refresh Put #1, dwFATSRecno, kunden Next nCounter Close #2 ' "W" Write Page Map ' ' Wenn Sie den Datencache mit dem Befehl Auto Refresh (Y) ' aktiviert haben, dann werden eventuell noch im Cache- ' puffer befindliche Daten mit diesem Befehl auf die ' Platte geschrieben. ' ' Wenn der Datencache inaktiv ist, dann werden nach jedem ' FATS-Befehl, mit Ausnahme des Befehls Build Record (B), ' sämtliche veränderten Daten auf die Platte geschrieben. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "W\{FileNo}" ' ' FileNo Nummer der Indexdatei Call FATSCall ("W\1") Call SatzErster_Click End Sub Private Sub knoepfe() If dwCurrentRecno = 0 Then SatzNeu.Enabled = False SatzLoeschen.Enabled = False Else SatzNeu.Enabled = True SatzLoeschen.Enabled = True End If End Sub Private Sub Listen_Click() SatzNeu.Enabled = nListmode SatzSichern.Enabled = nListmode SatzLoeschen.Enabled = nListmode Create.Enabled = nListmode SatzErster.Enabled = nListmode SatzNaechster.Enabled = nListmode SatzSuchen.Enabled = nListmode SatzVoriger.Enabled = nListmode SatzLetzter.Enabled = nListmode Anrede.Enabled = nListmode KName.Enabled = nListmode Branche.Enabled = nListmode Strasse.Enabled = nListmode PLZ.Enabled = nListmode Ort.Enabled = nListmode Ueberschrift.Visible = nListmode If nListmode = False Then nListmode = True Liste.Height = 2370 dwCurrentRecno = 0 Else nListmode = False SatzErster_Click End If Option1.Visible = nListmode Option2.Visible = nListmode Option3.Visible = nListmode Liste.Visible = nListmode End Sub Private Sub Option1_Click() Dim szCmnd As String Liste.Clear Kundenstamm.Status = "Aufsteigend sortiert nach Name" ' "F" Search First ' ' Dieser Befehl gibt die Datensatznummer und den Schlüsselwert ' des kleinsten Schlüssels der angegebenen Schlüsselnummer ' zurück. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "F\{KeyNo}\{FileNo}" ' ' KeyNo Schlüsselnummer ' ' FileNo Nummer der Indexdatei szCmnd = "F\1\1" SCHLEIFE: Call FATSCall (szCmnd) If uFATSError <> 0 Then GoTo WEITER Liste.AddItem szFATSkey ' "A" Search Next After ' ' Dieser Befehl sucht den über "KeyString" und "RecNo" ' spezifizierten Schlüssel in der Indexdatei und blättert dann ' um eine Position weiter. ' Als Ergebnis wird der auf den angegebenen Schlüssel folgende ' Schlüssel zurückgegeben. Der Aufruf entspricht daher den ' Befehlen Search Generic (G) mit anschließendem Search Next (N). ' ' Im Gegensatz zum Befehl "Search Next" kann dieser Befehl auch ' problemlos im Netzwerk verwendet werden. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "A\{KeyNo}\{RecNo}\{FileNo}\{KeyString}" ' ' KeyNo Schlüsselnummer ' ' RecNo Datensatznummer ' ' FileNo Nummer der Indexdatei ' ' KeyString Schlüssel szCmnd = "A\1\" + Str$(dwFATSRecno) + "\1\" + szFATSkey GoTo SCHLEIFE WEITER: End Sub Private Sub Option2_Click() Dim szCmnd As String Liste.Clear Kundenstamm.Status = "Aufsteigend sortiert nach Branche" szCmnd = "F\2\1" SCHLEIFE2: Call FATSCall (szCmnd) If uFATSError <> 0 Then GoTo WEITER2 Get #1, dwFATSRecno, kunden Liste.AddItem kunden.Branche$ + kunden.Name$ szCmnd = "A\2\" + Str$(dwFATSRecno) + "\1\" + szFATSkey GoTo SCHLEIFE2 WEITER2: End Sub Private Sub Option3_Click() Dim szCmnd As String Liste.Clear Kundenstamm.Status = "Absteigend sortiert nach Plz/Ort" ' "L" Search Last ' ' Dieser Befehl gibt die Datensatznummer und den Schlüsselwert ' des größten Schlüssels der angegebenen Schlüsselnummer zurück. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "L\{KeyNo}\{FileNo}" ' ' KeyNo Schlüsselnummer ' ' FileNo Nummer der Indexdatei szCmnd = "L\3\1" SCHLEIFE3: Call FATSCall (szCmnd) If uFATSError <> 0 Then GoTo WEITER3 Get #1, dwFATSRecno, kunden Liste.AddItem kunden.PLZ$ + kunden.Ort$ + kunden.Name$ ' "E" Search Previous Before ' ' Dieser Befehl sucht den über "KeyString" und "RecNo" ' spezifizierten Schlüssel in der Indexdatei und blättert dann ' um eine Position zurück. ' Als Ergebnis wird der dem angegebenen Schlüssel vorangehende ' Schlüssel zurückgegeben. Der Aufruf entspricht daher den ' Befehlen "Search Generic" mit anschließendem "Search Prev". ' ' Im Gegensatz zum Befehl "Search Previous" kann dieser Befehl ' auch problemlos im Netzwerk verwendet werden. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "E\{KeyNo}\{RecNo}\{FileNo}\{KeyString}" ' ' KeyNo Schlüsselnummer ' ' RecNo Datensatznummer ' ' FileNo Nummer der Indexdatei ' ' KeyString Schlüssel szCmnd = "E\3\" + Str$(dwFATSRecno) + "\1\" + szFATSkey GoTo SCHLEIFE3 WEITER3: End Sub Private Function replacekey(keyold$, keynew$, keynr%) As Integer Dim szCmnd As String Dim szMsg As String If keyold$ <> keynew$ Then ' "R" Replace Single Key ' ' Dieser Befehl verändert den über die Satznummer "RecNo" ' und den Schlüsselwert "KeyStrOld" spezifizierten Schlüssel ' in den neuen Schlüsselwert "KeyStrNew" mit derselben ' Satznummer. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "R\{KeyNo}\{RecNo}\{FileNo}\{KeyStrOld}\{KeyStrNew}" ' ' KeyNo Schlüsselnummer ' ' RecNo Datensatznummer ' ' FileNo Nummer der Indexdatei ' ' KeyStrOld Alter Schlüsselwert ' ' KeyStrNew Neuer Schlüsselwert szCmnd = "R\" + Str$(keynr%) + "\" + Str$(dwCurrentRecno) + "\1\" + keyold$ + "\" + keynew$ Call FATSCall (szCmnd) If uFATSError <> 0 Then szMsg = "Fats-Fehler: " + Str$(uFATSError) + szCmnd MsgBox (szMsg) replacekey = 0 Exit Function End If End If replacekey = 1 End Function Private Sub SatzErster_Click() Call FATSCall ("F\1\1") If uFATSError = 0 Then SatzLaden Else SatzNeu_Click End If End Sub Private Sub SatzLaden() Get #1, dwFATSRecno, kunden dwCurrentRecno = dwFATSRecno Anrede.Text = RTrim$(kunden.Anrede) KName.Text = RTrim$(kunden.Name) Branche.Text = RTrim$(kunden.Branche) Kundenstamm.Strasse = RTrim$(kunden.Strasse) PLZ.Text = RTrim$(kunden.PLZ) Ort.Text = RTrim$(kunden.Ort) Kundenstamm.Status = "Datensatz: " + Str$(dwCurrentRecno) Call knoepfe End Sub Private Sub SatzLetzter_Click() Call FATSCall ("L\1\1") If uFATSError = 0 Then SatzLaden End Sub Private Sub SatzLoeschen_Click() Dim szCmnd As String Dim szMsg As String If dwCurrentRecno <> 0 Then ' "D" Delete Record ' ' Diesem Befehl wird die im "Create Indexfile"-Befehl ' angegebene Anzahl Schlüssel und die zugehörige Satznummer ' im Kommandostring übergeben. Die Schlüssel werden aus der ' Indexdatei entfernt und die Satznummer freigegeben. ' ' Die Satznummer wird von FATS in eine Liste der bereits ' gelöschten Daten-sätze aufgenommen, damit der Befehl ' Insert Record (I) diese eventuell wiederverwenden kann, ' bevor die Datendatei erweitert werden muß. Diese Liste ' wird nach dem Prinzip last-in, first-out verwaltet, d.h. ' der zuletzt gelöschte Satz wird als nächster wiederverwendet. ' ' Beachten Sie bitte, daß mit diesem Befehl nur Hauptschlüssel ' gelöscht werden können. Nebenschlüssel, die mit dem Befehl ' Insert Single Key (1) erstellt wurden, sollten zuvor mit dem ' Befehl Delete Single Key (2) entfernt werden. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "D\{RecNo}\{DelFlag}\{FileNo}\{KeyStr1}[\{KeyStr2}...]" ' ' RecNo Datensatznummer ' ' DelFlag Schalter (Y/N) ' Bei gesetztem Schalter ("Y") überprüft FATS ' das Vorhandensein aller übergebenen Schlüssel ' bevor diese gelöscht werden. Sollte einer der ' Schlüssel nicht in der Indexdatei präsent sein, ' wird keiner gelöscht. Durch diese Option braucht ' der Löschvorgang etwas mehr Zeit. ' ' FileNo Nummer der Indexdatei ' ' KeyStr# Schlüssel szCmnd = "D\" + Str$(dwCurrentRecno) + "\Y\1\" + UCase$(RTrim$(kunden.Name$)) + "\" + UCase$(RTrim$(kunden.Branche$)) + "\" + kunden.PLZ$ + UCase$(RTrim$(kunden.Ort$)) Call FATSCall (szCmnd) If uFATSError <> 0 Then szMsg = "Fats-Fehler: " + Str$(uFATSError) MsgBox (szMsg) Exit Sub End If kunden.Loeschkennz = "D" Put #1, dwFATSRecno, kunden Call SatzNeu_Click End If End Sub Private Sub SatzNaechster_Click() ' "A" Search Next After ' ' Dieser Befehl sucht den über "KeyString" und "RecNo" ' spezifizierten Schlüssel in der Indexdatei und blättert dann ' um eine Position weiter. ' Als Ergebnis wird der auf den angegebenen Schlüssel folgende ' Schlüssel zurückgegeben. Der Aufruf entspricht daher den ' Befehlen Search Generic (G) mit anschließendem Search Next (N). ' ' Im Gegensatz zum Befehl "Search Next" kann dieser Befehl auch ' problemlos im Netzwerk verwendet werden. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "A\{KeyNo}\{RecNo}\{FileNo}\{KeyString}" ' ' KeyNo Schlüsselnummer ' ' RecNo Datensatznummer ' ' FileNo Nummer der Indexdatei ' ' KeyString Schlüssel Call FATSCall ("A\1\" + Str$(dwCurrentRecno) + "\1\" + UCase$(RTrim$(KName.Text))) If uFATSError = 0 Then SatzLaden End Sub Private Sub SatzNeu_Click() dwCurrentRecno = 0 Anrede.Text = "" KName.Text = "" Branche.Text = "" Kundenstamm.Strasse = "" PLZ.Text = "" Ort.Text = "" Kundenstamm.Status = "Neuanlage" Call knoepfe End Sub Private Sub SatzSichern_Click() Dim szCmnd As String Dim szStr1 As String Dim szStr2 As String Dim szMsg As String szStr2 = PLZ.Text If Len(szStr2) < 5 Then szStr2 = szStr2 + Space$(5 - Len(szStr2)) szStr2 = szStr2 + UCase$(RTrim$(Ort.Text)) If dwCurrentRecno = 0 Then ' "I" Insert Record ' ' Diesem Befehl wird die im "Create Indexfile"-Befehl ' angegebene Anzahl Schlüssel im Kommandostring übergeben. ' Die Schlüssel werden in die Indexdatei einsortiert und ' einer Satznummer zugeordnet, welche in der "RECNO" ' Variable an das Anwenderprogramm zurückgegeben wird. ' ' Anschließend sollte das aufrufende Programm den zugehörigen ' Datensatz entsprechend der zurückgegebenen Satznummer in ' die Datendatei speichern. ' ' Die Länge der übergebenen Schlüssel darf die beim ' "Create-Indexfile" angegebene Länge nicht überschreiten, ' kürzere Schlüssel werden mit dem ASCII-Zeichen 00h auf die ' maximale Schlüssellänge erweitert. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "I\{FileNo}\{KeyStr1}[\{KeyStr2}[\{KeyStr3}]]" ' ' FileNo Nummer der Indexdatei ' ' KeyStr# Schlüssel szCmnd = "I\1\" + UCase$(RTrim$(KName.Text)) + "\" + UCase$(RTrim$(Branche.Text)) + "\" + szStr2 Call FATSCall (szCmnd) If uFATSError <> 0 Then szMsg = "Fats-Fehler: " + Str$(uFATSError) + szCmnd MsgBox (szMsg) Exit Sub End If LSet kunden.Name = KName.Text LSet kunden.Branche = Branche.Text LSet kunden.PLZ = PLZ.Text LSet kunden.Ort = Ort.Text dwCurrentRecno = dwFATSRecno Else If replacekey(UCase$(RTrim$(kunden.Name)), UCase$(RTrim$(KName.Text)), 1) <> 0 Then LSet kunden.Name = KName.Text If replacekey(UCase$(RTrim$(kunden.Branche)), UCase$(RTrim$(Branche.Text)), 2) <> 0 Then LSet kunden.Branche = Branche.Text szStr1 = kunden.PLZ + UCase$(RTrim$(kunden.Ort)) If replacekey(szStr1, szStr2, 3) <> 0 Then LSet kunden.PLZ = PLZ.Text LSet kunden.Ort = Ort.Text End If End If LSet kunden.Loeschkennz = " " LSet kunden.Anrede = Anrede.Text LSet kunden.Strasse = Strasse.Text Put #1, dwCurrentRecno, kunden Kundenstamm.Status = "Datensatz: " + Str$(dwCurrentRecno) Call knoepfe End Sub Private Sub SatzSuchen_Click() ' "G" Search Generic ' ' Dieser Befehl dient wie der Befehl Search (S) dem Suchen ' eines Datensatzes über den angegebenen Schlüssel, wobei ' hier allerdings keine vollständige Angabe des Schlüssels ' erforderlich ist. ' Gesucht wird nach dem ersten Schlüssel, welcher mit den ' in "KeyString" übergebenen Zeichen beginnt. Lautet ' "KeyString" beispielsweise "WASCH", dann könnte der zurück- ' gegebene Schlüssel "WASCHEN" oder "WASCHMASCHINE" sein. ' ' Mit den Befehlen Search Next (N) bzw. Search Next After (A) ' können Sie die nächsten Datensätze ermitteln, wobei Sie die ' zurückgegebenen Schlüssel jeweils mit "KeyString" ' vergleichen müssen. ' ' Folgende Fehlercodes kann dieser Befehl zurückliefern: ' ' 0 Kein Fehler, die Satznummer des erster Schlüssels, ' der mit den in"KeyString" übergebenen Zeichen beginnt, ' steht in "RECNO". ' ' 12 Es gibt keinen Schlüssel, der mit der in "KeyString" ' übergebenen Zeichenkette beginnt, zurückgegeben wurde ' der nächst kleinere Schlüssel. ' ' 13 "KeyString" ist kleiner als alle vorhandenen Schlüssel, ' es wurde der erste (kleinste) Schlüssel zurückgegeben. ' ' 15 "KeyString" ist größer als alle vorhandenen Schlüssel, ' es wurde der letzte (größte) Schlüssel zurückgegeben. ' ' 16 Es wurden noch keine Schlüssel eingefügt. ' ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "G\{KeyNo}\{FileNo}\{KeyString}" ' ' KeyNo Schlüsselnummer ' ' FileNo Nummer der Indexdatei ' ' KeyString Gesuchter Schlüssel Call FATSCall ("G\1\1\" + UCase$(RTrim$(KName.Text))) If uFATSError = 0 Or (uFATSError > 11 And uFATSError < 15) Then SatzLaden End Sub Private Sub SatzVoriger_Click() ' "E" Search Previous Before ' ' Dieser Befehl sucht den über "KeyString" und "RecNo" ' spezifizierten Schlüssel in der Indexdatei und blättert dann ' um eine Position zurück. ' Als Ergebnis wird der dem angegebenen Schlüssel vorangehende ' Schlüssel zurückgegeben. Der Aufruf entspricht daher den ' Befehlen "Search Generic" mit anschließendem "Search Prev". ' ' Im Gegensatz zum Befehl "Search Previous" kann dieser Befehl ' auch problemlos im Netzwerk verwendet werden. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "E\{KeyNo}\{RecNo}\{FileNo}\{KeyString}" ' ' KeyNo Schlüsselnummer ' ' RecNo Datensatznummer ' ' FileNo Nummer der Indexdatei ' ' KeyString Schlüssel Call FATSCall ("E\1\" + Str$(dwCurrentRecno) + "\1\" + UCase$(RTrim$(KName.Text))) If uFATSError = 0 Then SatzLaden End Sub
© 2008 GCS Software, Udo Gertz