| |
|
In der letzten Folge unserer ISAM & PRIMA-Serie kommen wir nun zu dem Teil, der sich mit der Indexsequentiellen Datenzugriffsmethode (ISAM) beschäftigt. Zunächst sei noch einmal kurz erklärt, was eine Index-sequentielle Datei ist.
Eine ISAM-Datei kann wahlfrei (also mit Direktzugriff auf einen ganz bestimmten Datensatz) oder auch sequentiell (vorwärts und rückwärts) verarbeitet werden, ausgehend sowohl von Dateianfang bzw. -ende als auch von jeder beliebigen Stelle innerhalb der Datei. Selbstverständlich können Sätze gelesen, geändert und an dieselbe Stelle der Datei zurückgeschrieben werden.
Ferner lassen sich Datensätze einfügen, wodurch sich die Datei an beliebiger Stelle ergänzen läßt. Löscht man einen Datensatz, so muß dieser im Datenteil als gelöscht gekennzeichnet und entsprechend behandelt werden. Doppelte Schlüsselwörter (Keys) sind in unserem ISAM nicht vorgesehen. D. h., man kann nur noch einem Auswahlkriterium auf einmal suchen und keine Schlüssel miteinander verknüpfen.
Als Index wird lediglich ein sechs Bytes langes Feld am Anfang jedes Datensatzes benötigt. Auf dieses Indexfeld muß unmittelbar das Schlüsselwort folgen, an das sich die übrigen Satzdaten anschließen können.
Der Geschwindigkeitsvorteil, der durch die Verwendung eines indexsequentiellen Datenzugriffs entsteht, ist enorm und wird bei Verwendung einer Hard- oder RAM-Disk noch gesteigert.
Unser ISAM beinhaltet nur zwei Macros, wodurch die Anwendung nicht allzu schwer fallen sollte. Es ist so eingerichtet, daß maximal drei verschiedene Dateien (1-3) auf einmal eröffnet werden können. Vor dem Versuch, eine weitere Datei ohne vorherige Änderung des ISAM-Sourcecodes anzusprechen, kann man nur warnen. Wem jedoch drei gleichzeitig offene ISAM-Dateien nicht genügen , dem kann durch einfaches Einfügen eines jeweils 13 Byte langen Kontrollblocks (siehe Definitionen für ISAM) im Sourcecode geholfen werden. Außerdem ist an zwei Stellen jeweils eine kleine Änderung im Programm erforderlich.
Beispiel zur Erweiterung auf eine vierte ISAM-Datei
QWRT020: CMP.W #3,QIDENT(A1)
BNE QWRT030
PUT 3,QIND,A2
RTS
QWRT030 PUT 4,QIND,A2
RTS
QLES020: CMP.W #3,QIDENT(A1)
BNE QLES030
GET 3,QIND,A2
RTS
QLES030 GET 4,QIND,A2
RTS
Diese Änderungen müßten leicht auszuführen sein, so daß man entsprechend auf einfache Art und Weise auch eine fünfte oder sechste ISAM-Datei ermöglichen kann.
Man sollte möglichst keine ISAM-Datei mit sortierten Eingabedaten erstellen, da hier die Regel _ Je mehr durcheinander, desto schneller" gilt.
In den ISAM-Macros wird die eigentliche Arbeit nicht durch die Macros KEYLEN und ISAM selbst geleistet, sondern durch die ISAM-Funktionsroutinen, mit denen der Anwender selbst gar nicht direkt zu tun hat. Diese Routinen entsprechen den Funktionen Schreiben, Suchen, Lesen, Lesen _R, Gleichkoch und Gleich tief.
Format: KEYLEN Datenkanalnummer, #Länge
Die Länge des Schlüssels muß für jede ISAM-Datei nach dem OPEN- und vor dem ersten ISAM-Macro-Aufruf mittels KEYLEN definiert werden. Wenn man Schlüssel mit einer Länge von mehr als 100 Bytes verwenden will, muß man die Felder QA und QZ im Sourcelisting auf die gewünschte Schlüssellänge + 1 verändern (z. B. gewünschte Länge = 110 Bytes, dann müssen QA und QZ den Wert 111 zugewiesen bekommen).
Format: ISAM Datenkanalnummer, Funktion, #Puffer
Der Puffer muß dabei an der Wortgrenze beginnen!
Funktionen:
SCHREIBEN (Satz einfügen)
SUCHEN (Bestimmten Schlüssel suchen)
LESEN
(logisch nächsthöheren Datensatz lesen)
GLEICH__HOCH
(gleichen oder nächsthöheren Datensatz lesen)
LESEN__R
(logisch nächstniedrigeren Datensatz lesen)
GLEICH__TIEF
(gleichen oder nächstniedrigeren Datensatz lesen)
Vor dem ISAM-Aufruf muß der Schlüssel im Feld QA stehen und mit X'00' abgeschlossen sein. Dieses X'00' hat den Vorteil, daß ein Schlüssel, dessen Länge kleiner ist als die definierte Schlüssellänge, nicht rechtsbündig mit Leerstellen aufgefüllt werden muß. ISAM erledigt das von selbst.
Ist der Aufruf erfolgt und ein Fehler aufgetreten, erhält man einen Fehlercode in QF (.B) zurück. Die Fehlercodes haben folgende Bedeutung:
1 = Datensatz schon vorhanden
2 = Datensatz nicht gefunden
3 = Ende der Datei (EOF) erreicht
Hat man bei der Funktion "Lesen" ein EOF erhalten, sollte man nicht gleich wieder versuchen, mit der Funktion Lesen__R den letzten Datensatz zu erreichen. Die bessere Methode ist, QM auf 1 zu setzen und dann erst Lesen__R aufzurufen. Das bringt dann den letzten Datensatz der Datei oder, falls gar kein Datensatz existiert, ein EOF. Folglich muß QF unbedingt abgefragt werden, da ansonsten ja z. B. nicht das Ende der Datei erkannt werden kann.
Ferner erhält man die aktuelle Datensatz (Record)-Nummer in ISAMx (.L) zurück (das x steht für die Datenkanalnummer). Der Datensatz kann vor dem Schreiben im Puffer aufbereitet und anschließend geschrieben werden. Bei allen anderen Funktionen steht der Datensatz im Puffer und kann weiter bearbeitet werden. Der Wert in ISAMx kann verändert werden. Auf diese einfache Art und Weise kann man einen beliebigen Datensatz zum aktuellen machen. Die Gesamtanzahl der Datensätze kann man aus ISAMx+4 (.L) abfragen. Diesen Wert darf der Benutzer auf gar keinen Fall verändern.
Abschließend noch eine Anmerkung zum Schreiben von Datensätzen: Hat man die Funktion Schreiben gewählt, muß man den entsprechenden Datensatz auch tatsächlich mit 'PUT Dateinummer,ISAMx,#Puffer' schreiben, es sei denn, QF meldet eine Eins, also 'Datensatz schon vorhanden'. Das Schlüsselfeld (Keyfeld) des Puffers hat ISAM schon selbständig aufbereitet. Dieses Feld darf nur gelesen, aber nie beschrieben werden. Dies ist ISAM selbst vorbehalten.
Mit diesem letzten Teil von ISAM & PRIMA ist unsere Serie über die Assembler-Macros beendet. Wir hoffen, daß Sie die Macros auch dann verwenden können, wenn Sie keinen SEKA-Assembler von KUMA haben. Natürlich müssen sie dann entsprechend angepaßt werden. Schlimmstenfalls muß man sie jedesmal einbinden, wenn man einen Assembler benutzt, der keine Macroverarbeitung erlaubt. Für alle Tippfaulen: Die Macros sind komplett für DM 49,- beim Heim-Verlag zu beziehen.
(HE)