Sätze können mit der selektiven SET-RECORD-MAPPING-Anweisung ausgewählt und verändert werden.
Für eine Ausgabedatei können mehrere ADD-FILE-LINK-Kommandos mit demselben Eröffnungsmodus und verschiedenen Dateikettungsnamen abgesetzt werden. Über diese Dateikettungsnamen werden dann die PERCON-Anweisungen zugeordnet. So werden Sätze mit SELECT-INPUT-RECORDS ausgewählt und mit SET-RECORD-MAPPING verändert. Die restlichen Sätze bleiben unverändert oder werden in anderer Weise verändert. Zu beachten sind die Unterschiede, wenn Ein- und Ausgabedatei identisch sind oder die Ausgabedatei neu zu erstellen ist.
Ein- und Ausgabedatei sind identisch
Bei SAM- bzw. ISAM-Dateien können für dieselbe Datei mehrere ADD-FILE-LINK-Kommandos mit OPEN-MODE=*UPDATE bzw. OPEN-MODE=*INOUT und verschiedenen Dateikettungsnamen abgesetzt werden. Bei identischer Ein- und Ausgabedatei bleibt die Satzanzahl dieser Datei unverändert. Werden Sätze über mehrere SELECT-INPUT-RECORDS-Anweisungen ausgewählt und über mehrere SET-RECORD-MAPPING-Anweisungen verändert, werden die Sätze entsprechend oft überschrieben. Nur die letzte Änderung bleibt bestehen.
Bei SAM-Dateien, die mit OPEN-MODE=*UPDATE geöffnet werden, ändert sich die Satzlänge nicht. Verlängerte Sätze werden auf ihre ursprüngliche Länge gekürzt; verkürzte Sätze mit dem FILLER-Zeichen der SET-RECORD-MAPPING-Anweisung auf ihre alte Länge gebracht.
/ADD-FILE-LINK FILE-NAME=INOUTFILE, LINK-NAME=PCIN1, OPEN-MODE=*UPDATE /ADD-FILE-LINK FILE-NAME=INOUTFILE, LINK-NAME=PCOUT1, OPEN-MODE=*UPDATE /ADD-FILE-LINK FILE-NAME=INOUTFILE, LINK-NAME=PCOUT2, OPEN-MODE=*UPDATE /ADD-FILE-LINK FILE-NAME=INOUTFILE, LINK-NAME=PCOUT3, OPEN-MODE=*UPDATE /START-PERCON % PER0000 PERCON STARTED, VERSION V03.0A00 //ASSIGN-INPUT-FILE LINK-NAME=PCIN1 //ASSIGN-OUTPUT-FILE LINK-NAME=PCOUT1 //SELECT-INPUT-RECORDS - // OUTPUT-LINK-NAME=PCOUT1,- // CONDITION=((5,1)='A') //SET-RECORD-MAPPING - &*——————————————————————————————————————————————— (1) // OUTPUT-LINK-NAME=PCOUT1,- // FILLER=*INPUT,- // OUTPUT-FIELDS=C'X'(OUTPUT-POSITION=5) //ASSIGN-OUTPUT-FILE LINK-NAME=PCOUT2 //SELECT-INPUT-RECORDS - // OUTPUT-LINK-NAME=PCOUT2,- // CONDITION=((5,1)='B') //SET-RECORD-MAPPING - &*——————————————————————————————————————————————— (2) // OUTPUT-LINK-NAME=PCOUT2,- // FILLER=*INPUT,- // OUTPUT-FIELDS=C'Y'(OUTPUT-POSITION=5) //ASSIGN-OUTPUT-FILE LINK-NAME=PCOUT3 //SELECT-INPUT-RECORDS - // OUTPUT-LINK-NAME=PCOUT3,- // CONDITION=((6,1)<='2') //SET-RECORD-MAPPING - &*——————————————————————————————————————————————— (3) // OUTPUT-LINK-NAME=PCOUT3,- // FILLER=*INPUT,- // OUTPUT-FIELDS=C'9'(OUTPUT-POSITION=6) //END
% PER0030 NUMBER OF PROCESSED RECORDS FOR LINK='PCIN1' (FILE=:2OS6:$WKST.INOUTFILE): 7 % PER0030 NUMBER OF PROCESSED RECORDS FOR LINK='PCOUT1' (FILE=:2OS6:$WKST.INOUTFILE): 2 % PER0030 NUMBER OF PROCESSED RECORDS FOR LINK='PCOUT2' (FILE=:2OS6:$WKST.INOUTFILE): 4 % PER0030 NUMBER OF PROCESSED RECORDS FOR LINK='PCOUT3' (FILE=:2OS6:$WKST.INOUTFILE): 3 % PER0031 PERCON TERMINATED NORMALLY
(1) | In Spalte 5 wird ’A’ durch ’X’ ersetzt. |
(2) | In Spalte 5 wird ’B’ durch ’Y’ ersetzt. |
(3) | In Spalte 6 werden alle Zeichen ≤ ’2’ durch ’9’ ersetzt. |
Datei vorher: | Datei nachher: |
---|---|
A0 * | A9 |
B1 * | B9 |
B2 * | B9 |
B3 | Y3 |
A4 | X4 |
C5 | C5 |
B6 | Y6 |
* Die Änderungen durch (1) und (2) bleiben wegen (3) unberücksichtigt.
Bei ISAM-Dateien kann es zu unerwünschten Schleifen kommen, wenn
der Satzschlüssel verändert wird,
mit DUPLICATE-KEY=*YES gearbeitet wird,
der ausgegebene Satz vor dem eingelesenen Satz liegt, da die Schreibposition die nächste Leseposition festlegt.
Ein- und Ausgabedatei verschieden
Bei ISAM- bzw. UPAM-Dateien können für dieselbe Ausgabedatei mehrere ADD-FILE-LINK-Kommandos mit OPEN-MODE=*OUTPUT bzw. OPEN-MODE=*OUTIN und verschiedenen Dateikettungsnamen abgesetzt werden.
Die Anzahl der Ausgabesätze kann sich reduzieren, wenn keine Eingabesätze durch eine SELECT-INPUT-RECORDS-Anweisung ausgewählt wurden. Sie kann sich erhöhen, wenn Eingabesätze durch mehrere SELECT-INPUT-RECORDS-Anweisungen ausgewählt wurden.
Wird bei ISAM-Dateien DUPLICATE-KEY=*YES angegeben, kann ein Eingabesatz in mehrere Ausgabesätze aufgespalten werden.
Bei folgendem Beispiel wurde die Datei INPUTFILE mit den Eigenschaften ACCESS-METHOD=ISAM, RECORD-FORMAT=*VARIABLE, KEY-POSITION=5, KEY-LENGTH=8 angelegt.
/ADD-FILE-LINK - / FILE-NAME=INPUTFILE,- / LINK-NAME=PCIN1,- / OPEN-MODE=*INPUT /CREATE-FILE FILE-NAME=OUTPUTFILE /ADD-FILE-LINK - / FILE-NAME=OUTPUTFILE,- / LINK-NAME=PCOUT1,- / OPEN-MODE=*OUTPUT,- / ACCESS-METHOD=*ISAM,- / SUPPORT=*DISK(ISAM-ATTRIBUTES=(DUPLICATE-KEY=*YES)) /ADD-FILE-LINK - / FILE-NAME=OUTPUTFILE,- / LINK-NAME=PCOUT2,- / OPEN-MODE=*OUTPUT,- / ACCESS-METHOD=*ISAM,- / SUPPORT=*DISK(ISAM-ATTRIBUTES=(DUPLICATE-KEY=*YES)) /ADD-FILE-LINK - / FILE-NAME=OUTPUTFILE,- / LINK-NAME=PCOUT3,- / OPEN-MODE=*OUTPUT,- / ACCESS-METHOD=*ISAM,- / SUPPORT=*DISK(ISAM-ATTRIBUTES=(DUPLICATE-KEY=*YES)) /START-PERCON //ASSIGN-INPUT-FILE - // LINK-NAME=PCIN1 //ASSIGN-OUTPUT-FILE - // LINK-NAME=PCOUT1,- // FILE=*DISK-FILE(FILE-ATTRIBUTES=*INPUT-FILE) //SELECT-INPUT-RECORDS - // OUTPUT-LINK-NAME=PCOUT1,- // CONDITION=((13,1)='A') //SET-RECORD-MAPPING - // OUTPUT-LINK-NAME=PCOUT1,- // FILLER=*INPUT,- // OUTPUT-FIELDS=C'X'(OUTPUT-POSITION=13)
//ASSIGN-OUTPUT-FILE - // LINK-NAME=PCOUT2,- // FILE=*DISK-FILE(FILE-ATTRIBUTES=*INPUT-FILE) //SELECT-INPUT-RECORDS - // OUTPUT-LINK-NAME=PCOUT2,- // CONDITION=((13,1)='B') //SET-RECORD-MAPPING - // OUTPUT-LINK-NAME=PCOUT2,- // FILLER=*INPUT,- // OUTPUT-FIELDS=C'Y'(OUTPUT-POSITION=13)//ASSIGN-OUTPUT-FILE - // LINK-NAME=PCOUT3,- // FILE=*DISK-FILE(FILE-ATTRIBUTES=*INPUT-FILE) //SELECT-INPUT-RECORDS - // OUTPUT-LINK-NAME=PCOUT3,- // CONDITION=((14,1)<='2') //SET-RECORD-MAPPING - // OUTPUT-LINK-NAME=PCOUT3,- // FILLER=*INPUT,- // OUTPUT-FIELDS=C'9'(OUTPUT-POSITION=14) //END
INPUTFILE | OUTPUTFILE | |
---|---|---|
(1) | 00000001A0 | 00000001X0 |
(1) | 00000002B1 | 00000001A9 |
(1) | 00000003B2 | 00000002Y1 |
00000004B3 | 00000002B9 | |
00000005A4 | 00000003Y2 | |
(2) | 00000006C5 | 00000003B9 |
00000007B6 | 00000004Y3 | |
00000005X4 | ||
00000007Y6 |
(1) | Diese Sätze werden jeweils durch die erste und dritte bzw. zweite und dritte SELECT-INPUT-RECORDS-Anweisung ausgewählt und erscheinen deshalb zweimal in der OUTPUTFILE. |
(2) | Dieser Satz wird durch keine SELECT-INPUT-RECORDS-Anweisung ausgewählt und erscheint deshalb nicht in der OUTPUTFILE. |
Aufspalten eines Satzes
Soll ein Satz in drei kürzere Sätze aufgespalten werden, ist dazu eine Zwischendatei (BUFFERFILE) erforderlich. Da diese eine ISAM-Datei ist, wird ein Pseudoschlüssel (für alle Sätze ’1’ in Spalte 5) eingeführt. Bei der Weiterverarbeitung der Zwischendatei wird dieser Schlüssel ignoriert.
/ADD-FILE-LINK - / FILE-NAME=INPUTFILE,- / LINK-NAME=PCIN1,- / OPEN-MODE=*INPUT / /CREATE-FILE FILE-NAME=BUFFERFILE /ADD-FILE-LINK - / FILE-NAME=BUFFERFILE,- / LINK-NAME=PCOUT1,- / OPEN-MODE=*OUTPUT,- / ACCESS-METHOD=*ISAM,- / SUPPORT=*DISK(ISAM-ATTRIBUTES=(DUPLICATE-KEY=*YES,- / KEY-LENGTH=1,- / KEY-POSITION=5)) /ADD-FILE-LINK - / FILE-NAME=BUFFERFILE,- / LINK-NAME=PCOUT2,- / OPEN-MODE=*OUTPUT,- / ACCESS-METHOD=*ISAM,- / SUPPORT=*DISK(ISAM-ATTRIBUTES=(DUPLICATE-KEY=*YES,- / KEY-LENGTH=1,- / KEY-POSITION=5)) /ADD-FILE-LINK - / FILE-NAME=BUFFERFILE,- / LINK-NAME=PCOUT3,- / OPEN-MODE=*OUTPUT,- / ACCESS-METHOD=*ISAM,- / SUPPORT=*DISK(ISAM-ATTRIBUTES=(DUPLICATE-KEY=*YES,- / KEY-LENGTH=1,- / KEY-POSITION=5)) /ADD-FILE-LINK - / FILE-NAME=BUFFERFILE,- / LINK-NAME=PCIN2 / /CREATE-FILE FILE-NAME=OUTPUTFILE /ADD-FILE-LINK - / FILE-NAME=OUTPUTFILE,- / LINK-NAME=PCOUT4,- / ACCESS-METHOD=*SAM / /START-PERCON //ASSIGN-INPUT-FILE LINK-NAME=PCIN1 //ASSIGN-OUTPUT-FILE LINK-NAME=PCOUT1 //SET-RECORD-MAPPING - // OUTPUT-LINK-NAME=PCOUT1,- // OUTPUT-FIELDS=(C'1'(OUTPUT-POSITION=5),- // *FIELD(INPUT-POSITION=5,- // INPUT-LENGTH=2,- // OUTPUT-POSITION=6)) //ASSIGN-OUTPUT-FILE LINK-NAME=PCOUT2 //SET-RECORD-MAPPING - // OUTPUT-LINK-NAME=PCOUT2,- // OUTPUT-FIELDS=(C'1'(OUTPUT-POSITION=5),- // *FIELD(INPUT-POSITION=7,- // INPUT-LENGTH=2,- // OUTPUT-POSITION=6)) //ASSIGN-OUTPUT-FILE LINK-NAME=PCOUT3 //SET-RECORD-MAPPING - // OUTPUT-LINK-NAME=PCOUT3,- // OUTPUT-FIELDS=(C'1'(OUTPUT-POSITION=5),- // *FIELD(INPUT-POSITION=9,- // INPUT-LENGTH=2,- // OUTPUT-POSITION=6)) //START-CONVERSION //ASSIGN-INPUT-FILE LINK-NAME=PCIN2 //ASSIGN-OUTPUT-FILE LINK-NAME=PCOUT4 //SET-RECORD-MAPPING - // OUTPUT-FIELDS=*FIELD(INPUT-POSITION=6,- // INPUT-LENGTH=2,- // OUTPUT-POSITION=5) //END
INPUTFILE (SAM): | BUFFERFILE (ISAM): | OUTPUTFILE (SAM): |
---|---|---|
S1S2S3 | 1S1 | S1 |
S4S5S6 | 1S2 | S2 |
S7S8S9 | 1S3 | S3 |
1S4 | S4 | |
1S5 | S5 | |
1S6 | S6 | |
1S7 | S7 | |
1S8 | S8 | |
1S9 | S9 |