| ![]() | ||||||||||||||||||||
Mit den Dieser Index ermöglicht es FATS, jeden Datensatz durch Angabe beliebiger Begriffe in Sekundenbruchteilen zu finden. FATS stellt dem Anwendungsprogramm unmittelbar nach der Suche eine Liste aller gefundener Satznummern bzw. Primary-Keys zur Verfügung. Das nachfolgende Microsoft Pascal Beispiel demonstriert die Verwendung der FATS Matchcode-Befehle:
 FATS-Matchcode Befehlen läßt sich auf einfachste Weise ein Volltext-Index mit dem Inhalt der von Ihnen gewünschten Spalten bzw. Felder einer Datentabelle bzw. -datei erstellen.
Jedes Wort und jede Zahl wird in den Index aufgenommen, es wird eine "invertierte Liste" erstellt.
| "MC" Create Matchcode File (Matchcode-Indexdatei definieren, erstellen und öffnen.) | |
| "MB" Build Matchcode (Inhalte der Datenspalten in den Matchcode-Index einfügen.) | |
| "O" Open Indexfile (Indexdatei öffnen.) | |
| "MS" Search in Matchcode (Matchcode-Suchabfrage durchführen.) |
(*
FATS Extended Demo für Microsoft Pascal / IBM Pascal
Dieses Testprogramm benötigt die erweiterte Version von FATS (FATSXWE.EXE)
Es zeigt die Verwendung der Befehle: 'MC', 'MB', 'MS' und 'MA'
*)
program TST2_GER (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
dn_kund = 'KUNDEN.DAT';
var
szCmnd: lstring(255);
szFATSkey: lstring(255);
uFATSError: word;
dwFATSRecno: integer4;
hKunden: file of kundenrec;
kdata: kundenrec;
dwCurRecno: integer4;
szRecno: lstring(8);
cChar: char;
function FATSCALL (vars cmnd: lstring; vars errorcode: word;
vars fatskey: lstring) : integer4; extern;
begin
writeln ('FATS Extended Testprogramm (Kommandos "MC", "MB", "MS" und "MA")');
writeln ('Dieses Programm wurde für MS-Pascal entworfen.');
writeln;
writeln ('Folgende Kommandos generieren die ausführbare Datei:');
writeln;
writeln (' PAS1 TST2_GER');
writeln (' PAS2');
writeln (' LINK TST2_GER FATSXMPR.LIB');
writeln;
writeln ('Bitte [ENTER] drücken...');
read( cChar );
(*
FATS Extended Workstation Engine starten/beenden:
Starten: FATSXWE
Beenden: FATSXWE -unload
*)
(*
-------> Datendatei öffnen
*)
writeln ('Datendatei wird geöffnet ...');
assign (hKunden, dn_kund);
hKunden.mode:=direct;
reset (hKunden);
(*
========================================================================
Matchcode generieren
========================================================================
*)
(*
-------> Matchcode Datei erstellen
Der Matchcode wird mit dem Kommando
"MC" Create Matchcode File
generiert. Dabei geben Sie die logischen Suchgruppen und deren
Eigenschaften an. Eine Suchgruppe besteht aus dem Inhalt eines
oder mehrerer Datenfelder, in denen bei Angabe der Suchbegriffe
gemeinsam gesucht werden soll.
In diesem Beispiel werden folgende Suchgruppen definiert:
Suchgruppe Felder
I1 NAME
I2 BRANCHE
I3 PLZ & ORT
Der Aufbau des Kommandostrings:
szCmnd = "MC\{FileName}\{Flags}\{FileNo}\{Col1def}[\{Col2def}]"
FileName Name der Matchcode-Datei, eventuell mit Pfadangabe
(z.B. C:/DATEN/KUNDEN.FMS oder KUNDEN.FMS)
Flags Momentan noch nicht benutzt
FileNo Nummer der Matchcode-Indexdatei
Col#def Definition der Datenspalte # (Flags, durch Komma getrennt).
Der Inhalt der entsprechenden Datenspalten wird später den
Befehlen "MB", "MI" und "MD" in der durch diesen Befehl
festgelegten Reihenfolge übergeben.
I# Spalteninhalt in der Suchgruppe # (1-32) indizieren.
Sie können mehrere Spalten zu einer logischen Suchgruppe
zusammenfassen (z.B. Vorname, Nachname).
An dieser Stelle sind noch weitere Einstellungen möglich,
die ausführlich im Benutzerhandbuch beschrieben sind.
*)
writeln;
writeln ('Matchcode-Datei wird erstellt ...');
szCmnd:='MC\KUNDEN.FTS\\1\I1\I2\I3';
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 Fehlercode: '); write (uFATSError);
writeln (' (Kommando: MC)');
writeln;
End;
Return;
End;
(*
-------> Texte einfügen
Nachdem die Datei definiert und erzeugt wurde, wird der Inhalt der
Datensätze mit dem Kommando
"MB" Build Matchcode in die Datei
eingefügt. Dabei dient die Definition, welche Sie über den Befehl
"MC" festgelegt haben, als Schablone für dieses Kommando.
Syntax des Kommandostrings:
szCmnd = "MB\{FileNo}\{RecNo}\{Col1data}[\{Col2data}[\{Col3data}]]"
FileNo Nummer der Matchcode-Indexdatei
RecNo <> 0 Datensatz- bzw. ID-Nummer
== 0 Matchcode-Indizierung beenden
Col#data Inhalt der Datenspalte X
*)
writeln;
writeln ('Der Matchcode wird jetzt aufgebaut');
writeln;
writeln ('Bitte [ENTER] drücken...');
writeln;
read( cChar );
dwCurRecno:=0;
Repeat
seek(hKunden, dwCurRecno + 1);
get(hKunden);
If NOT EOF( hKunden ) Then Begin
dwCurRecno:=dwCurRecno + 1;
kdata:=hKunden^;
szCmnd:='MB\1\';
If encode(szRecno, dwCurRecno:8) Then concat(szCmnd, szRecno);
If kdata.LOESCHKENNZ = ' ' Then Begin
concat (szCmnd, '\');
concat (szCmnd, kdata.NAME);
concat (szCmnd, '\');
concat (szCmnd, kdata.BRANCHE);
concat (szCmnd, '\');
concat (szCmnd, kdata.PLZ);
concat (szCmnd, ' ');
concat (szCmnd, kdata.ORT);
End;
dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);
If uFATSError <> 0 Then Begin
(*
Wenn bei der Generierung des Matchcode-Indizes ein Fehler
auftritt, dann wird die entsprechende Datei automatisch
geschlossen.
*)
write ('FATS Fehlercode: '); write (uFATSError);
writeln (' (Kommando: MB)');
writeln;
break;
End;
writeln (kdata.NAME,' --> Satznummer ', dwCurRecno:-8);
End Else Begin
(*
Nachdem der letzte Datensatz indiziert wurde, wird die
Indizierung durch die Angabe einer Null anstelle einer
gültigen Datensatznummer beendet ("MB\{Dateinummer}\0").
Die Datei wird dabei geschlossen - ein Close-Befehl ist
danach nicht mehr nötig.
*)
szCmnd:='MB\1\0';
dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);
break;
End;
Until uFATSError <> 0;
If dwCurRecno = 0 Then Begin
writeln;
writeln( 'Die Datendatei KUNDEN.DAT existiert nicht oder enthält keine' );
writeln( 'Datensätze. Bitte generieren Sie diese Datei mit dem Test-' );
writeln( 'programm TST0_GER.PAS oder TST1_GER.PAS' );
return;
End;
(*
========================================================================
Matchcode Suche
========================================================================
*)
(*
-------> Matchcode Datei öffnen
Mit dem Befehl
"O" Open Indexfile wird eine Matchcode-
Indexdatei mit den über den Befehl Auto Refresh ("Y")
definierten Öffnungsflags geöffnet und der Dateinummer
"FileNo" zugewiesen. Diese Nummer muß bei allen nach-
folgenden FATS-Befehlen angegeben werden, um mit der
Indexdatei zu arbeiten.
*)
szCmnd:='O\KUNDEN.FTS\1';
dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);
(*
-------> In der Suchgruppe 1 (NAME) suchen
Der Befehl
"MS" Search in Matchcode führt eine Matchcode-Abfrage
durch und erstellt eine Ergebnistabelle mit den Datensatz- bzw.
ID-Nummern der Datensätze, welche die gesuchten Begriffe beinhalten.
Bei erfolgreicher Verarbeitung (Errorcode == 0) wird der Applikation
die Datensatz- bzw. ID-Nummer des ersten Treffers über die Variable
"dwRecno" zur weiteren Verarbeitung zur Verfügung gestellt.
Die Ergebnistabelle kann anschließend mit den Browserbefehlen
("MA", "ME", "MN", "MP" etc.) ausgelesen werden.
Der Aufbau des Kommandostrings:
szCmnd = "MS\{FileNo}\{Flags}\{Total}\{SearchGrp1}[\{SearchGrp2}...]"
FileNo Nummer der Indexdatei
Flags Der Suchvorgang kann durch die Angabe verschiedener
Flags beeinflußt werden. Eine Beschreibung der Flags
finden Sie in der Befehlsreferenz.
Total Maximale Anzahl Treffer in der Ergebnistabelle:
0 Es werden alle Treffer in die Ergebnistabelle
gestellt. Diese Einstellung arbeitet sehr schnell,
es findet aber auch keine Sortierung anhand der
Trefferqualität statt.
> 0 Es wird versucht, die angegebene Anzahl Treffer in
die Ergebnistabelle zu stellen. Diese Treffer werden
einer Sortierung bezüglich ihrer Qualität unterzogen
und dann in eine von 7 Sortiergruppen eingeordnet.
SearchGrp# Hier werden die in der Suchgruppe # gesuchten Begriffe
angegeben.
Für die Auswertung der Ergebnistabelle können abhängig von der
Programmlogik verschiedene FATS-Befehle verwendet werden.
In dem folgenden Beispiel werden alle Treffer auf den Bildschirm
ausgegeben:
*)
writeln;
writeln ('Es wird jetzt in der Suchgruppe 1 (NAME) nach GMBH gesucht');
writeln;
writeln ('Bitte [ENTER] drücken...');
writeln;
read( cChar );
szCmnd:='MS\1\\0\GMBH';
Repeat
dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);
If uFATSError = 0 Then Begin
seek(hKunden, dwFATSRecno);
get(hKunden);
kdata:=hKunden^;
writeln(kdata.NAME, ' | ', kdata.BRANCHE);
writeln(kdata.PLZ, ' ', kdata.ORT, '(#', dwFATSRecno:-8, ')');
writeln;
szCmnd:='MA\1\';
If encode(szRecno, dwFATSRecno:8) Then concat(szCmnd, szRecno);
End;
Until uFATSError <> 0;
(*
--------> Verknüpfte Suche über Branche / Ort
*)
writeln;
writeln ('Es wird jetzt eine verknüpfte Suche über die Suchgruppen');
writeln ('2 (Branche) und 3 (PLZ, Ort) gestartet.');
writeln ('Gesucht werden alle GROßHANDlungen in STUTTgart.');
writeln;
writeln ('Bitte [ENTER] drücken...');
writeln;
read( cChar );
szCmnd:='MS\1\\0\\großhand\stutt';
Repeat
dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);
If uFATSError = 0 Then Begin
seek(hKunden, dwFATSRecno);
get(hKunden);
kdata:=hKunden^;
writeln(kdata.NAME, ' | ', kdata.BRANCHE);
writeln(kdata.PLZ, ' ', kdata.ORT, '(#', dwFATSRecno:-8, ')');
writeln;
szCmnd:='MA\1\';
If encode(szRecno, dwFATSRecno:8) Then concat(szCmnd, szRecno);
End;
Until uFATSError <> 0;
(*
--------> Matchcode Datei schließen
*)
szCmnd:='K\1';
dwFATSRecno:=FATSCALL(szCmnd, uFATSError, szFATSkey);
close( hKunden );
End.
© 2008
GCS Software, Udo Gertz