Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

GETFL - Satz nach Markierung lesen

Makrotyp:

R bei PARMOD=24
S bei PARMOD=24 und Angabe des MF-Operanden
0 bei PARMOD=31

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

GETFL

fcbadr / (1) / (r2)

  [,area / (0)]

  [,LOCK / NOLOCK]

[,LIMIT = END / KEY]

[,LOGTEST = ANY / ALL]

[,REVERSE = YES]

[,VALTEST = GT / GE / EQ / NE / LE / LT]

[,PARMOD = 24 / 31]

[MF=(E,liste / E,(r1)) / L]

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
0




LOGTEST-Operand angegeben
LOGTEST-Operand null oder ungültig






1
0



LOGTEST=ALL
LOGTEST=ANY







1
0


LIMIT=KEY
LIMIT=END








1
0

REVERSE=YES
REVERSE=null

Operanden-Byte 2

Bitmuster/Bitposition
(3-0 nicht verwendet)


7

6

5

4

Bedeutung PARMOD=24

Bedeutung PARMOD=31

1




LOCK angegeben oder
Standardeinstellung

LOCK angegeben oder
Standardeinstellung

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

  • kein passender Satz im definierten Bereich vorhanden

  • Grenze ist identisch mit der Zeigerposition

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