FATS - Fast Access Tree System
Inhaltsverzeichnis
Programmierschnittstellen
MS-Basic für OS/2


Das nachfolgende Microsoft Basic Beispiel demonstriert die Verwendung der von FATS bereitgestellten  Index-Befehle:

 "C" Create Indexfile
(Indexdatei definieren, erstellen und öffnen.)
 "O" Open Indexfile
(Indexdatei öffnen.)
 "K" Close Indexfile
(Eine oder alle Indexdateien schließen.)
 "I" Insert Record
((Haupt)-Schlüssel in Indexdatei einfügen und Datensatznummer besetzen.)
 "F" Search First
(Suchen des ersten Schlüssels.)
 "L" Search Last
(Suchen des letzten Schlüssels.)
 "N" Search Next
(Suchen des nächsten Schlüssels in Folge.)
 "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.)
 "Y" Auto Refresh
(Bestimmt das Verhalten der Bibliothek im Netzwerk- und Einzelplatzbetrieb.)

REM   FATS 02.30
REM   (c) GCS Software, Udo Gertz 1993-1998
REM
REM   Testprogramm (Microsoft Basic / Quick Basic Compiler)
REM 
REM   Erstellen der Testdateien KUNDEN.DAT / KUNDEN.KEY
REM
REM   19-03-2009 U.Gertz



REM   Benötigte Objekt-Dateien
REM   ========================
REM
REM   Folgende Objekt-Module werden benötigt, wenn FATS zum
REM   Anwendungsprogramm gelinkt werden soll:
REM
REM        FATS.OBJ        FATS Universalmodul
REM        FATS_MB6.OBJ    MS-Basic Schnittstelle für NEAR-Strings, oder
REM        FATS_MB7.OBJ    MS-Basic Schnittstelle für FAR-Strings (/Fs)
REM
REM   Wenn Sie die Dynamische Bibliothek FATS_O16.DLL verwenden
REM   möchten, dann werden die folgenden Bibliotheken benötigt:
REM
REM        FATS_O16.LIB    Import-Library für FATS_O16.DLL
REM        FATSMB6D.OBJ    Schnittstelle für NEAR-Strings, oder
REM        FATSMB7D.OBJ    Schnittstelle für FAR-Strings (/Fs)
REM
REM   Wenn Sie die erweiterte Version von FATS erworben haben, dann
REM   müssen Sie das Objekt-Modul FATSX.OBJ bzw. die Bibliothek
REM   FATSXO16.LIB (für die DLL FATSXO16.DLL) verwenden.
REM
REM
REM   Compilieren der Programme
REM   =========================
REM
REM   Um Ihre Programme zu übersetzen ist eine der folgenden Methoden zu wählen:
REM
REM     1. Methode: FATS an das Anwendungsprogramm binden
REM
REM        BC TST1GER6 /Lp [/Fs]
REM        LINK TST1GER6 FATS_MB[6 oder 7].OBJ FATS.OBJ
REM
REM        oder wenn Sie die erweiterte Version von FATS
REM        besitzen: (FATSX.OBJ)
REM
REM        LINK TST1GER6 FATS_MB[6 oder 7].OBJ FATSX.OBJ
REM
REM     2. Methode: Aufruf der Dynamischen Bibliothek (FATS_O16.DLL)
REM
REM        BC TST1GER6 /Lp [/Fs]
REM        LINK TST1GER6 FATSMB[6 oder 7]D.OBJ FATS_O16.LIB
REM
REM        oder wenn Sie die erweiterte Version von FATS
REM        besitzen: (FATSXO16.DLL)
REM
REM        LINK TST1GER6 FATSMB[6 oder 7]D.OBJ FATSXO16.LIB
REM
REM
REM   FATS Befehle ausführen
REM   ======================
REM
REM   Alle FATS Befehle werden mit einer Funktion ausgeführt:
REM
REM     FATSBASIC( szCmnd$, uFATSError%, dwRecno&, nKeyLen% )
REM
REM   Bedeutung der verwendeten Parameter:
REM
REM      szCmnd         Dieser String definiert den auszuführenden FATS-
REM                     Befehl sowie die dazugehörenden Parameter.
REM 
REM      nErrorcode     Über diese Variable wird die Anwendung über
REM                     Erfolg (0) oder Mißerfolg (<> 0) der letzten
REM                     FATS-Aktion unterrichtet.
REM 
REM      nKeyLen        Schlüssellänge, einfache Integer
REM
REM                     Da es für FATS keine Möglichkeit gibt, Basic-Strings
REM                     direkt zu manipulieren, müssen Sie selbst dafür sorgen,
REM                     daß die Stringvariable szFATSkey$ die benötigte Länge
REM                     hat. Die Basic-Funktion SPACE$ füllt daher den String
REM                     szFATSkey$ mit der benötigten Anzahl Leerzeichen.
REM                     Der nachträgliche Aufruf von FATSGETKEY kopiert dann
REM                     den Schlüsselwert in den Basic-String:
REM
REM                     If nKeyLen% > 0 Then
REM                       szFATSkey$ = Space$( nKeyLen% )
REM                       Call FATSGETKEY( szFATSkey$ )
REM                     Else
REM                       szFATSkey$ = ""
REM                     End If



