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


FATS ist aufrufkompatibel zu der Dateiverwaltung FABS PLUS, dadurch ist die Einbindung des Programmes in bestehende, auf FABS basierende Anwendungsprogramme ohne Quelltextänderungen durch Austausch der OBJ-Module erledigt.

Sämtliche Programmierschnittstellen dieser Software wurden nachgebildet. Sie können auch in Kombination mit den neuen verbesserten Schnittstellen von FATS verwendet werden, um so einen schrittweisen Umstieg zu ermöglichen.

Das nachfolgende Microsoft Pascal Beispiel demonstriert die Verwendung der von FATS bereitgestellten  FABS PLUS kompatiblen Befehle:

{ FATS Basis Demo für MS Pascal (kompatible Schnittstelle) }

program TST0_GER (input,output);

type

  fatskeystr = string(25);

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


const

  dn_demo = '..\..\..\DEMODATA\KUNDEN.ASC';
  dn_kund = 'KUNDEN.DAT';

var
  hKunden: file of kundenrec;
  hDemodata: text;
  kpuffer: kundenrec;
  szCmnd: lstring(255);
  lpFatsKey: ads of fatskeystr;
  szFatskey: fatskeystr;
  szRecno: lstring(8);
  uErrorcode, count: word;
  dwRecno: integer4;
  cChar: char;


function fbspas (vars szCmnd : lstring; vars uErrorcode: word) : word; extern;

function fbpas1 (vars szCmnd : lstring; vars uErrorcode: word;
                 vars pKeyadr : word) : word; extern;

function gfseg1: word; extern;


function fatscall: integer4;
Var uKeyOfs : Word;
Var dwRecno : integer4;
begin
  dwRecno := fbpas1(szCmnd, uErrorcode, uKeyOfs);
  lpFatsKey.r:=uKeyOfs;
  lpFatsKey.s:=gfseg1;
  szFatsKey:=lpFatsKey^;
  fatscall:=dwRecno;
end;


begin

  writeln ('Dieses Programm muß mit MS-Pascal übersetzt werden.');
  writeln;
  writeln ('Folgendes Objektmodul benötigen Sie: FATS.OBJ');
  writeln ('Bitte [ENTER] drücken...');
  read(cChar);

  { -------> ASCII-Datei mit Demodaten öffnen }

  assign (hDemodata, dn_demo);
  reset (hDemodata);

  { -------> Datendatei erstellen }

  writeln ('Datendatei wird erstellt ...');
  assign  (hKunden, dn_kund);
  hKunden.mode:=direct;
  rewrite (hKunden);

  { -------> Indexdatei erstellen }

  writeln ('Indexdatei wird erstellt ...');
  szCmnd:='C\KUNDEN.KEY\25\3\A\1';
  dwRecno:=fbspas(szCmnd, uErrorcode);

  { -------> Datensätze einfügen }

  writeln;
  writeln ('Es werden jetzt 222 Datensätze in die Datei eingefügt. Für jeden');
  writeln ('Datensatz werden 3 Schlüssel in die Indexdatei eingefügt.');
  writeln ('Bitte [ENTER] drücken...'); read(cChar);

  count:=0;
  repeat
     kpuffer.LOESCHKENNZ:=' ';
     read(hDemodata, kpuffer.ANREDE);
     read(hDemodata, kpuffer.NAME);
     read(hDemodata, kpuffer.BRANCHE);
     read(hDemodata, kpuffer.STRASSE);
     read(hDemodata, kpuffer.PLZ);
     read(hDemodata, kpuffer.ORT);
     szCmnd:='I\1\';
     concat(szCmnd, kpuffer.NAME);
     concat(szCmnd, '\');
     concat(szCmnd, kpuffer.BRANCHE);
     concat(szCmnd, '\');
     concat(szCmnd, kpuffer.PLZ);
     concat(szCmnd, kpuffer.ORT);
     dwRecno:=fbspas(szCmnd, uErrorcode);
     seek(hKunden, dwRecno);
     hKunden^:=kpuffer;
     put(hKunden);
     writeln(kpuffer.NAME,' --> Satznummer ', dwRecno:-8);
     count:=count+1;
  until (count = 222) or (uErrorcode <> 0);

  close(hDemodata);

  { -------> Datensätze nach Name sortiert ausgeben }

  writeln;
  writeln ('Die Datensätze werden jetzt anhand des ersten Schlüssels (NAME)');
  writeln ('aufsteigend sortiert ausgegeben. Der dabei verwendete FATS-Befehl');
  writeln ('SEARCH NEXT AFTER kann im Einzelplatz und im Netzwerk verwendet');
  writeln ('werden. Bitte [ENTER] drücken...');
  read(cChar);

  szCmnd:='F\1\1';
  repeat
    dwRecno:=fatscall;
    if (uErrorcode = 0) and (encode(szRecno, dwRecno:8)) then begin
      seek(hKunden, dwRecno);
      get(hKunden);
      kpuffer:=hKunden^;
      writeln(kpuffer.NAME, ' --> Satznummer ', dwRecno:-8);
      szCmnd:='A\1\';
      concat(szCmnd, szRecno);
      concat(szCmnd, '\1\');
      concat(szCmnd, szFatskey);
    end;
  until uErrorcode <> 0;

  { -------> Datensätze nach Branche sortiert ausgeben }

  writeln;
  writeln ('Die Datensätze werden jetzt anhand des zweiten Schlüssels (BRANCHE)');
  writeln ('aufsteigend sortiert ausgegeben.');
  writeln ('Bitte [ENTER] drücken...');
  read(cChar);

  szCmnd:='F\2\1';
  repeat
    dwRecno:=fatscall;
    if uErrorcode = 0 then begin
      seek(hKunden, dwRecno);
      get(hKunden);
      kpuffer:=hKunden^;
      writeln(kpuffer.BRANCHE, ' ', kpuffer.NAME, ' --> Satznummer ', dwRecno:-8);
      { **** Nur für Einzelplatzsysteme geeignet: SEARCH NEXT **** }
      szCmnd:='N\1';
    end;
  until uErrorcode <> 0;

  { -------> Datensätze nach PLZ & Ort sortiert ausgeben }

  writeln;
  writeln ('Die Datensätze werden jetzt anhand des dritten Schlüssels (PLZ/ORT)');
  writeln ('absteigend sortiert ausgegeben.');
  writeln ('Bitte [ENTER] drücken...');
  read(cChar);

  szCmnd:='L\3\1';
  repeat
    dwRecno:=fatscall;
    if (uErrorcode = 0) and (encode(szRecno, dwRecno:8)) then begin
      seek(hKunden, dwRecno);
      get(hKunden);
      kpuffer:=hKunden^;
      writeln(kpuffer.PLZ,' ', kpuffer.ORT, ' ', kpuffer.NAME, ' --> Satznummer ', dwRecno:-8);
      szCmnd:='E\3\';
      concat(szCmnd, szRecno);
      concat(szCmnd, '\1\');
      concat(szCmnd, szFatskey);
    end;
  until uErrorcode <> 0;

  { -------> Indexdatei schließen }

  szCmnd:='K\1';
  dwRecno:=fbspas(szCmnd, uErrorcode);

  close(hKunden);

end.
 

© 2008  GCS Software, Udo Gertz