|
Das nachfolgende C/C++ Beispiel demonstriert die Verwendung der von FATS bereitgestellten  Index-Befehle:
/* FATS 02.30 (c) GCS Software, Udo Gertz 1993-1998 Testprogramm (Watcom C for OS/2) Schnelle Re-Indizierung (Befehl "XB") Es wird die erweiterte FATS Version benötigt. 19-03-2009 U.Gertz */ #include <stdio.h> #include <io.h> #include <fcntl.h> #include <sys\types.h> #include <sys\stat.h> #include <stdlib.h> #include <string.h> #include <mem.h> #include "FATS.h" struct kdat { char LOESCHKENNZ; char ANREDE[6]; char NAME[26]; char BRANCHE[26]; char STRASSE[26]; char PLZ[6]; char ORT[21]; }; char szCmnd[256]; char szFATSkey[256]; unsigned int uFATSError; unsigned long dwFATSRecno; struct kdat kdata; main () { int hKunden; int nIOresult; unsigned long dwRecords = 0L; void * lpFATSData; /* Datenbereich initialisieren */ lpFATSData = FATSLibInit(0, 2); hKunden = open( "KUNDEN.DAT", O_RDWR ); setmode(hKunden, O_BINARY); /* -------> 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) */ printf( "Indexdatei wird erstellt ...\n\n" ); dwFATSRecno = FATSLibCall( "C\\KUNDEN.KEY\\25\\3\\A\\1", &uFATSError, szFATSkey, lpFATSData ); if ( uFATSError ) { printf( "\n" ); if ( uFATSError == -1 ) { printf( "FATS Workstation Engine ist nicht aktiviert.\n" ); printf( "Bitte starten Sie die Engine durch Eingabe von FATSXWE\n" ); } else { printf( "FATS Fehlercode: %i (Command: C)\n", uFATSError ); } return ( uFATSError ); } /* ======================================================================== Indexdatei wiederherstellen ======================================================================== */ do { nIOresult = read( hKunden, &kdata, sizeof( kdata ) ); if ( nIOresult != sizeof( kdata ) ) { /* 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. */ dwFATSRecno = FATSLibCall( "XB\\1\\0", &uFATSError, szFATSkey, lpFATSData ); break; } dwRecords++; if ( !kdata.LOESCHKENNZ ) { /* "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 */ sprintf( szCmnd, "XB\\1\\%lu\\%s\\%s\\%s%s", dwRecords, kdata.NAME, kdata.BRANCHE, kdata.PLZ, kdata.ORT ); } else { /* Datensatz als "Gelöscht" markieren */ sprintf( szCmnd, "DL\\%lu\\S\\1", dwRecords ); } dwFATSRecno = FATSLibCall( szCmnd, &uFATSError, szFATSkey, lpFATSData ); } while ( !uFATSError ); /* Datenbereich freigeben */ lpFATSData = FATSLibExit( lpFATSData ); close( hKunden ); }
© 2008 GCS Software, Udo Gertz