Beim Kopieren von Dateien werden Sätze einer Eingabedatei nach bestimmten Kriterien ausgewählt und in eine oder mehrere Ausgabedateien übernommen. Beim Editieren eines Bandes werden Blöcke des Eingabebandes ausgewählt. Die Positionsangaben beziehen sich dann nicht auf den Satzanfang, sondern auf den Blockanfang.
Eingabesätze, für die keines der Auswahlkriterien zutrifft, können in spezielle Ausgabedateien übernommen werden. Diese Ausgabedateien, im Folgenden als „Restdateien“ bezeichnet, werden über das Schlüsselwort REMAINING-RECORDS des Operanden CONDITION vereinbart.
Es ist möglich, für jede Ausgabedatei mit der Anweisung SELECT-INPUT-RECORDS ein eigenes Auswahlkriterium festzulegen.
Beziehen sich in einem Konvertierungsschritt mehrere SELECT-INPUT-RECORDS-Anweisungen auf den gleichen Dateikettungsnamen, wird für diesen Dateikettungsnamen nur die zuletzt gegebene Anweisung ausgeführt.
SELECT-INPUT-RECORDS |
OUTPUT-LINK-NAME = *STD / list-poss(2000): <filename 1..8 without-gen> ,CONDITION = *REMAINING-RECORDS / <text 7..1800 with-low> |
OUTPUT-LINK-NAME =
Dateikettungsname der Ausgabedateien, auf die sich diese Anweisung beziehen soll.
OUTPUT-LINK-NAME = *STD
Diese Anweisung bezieht sich auf alle bisher angegebenen Ausgabedateien.
OUTPUT-LINK-NAME = list-poss(2000): <filename 1..8 without-gen>
Soll sich die Anweisung nur auf einige Ausgabedateien beziehen, müssen die Dateikettungsnamen dieser Dateien angegeben werden.
CONDITION =
Über diesen Operanden werden entweder die Auswahlkriterien (Bedingungen) festgelegt oder „Restdateien“ vereinbart.
CONDITION = *REMAINING-RECORDS
Die im Operanden OUTPUT-LINK-NAME angegebenen Ausgabedateien werden als „Restdateien“ verwendet. Das heißt, alle Eingabesätze, für die keines der Auswahlkriterien zutrifft, werden in die „Restdateien“ ausgegeben.
In einem Konvertierungsschritt können mehrere Restdateien vereinbart werden.
Hinweis
Die Anweisungen SET-RECORD-MAPPING, SET-GROUP-ATTRIBUTES und SET-PAGE-LAYOUT können ohne Einschränkungen für „Restdateien“ verwendet werden, ebenso die Benutzeranschlüsse.
Wird in einem Benutzeranschluss für Eingabe entschieden, einen Satz nicht zu übernehmen, so gilt das für alle Ausgabedateien einschließlich der Restdateien.
Genügt ein Satz den Selektionskriterien und wird dann im Benutzeranschluss für Ausgabe entschieden, ihn nicht zu übernehmen, gilt er dennoch als ausgewählt und wird in keine Restdatei ausgegeben.
Bei der Anweisung START-TAPE-PROCESSING wird durch den Operanden OUTPUT-LINK-NAME festgelegt, für welche der vereinbarten Ausgabedateien die Anweisung wirksam werden soll. D.h. bei jedem Aufruf dieser Anweisung können andere Ausgabedateien angesprochen werden. Die Angabe *STD gilt für alle zuvor angegebenen Ausgabedateien mit Ausnahme der Restdateien. Werden die Dateikettungsnamen der Ausgabedateien explizit bei diesem Operanden angegeben, so ist die Verwendung des LINK-Namens einer Restdatei nicht zulässig und wird als Fehler zurückgewiesen (Meldung PER0062). Beim Abarbeiten einer Anweisung START-TAPE-PROCESSING wird nur dann ein Block in die Restdateien ausgegeben, wenn für keine der im Operanden OUTPUT-LINK-NAME angesprochenen Ausgabedateien eine Ausgabe möglich war, d.h. für keine dieser Ausgabedateien erfüllte der Block die Selektionskriterien.
Die Vereinbarung einer Restdatei ist nur sinnvoll, wenn für alle „normalen“ Ausgabedateien eine Anweisung SELECT-INPUT-RECORDS mit Angabe einer Bedingung wirksam ist, da sonst keine Restsätze entstehen können.
Ein Beispiel zur sinnvollen Verwendung einer Restdatei ist auf "Ausgeben von Sätzen in eine Restdatei" gegeben.
CONDITION = <text 7..1800 with-low>
Über diesen Operanden wird die Bedingung angegeben, unter der ein Eingabesatz für die Ausgabe ausgewählt wird. Ein Satz wird übernommen, wenn die Bedingung erfüllt wird, d.h. den Wert ’wahr’ annimmt.
Die Bedingung kann aus einem oder mehreren durch AND oder OR logisch verknüpften Vergleichen bestehen. Die AND-Verknüpfung hat Vorrang vor der OR-Verknüpfung. Diese Vorrangsteuerung kann durch Klammern geändert werden. Dadurch ergibt sich eine bessere Lesbarkeit und eine kürzere Programmlaufzeit, da einzelne Vergleiche nicht mehrfach abgearbeitet werden. Die Bedingung wird von links nach rechts abgearbeitet.
Durch gezielte Reihung der Vergleiche (insbesondere Vergleiche, die meist dasselbe Ergebnis liefern) wird die Laufzeit reduziert:
z.B.: | a OR b OR c a AND b AND c |
Einschränkung der Klammerschachtelung: 1800 Byte für CONDITION.
Mehrere durch AND verknüpfte Vergleiche (=Relation) ergeben den Wert ’wahr’, wenn alle Vergleiche ’wahr’ sind.
Mehrere durch OR verknüpfte Relationen oder Vergleiche, die keiner Relation angehören, ergeben den Wert ’wahr’, wenn mindestens eine Relation oder ein Vergleich ’wahr’ ist.
Bei zwei Vergleichen gilt:
|
Die Syntax, mit der die Bedingung im Operanden CONDITION angegeben wird, lautet folgendermaßen:
bedingung: = (vergleich [AND/OR vergleich] ...) vergleich: = (position[,länge]) EQ/NE N[UMERIC]/AL[PHA] oder(position[,länge]) EQ/NE AS[CENDING]/D[ESCENDING]/M[ODULE](modname) oder(position[,länge[,C]]) op <c-string 1..256>/<x-string 1..512> oder(position,länge,Z/P) op Z‘zahl‘/P‘zahl‘ oderRECCNT(dateikettungsname) op Z‘zahl‘/P‘zahl‘ oderBYTCNT(dateikettungsname) op Z‘zahl‘/P‘zahl‘ oderBLKCNT(dateikettungsname) op Z‘zahl‘/P‘zahl‘ oderRECLEN(dateikettungsname) op Z‘zahl‘/P‘zahl‘ oderbedingung position : = <integer 1..32768> länge : = <integer 1..256> oderRECLEN (Satzlänge), wobei 1 <= RECLEN <= 256 gelten muss oder1 <= RECLEN-reduction <= 256 Bei Verletzung der Bedingung wird der Konvertierungsschritt mit der Meldung PER0042 abgebrochen. op : = EQ/NE/GT/LT/GE/LE
zahl : = wie bei „Literale”, siehe
"Literale"
Die Angaben für Vergleichsoperatoren sind gleichwertig und haben folgende Bedeutung:
Sonderzeichen | Buchstabenkombinationen | Bedeutung |
= | EQ | gleich |
> | GT | größer |
< | LT | kleiner |
>= | GE | größer gleich |
<= | LE | kleiner gleich |
<> | NE | ungleich |
Satzauswahl
Die Auswahl eines Satzes erfolgt durch
Das bezeichnete Feld wird auf das gewünschte Zeichenformat geprüft.
NUMERIC PERCON prüft, ob das angegebene Feld nur Ziffern enthält. ALPHA
PERCON prüft, ob das angegebene Feld ausschließlich Großbuchstaben,
Kleinbuchstaben, Umlaute und Leerzeichen enthält.Beispiele
COND=((5,3) EQ NUMERIC)
COND=((20,4) EQ NUMERIC AND (25,5) EQ ALPHA)
PERCON prüft das angegebene Feld auf aufsteigende bzw. absteigende Reihenfolge, d.h. ob das Feld einen höheren bzw. niedrigeren Wert hat als das Feld des vorhergehenden Satzes. Wird ein Satz auf Grund der SELECT-INPUT-RECORDS-Bedingung nicht in die Ausgabedatei übernommen, wird auch das Feld dieses Satzes nicht als Vergleichsfeld zum Vergleich mit dem Feld des nächsten Satzes herangezogen.
ASCENDING PERCON überprüft auf aufsteigende Reihenfolge DESCENDING
PERCON überprüft auf absteigende Reihenfolge
MODULE
PERCON prüft, ob das angegebene Feld nur die Zeichen enthält, die vom Benutzer zugelassen sind.
modname
Gibt den Namen eines Benutzermoduls (1. CSECT-Name) oder den Namen (ENTRY-Name) eines Bereichs in einem Benutzermodul an, der aus 256 Zeichen X’00’ bzw. X’FF’ besteht.
PERCON addiert den Wert jedes Zeichens aus dem Feld auf die Anfangsadresse des Benutzermoduls bzw. des Benutzerbereichs auf. Steht an der sich ergebenden Position X’00’, ist das Zeichen zugelassen, steht an der Stelle X’FF’, ist das Zeichen nicht zugelassen. Entspricht ein Byte des Feldes nicht der Bedingung, ist der Vergleich nicht erfüllt.Das Feld wird mit dem angegebenen Literal verglichen. Es ist zu beachten, dass entsprechend dem Format und der Länge verglichen wird. Beachte die Tabelle am Ende des Abschnittes.
Der aktuelle Wert von Kennwort (siehe "Kennwörter") wird mit dem angegebenen Literal verglichen. Beachte die Tabelle am Ende des Abschnitts.
Beispiel
Es sollen zwei Eingabedateien (IN1 und IN2) in eine Ausgabedatei konvertiert werden. Von der ersten Eingabedatei sollen alle Sätze und von der zweiten Eingabedatei alle Sätze ab dem fünften übertragen werden. Die Bedingung hierfür lautet:
COND=(RECCNT(IN1) GT Z'0' AND RECCNT(IN2) EQ Z'0' OR RECCNT(IN2) GE Z'5')
Beispiele zur Klammerschachtelung:
Im ersten Beispiel werden zwei Felder verglichen.
Wenn im ersten Feld eine entpackte Zahl > 100 oder < 50 steht und zugleich im zweiten Feld die Zeichenkette ’1.1’ oder ’2.2’, dann wird der Satz übernommen.
//SELECT-INPUT-RECORDS OUTPUT-LINK-NAME=02,- // CONDITION=(- // ( (10,5,Z) GT Z'100' - // OR (10,5,Z) LT Z'50' - // ) - // AND ( (20,3,C) EQ C'1.1' - // OR (20,3,C) EQ C'2.2' - // ) )
Im zweiten Beispiel werden die Möglichkeiten der Klammerschachtelung aufgezeigt. Die Vergleiche sind von V1 bis V12 durchnummeriert.
Ein Satz wird nur dann ausgegeben, wenn:
V1, V2 und V3 wahr sind und
mindestens einer der Vergleiche V4, V5 oder V6 wahr ist und V7 wahr ist.V1, V2 und V3 wahr sind und
mindestens einer der Vergleiche V4, V5 oder V6 wahr ist und V8 und V9 wahr sind und mindestens einer der Vergleiche V10, V11 oder V12 wahr ist.
//SELECT-INPUT-RECORDS OUTPUT-LINK-NAME=03,- // CONDITION=(- // RECCNT(IN1) LE Z'5000' - V1 // AND RECCNT(03) LT Z'300' - V2 // AND (28,5) EQ ASCENDING - V3 // AND ( (6,1,C) EQ 'P' - V4 // OR (6,2,C) EQ 'ST' - V5 // OR (6,3,C) EQ 'MOD' - V6 // ) - // AND ( (20,5) EQ NUMERIC - V7 // OR RECLEN(IN1) GT Z'120' - V8 // AND (35,2) EQ MODULE(ABISK) - V9 // AND ( (37,3,P) LT Z'230' - V10 // OR (37,3,P) EQ Z'241' - V11 // OR (37,3,P) GT Z'260' - V12 // ) - // ) )
Konvertierungsregeln bei ungleichem Zeichenformat und verschiedenen Längen der Felder
Im CONDITION-Operanden werden Operanden spezifiziert, die miteinander zu vergleichen sind. Haben zwei zu vergleichende Operanden verschiedenes Zeichenformat oder verschiedene Länge, ist Folgendes zu beachten:
literal | C,X | P,Z | Bemerkung | |
feld | Kennwort | |||
C | + | - | Bei unterschiedlichen Längen von feld und literal wird für den Vergleich das kürzere Feld rechts mit Leerzeichen aufgefüllt. | |
P,Z | RECCNT, | - | + | wie bei „Literale“, siehe "Literale". |
+
zulässiger Vergleich
- unzulässiger Vergleich