Rational Developer for System z
Enterprise PL/I for z/OS, Version 4.1, プログラミング・ガイド

連続データ・セットの例

連続データ・セットを作成し、それにアクセスする方法 については、図 31 のプログラムに示されています。 プログラムは、2 つのデータ・セットの内容を入力ストリーム内で 組み合わせてから、それを新規データ・セット &&TEMP; に書き込みますが、 元のデータ・セットにはおのおの、EBCDIC 照合順序に並べられた 15 バイトの 固定長レコードが入っています。 INPUT1 と INPUT2 の 2 つの入力ファイルは デフォルト属性 BUFFERED を持ち、関連データ・セット からレコードをそれぞれのバッファーに読み取るのに位置指定モードが使われます。 バッファー内の基底付き変数へのアクセスは、 ファイルがクローズされた後は行わないでください。

図 31. 連続データ・セットのマージ、ソート、作成と連続データ・セットへのアクセス
 //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))

図 32 のプログラムは、レコード単位データ伝送を 使って、図 28 のプログラムが作成するテーブルを 印刷します。

図 32. レコード単位データ伝送の印刷
%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)