FATS - Fast Access Tree System
Inhaltsverzeichnis
Programmierschnittstellen
IBM-Pascal, MS-Pascal, Quick Pascal


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

(*

   FATS 02.30
   (c) GCS Software, Udo Gertz 1993-1998

   Testprogramm (Microsoft Pascal, IBM Pascal)
 
   Schnelle Re-Indizierung (Befehl "XB")
   Es wird die erweiterte FATS Version benötigt.

   19-03-2009 U.Gertz
*) 

program REINDGER (input, output);


type

  kundenrec = record
      LOESCHKENNZ: char;
      ANREDE: lstring(5);
      NAME: lstring(25);
      BRANCHE: lstring(25);
      STRASSE: lstring(25);
      PLZ: lstring(5);
      ORT: lstring(20);
   end;


const

  fn_cust = 'KUNDEN.DAT';


var
  hKunden: file of kundenrec;
  kpuffer: kundenrec;
  szCmnd: lstring(255);
  szFATSkey: lstring(255);
  szRecno: lstring(8);
  uFATSError: word;
  dwFATSRecno: integer4;
  dwRecords: integer4;


       function FATSCALL (vars szCmnd: lstring; vars nErrorcode: word;
                          vars szReturnKey: lstring) : integer4; extern;


begin

  assign  (hKunden, fn_cust);
  hKunden.mode:=direct;
  reset (hKunden);


  (*
     -------> Indexdatei erstellen
  *) 

  (*
      "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\KUNDEN.KEY\25\3\A\1';
  dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);

  If uFATSError <> 0 Then Begin

    writeln;
    If uFATSError = -1 Then Begin

      writeln ('FATS Workstation Engine ist nicht aktiviert.');
      writeln ('Bitte starten Sie die Engine durch Eingabe von FATSXWE');

    End Else Begin

      write ('FATS Fehler: '); write (uFATSError);
      writeln (' (Befehl: C)');
      writeln;

    End;

    close( hKunden );
    Return;

  End;


  (*
     ========================================================================
               Indexdatei wiederherstellen
     ========================================================================
  *) 

  dwRecords:=0;

  repeat

    seek(hKunden, dwRecords + 1);
    get(hKunden);
    kpuffer:=hKunden^;

    If EOF( hKunden ) Then Begin

      (*
         Nachdem der letzte Datensatz indiziert wurde, wird die
         Indizierung durch die Angabe einer Null anstelle einer
         gültigen Datensatznummer beendet ("XB\{Dateinummer}\0").
         Die Datei wird dabei geschlossen - ein Close-Befehl ist
         danach nicht mehr nötig.
      *) 

      szCmnd:='XB\1\0';
      dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);
      break;
    End;

    dwRecords:=dwRecords + 1;

    If kpuffer.LOESCHKENNZ = ' ' Then Begin

      (*
          "XB" Re-Indexing: Build
       
         Diesem Befehl wird die im Befehl "C" angegebene Anzahl
         Schlüssel im Kommandostring übergeben. Die Schlüssel
         werden in die Indexdatei einsortiert und der Satznummer
         "RecNo" zugeordnet.
       
         Verwenden Sie diesen Befehl, um nach einem erfolgreichen
         "Create Indexfile" (C) - Befehl innerhalb einer
         Programmschleife die Schlüssel aller Datensätze in den
         Index einzufügen.
         Der Befehl steht nur bei einer Re-Indizierung bereit, d.h.
         unmittelbar nach Ausführung des "C"-Kommandos, spätere
         Änderungen am Index werden z.B. über den Insert Record (I)
         Befehl realisiert.
       
         Das Kommando "XB\{FileNo}\0" beendet die Re-Indizierung und
         schließt die entsprechende Indexdatei. Die Indexdatei wird bei
         einem durch Fehler bedingten vorzeitigen Abbruch der Re-Indizierung
         automatisch geschlossen. In jedem Fall kann ein anschließendes
         Close-Kommando unterbleiben.
       
         Die Länge der übergebenen Schlüssel darf die beim "Create
         Indexfile" (C) 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 = "XB\{FileNo}\{RecNo}\{KeyStr1}[\{KeyStr2}]"
       
             FileNo     Nummer der Indexdatei
       
             RecNo      <> 0 Datensatznummer
                        == 0 Re-Indizierung beenden
       
             KeyStr#    Schlüssel

      *)  

      szCmnd:='XB\1\';
      If encode(szRecno, dwRecords:8) Then concat(szCmnd, szRecno);
      concat (szCmnd, '\');
      concat(szCmnd, kpuffer.NAME);
      concat(szCmnd, '\');
      concat(szCmnd, kpuffer.BRANCHE);
      concat(szCmnd, '\');
      concat(szCmnd, kpuffer.PLZ);
      concat(szCmnd, kpuffer.ORT);

    End Else Begin

      (*
         Datensatz als "Gelöscht" markieren
      *) 

      szCmnd:='DL\';
      If encode(szRecno, dwRecords:8) Then concat(szCmnd, szRecno);
      concat (szCmnd, '\S\1');
    End;

    dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);

  until uFATSError <> 0;


  close(hKunden);

end.

© 2008  GCS Software, Udo Gertz