REM  -------> Aktivierung des Netzwerkbetriebes
REM
REM   "Y" Auto Refresh Kommando
REM
REM  FATS ist standardmäßig für den Betrieb im Netzwerk ausgestattet.
REM  Beinahe alle Befehle können sowohl im Einzelplatz- als auch im
REM  Netzwerkbetrieb ausgeführt werden.
REM  Standardmäßig sind die Netzfunktionen ausgeschaltet. Sie können
REM  diese mit dem Befehl "Y\2" initialisieren.
REM  Diese Initialisierung wird normalerweise beim Programmstart
REM  erledigt und gilt dann für die gesamte Laufzeit des Programmes.

CALL FATSBASIC( "Y\2", ERRORCODE%, RECNO&, KEYLEN% )

REM  -------> ASCII-Datei mit Demodaten öffnen

OPEN "R", #1, "..\..\..\DEMODATA\KUNDEN.ASC", 105
FIELD #1, 5 AS F1$, 25 AS F2$, 25 AS F3$, 25 AS F4$, 5 AS F5$, 20 AS F6$

REM  -------> Datendatei erstellen

PRINT "Datendatei wird erstellt ..."

OPEN "R", #2, "KUNDEN.DAT", 128
FIELD #2, 1 AS LOESCHKENNZ$,_
          5 AS ANREDE$,_
         25 AS NAME$,_
         25 AS BRANCHE$,_
         25 AS STRASSE$,_
          5 AS PLZ$,_
         20 AS ORT$


REM  -------> Indexdatei erstellen


REM   "C" Create Indexfile
REM
REM  Mit diesem Befehl erstellen Sie eine Indexdatei, wobei eine
REM  eventuell bereits vorhandene Datei mit demselben Dateinamen
REM  gelöscht wird.
REM  Die Indexdatei wird dabei gleichzeitig mit den über den
REM  Befehl Auto Refresh (Y) definierten Öffnungsflags geöffnet
REM  und der Dateinummer "FileNo" zugewiesen. Diese Nummer muß bei
REM  allen nachfolgenden FATS-Befehlen angegeben werden, um mit
REM  der Indexdatei zu arbeiten.
REM
REM  Maximal 200 Schlüssel pro Datensatz können in einer Indexdatei
REM  verwaltet werden, wobei die maximale Schlüssellänge 240 Zeichen
REM  beträgt.
REM
REM  Beachten Sie bei der Dateipfadangabe, daß der Backslash (\) von
REM  FATS als Trennzeichen behandelt wird und daher im Pfad durch
REM  einen normalen Schrägstrich ersetzt werden sollte.
REM  Alternativ dazu können Sie auch das Trennzeichen umdefinieren,
REM  indem Sie dieses als erstes Zeichen im Befehlsstring angeben,
REM  z.B. szCmnd = "&C&C:\ARTIKEL.KEY&1&1&A&1" (das Trennzeichen muß
REM  ein ASCII-Zeichen kleiner als 48 sein).
REM
REM  Der Aufbau des Kommandostrings:
REM
REM    szCmnd = "C\{Filename}\{KeyLength}\{KeyCount}\{KeyType}\{FileNo}"
REM
REM      FileName   Name der Datei, eventuell mit Pfadangabe
REM                 (z.B. C:/DATEN/ARTIKEL.KEY oder ARTIKEL.KEY)
REM
REM      KeyLength  Maximale Länge der Schlüssel
REM
REM      KeyCount   Anzahl Schlüssel (1-200)
REM
REM      KeyType    Art der Schlüssel (A=ASCII Textschlüssel, I=Integer)
REM
REM      FileNo     Nummer der Indexdatei (1-40)


