Records can be selected and updated using the SET-RECORD-MAPPING statement.
In the case of output files, several ADD-FILE-LINK commands can be issued in the same open mode and with different link names. These link names are then used to assign the PERCON statements. In this way records are selected with SELECT-INPUT-RECORDS and updated with SET-RECORD-MAPPING. All other records remain unchanged unless they are updated in some other manner. There are certain differences when input and output file are identical or when a new output file has to be created.
Input file identical to output file
In the case of SAM or ISAM files, several ADD-FILE-LINK commands with OPEN-MODE=*UPDATE or OPEN-MODE=*INOUT and with different link names can be issued for the same file. When the input file and the output file are identical, the number of records in this file remains unchanged. If records are selected via several SELECT-INPUT-RECORDS statements and updated via several SET-RECORD-MAPPING statements, the records are overwritten as often as required. Only the last update version is retained.
In the case of SAM files opened with *OPEN-MODE=*UPDATE, the record length is not changed. Records which have been lengthened are shortened to their original length; records that have been truncated are extended to their original length by means of the filler character of the SET-RECORD-MAPPING statement.
/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 column 5, ’A’ is replaced by ’X’. |
(2) | In column 5, ’B’ is replaced by ’Y’. |
(3) | In column 6, all characters ≤ ’2’ are replaced by ’9’. |
Old file: | New file: |
---|---|
A0 * | A9 |
B1 * | B9 |
B2 * | B9 |
B3 | Y3 |
A4 | X4 |
C5 | C5 |
B6 | Y6 |
* Because of (3), updates resulting from (1) and (2) are not taken into account.
In the case of ISAM files, loops may occur inadvertently
if the record key is changed
if DUPLICATE-KEY=*YES is specified
if the record which is output precedes the record which has been read in, since the write position defines the next read position.
Input file not identical to output file
With ISAM or UPAM files, several ADD-FILE-LINK commands with OPEN-
MODE=*OUTPUT or OPEN-MODE=*OUTIN and with different link names can be issued for the same output file.
The number of output records can be reduced if no input records have been selected by means of the SELECT-INPUT-RECORDS statement. By the same token, it can be increased if input records have been selected using more than one SELECT-INPUT-RECORDS statement.
With ISAM files, if DUPLICATE-KEY=*YES has been specified, an input record can be split up into more than one output record.
In the example below, the INPUTFILE has been created with the properties ACCESS-METHOD=ISAM, RECORD-FORMAT=*VARIABLE, KEY-POSITION=5, KEY-LENGTH=8.
/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) | The records are selected by the first and third SELECT-INPUT-RECORDS statement or by the second and third such statements, for which reason they appear twice in the output file. |
(2) | This record is not selected by a SELECT-INPUT-RECORDS statement and therefore does not appear in the output file. |
Splitting a record
If a record is split up into three shorter records, a buffer file is required. Since this buffer file is an ISAM file, a pseudo key is added (for all records ’1’ in column 5). When the buffer file is further processed, this key is ignored.
/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 |