|
Mit den  FATS-Matchcode Befehlen läßt sich auf einfachste Weise ein Volltext-Index mit dem Inhalt der von Ihnen gewünschten Spalten bzw. Felder einer Datentabelle bzw. -datei erstellen. Dieser Index ermöglicht es FATS, jeden Datensatz durch Angabe beliebiger Begriffe in Sekundenbruchteilen zu finden. FATS stellt dem Anwendungsprogramm unmittelbar nach der Suche eine Liste aller gefundener Satznummern bzw. Primary-Keys zur Verfügung. Das nachfolgende Visual Basic Beispiel demonstriert die Verwendung der FATS Matchcode-Befehle:
Jedes Wort und jede Zahl wird in den Index aufgenommen, es wird eine "invertierte Liste" erstellt.
"MC" Create Matchcode File (Matchcode-Indexdatei definieren, erstellen und öffnen.) | |
"MB" Build Matchcode (Inhalte der Datenspalten in den Matchcode-Index einfügen.) | |
"O" Open Indexfile (Indexdatei öffnen.) | |
"MI" Insert Matchcode (Neuanlage bzw. Update eines Datensatzes im Matchcode Index.) | |
"MD" Delete Matchcode (Entfernt den Inhalt eines Datensatzes aus dem Matchcode-Index.) | |
"MS" Search in Matchcode (Matchcode-Suchabfrage durchführen.) | |
"MF" Get First Result (Ermitteln des ersten Treffers in der Ergebnistabelle einer Matchcodesuche.) | |
"ML" Get Last Result (Ermitteln des letzten Treffers in der Ergebnistabelle einer Matchcodesuche.) | |
"MN" Get Next Result (Ermitteln des nächsten Treffers in der Ergebnistabelle einer Matchcodesuche.) | |
"MA" Get Next Result After (Ermitteln des auf den angegebenen Treffer folgenden Treffers in der Ergebnistabelle einer Matchcodesuche.) | |
"ME" Get Previous Result Before (Ermitteln des dem angegegebenen Treffers vorangehenden Treffers in der Ergebnistabelle einer Matchcodesuche.) |
VERSION 2.00 Begin Form Kundenstamm BorderStyle = 2 Caption = "FATS-Testprogramm" FontBold = -1 'True FontItalic = 0 'False FontName = "MS Sans Serif" FontSize = 9,6 FontStrikethru = 0 'False FontUnderline = 0 'False Height = 5664 Left = 1584 LinkTopic = "KunStamm" ScaleHeight = 5292 ScaleWidth = 5400 Top = 1596 Width = 5496 Begin OptionButton txtSuchenStatus Caption = "Suche nach Primary Key:" Height = 204 Left = 0 TabIndex = 30 Top = 380 Width = 5412 Visible = 0 'False End Begin CommandButton Listen Caption = "Listen" Height = 375 Left = 3240 TabIndex = 29 Top = 0 Width = 1095 End Begin CommandButton SatzLoeschen Caption = "Löschen" Enabled = 0 'False Height = 375 Left = 2160 TabIndex = 28 Top = 0 Width = 1095 End Begin CommandButton SatzSichern Caption = "Sichern" Height = 375 Left = 1080 TabIndex = 27 Top = 0 Width = 1095 End Begin CommandButton SatzNeu Caption = "Neu" Enabled = 0 'False Height = 375 Left = 0 TabIndex = 26 Top = 0 Width = 1095 End Begin CommandButton SatzLetzter Caption = "Letzter" Height = 375 Left = 4320 TabIndex = 25 Top = 600 Width = 1095 End Begin CommandButton SatzNaechster Caption = ">>" Height = 375 Left = 3240 TabIndex = 24 Top = 600 Width = 1095 End Begin CommandButton SatzSuchen Caption = "&Suchen" Height = 375 Left = 2160 TabIndex = 23 Top = 600 Width = 1095 End Begin CommandButton SatzVoriger Caption = "<<" Height = 375 Left = 1080 TabIndex = 22 Top = 600 Width = 1095 End Begin CommandButton SatzErster Caption = "Erster" Height = 375 Left = 0 TabIndex = 21 Top = 600 Width = 1095 End Begin CommandButton CreateMatchcode Caption = "Create" Height = 375 Left = 4320 TabIndex = 20 Top = 0 Width = 1095 End Begin CommandButton CreateTestData Caption = "Testdatei erstellen" Height = 372 Left = 3720 TabIndex = 19 Top = 4920 Width = 1692 End Begin ListBox Liste FontBold = -1 'True FontItalic = 0 'False FontName = "Courier New" FontSize = 9,6 FontStrikethru = 0 'False FontUnderline = 0 'False Height = 270 Left = 120 MultiSelect = 0 'False TabIndex = 18 Top = 2966 Visible = 0 'False Sorted = 0 'False Width = 5175 End Begin Label txtMatchcode1 BackColor = &H00C0C0C0& Caption = "Matchcode Suche im Datenfeld Name:" Height = 204 Left = 120 TabIndex = 1 Top = 1100 Width = 5172 End Begin TextBox Matchcode1 Height = 288 Left = 120 MaxLength = 80 TabIndex = 9 Top = 1320 Width = 5172 End Begin Label txtMatchcode2 BackColor = &H00C0C0C0& Caption = "Matchcode Suche im Datenfeld Branche:" Height = 204 Left = 120 TabIndex = 2 Top = 1660 Width = 5172 End Begin TextBox Matchcode2 Height = 288 Left = 120 MaxLength = 80 TabIndex = 10 Top = 1874 Width = 5172 End Begin Label txtMatchcode3 BackColor = &H00C0C0C0& Caption = "Matchcode Suche in Plz/Ort:" Height = 204 Left = 120 TabIndex = 3 Top = 2220 Width = 5172 End Begin TextBox Matchcode3 Height = 288 Left = 120 MaxLength = 80 TabIndex = 11 Top = 2438 Width = 5172 End Begin TextBox Ort Height = 285 Left = 2280 MaxLength = 20 TabIndex = 17 Top = 4406 Width = 2655 End Begin TextBox PLZ Height = 285 Left = 1440 MaxLength = 5 TabIndex = 16 Top = 4406 Width = 735 End Begin TextBox Strasse Height = 285 Left = 1440 MaxLength = 25 TabIndex = 15 Top = 4046 Width = 3495 End Begin TextBox Branche Height = 285 Left = 1440 MaxLength = 25 TabIndex = 14 Top = 3686 Width = 3495 End Begin TextBox KName Height = 285 Left = 1440 MaxLength = 25 TabIndex = 13 Top = 3326 Width = 3495 End Begin TextBox Anrede Height = 285 Left = 1440 MaxLength = 5 TabIndex = 12 Top = 2966 Width = 735 End Begin Label Status Height = 255 Left = 120 TabIndex = 22 Top = 4980 Width = 3492 End Begin Label txtPLZOrt Caption = "Plz/Ort" Height = 255 Left = 120 TabIndex = 8 Top = 4406 Width = 1215 End Begin Label txtStrasse Caption = "Straße" Height = 255 Left = 120 TabIndex = 7 Top = 4046 Width = 1215 End Begin Label txtBranche Caption = "Branche" Height = 255 Left = 120 TabIndex = 6 Top = 3686 Width = 1215 End Begin Label txtName Caption = "Name" Height = 255 Left = 120 TabIndex = 5 Top = 3326 Width = 1215 End Begin Label txtAnrede Caption = "Anrede" Height = 255 Left = 120 TabIndex = 4 Top = 2966 Width = 1215 End End Dim kunden As kdat Dim dwAktuellerSatz As Long Dim nListeAktiv As Integer Dim nMatchcodeSuche As Integer Const maxTreffer = 20 Sub CreateMatchcode_Click () Dim szCmnd As String Dim szMsg As String Dim dwDatensatzNr As Long Dim szFATSDatei As String ' ======================================================================== ' Matchcode generieren ' ======================================================================== If MsgBox("Wollen Sie die Matchcodedatei neu aufbauen ?", 260) <> 6 Then Exit Sub Call FATSCall ("K\1") ' -------> Matchcode Datei erstellen ' ' Der Matchcode wird mit dem Kommando "MC" Create Matchcode File ' generiert. Dabei geben Sie die logischen Suchgruppen und deren ' Eigenschaften an. Eine Suchgruppe besteht aus dem Inhalt eines ' oder mehrerer Datenfelder, in denen bei Angabe der Suchbegriffe ' gemeinsam gesucht werden soll. ' ' In diesem Beispiel werden folgende Suchgruppen definiert: ' ' Suchgruppe Felder ' ' I1 NAME ' I2 BRANCHE ' I3 PLZ & ORT ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "MC\{FileName}\{Flags}\{FileNo}\{Col1def}[\{Col2def}]" ' ' FileName Name der Matchcode-Datei, eventuell mit Pfadangabe ' (z.B. C:/DATEN/KUNDEN.FMS oder KUNDEN.FMS) ' ' Flags Momentan noch nicht benutzt ' ' FileNo Nummer der Matchcode-Indexdatei ' ' Col#def Definition der Datenspalte # (Flags, durch Komma getrennt). ' Der Inhalt der entsprechenden Datenspalten wird später den ' Befehlen "MB", "MI" und "MD" in der durch diesen Befehl ' festgelegten Reihenfolge übergeben. ' ' I# Spalteninhalt in der Suchgruppe # (1-32) indizieren. ' Sie können mehrere Spalten zu einer logischen Suchgruppe ' zusammenfassen (z.B. Vorname, Nachname). ' ' An dieser Stelle sind noch weitere Einstellungen möglich, ' die ausführlich im Benutzerhandbuch beschrieben sind. szFATSDatei = App.Path & "\" & "KUNDEN.FTS" szCmnd = "&MC&" & szFATSDatei & "&&1&I1&I2&I3" Call FATSCall (szCmnd) If uFATSError <> 0 Then szMsg = "FATS Fehler: " & Str$(uFATSError) & " (Kommando: MC)" MsgBox (szMsg) Exit Sub End If Call Knoepfe(False) ' -------> Texte einfügen ' ' Nachdem die Datei definiert und erzeugt wurde, wird der Inhalt der ' Datensätze mit dem Kommando "MB" Build Matchcode in die Datei ' eingefügt. Dabei dient die Definition, welche Sie über den Befehl ' "MC" festgelegt haben, als Schablone für dieses Kommando. ' ' Syntax des Kommandostrings: ' ' szCmnd = "MB\{FileNo}\{RecNo}\{Col1data}[\{Col2data}[\{Col3data}]]" ' ' FileNo Nummer der Matchcode-Indexdatei ' ' RecNo <> 0 Datensatz- bzw. ID-Nummer ' == 0 Matchcode-Indizierung beenden ' ' Col#data Inhalt der Datenspalte X dwDatensatzNr = 0 ' Bei der Indizierung sequentieller Datenbestände sollte die über ' "RecNo" spezifizierte Nummer der physikalischen Datensatznummer ' entsprechen, d.h. der erste Datensatz hat die Nummer 1, der ' zweite Satz die Nummer 2 etc., bei als gelöscht markierten ' Datensätzen wird der Inhalt der Datenspalten nicht mit angegeben ' ("MB\{FileNo}\{RecNo}"). ' Der Build Matchcode (MB) Befehl verlangt eine aufsteigende Nummer ' als "RecNo"-Argument, d.h. der Matchcode kann normalerweise nicht ' in der logischen Ordnung eines Indizes indiziert werden. ' Das Beispielprogramm MCSORT zeigt die Verwendung eines ' Keys beim Generieren der Matchcode Indexdatei. Do Get #1, dwDatensatzNr + 1, kunden If Not EOF(1) Then dwDatensatzNr = dwDatensatzNr + 1 szCmnd = "MB\1\" & Str$(dwDatensatzNr) If kunden.loeschkennz = " " Then szCmnd = szCmnd & "\" & RTrim$(kunden.Name) szCmnd = szCmnd & "\" & RTrim$(kunden.Branche) szCmnd = szCmnd & "\" & RTrim$(kunden.Plz & " " & kunden.Ort) End If Call FATSCall (szCmnd) If uFATSError <> 0 Then szMsg = "FATS Fehler: " & Str$(uFATSError) & " (Kommando: MB)" MsgBox (szMsg) Exit Sub End If Kundenstamm.Status = Str$(dwDatensatzNr) & " Datensätze" If ((dwDatensatzNr And 31) = 0) Then Kundenstamm.Status.Refresh Else ' Nachdem der letzte Datensatz indiziert wurde, wird die ' Indizierung durch die Angabe einer Null anstelle einer ' gültigen Datensatznummer beendet ("MB\{Dateinummer}\0"). ' Die Datei wird dabei geschlossen - ein Close-Befehl ist ' danach nicht mehr nötig. Call FATSCall ("MB\1\0") ' -------> Matchcode Datei öffnen ' ' Mit dem Befehl "O" Open Indexfile wird eine Matchcode- ' Indexdatei mit den über den Befehl Auto Refresh ("Y") ' definierten Öffnungsflags geöffnet und der Dateinummer ' "FileNo" zugewiesen. Diese Nummer muß bei allen nach- ' folgenden FATS-Befehlen angegeben werden, um mit der ' Indexdatei zu arbeiten. szCmnd = "&O&" & szFATSDatei & "&1" Call FATSCall(szCmnd) End If Loop While Not EOF(1) Call Knoepfe(True) Call SatzErster_Click End Sub Sub SatzLaden (dwNeuerSatz As Long, nListenIndex As Integer) Get #1, dwNeuerSatz, kunden If nListenIndex >= 0 Then Liste.AddItem kunden.Name & "|" & kunden.Branche & "|" & kunden.Plz & " " & kunden.Ort Liste.ItemData(nListenIndex) = dwNeuerSatz End If If nListenIndex <= 0 Then dwAktuellerSatz = dwNeuerSatz 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$(dwAktuellerSatz) Call knoepfe(True) End If End Sub Sub SatzSuchen_Click () Dim szCmnd As String ' ======================================================================== ' Matchcode Suche ' ======================================================================== szCmnd = RTrim$(Matchcode1.Text) szCmnd = szCmnd & "\" & RTrim$(Matchcode2.Text) szCmnd = szCmnd & "\" & RTrim$(Matchcode3.Text) If (nListeAktiv = True) Or (Len(szCmnd) > 2) Then nMatchcodeSuche = True ' -------> In der Suchgruppe 1 (NAME) suchen ' ' Der Befehl "MS" Search in Matchcode führt eine Matchcode-Abfrage ' durch und erstellt eine Ergebnistabelle mit den Datensatz- bzw. ' ID-Nummern der Datensätze, welche die gesuchten Begriffe beinhalten. ' Bei erfolgreicher Verarbeitung (Errorcode == 0) wird der Applikation ' die Datensatz- bzw. ID-Nummer des ersten Treffers über die Variable ' "dwRecno" zur weiteren Verarbeitung zur Verfügung gestellt. ' Die Ergebnistabelle kann anschließend mit den Browserbefehlen ' ("MA", "ME", "MN", "MP" etc.) ausgelesen werden. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "MS\{FileNo}\{Flags}\{Total}\{SearchGrp1}[\{SearchGrp2}...]" ' ' FileNo Nummer der Indexdatei ' ' Flags Der Suchvorgang kann durch die Angabe verschiedener ' Flags beeinflußt werden. Eine Beschreibung der Flags ' finden Sie in der Befehlsreferenz. ' ' Total Maximale Anzahl Treffer in der Ergebnistabelle: ' ' 0 Es werden alle Treffer in die Ergebnistabelle ' gestellt. Diese Einstellung arbeitet sehr schnell, ' es findet aber auch keine Sortierung anhand der ' Trefferqualität statt. ' ' > 0 Es wird versucht, die angegebene Anzahl Treffer in ' die Ergebnistabelle zu stellen. Diese Treffer werden ' einer Sortierung bezüglich ihrer Qualität unterzogen ' und dann in eine von 7 Sortiergruppen eingeordnet. ' ' SearchGrp# Hier werden die in der Suchgruppe # gesuchten Begriffe ' angegeben. ' ' Für die Auswertung der Ergebnistabelle können abhängig von der ' Programmlogik verschiedene FATS-Befehle verwendet werden. ' In dem folgenden Beispiel werden alle Treffer auf den Bildschirm ' ausgegeben: ' In dem folgenden Beispiel werden alle Treffer auf den ' Bildschirm ausgegeben: szCmnd = "MS\1\\0\" & szCmnd Else nMatchcodeSuche = False szCmnd = "G\1\2\" & UCase$(RTrim$(KName.Text)) End If Kundenstamm.liste.Clear Call FATSCall (szCmnd) If uFATSError = 0 Or (uFATSError > 11 And uFATSError < 15) Then Do Call SatzLaden(dwFATSRecno, CInt(Liste.ListCount)) If (nMatchcodeSuche = True) And (Liste.ListCount < maxTreffer) Then ' "MN" Get Next Result (Matchcode) ' ' Dieser Befehl gibt die Datensatz- bzw. ID-Nummer des nächsten ' Datensatzes der über einen vorangehenden Befehl "MS - Search ' in Matchcode" erstellten Ergebnistabelle zurück. ' Ausgegangen wird dabei vom Ergebnis des letzten Browserbefehls, ' d.h. unmittelbar vor der Anwendung dieses Befehls muß einer ' der Befehle "MA", "ME", "MF", "MN", "MP" oder "MS" ausgeführt ' worden sein. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "MN\{FileNo}" ' ' FileNo Nummer der Matchcode-Indexdatei ' ' Wenn keine weiteren Treffer vorhanden sind, dann wird der ' Fehlercode #15 zurückgegeben. Call FATSCall ("MN\1") Else Exit Do End If Loop While uFATSError = 0 ' Folgende Browser-Befehle werden von FATS angeboten: ' ' "MF" - Get First Result ' "ML" - Get Last Result ' "MP" - Get Previous Result ' "MN" - Get Next Result ' "MA" - Get Next Result After ' "ME" - Get Previous Result Before Liste.ListIndex = 0 If (Liste.ListCount > 1) And (nListeAktiv = False) Then Call Listen_Click Else If nMatchcodeSuche = True Then Kundenstamm.SatzErster.Enabled = False Kundenstamm.SatzNaechster.Enabled = False Kundenstamm.SatzVoriger.Enabled = False Kundenstamm.SatzLetzter.Enabled = False Kundenstamm.Status = "Keine Datensätze gefunden" If uFATSError = 11 Then Call CreateMatchcode_Click ElseIf uFATSError = 241 Then MsgBox ( "Trial Version: Nutzungsdauer des Matchcode Index abgelaufen. Bitte neu generieren !" ) End If End If End If If nMatchcodeSuche = True Then Kundenstamm.txtSuchenStatus.Value = False Kundenstamm.txtSuchenStatus.Visible = True Kundenstamm.txtSuchenStatus.Caption = "Matchcode Suche: ('" & RTrim$(Matchcode1.Text) & "','" & RTrim$(Matchcode2.Text) & "','" & RTrim$(Matchcode3.Text) & "')" Else Kundenstamm.txtSuchenStatus.Visible = False End If Kundenstamm.txtSuchenStatus.Refresh If nListeAktiv = False Then Kundenstamm.Matchcode1.SetFocus Else Kundenstamm.Liste.SetFocus End If End Sub Sub SatzErster_Click () If nMatchcodeSuche = True Then ' "MF" Get First Result (Matchcode) ' ' Dieser Befehl gibt die Datensatz- bzw. ID-Nummer des ersten ' Datensatzes der über einen vorangehenden Befehl "MS" Search ' in Matchcode erstellten Ergebnistabelle zurück. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "MF\{FileNo}" ' ' FileNo Nummer der Matchcode-Indexdatei Call FATSCall ("MF\1") Else Call FATSCall ("F\1\2") End If If uFATSError = 0 Then Call SatzLaden(dwFATSRecno, -1) Else Call SatzNeu_Click End If End Sub Sub SatzLetzter_Click () If nMatchcodeSuche = True Then ' "ML" Get Last Result (Matchcode) ' ' Dieser Befehl gibt die Datensatz- bzw. ID-Nummer des letzten ' Datensatzes der über einen vorangehenden Befehl "MS" Search ' in Matchcode erstellten Ergebnistabelle zurück. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "ML\{FileNo}" ' ' FileNo Nummer der Matchcode-Indexdatei Call FATSCall ("ML\1") Else Call FATSCall ("L\1\2") End If If uFATSError = 0 Then Call SatzLaden(dwFATSRecno, -1) End Sub Sub SatzVoriger_Click () If nMatchcodeSuche = True Then ' "ME" Get Previous Result Before (Matchcode) ' ' Dieser Befehl sucht den über "RecNo" spezifizierten Datensatz in der über ' einen vorangehenden Befehl Search in Matchcode ("MS") erstellten Ergebnis- ' tabelle und blättert dann um eine Position zurück. ' Als Ergebnis wird die Datensatz- bzw. ID-Nummer des dem angegebenen Daten- ' satz vorangehenden Datensatzes der Ergebnistabelle zurückgegeben. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "ME\{FileNo}\{RecNo}" ' ' FileNo Nummer der Matchcode-Indexdatei ' ' RecNo Datensatznummer bzw. Satz-ID Call FATSCall ("ME\1\" & Str$(dwAktuellerSatz)) Else Call FATSCall ("E\1\" & Str$(dwAktuellerSatz) & "\2\" & UCase$(RTrim$(KName.Text))) End If If uFATSError = 0 Then Call SatzLaden(dwFATSRecno, -1) End Sub Sub SatzNaechster_Click () If nMatchcodeSuche = True Then ' "MA" Get Next Result After (Matchcode) ' ' Dieser Befehl sucht den über "RecNo" spezifizierten Datensatz ' in der über einen vorangehenden Befehl Search in Matchcode ("MS") ' erstellten Ergebnistabelle und blättert dann um eine Position ' weiter. ' Als Ergebnis wird die Datensatz- bzw. ID-Nummer des dem ' angegebenen Datensatz folgenden Datensatzes der Ergebnistabelle ' zurückgegeben. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "MA\{FileNo}\{RecNo}" ' ' FileNo Nummer der Matchcode-Indexdatei ' ' RecNo Datensatznummer bzw. Satz-ID Call FATSCall ("MA\1\" & Str$(dwAktuellerSatz)) Else Call FATSCall ("A\1\" & Str$(dwAktuellerSatz) & "\2\" & UCase$(RTrim$(KName.Text))) End If If uFATSError = 0 Then Call SatzLaden(dwFATSRecno, -1) End Sub Sub SatzNeu_Click () dwAktuellerSatz = 0 Anrede.Text = "" KName.Text = "" Branche.Text = "" Kundenstamm.Strasse = "" Plz.Text = "" Ort.Text = "" Kundenstamm.Status = "Neuanlage" Call txtSuchenStatus_Click End Sub Sub SatzSichern_Click () Dim szCmnd As String Dim szKey3loeschen As String Dim szKey3einfuegen As String Dim szMCloeschen As String Dim szMCeinfuegen As String Dim szMsg As String If Len(RTrim$(KName.Text)) = 0 Then MsgBox ( "Bitte das Feld NAME ausfuellen" ) Exit Sub End If szKey3einfuegen = Plz.Text If Len(szKey3einfuegen) < 5 Then szKey3einfuegen = szKey3einfuegen & Space$(5 - Len(szKey3einfuegen)) szKey3einfuegen = szKey3einfuegen & UCase$(RTrim$(Ort.Text)) szMCeinfuegen = RTrim$(KName.Text) szMCeinfuegen = szMCeinfuegen & "\" & RTrim$(Branche.Text) szMCeinfuegen = szMCeinfuegen & "\" & RTrim$(Plz.Text) & " " & RTrim$(Ort.Text) If dwAktuellerSatz = 0 Then szMCloeschen = "" szCmnd = "I\2\" & UCase$(RTrim$(KName.Text)) & "\" & UCase$(RTrim$(Branche.Text)) & "\" & szKey3einfuegen 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 dwAktuellerSatz = dwFATSRecno Else szMCloeschen = RTrim$(kunden.Name) szMCloeschen = szMCloeschen & "\" & RTrim$(kunden.Branche) szMCloeschen = szMCloeschen & "\" & RTrim$(kunden.Plz) & " " & RTrim$(kunden.Ort) If szMCloeschen = szMCeinfuegen Then ' der Matchcode wurde nicht geändert, es ist kein Update nötig szMCloeschen = "" szMCeinfuegen = "" End If 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 szKey3loeschen = kunden.Plz & UCase$(RTrim$(kunden.Ort)) If replacekey(szKey3loeschen, szKey3einfuegen, 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, dwAktuellerSatz, kunden If Len(szMCloeschen) Then Call FATSCall ("MD\1\" & Str$(dwAktuellerSatz) & "\" & szMCloeschen) If uFATSError <> 0 Then MsgBox ( "FATS-Fehler: " & Str$(uFATSError) & " (Kommando MD)" ) End If If Len(szMCeinfuegen) Then ' "MI" Insert Matchcode ' ' Dieser Befehl fügt den Inhalt der Datenspalten ("Col#data") des ' über "RecNo" spezifizierten Datensatzes dem Matchcode Index hinzu. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "MI\{FileNo}\{RecNo}\{Col1data}[\{Col2data}[\{Col3data}]]" ' ' FileNo Nummer der Matchcode-Indexdatei ' ' RecNo Datensatznummer bzw. Satz-ID ' ' Col#data Inhalt der Datenspalte # ' ' ' Die Position der Datenspalten ("Col#data") innerhalb des Kommando ' strings entspricht der beim Aufruf des Befehls "MC" Create Matchcode ' File festgelegten Definition. Die Syntax des Kommandostrings ' entspricht der des Befehls Build Matchcode ("MB"). ' ' Bitte beachten Sie, daß bei der Änderung eines bereits indizierten ' Datensatzes zuerst mit dem Befehl Delete Matchcode ("MD") dessen ' bisheriger Inhalt (vor der Änderung) aus dem Matchcode-Index entfernt ' werden muß, bevor der neue Inhalt mit diesem Befehl wieder eingefügt ' wird. ' ' Bei der Neuerstellung bzw. Reorganisation des Matchcode-Indizes ' sollte aus Geschwindigkeitsgründen immer der Befehl Build ' Matchcode (MB) anstatt diesem Befehl angewandt werden. ' ' Wenn bei der Erstellung der Matchcode-Indexdatei ein Primärschlüssel ' definiert wurde (Flag "K#:#"), dann hat die über "RecNo" angegebene ' Datensatz- bzw. ID-Nummer keine Bedeutung, d.h. es muß wie bereits ' beim "MB"-Befehl der Primärschlüssel über "Col#data" angegeben werden. Call FATSCall ("MI\1\" & Str$(dwAktuellerSatz) & "\" & szMCeinfuegen) If uFATSError <> 0 Then MsgBox ( "FATS-Fehler: " & Str$(uFATSError) & " (Kommando MI)" ) End If Kundenstamm.Status = "Datensatz: " & Str$(dwAktuellerSatz) Call txtSuchenStatus_Click End Sub Function replacekey (szKeyOld As String, szKeyNew As String, nKey As Integer) As Integer Dim szCmnd As String Dim szMsg As String If szKeyOld <> szKeyNew Then szCmnd = "R\" & Str$(nKey) & "\" & Str$(dwAktuellerSatz) & "\2\" & szKeyOld & "\" & szKeyNew 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 Sub SatzLoeschen_Click () Dim szCmnd As String Dim szMsg As String If dwAktuellerSatz <> 0 Then szCmnd = "D\" & Str$(dwAktuellerSatz) & "\Y\2\" & 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 ' "MD" Delete Matchcode ' ' Dieser Befehl entfernt den Inhalt der Datenspalten ("Col#data") des ' über "RecNo" spezifizierten Datensatzes aus dem Matchcode Index. ' ' Der Aufbau des Kommandostrings: ' ' szCmnd = "MD\{FileNo}\{RecNo}\{Col1data}[\{Col2data}[\{Col3data}]]" ' ' FileNo Nummer der Matchcode-Indexdatei ' ' RecNo Datensatznummer bzw. Satz-ID ' ' Col#data Inhalt der Datenspalte # ' ' ' Die Position der Datenspalten ("Col#data") innerhalb des Kommando ' strings entspricht der beim Aufruf des Befehls "MC" Create Matchcode ' File festgelegten Definition. Die Syntax des Kommandostrings ' entspricht der des Befehls Build Matchcode ("MB"). ' ' Eine vor der Ausführung dieses Befehls generierte Ergebnistabelle ' bleibt von dem Befehl unberührt, d.h. kann eventuell nachträglich ' gelöschte Datensätze beinhalten. ' ' Wenn bei der Erstellung der Matchcode-Indexdatei ein Primärschlüssel ' definiert wurde (Flag "K#:#"), dann hat die über "RecNo" angegebene ' Datensatz- bzw. ID-Nummer keine Bedeutung, d.h. es muß wie bereits ' beim "MB"-Befehl der Primärschlüssel über "Col#data" angegeben werden. szCmnd = "MD\1\" & Str$(dwFATSRecno) szCmnd = szCmnd & "\" & RTrim$(kunden.Name) szCmnd = szCmnd & "\" & RTrim$(kunden.Branche) szCmnd = szCmnd & "\" & RTrim$(kunden.Plz & " " & kunden.Ort) Call FATSCall (szCmnd) If uFATSError <> 0 Then MsgBox ( "FATS-Error: " & Str$(uFATSError) & szCmnd ) Call SatzNeu_Click End If End Sub Sub CreateTestData_Click () Dim szCmnd As String Dim szMsg As String Dim dwDatensatzNr As Long Dim szDemodatei As String Dim szIndexdatei As String If MsgBox("Wollen Sie die Datei wirklich neu aufbauen ?", 260) <> 6 Then Exit Sub szDemodatei = App.Path & "\..\..\..\DEMODATA\" & "KUNDEN.ANS" szIndexdatei = App.Path & "\" & "KUNDEN.KEY" If Dir$(szDemodatei) = "" Then szMsg = "Datei " & szDemodatei & " nicht gefunden" MsgBox (szMsg) Exit Sub End If szCmnd = "&C&" & szIndexdatei & "&25&3&A&2" Call FATSCall (szCmnd) Open szDemodatei For Random As #2 Len = 105 Dim szDemodata As String * 105 Call Knoepfe(False) dwDatensatzNr = 0 Do Get #2, dwDatensatzNr + 1, szDemodata If Not EOF(2) Then dwDatensatzNr = dwDatensatzNr + 1 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) szCmnd = "B\2\" & 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 Do End If Put #1, dwFATSRecno, kunden Kundenstamm.Status = Str$(dwFATSRecno) & " Datensätze" If ((dwDatensatzNr And 31) = 0) Then Kundenstamm.Status.Refresh End If Loop While Not EOF(2) Close #2 Call FATSCall ("W\2") If Dir$(App.Path & "\" & "KUNDEN.FTS") <> "" Then Call FATSCall ("K\1") Kill (App.Path & "\" & "KUNDEN.FTS") End If Call Knoepfe(True) Call SatzErster_Click End Sub Sub knoepfe (nAktiviert) If dwAktuellerSatz = 0 Then SatzNeu.Enabled = False SatzLoeschen.Enabled = False Else SatzNeu.Enabled = nAktiviert SatzLoeschen.Enabled = nAktiviert End If Kundenstamm.SatzErster.Enabled = nAktiviert Kundenstamm.SatzNaechster.Enabled = nAktiviert Kundenstamm.SatzVoriger.Enabled = nAktiviert Kundenstamm.SatzLetzter.Enabled = nAktiviert Kundenstamm.SatzSuchen.Enabled = nAktiviert Kundenstamm.SatzSichern.Enabled = nAktiviert Kundenstamm.CreateMatchcode.Enabled = nAktiviert Kundenstamm.CreateTestData.Enabled = nAktiviert Kundenstamm.Listen.Enabled = nAktiviert End Sub Sub Listen_Click () Call Knoepfe(nListeAktiv) Kundenstamm.Listen.Enabled = True Kundenstamm.SatzSuchen.Enabled = True Kundenstamm.Anrede.Enabled = nListeAktiv Kundenstamm.KName.Enabled = nListeAktiv Kundenstamm.Branche.Enabled = nListeAktiv Kundenstamm.Strasse.Enabled = nListeAktiv Kundenstamm.Plz.Enabled = nListeAktiv Kundenstamm.Ort.Enabled = nListeAktiv If nListeAktiv = False Then nListeAktiv = True Kundenstamm.Listen.Caption = "Maske" liste.Height = 1860 Else nListeAktiv = False Kundenstamm.Listen.Caption = "Liste" Kundenstamm.Liste.Clear If dwAktuellerSatz <> 0 Then Call SatzLaden(dwAktuellerSatz, -1) Kundenstamm.Anrede.SetFocus Else Call SatzNeu_Click End If End If liste.Visible = nListeAktiv End Sub Sub txtSuchenStatus_Click () nMatchcodeSuche = False Matchcode1.Text = "" Matchcode2.Text = "" Matchcode3.Text = "" Kundenstamm.txtSuchenStatus.Visible = False If nListeAktiv = False Then Call Knoepfe(True) End If Kundenstamm.Matchcode1.SetFocus End Sub Sub Form_Resize () Kundenstamm.Liste.Width = 5175 + (Kundenstamm.Width - 5496) End Sub Sub Matchcode1_KeyUp (KeyCode As Integer, Shift As Integer) If KeyCode = &HD Then Kundenstamm.Matchcode2.SetFocus End Sub Sub Matchcode2_KeyUp (KeyCode As Integer, Shift As Integer) If KeyCode = &HD Then Kundenstamm.Matchcode3.SetFocus End Sub Sub Matchcode3_KeyUp (KeyCode As Integer, Shift As Integer) If KeyCode = &HD Then Call SatzSuchen_Click End Sub Sub Liste_Click () Dim szStatuszeile dwAktuellerSatz = Liste.ItemData(Liste.ListIndex) szStatuszeile = "Treffer " & Str$(Liste.ListIndex + 1) If (Liste.ListCount < maxTreffer) Then szStatuszeile = szStatuszeile & " von " & Str$(Liste.ListCount) Else szStatuszeile = szStatuszeile & " von mehr als " & Str$(maxTreffer) End If Kundenstamm.Status = szStatuszeile End Sub Sub Liste_DblClick () Call Listen_Click End Sub Sub Liste_KeyUp (KeyCode As Integer, Shift As Integer) If KeyCode = &HD Then Call Listen_Click End Sub
© 2008 GCS Software, Udo Gertz