PRINT "Indexdatei wird erstellt ..."

CALL FATSBASIC( "C\KUNDEN.KEY\25\3\A\1", ERRORCODE%, RECNO&, KEYLEN% )
IF ERRORCODE% <> 0 GOTO ENDE


REM  ========================================================================
REM            Datensätze einfügen
REM  ========================================================================

PRINT
PRINT "Es werden jetzt 222 Datensätze in die Datei eingefügt. Für jeden"
PRINT "Datensatz werden 3 Schlüssel in die Indexdatei eingefügt."
INPUT "Bitte [ENTER] drücken...", X$

FOR X=1 TO 222

  GET #1, X
  LSET LOESCHKENNZ$=" "
  LSET ANREDE$=F1$
  LSET NAME$=F2$
  LSET BRANCHE$=F3$
  LSET STRASSE$=F4$
  LSET PLZ$=F5$
  LSET ORT$=F6$

    REM   "I" Insert Record
    REM
    REM  Diesem Befehl wird die im "Create Indexfile"-Befehl
    REM  angegebene Anzahl Schlüssel im Kommandostring übergeben.
    REM  Die Schlüssel werden in die Indexdatei einsortiert und
    REM  einer Satznummer zugeordnet, welche in der "RECNO"
    REM  Variable an das Anwenderprogramm zurückgegeben wird.
    REM
    REM  Anschließend sollte das aufrufende Programm den zugehörigen
    REM  Datensatz entsprechend der zurückgegebenen Satznummer in
    REM  die Datendatei speichern.
    REM
    REM  Die Länge der übergebenen Schlüssel darf die beim
    REM  "Create-Indexfile" angegebene Länge nicht überschreiten,
    REM  kürzere Schlüssel werden mit dem ASCII-Zeichen 00h auf die
    REM  maximale Schlüssellänge erweitert.
    REM
    REM  Der Aufbau des Kommandostrings:
    REM
    REM    szCmnd = "I\{FileNo}\{KeyStr1}[\{KeyStr2}[\{KeyStr3}]]"
    REM
    REM      FileNo     Nummer der Indexdatei
    REM
    REM      KeyStr#    Schlüssel

    CMND$ = "I\1\"
    CMND$ = CMND$ + RTRIM$(NAME$) + "\" + RTRIM$(BRANCHE$) + "\" + RTRIM$(PLZ$ + ORT$)

  CALL FATSBASIC( CMND$, ERRORCODE%, RECNO&, KEYLEN% )
  IF ERRORCODE% <> 0 GOTO ENDE

  PRINT NAME$; " --> Satznummer "; RECNO&
  PUT #2, RECNO&

NEXT X

CLOSE #1

REM   "K" Close Indexfile
REM
REM  Mit diesem Befehl schließen Sie die über "FileNo"
REM  angegebene Indexdatei.
REM
REM  Wenn Sie den Datencache mit dem Befehl Auto Refresh (Y)
REM  aktiviert haben, dann werden eventuell noch im Cachepuffer
REM  befindliche Daten automatisch auf die Platte geschrieben,
REM  was Sie jedoch auch jederzeit mit dem Befehl Write Page
REM  Map (W) erzwingen können.
REM
REM  Wenn der Datencache inaktiv ist, dann werden nach jedem
REM  FATS-Befehl sämtliche veränderten Daten auf die Platte
REM  geschrieben. Das Schließen der Dateien ist daher nur vor dem
REM  Beenden des aufrufenden Programmes notwendig.
REM
REM  Wenn Sie den Parameter "FileNo" weglassen, dann werden alle
REM  geöffneten Indexdateien geschlossen. Diese Variante empfiehlt
REM  sich vor der Beendigung des Anwendungsprogrammes.
REM
REM  Der Aufbau des Kommandostrings:
REM
REM    szCmnd = "K\{FileNo}"
REM
REM      FileNo     Nummer der Indexdatei

CALL FATSBASIC( "K\1", ERRORCODE%, RECNO&, KEYLEN% )


REM  ========================================================================
REM            Suche im Index
REM  ========================================================================


