Rational Developer for System z
Enterprise PL/I for z/OS, Version 4.2, Programming Guide

Example of consecutive data sets

Creating and accessing consecutive data sets are illustrated in the program in Figure 31. The program merges the contents of two data sets, in the input stream, and writes them onto a new data set, &&TEMP; each of the original data sets contains 15-byte fixed-length records arranged in EBCDIC collating sequence. The two input files, INPUT1 and INPUT2, have the default attribute BUFFERED, and locate mode is used to read records from the associated data sets into the respective buffers. Access of based variables in the buffers should not be attempted after the file has been closed.

Figure 31. Merge Sort--creating and accessing a consecutive data set
 //EXAMPLE  JOB
 //STEP1 EXEC IBMZCBG
 //PLI.SYSIN   DD *
 %PROCESS INT F(I) AG A(F) OP STG NEST X(F) SOURCE ;
 %PROCESS LIST;

  MERGE: PROC OPTIONS(MAIN);
    DCL (INPUT1,                             /* FIRST INPUT FILE     */
         INPUT2,                             /* SECOND INPUT FILE    */
         OUT )      FILE RECORD SEQUENTIAL;  /* RESULTING MERGED FILE*/
    DCL SYSPRINT    FILE PRINT;              /* NORMAL PRINT FILE    */

    DCL INPUT1_EOF  BIT(1) INIT('0'B);       /* EOF FLAG FOR INPUT1  */
    DCL INPUT2_EOF  BIT(1) INIT('0'B);       /* EOF FLAG FOR INPUT2  */
    DCL OUT_EOF     BIT(1) INIT('0'B);       /* EOF FLAG FOR OUT     */
    DCL TRUE        BIT(1) INIT('1'B);       /* CONSTANT TRUE        */
    DCL FALSE       BIT(1) INIT('0'B);       /* CONSTANT FALSE       */

    DCL ITEM1       CHAR(15) BASED(A);       /* ITEM FROM INPUT1     */
    DCL ITEM2       CHAR(15) BASED(B);       /* ITEM FROM INPUT2     */
    DCL INPUT_LINE  CHAR(15);                /* INPUT FOR READ INTO  */
    DCL A           POINTER;                 /* POINTER VAR          */
    DCL B           POINTER;                 /* POINTER VAR          */

    ON ENDFILE(INPUT1) INPUT1_EOF = TRUE;
    ON ENDFILE(INPUT2) INPUT2_EOF = TRUE;
    ON ENDFILE(OUT)    OUT_EOF    = TRUE;

    OPEN FILE(INPUT1) INPUT,
         FILE(INPUT2) INPUT,
         FILE(OUT)    OUTPUT;

    READ FILE(INPUT1) SET(A);                /* PRIMING READ         */
    READ FILE(INPUT2) SET(B);

    DO WHILE ((INPUT1_EOF = FALSE) & (INPUT2_EOF = FALSE));
      IF ITEM1 > ITEM2 THEN
        DO;
          WRITE FILE(OUT) FROM(ITEM2);
          PUT FILE(SYSPRINT) SKIP EDIT('1>2', ITEM1, ITEM2)
              (A(5),A,A);
          READ FILE(INPUT2) SET(B);
        END;
      ELSE
        DO;
          WRITE FILE(OUT) FROM(ITEM1);
          PUT FILE(SYSPRINT) SKIP EDIT('1<2', ITEM1, ITEM2)
              (A(5),A,A);
          READ FILE(INPUT1) SET(A);
        END;
    END;
    DO WHILE (INPUT1_EOF = FALSE);           /* INPUT2 IS EXHAUSTED  */
      WRITE FILE(OUT) FROM(ITEM1);
      PUT FILE(SYSPRINT) SKIP EDIT('1', ITEM1) (A(2),A);
      READ FILE(INPUT1) SET(A);
    END;

    DO WHILE (INPUT2_EOF = FALSE);           /* INPUT1 IS EXHAUSTED  */
      WRITE FILE(OUT) FROM(ITEM2);
      PUT FILE(SYSPRINT) SKIP EDIT('2', ITEM2) (A(2),A);
      READ FILE(INPUT2) SET(B);
    END;

    CLOSE FILE(INPUT1), FILE(INPUT2), FILE(OUT);
    PUT FILE(SYSPRINT) PAGE;
    OPEN FILE(OUT) SEQUENTIAL INPUT;

    READ FILE(OUT) INTO(INPUT_LINE);         /* DISPLAY OUT FILE     */
    DO WHILE (OUT_EOF = FALSE);
      PUT FILE(SYSPRINT) SKIP EDIT(INPUT_LINE) (A);
      READ FILE(OUT) INTO(INPUT_LINE);
    END;
    CLOSE FILE(OUT);

  END MERGE;
 /*
 //GO.INPUT1 DD *
 AAAAAA
 CCCCCC
 EEEEEE
 GGGGGG
 IIIIII
 /*
 //GO.INPUT2 DD *
 BBBBBB
 DDDDDD
 FFFFFF
 HHHHHH
 JJJJJJ
 KKKKKK
 /*
 //GO.OUT DD DSN=&&TEMP,DISP=(NEW,DELETE),UNIT=SYSDA,
 //          DCB=(RECFM=FB,BLKSIZE=150,LRECL=15),SPACE=(TRK,(1,1))

The program in Figure 32 uses record-oriented data transmission to print the table created by the program in Figure 28.

Figure 32. Printing record-oriented data transmission
%PROCESS INT F(I) AG A(F) OP STG NEST X(F) SOURCE ;
%PROCESS LIST;

 PRT: PROC OPTIONS(MAIN);
   DCL TABLE       FILE RECORD INPUT SEQUENTIAL;
   DCL PRINTER     FILE RECORD OUTPUT SEQL
                        ENV(V BLKSIZE(102) CTLASA);
   DCL LINE        CHAR(94) VAR;

   DCL TABLE_EOF   BIT(1) INIT('0'B);       /* EOF FLAG FOR TABLE   */
   DCL TRUE        BIT(1) INIT('1'B);       /* CONSTANT TRUE        */
   DCL FALSE       BIT(1) INIT('0'B);       /* CONSTANT FALSE       */


   ON ENDFILE(TABLE) TABLE_EOF = TRUE;

   OPEN FILE(TABLE),
        FILE(PRINTER);

   READ FILE(TABLE) INTO(LINE);             /* PRIMING READ         */

   DO WHILE (TABLE_EOF = FALSE);
     WRITE FILE(PRINTER) FROM(LINE);
     READ FILE(TABLE) INTO(LINE);
   END;

   CLOSE FILE(TABLE),
         FILE(PRINTER);
 END PRT;

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)