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


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 2.00
Begin Form Kundenstamm
   BorderStyle     =   1  'Fixed Single
   Caption         =   "Fats-Testprogramm"
   FontBold        =   -1  'True
   FontItalic      =   0   'False
   FontName        =   "MS Sans Serif"
   FontSize        =   9,6
   FontStrikethru  =   0   'False
   FontUnderline   =   0   'False
   Height          =   4680
   Left            =   1584
   LinkTopic       =   "KunStamm"
   ScaleHeight     =   4308
   ScaleWidth      =   5424
   Top             =   1596
   Width           =   5520
   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
      TabIndex        =   26
      Top             =   1440
      Visible         =   0   'False
      Width           =   5175
   End
   Begin OptionButton Option3
      Caption         =   "Plz/Ort"
      Height          =   375
      Left            =   2760
      TabIndex        =   25
      Top             =   960
      Visible         =   0   'False
      Width           =   1215
   End
   Begin OptionButton Option2
      Caption         =   "Branche"
      Height          =   372
      Left            =   1440
      TabIndex        =   24
      Top             =   960
      Visible         =   0   'False
      Width           =   1332
   End
   Begin OptionButton Option1
      Caption         =   "Name"
      Height          =   375
      Left            =   120
      TabIndex        =   23
      Top             =   960
      Visible         =   0   'False
      Width           =   1215
   End
   Begin CommandButton Listen
      Caption         =   "Listen"
      Height          =   375
      Left            =   3240
      TabIndex        =   21
      Top             =   0
      Width           =   1060
   End
   Begin CommandButton SatzLoeschen
      Caption         =   "Löschen"
      Enabled         =   0   'False
      Height          =   375
      Left            =   2160
      TabIndex        =   20
      Top             =   0
      Width           =   1060
   End
   Begin CommandButton SatzSichern
      Caption         =   "Sichern"
      Height          =   375
      Left            =   1080
      TabIndex        =   19
      Top             =   0
      Width           =   1060
   End
   Begin CommandButton SatzNeu
      Caption         =   "Neu"
      Enabled         =   0   'False
      Height          =   375
      Left            =   0
      TabIndex        =   18
      Top             =   0
      Width           =   1065
   End
   Begin CommandButton SatzLetzter
      Caption         =   "Letzter"
      Height          =   375
      Left            =   4320
      TabIndex        =   17
      Top             =   370
      Width           =   1060
   End
   Begin CommandButton SatzNaechster
      Caption         =   ">>"
      Height          =   375
      Left            =   3240
      TabIndex        =   16
      Top             =   370
      Width           =   1060
   End
   Begin CommandButton SatzSuchen
      Caption         =   "Suchen"
      Height          =   375
      Left            =   2160
      TabIndex        =   15
      Top             =   370
      Width           =   1060
   End
   Begin CommandButton SatzVoriger
      Caption         =   "<<"
      Height          =   375
      Left            =   1080
      TabIndex        =   14
      Top             =   370
      Width           =   1060
   End
   Begin CommandButton SatzErster
      Caption         =   "Erster"
      Height          =   375
      Left            =   0
      TabIndex        =   13
      Top             =   370
      Width           =   1060
   End
   Begin CommandButton Create
      Caption         =   "Create"
      Height          =   375
      Left            =   4320
      TabIndex        =   12
      Top             =   0
      Width           =   1060
   End
   Begin TextBox Ort
      Height          =   324
      Left            =   2280
      MaxLength       =   20
      TabIndex        =   11
      Top             =   3240
      Width           =   2655
   End
   Begin TextBox PLZ
      Height          =   324
      Left            =   1440
      MaxLength       =   5
      TabIndex        =   10
      Top             =   3240
      Width           =   735
   End
   Begin TextBox Strasse
      Height          =   324
      Left            =   1440
      MaxLength       =   25
      TabIndex        =   9
      Top             =   2880
      Width           =   3495
   End
   Begin TextBox Branche
      Height          =   324
      Left            =   1440
      MaxLength       =   25
      TabIndex        =   8
      Top             =   2520
      Width           =   3495
   End
   Begin TextBox KName
      Height          =   324
      Left            =   1440
      MaxLength       =   25
      TabIndex        =   7
      Top             =   2160
      Width           =   3495
   End
   Begin TextBox Anrede
      Height          =   324
      Left            =   1440
      MaxLength       =   5
      TabIndex        =   6
      Top             =   1800
      Width           =   735
   End
   Begin Label Status
      Height          =   255
      Left            =   120
      TabIndex        =   22
      Top             =   3960
      Width           =   5175
   End
   Begin Label txtPLZOrt
      Caption         =   "Plz/Ort"
      Height          =   255
      Left            =   120
      TabIndex        =   5
      Top             =   3240
      Width           =   1215
   End
   Begin Label txtStrasse
      Caption         =   "Straße"
      Height          =   255
      Left            =   120
      TabIndex        =   4
      Top             =   2880
      Width           =   1215
   End
   Begin Label txtBranche
      Caption         =   "Branche"
      Height          =   255
      Left            =   120
      TabIndex        =   3
      Top             =   2520
      Width           =   1215
   End
   Begin Label txtName
      Caption         =   "Name"
      Height          =   255
      Left            =   120
      TabIndex        =   2
      Top             =   2160
      Width           =   1215
   End
   Begin Label txtAnrede
      Caption         =   "Anrede"
      Height          =   255
      Left            =   120
      TabIndex        =   1
      Top             =   1800
      Width           =   1215
   End
   Begin Label Ueberschrift
      Alignment       =   2  'Center
      Caption         =   "Kundenstamm"
      FontBold        =   -1  'True
      FontItalic      =   0   'False
      FontName        =   "MS Serif"
      FontSize        =   12
      FontStrikethru  =   0   'False
      FontUnderline   =   0   'False
      ForeColor       =   &H00800000&
      Height          =   375
      Left            =   1080
      TabIndex        =   0
      Top             =   960
      Width           =   3255
   End
End


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