Makrotyp: | R bei PARMOD=24 |
Der GETFL-Makroaufruf kann nur auf Dateien angewendet werden, die mit Markierungen erstellt wurden: er wertet die Markierungen (= Flags) im ISAM-Index aus und stellt dem Anwenderprogramm aus einem bestimmten Bereich der Datei (siehe Operand LIMIT, "GETFL - Satz nach Markierung lesen") den nächsten Satz zur Verfügung, der den im GETFL-Aufruf vorgegebenen Bedingungen genügt. Der GETFL-Makro kann sowohl Wertmarkierung als auch logische Markierung auswerten, die Suche kann sowohl in Richtung Dateianfang wie Dateiende verlaufen.
Zu beachten ist, dass NK-ISAM keine Markierungen in die Indexeinträge aufnimmt. Eine Suche nach Sätzen mit bestimmten Merkmalen verläuft daher als sequenzielle Leseoperation.
Für K-ISAM-Dateien werden die Markierungen entsprechend der VALPROP-Angabe in FILE/FCB ausgewertet und in den Indexeintrag übernommen; eine Suche mit GETFL verläuft also nicht sequenziell, sondern über den Indexbaum. Der einzige für den Anwender sichtbare Unterschied in der Flagverarbeitung von NK-ISAM- und K-ISAM-Dateien ist die geringere Performance bei NK-ISAM. In NK-ISAM-Dateien sollte auf Flagverarbeitung verzichtet werden.
Werden VALTEST und LOGTEST angegeben, so müssen auf den gesuchten Satz beide Bedingungen zutreffen.
Werden weder VALTEST noch LOGTEST angegeben, wirkt der GETFL-Makroaufruf (innerhalb der mit LIMIT gesetzten Grenzen) wie ein GET- oder GETR-Makroaufruf. Wird die mit LIMIT definierte Grenze erreicht, geht die Steuerung an den EXLST-Ausgang EOFADDR (bei LIMIT=END) oder an den EXLST-Ausgang NOFIND (bei LIMIT=KEY).
Wird der GETFL-Makroaufruf auf eine Datei angewendet, die ohne Markierungen erstellt wurde, geht die Steuerung an den EXLST-Ausgang USERERR.
Das Feld, auf das der FCB-Operand KEYARG verweist, muss groß genug sein, um den gesamten Index aufnehmen zu können (Schlüssel + Wertmarkierung + logische Markierung). Vorgaben für Wertmarkierungen oder Masken für logische Markierungen müssen formal mit den entsprechenden Markierungen in den Datensätzen übereinstimmen (vor allem hinsichtlich Lage und Länge).
Wertmarkierung
Bei der Suche nach einem Satz mit bestimmter Wertmarkierung (Operand VALTEST) wird der entsprechende Markierungsbereich eines jeden Satzes bzw. im Indexeintrag mit dem beim GETFL-Makroaufruf angegebenen Wert verglichen. Es wird jeweils der Satz gelesen, der innerhalb des Bereichs als erster den Bedingungen genügt.
logische Markierung
Bei der Suche nach einem Satz anhand der logischen Markierung muss im GETFL-Makroaufruf eine Bit-Maske definiert werden, die bitweise mit der logischen Markierung verglichen wird. Entsprechend der Angabe im Operanden LOGTEST wird der erste Satz gelesen, der innerhalb des angegebenen Bereichs als erster einer oder allen Bedingungen genügt.
Formate
Die Formate des GETFL-Makros unterscheiden sich durch den MF-Operanden:
kein MF-Operand | der Makro generiert Parameter und Systemaufruf, PARMOD=24/31, FCB-Adresse als symbolische Adresse oder in Register 1 |
MF=L | List-Form: der Makro generiert die Operandenliste, PARMOD=24, FCB-Adresse nicht in Register 1 |
MF=E | Execute-Form: der Makro generiert den Systemaufruf zu MF=L |
Da die Parameter im Format ohne MF-Operanden und im Format mit MF=L bis auf FCB-Adresse, PARMOD und MF identisch sind, werden diese beiden Formate nicht getrennt dargestellt.
Operation | Operanden |
|
|
|
Operandenbeschreibung
fcbadr
Adresse des FCB für die Datei
(1)
Die FCB-Adresse steht im Register 1.
(r2)
nur bei PARMOD=24: bei Ausführung des GETFL mit MF=(E, ) steht die FCB-Adresse in dem mit „r2“ bezeichneten Register (r2not equal1)
area
Adresse des Bereichs, in den der Satz gebracht werden soll
(0)
Die Adresse des Bereichs, in den der Satz gebracht werden soll, steht im Register 0.
LOCK
Die Sperre bleibt nach Ausführung des Makroaufrufs bestehen (explizite Sperre).
NOLOCK
Die Sperre bleibt nach dem Lesen nicht bestehen.
LIMIT
definiert die obere Grenze des zu durchsuchenden Bereichs, die untere Grenze ist durch die aktuelle Zeigerposition in der Datei gegeben – abhängig vom vorausgegangenen Makroaufruf. Die „Suchrichtung“ hängt davon ab, ob REVERSE=YES gilt. Die Suche beginnt:
nach einem Makroaufruf SETL B mit dem ersten Satz der Datei
nach einem Makroaufruf SETL E mit dem letzten Satz der Datei (sinnvoll nur zusammen mit REVERSE=YES)
nach einem Makroaufruf SETL KEY an der Zeigerposition
- nach anderen Makroaufrufen mit dem ersten Satz vor oder hinter der Zeigerposition (abh. von REVERSE=YES)
= END
Die Suche wird solange fortgesetzt, bis Dateiende (oder Dateianfang) erreicht ist. Enthält die Datei keinen Satz, dessen Markierungen die vorgegebenen Bedingungen erfüllen, wird der EXLST-Ausgang EOFADDR aktiviert.
= KEY
Die Grenze des Bereichs ist durch einen Schlüssel definiert, auf den der FCB-Operand KEYARG verweist. Die Suche wird abgebrochen, wenn der zu prüfende Satz den gleichen Schlüssel hat wie der durch KEYARG referenzierte.
- ohne REVERSE=YES: es werden nur Sätze geprüft, deren Schlüssel kleiner ist als der über KEYARG adressierte Schlüssel.
mit REVERSE=YES: es werden nur Sätze geprüft, deren Schlüssel größer ist als der über KEYARG adressierte Schlüssel.
Enthält der über einen Schlüssel abgegrenzte Bereich keinen Satz, dessen Markierungen den Bedingungen im GETFL-Makroaufruf entsprechen, geht die Steuerung an den EXLST-Ausgang NOFIND. Auch wenn die Datei bereits auf den Satz positioniert ist, der den LIMIT-Schlüssel enthält, geht die Steuerung an den EXLST-Ausgang NOFIND; die Dateiposition wird nicht verändert. Ist der über KEYARG adressierte Schlüssel kleiner als die aktuelle Zeigerposition (bzw. größer bei REVERSE=YES), geht die Steuerung an den EXLST-Ausgang USERERR.
LOGTEST
gibt an, ob bei der Suche über die logische Markierung nur Sätze bereitgestellt werden sollen, die alle oder mindestens eine der in der Bit-Maske gesetzten Bedingungen erfüllen. Die Bit-Maske muss in dem Feld enthalten sein, auf das der FCB-Operand KEYARG verweist. Es muss mindestens ein Bit der Maske gesetzt sein sonst geht die Steuerung an den EXLST-Ausgang USERERR.
= ANY
liest den nächsten Satz, in dessen logischer Markierung mindestens ein Bit gesetzt ist, das auch in der Maske gesetzt ist.
= ALL
liest den nächsten Satz, in dessen logischer Markierung alle Bits gesetzt sind, die den in der Maske gesetzten Bits entsprechen.
MF = (E,...)
erzeugt den Systemaufruf. Die Operandenliste, die mit MF=L generiert wurde, wird für die Ausführung des Makroaufrufs ausgewertet.
= E,addr
Adresse der mit MF=L erzeugten Operandenliste. Sollen die Adressen von FCB und „area“ in Registern übergeben werden, müssen diese vor Ausführung des Makroaufrufs mit der gültigen Adressen geladen werden.
= E,r
Die Adresse der mit MF=L erzeugten Operandenliste steht im Register „r“.
MF = L
nur bei PARMOD=24
Es wird eine 8 Byte lange Operandenliste generiert, der Makroaufruf wird nicht ausgeführt.
Die Operandenliste ist auf Wortgrenze ausgerichtet und enthält:
das Operandenbyte 1 (siehe unten, Tabelle GETFL-1)
- die FCB-Adresse oder die Nummer des Registers, das die FCB-Adresse enthält (=1)
das Operandenbyte 2 (siehe unten, Tabelle GETFL-2)
die Adresse des Bereichs, in den der Satz übertragen wird, oder die Nummer des Registers, das beim Makroaufruf mit MF=E diese Adresse enthält.
Die Operandenliste muss symbolisch adressierbar sein (= symbolische Adresse des Makroaufrufs).
PARMOD
Gibt den Generierungsmodus an, entsprechend dem im FCB-Makroaufruf für die Datei gültigen Wert.
Abhängig von MF=L und PARMOD-Angabe werden unterschiedliche „Operandenlisten“ generiert.
Voreinstellung: | der durch den Makro GPARMOD oder durch den Assembler voreingestellte Wert für den Generierungsmodus |
= 24
Der generierte Objektcode ist nur im 16-MB-Adressraum ablauffähig. Bei MF=L wird eine 8-Byte-Operandenliste generiert, ohne MF=L werden die Parameter in die Register 0 und 1 übernommen.
= 31
Der generierte Objektcode ist im 2-GB-Adressraum ablauffähig. Die Informationen zur Makroausführung sind im FCB enthalten.
REVERSE = YES
Die Verarbeitung verläuft „rückwärts“ in Richtung Dateianfang.
Voreinstellung: die Dateiverarbeitung verläuft „vorwärts“ in Richtung Dateiende
VALTEST
gibt an, in welcher Relation die Wertmarkierung des zu lesenden Satzes zu der Vorgabe stehen soll, auf die der FCB-Operand verweist.
= GT
(= greater than) der Wert im Datensatz muss größer sein als die Wertvorgabe im KEYARG-Feld
= GE
(= greater or equal) der Wert im Datensatz ist größer oder gleich der Wertvorgabe im KEYARG-Feld
= EQ
(= equal) die beiden Werte müssen übereinstimmen
= NE
(= not equal) die beiden Werte dürfen nicht übereinstimmen
= LE
(= less or equal) der Wert im Datensatz ist kleiner oder gleich der Wertvorgabe im KEYARG-Feld
= LT
(= less than) der Wert im Datensatz ist kleiner als die Wertvorgabe im KEYARG-Feld.
Operandenliste zu MF=L
Wort 1 | ... | Wort 2 | ... |
Op-Byte 1 | FCB-Adresse oder Registernummer | Op-Byte 2 | Area-Adresse oder Registernummer |
Op-Byte 1 = Operanden-Byte 1 | |
verschlüsselte GETFL-Operanden und LOGTEST (siehe Tabelle „Operanden-Byte 1". | |
FCB-Adresse/Register | |
hier ist entweder die Adresse des FCB oder ein Register anzugeben (rechtsbündig ausgerichtet), das die Adresse des FCB enthält. | |
Op-Byte 2 = Operanden-Byte 2 | |
verschlüsselte Informationen zu den GETFL-Operanden LOCK/NOLOCK, fcbadr, area (siehe Tabelle „Operanden-Byte 2". | |
Area-Adresse/Register | |
hier ist entweder die Adresse des Bereichs oder ein Register anzugeben (rechtsbündig ausgerichtet), das die Adresse des Bereichs enthält, in den der Satz übertragen werden soll. |
Operanden-Byte 1
Bitposition/Bitmuster | ||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Bedeutung |
0 | 0 | 1 | 0 | VALTEST=GT | ||||
0 | 1 | 0 | 0 | VALTEST=LT | ||||
1 | 0 | 0 | 0 | VALTEST=EQ | ||||
0 | 1 | 1 | 1 | VALTEST=NE | ||||
1 | 0 | 1 | 0 | VALTEST=GE | ||||
1 | 1 | 0 | 0 | VALTEST=LE | ||||
0 | 0 | 0 | 0 | VALTEST=0 oder ungültig | ||||
1 | LOGTEST-Operand angegeben | |||||||
1 | LOGTEST=ALL | |||||||
1 | LIMIT=KEY | |||||||
1 | REVERSE=YES |
Operanden-Byte 2
Bitmuster/Bitposition | |||||
7 | 6 | 5 | 4 | Bedeutung PARMOD=24 | Bedeutung PARMOD=31 |
1 | LOCK angegeben oder | LOCK angegeben oder | |||
0 | NOLOCK angegeben | NOLOCK angegeben | |||
1 | FCB-Adresse in Register enthalten | - nicht verwendet - | |||
0 | FCB-Adresse angegeben | - nicht verwendet - | |||
1 | 'area' -Adresse nicht angegeben | - nicht verwendet - | |||
0 | 'area' -Adresse angegeben | - nicht verwendet - | |||
1 | 'area' -Adresse in Reg. 0 enthalten | - nicht verwendet - | |||
0 | 'area' -Adresse angegeben | - nicht verwendet - |
Hinweis zur Programmierung
Der GETFL-Makroaufruf zerstört die Register 0, 1, 14 und 15.
Übersicht über die EXLST-Ausgänge
EXLST-Ausgang | betroffener GEFTL-Operand | Bedeutung |
EOFADDR | LIMIT = END | Kein passender Satz vorhanden |
NOFIND | LIMIT = KEY |
|
USERERR | --- | Datei wurde nicht mit Markierungen erstellt oder anderer Anwenderfehler (wie z.B. falscher OPEN-Modus) |
LIMIT = KEY | Grenze ist bereits überschritten | |
LOGTEST | Die Logikmaske enthält nur Nullen: kein Bit gesetzt |