| ![]() | ||||||||||||||||||||
Das nachfolgende Borland Pascal Beispiel demonstriert die Verwendung der von FATS bereitgestellten
 Index-Befehle:
(*
FATS 02.30
(c) GCS Software, Udo Gertz 1993-1998
Testprogramm (Turbo Pascal Windows 3.x)
Datei KUNDEN.DAT re-indizieren
19-03-2009 U.Gertz
*)
program REBLDGER;
uses WinCrt,
WinProcs;
function FATSLibInit(nSize: integer; nSign: integer): Pointer;
far; external 'FATS_WIN';
function FATSLibExit(lpFATSdata: Pointer): Pointer;
far; external 'FATS_WIN';
function FATSLibCall(var szCmnd: string; var uErrorCode: word;
var szFATSkey: string; lpFATSdata: Pointer): longint;
far; external 'FATS_WIN';
const
fn_kund = 'KUNDEN.DAT';
type
kundenrec = record
LOESCHKENNZ: char;
ANREDE: string[5];
NAME: string[25];
BRANCHE: string[25];
STRASSE: string[25];
PLZ: string[5];
ORT: string[20];
end;
var
hKunden: file of kundenrec;
kpuffer: kundenrec;
lpFATSdata: Pointer;
szCmnd: string;
szFATSkey: string;
szRecno: string[8];
uFATSError: word;
dwFATSRecno: longint;
dwRecords: longint;
label exitbuild;
begin
(*
Bevor Sie die FATS-Befehle in Ihrem Programm verwenden können,
müssen Sie FATS einen Datenbereich zuweisen:
*)
lpFATSdata := FATSLibInit( 0, 1 );
if lpFATSdata = nil then exit;
(*
Der erste Parameter bestimmt die Größe des FATS-Datenbereichs.
Wenn Sie hier eine Null angeben, dann wird der minimal benötigte
Speicherplatz reserviert (ca. 18-20 KB). Der zweite Parameter
bestimmt die eingesetzte Programmiersprache. Die Adresse des
Datenbereichs wird in der Variable lpFatsdata zurückgegeben.
*)
(*
-------> Aktivierung des FATS Cachesystems
Standardmäßig ist die Cacheverwaltung ausgeschaltet. Sie können diese
mit dem Befehl
"Y" Auto Refresh initialisieren.
Mit diesem Befehl können Sie vor einer Reorganisation den FATS-Cache
mittels "Y\5" oder "Y\106" einschalten, die entsprechende Indexdatei
erzeugen oder öffnen und dann die Schlüssel einfügen.
Nach Beenden der Reorganisation stellen Sie den ursprünglichen Zustand
mit "Y\0", "Y\2" etc. wieder her. Die Operation kann dadurch im
günstigsten Fall bis zu 30x schneller ablaufen.
Bei der Einstellung "Y\5" werden die Daten nicht sofort nach jedem
schreibenden Befehl auf die Platte geschrieben, sondern solange in den
FATS internen Cachepuffern behalten, bis diese überlaufen. Beim ersten
Schreibzugriff werden jedoch sämtliche zu der jeweiligen Datei gehörende
Puffer auf die Platte geschrieben, wodurch die Integrität der Indexdatei
garantiert wird. Das Zurückschreiben der Cachepuffer kann auch jederzeit
durch den Befehl W (Write Page Map) erreicht werden.
Diese Einstellung bringt im günstigsten Fall eine bis zu 30-fache
Beschleunigung gegenüber den herkömmlichen Einstellungen ("Y\0" & "Y\2"),
es muß jedoch selbst dafür gesorgt werden, daß die Indexdatei bei
Beendigung des Programmes mit dem Befehl Close Indexfile (K) geschlossen
wird.
Als Äquivalent im Netzwerkbetrieb dient der Befehl "Y\106"
*)
szCmnd:='Y\5';
dwFATSRecno:=FATSLibCall(szCmnd, uFATSError, szFATSkey, lpFATSdata);
(*
-------> Datendatei öffnen
*)
assign (hKunden, fn_kund);
reset (hKunden);
(*
-------> Indexdatei erstellen
*)
szCmnd:='C\KUNDEN.KEY\25\3\A\1';
dwFATSRecno:=FATSLibCall(szCmnd, uFATSError, szFATSkey, lpFATSdata);
(*
========================================================================
Indexdatei wiederherstellen
========================================================================
*)
dwRecords:=0;
repeat
If EOF( hKunden ) Then Begin
goto exitbuild;
End;
seek(hKunden, dwRecords);
read(hKunden, kpuffer);
dwRecords:=dwRecords + 1;
str(dwRecords, szRecno);
If kpuffer.LOESCHKENNZ = ' ' Then Begin
(*
"BK" Build Keys
Diesem Befehl wird die im Befehl Create Indexfile (C)
angegebene Anzahl Schlüssel im Kommandostring übergeben.
Die Schlüssel werden in die Indexdatei einsortiert und
der Satznummer "RecNo" zugeordnet.
Dieser Befehl entspricht dem Befehl Insert Keys (IK), die
Daten werden jedoch nicht sofort nach dem Befehl auf die
Platte geschrieben, sondern solange in den FATS internen
Cachepuffern behalten, bis diese überlaufen.
Der Aufbau des Kommandostrings:
szCmnd = "BK\{RecNo}\{FileNo}\{KeyStr1}[\{KeyStr2}[\{KeyStr3}]]"
RecNo Datensatznummer
FileNo Nummer der Indexdatei
KeyStr# Schlüssel
*)
szCmnd:='BK\' + szRecno + '\1';
szCmnd:=szCmnd + '\' + kpuffer.NAME;
szCmnd:=szCmnd + '\' + kpuffer.BRANCHE;
szCmnd:=szCmnd + '\' + kpuffer.PLZ + kpuffer.ORT;
End Else Begin
(*
"DL" Manipulate Deleted List
*)
szCmnd:='DL\' + szRecno + '\S\1';
End;
dwFATSRecno:=FATSLibCall(szCmnd, uFATSError, szFATSkey, lpFATSdata);
until uFATSError <> 0;
exitbuild:
(*
--------> Indexdatei schließen
*)
szCmnd:='K\1';
dwFATSRecno:=FATSLibCall(szCmnd, uFATSError, szFATSkey, lpFATSdata);
close(hKunden);
(*
Vor dem Beenden des Anwendungsprogrammes sollten Sie den mit der
Funktion FATSLibInit reservierten Speicherbereich wieder freigeben.
Dafür steht die Funktion FATSLibExit zur Verfügung:
*)
lpFATSdata := FATSLibExit( lpFATSdata );
(*
Obwohl der Speicherbereich notfalls auch vom Betriebssystem
automatisch freigegeben würde, ist dieser Befehl nützlich, da
er sämtliche noch geöffneten FATS-Dateien ordnungsgemäß schließt.
*)
end.
© 2008
GCS Software, Udo Gertz