FATS - Fast Access Tree System
Inhaltsverzeichnis
Programmierschnittstellen
Visual Basic für Windows 3.x


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.
Jedes Wort und jede Zahl wird in den Index aufgenommen, es wird eine "invertierte Liste" erstellt.

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:

 "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 FATSXVBW FATS1
      Left            =   4920
      Top             =   3266
   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