REM   "O" Open Indexfile
REM
REM  Mit diesem Befehl wird die über "FileName" bestimmte
REM  Indexdatei mit den über den Befehl Auto Refresh (Y)
REM  definierten Öffnungsflags geöffnet und der Dateinummer
REM  "FileNo" zugewiesen. Diese Nummer muß bei allen nach-
REM  folgenden FATS-Befehlen angegeben werden, um mit der
REM  Indexdatei zu arbeiten.
REM  Eine eventuell mit der gleichen Dateinummer bereits
REM  geöffnete Indexdatei wird zuvor geschlossen.
REM
REM  Beachten Sie bei der Dateipfadangabe, daß der Backslash
REM  (\) von FATS als Trennzeichen behandelt wird und daher
REM  im Pfad durch einen normalen Schrägstrich ersetzt werden
REM  sollte.
REM  Alternativ dazu können Sie auch das Trennzeichen
REM  umdefinieren, indem Sie dieses als erstes Zeichen im
REM  Befehlsstring angeben, z.B. szCmnd = "&O&C:\ARTIKEL.KEY&1"
REM  (das Trennzeichen muß ein ASCII-Zeichen kleiner als 48 sein).
REM
REM  Der Aufbau des Kommandostrings:
REM
REM    szCmnd = "O\{FileName}\{FileNo}"
REM
REM      FileName   Name der Datei, eventuell mit Pfadangabe
REM                 (z.B. C:/DATEN/ARTIKEL.KEY oder ARTIKEL.KEY)
REM
REM      FileNo     Nummer der Indexdatei

CALL FATSBASIC( "O\KUNDEN.KEY\1", ERRORCODE%, RECNO&, KEYLEN% )


REM  -------> Datensätze nach Name sortiert ausgeben

PRINT
PRINT "Die Datensätze werden jetzt anhand des ersten Schlüssels (NAME)"
PRINT "aufsteigend sortiert ausgegeben. Der dabei verwendete FATS-Befehl"
PRINT "SEARCH NEXT AFTER kann im Einzelplatz und im Netzwerk verwendet"
PRINT "werden."
PRINT
INPUT "Bitte [ENTER] drücken...", X$


REM   "F" Search First
REM
REM  Dieser Befehl gibt die Datensatznummer und den Schlüsselwert
REM  des kleinsten Schlüssels der angegebenen Schlüsselnummer
REM  zurück.
REM
REM  Der Aufbau des Kommandostrings:
REM
REM    szCmnd = "F\{KeyNo}\{FileNo}"
REM
REM      KeyNo      Schlüsselnummer
REM
REM      FileNo     Nummer der Indexdatei

CMND$ = "F\1\1"

SCHLEIFE1:

  CALL FATSBASIC( CMND$, ERRORCODE%, RECNO&, KEYLEN% )
  IF ERRORCODE% <> 0 GOTO WEITER1

  FATSKEY$ = SPACE$( KEYLEN% )
  CALL FATSGETKEY( FATSKEY$ )

  GET #2, RECNO&
  PRINT NAME$; " --> Satznummer "; RECNO&

  REM   "A" Search Next After
  REM
  REM  Dieser Befehl sucht den über "KeyString" und "RecNo"
  REM  spezifizierten Schlüssel in der Indexdatei und blättert dann
  REM  um eine Position weiter.
  REM  Als Ergebnis wird der auf den angegebenen Schlüssel folgende
  REM  Schlüssel zurückgegeben. Der Aufruf entspricht daher den
  REM  Befehlen Search Generic (G) mit anschließendem Search Next (N).
  REM
  REM  Im Gegensatz zum Befehl "Search Next" kann dieser Befehl auch
  REM  problemlos im Netzwerk verwendet werden.
  REM
  REM  Der Aufbau des Kommandostrings:
  REM
  REM    szCmnd = "A\{KeyNo}\{RecNo}\{FileNo}\{KeyString}"
  REM
  REM      KeyNo      Schlüsselnummer
  REM
  REM      RecNo      Datensatznummer
  REM
  REM      FileNo     Nummer der Indexdatei
  REM
  REM      KeyString  Schlüssel

  CMND$ = "A\1\" + STR$( RECNO& ) + "\1\" + FATSKEY$
  GOTO SCHLEIFE1

WEITER1:


REM  --------> Datensätze nach Branche sortiert ausgeben

PRINT
PRINT "Die Datensätze werden jetzt anhand des zweiten Schlüssels (BRANCHE)"
PRINT "aufsteigend sortiert ausgegeben."
PRINT
INPUT "Bitte [ENTER] drücken...", X$

CMND$ = "F\2\1"

