Makroaufrufe, die sich auf einen Satz beziehen, der von einem vorangegangenen Makroaufruf bearbeitet wurde, arbeiten mit internen „Zeigern“, um die aktuelle Position in der Datei bestimmen zu können:
Sowohl für den Primärschlüssel als auch für jeden in der Datei definierten Sekundärschlüssel wird ein eigener Zeiger geführt. Eine erfolgreiche Positionierungs- oder Leseoperation über einen Sekundärschlüssel (mit SETL, GET, GETKY oder GETR) verändert zunächst den Zeiger für diesen Sekundärschlüssel und setzt über den aktualisierten Sekundärschlüsselwert den Zeiger für den Primärschlüssel auf den gelesenen Satz.
Makroaufrufe, die ISAM-Zeiger auswerten, sind alle sequenziellen Makroaufrufe oder z.B. PUTX, der einen zuvor gelesenen Satz in die Datei zurückschreibt.
Kann ein Makroaufruf nicht vollständig ausgeführt werden, weil z.B. ein Fehler oder ein PGLOCK auftrat, wird der Zeiger bei NK-ISAM auf den Wert zurückgesetzt, den er vor dem Makroaufruf hatte. Eine Ausnahme bildet allerdings der Fehler „NOFIND“: da der gesuchte Satz nicht gefunden wurde, kann auf diesen Schlüssel nicht positioniert werden.
ISAM-Zeiger werden in der Regel aktualisiert bevor der Makroaufruf ausgeführt wird. Allerdings muss bei sequenziellen Leseoperationen (GET, GETR) auch der vorausgegangene Makroaufruf berücksichtigt werden: geht einer sequenziellen Leseoperation ein SETL-Makroaufruf voraus, dient dieser SETL als „Positionierungs-Makroaufruf“.
Die ISAM-Aktionen OSTAT (Open Status) und ISREQ haben keinen Einfluss auf die Zeigerposition, da sie keine Aktionen in der Datei auslösen.
Bei Dateieröffnung wird als erste Aktion für eine ISAM-Datei intern ein „SETL B“ durchgeführt, d.h. auf den ersten Satz der Datei positioniert.
Regeln für ISAM-Zeiger
Aktionsmakro | Zeiger | Aktion | Bemerkung |
ELIM | ohne Angabe von KEY: Zeiger wird nicht verändert; mit Angabe von KEY: Zeiger wird auf den 1. Satz dieses Schlüssels gesetzt | streicht einen Satz aus der Datei | Man kann ELIM als ' left-shift' - Operation für den Teil der Datei betrachten, der rechts des definierten Satzes steht. |
GET | setzt den Zeiger für den im Makro angesprochenen Primär- bzw. Sekundärschlüssel einen Satz weiter in Richtung Dateiende | stellt den Satz bereit, auf den der Zeiger verweist | Weist der Zeiger auf einen Satz außerhalb der Datei, wird dem Anwender die Steuerung am Ausgang EOFADDR übergeben. |
GETFL | setzt den Zeiger auf den Satz, der bereitgestellt wurde, oder auf den letzten Satz des definierten Bereichs | stellt den nächsten Satz bereit, der die Markierungskriterien erfüllt | Der Satz, der auf Grund eines korrespondierenden GET oder GETR-Makroaufrufs gefunden worden wäre, ist der erste Satz, der untersucht wird. |
GETKY | setzt den Zeiger auf den Satz mit dem angegebenen Primär- bzw. Sekundärschlüsselwert oder positioniert an die Stelle der Datei, wo dieser Satz stehen müsste | stellt den Satz bereit, auf den der Zeiger verweist, falls ein Satz mit dem angegebenen Schlüssel vorhanden ist | Ein GETKY für einen Schlüssel, zu dem es keinen Datensatz gibt, ist äquivalent einem GETKY für einen Satz mit der Länge null, der zwischen zwei existenten Sätzen liegen soll. |
GETR | setzt den Zeiger für den im Makro angesprochenen Primär- bzw. Sekundärschlüssel einen Satz weiter in Richtung Dateianfang | stellt den Satz bereit, auf den der Zeiger verweist (-> Rückwärtslesen) | Weist der Zeiger auf einen Satz vor dem Dateianfang, erhält der Anwender die Steuerung am Ausgang EOFADDR (siehe „GET“). |
INSRT | setzt den Zeiger auf die Position, die auf Grund des Satzschlüssels angegeben ist | fügt den Satz an der Stelle ein, auf die der Zeiger verweist | Der Satz wird nicht eingefügt, wenn bereits ein Satz mit diesem Schlüssel vorhanden ist. Der Zeiger verweist jedoch weiterhin auf die Position der Datei, an der der Satz eingefügt werden sollte. |
OPEN | setzt den Zeiger vor ersten Satz | siehe "OPEN - Datei eröffnen" | |
PUT | setzt den Zeiger genau hinter das derzeitige Ende der Datei | bringt den Satz an die Stelle auf die verwiesen wird | |
PUTX | der Zeiger wird nicht verändert | bringt den Satz an die Stelle der Datei, auf die der Zeiger verweist | Es wird geprüft, ob unmittelbar vor dem PUTX ein GET-, GETR-, GETFL- oder GETKY-Makro aufgerufen wurde. So werden trotz nicht aktualisierten Zeigers Fehler vermieden. |
RETRY | abhängig von der Operation, die wiederholt werden soll, oder von der Positionierungsoperation | wiederholt letzten Aktionsmakro bzw. positioniert Zeiger auf Ausgangsstellung oder bringt das Programm in eine Warteschlange | RETRY selbst ändert den Zeiger nicht, es sei denn, dass es zu der Ausführung eines Aktionsmakroaufrufs führt, der seinerseits den Zeiger ändert. |
SETL | SETL B: Zeiger wird vor den ersten Satz der Datei gesetzt SETL E: Zeiger wird hinter den letzten Satz der Datei gesetzt SETL KEY: Zeiger wird auf den ersten Satz mit dem angegebenen Primär- bzw. Sekundärschlüsselwert gesetzt oder auf den Satz mit dem nächsthöheren Schlüsselwert | keine Aktion | Die Aktualisierung des Zeigers durch ein nachfolgendes GETR oder GET wird aufgehoben. Durch das Zeigerkonzept kann bei nachfolgendem GET oder GETR ein SETL auf einen nicht vorhandenen Satz als SETL auf einen Satz der Länge null an der korrekten Position angenommen werden. Die Zeigeraktualisierung des darauf folgenden GET oder GETR wird hier nicht aufgehoben |
STORE | setzt den Zeiger auf die Position, die durch den Schlüssel gegeben ist; | schreibt den Satz an gewünschte Stelle | Ist bereits ein Satz mit diesem Schlüssel vorhanden, wird er überschrieben, es sei denn, DUPEKY=YES wurde vereinbart. |