SCHLEIFE2:

  CALL FATSBASIC( CMND$, ERRORCODE%, RECNO&, KEYLEN% )
  IF ERRORCODE% <> 0 GOTO WEITER2

  GET #2,RECNO&
  PRINT BRANCHE$; " "; NAME$; " --> Satznummer "; RECNO&

  REM   "N" Search Next
  REM
  REM  Dieser Befehl gibt die Datensatznummer und den
  REM  Schlüsselwert des nächsten Schlüssels zurück.
  REM  Ausgegangen wird dabei vom Ergebnis des letzten
  REM  Suchbefehls, d.h. unmittelbar vor der Anwendung
  REM  dieses Befehls muß ein beliebiger Such-Befehl,
  REM  ausgeführt worden sein.
  REM
  REM  Jede Veränderung der Indexdatei durch das Einfügen
  REM  oder Löschen von Schlüsseln macht einen für diesen
  REM  Befehl notwendigen internen Zeiger ungültig, wodurch
  REM  der Next-Befehl fehlschlägt. Da dies im Netzwerk auch
  REM  von einer anderen Station aus passieren kann, sollte
  REM  in Netzwerkumgebungen der Befehl Search Next After (A)
  REM  verwendet werden.
  REM
  REM  Wenn es keinen nächsten Schlüssel gibt, d.h. der zuletzt
  REM  gefundene Schlüssel der Letzte in Folge war, wird der
  REM  Fehlercode #15 zurückgegeben.
  REM
  REM  Der Aufbau des Kommandostrings:
  REM
  REM    szCmnd = "N\{FileNo}"
  REM
  REM      FileNo     Nummer der Indexdatei

  CMND$ = "N\1"
  GOTO SCHLEIFE2

WEITER2:


REM  --------> Datensätze nach PLZ & Ort sortiert ausgeben

PRINT
PRINT "Die Datensätze werden jetzt anhand des dritten Schlüssels (PLZ/ORT)"
PRINT "absteigend sortiert ausgegeben."
PRINT
INPUT "Bitte [ENTER] drücken...", X$


REM   "L" Search Last
REM
REM  Dieser Befehl gibt die Datensatznummer und den Schlüsselwert
REM  des größten Schlüssels der angegebenen Schlüsselnummer zurück.
REM
REM  Der Aufbau des Kommandostrings:
REM
REM    szCmnd = "L\{KeyNo}\{FileNo}"
REM
REM      KeyNo      Schlüsselnummer
REM
REM      FileNo     Nummer der Indexdatei

CMND$ = "L\3\1"

SCHLEIFE3:

  CALL FATSBASIC( CMND$, ERRORCODE%, RECNO&, KEYLEN% )
  IF ERRORCODE% <> 0 GOTO WEITER3

  FATSKEY$ = SPACE$( KEYLEN% )
  CALL FATSGETKEY( FATSKEY$ )

  GET #2, RECNO&
  PRINT PLZ$; " "; ORT$; " "; NAME$; " --> Satznummer "; RECNO&

  REM   "E" Search Previous Before
  REM
  REM  Dieser Befehl sucht den über "KeyString" und "RecNo"
  REM  spezifizierten Schlüssel in der Indexdatei und blättert dann
  REM  um eine Position zurück.
  REM  Als Ergebnis wird der dem angegebenen Schlüssel vorangehende
  REM  Schlüssel zurückgegeben. Der Aufruf entspricht daher den
  REM  Befehlen "Search Generic" mit anschließendem "Search Prev".
  REM
  REM  Im Gegensatz zum Befehl "Search Previous" kann dieser Befehl
  REM  auch problemlos im Netzwerk verwendet werden.
  REM
  REM  Der Aufbau des Kommandostrings:
  REM
  REM    szCmnd = "E\{KeyNo}\{RecNo}\{FileNo}\{KeyString}"
  REM
  REM      KeyNo      Schlüsselnummer
  REM
  REM      RecNo      Datensatznummer
  REM
  REM      FileNo     Nummer der Indexdatei
  REM
  REM      KeyString  Schlüssel

  CMND$ = "E\3\" + STR$( RECNO& ) + "\1\" + FATSKEY$
  GOTO SCHLEIFE3

WEITER3:

ENDE:

REM  --------> Indexdatei schließen

CALL FATSBASIC( "K\1", ERRORCODE%, RECNO&, KEYLEN% )

CLOSE #2

END

© 2008  GCS Software, Udo Gertz