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

ストリーム入出力によるデータ・セットの作成

データ・セットを作成するには、ユーザーの PL/I プログラム内で、 またはデータ・セットを定義する DD ステートメント内で、特定の情報を オペレーティング・システムに与える必要があります。z/OS UNIX では、次のような方法でこの情報を与えます。

次に、必須情報を示し、ユーザーが与えることのできるいくつかのオプショナルの 情報について説明します。

必須情報

ユーザーのアプリケーションで STREAM ファイルを作成する場合は、PL/I は、 次の入手源の 1 つから、優先順位順に (降順)、そのファイルの行サイズの値を導き出します。

LINESIZE の値が与えられていて、RECSIZE の値が与えられていない場合は、PL/I は、次のようにレコード長を導き出します。

LINESIZE の値が与えられておらず、RECSIZE の値が与えられている場合は、PL/I は、次のように RECSIZE から行サイズの値を導き出します。

LINESIZE も RECSIZE も与えられていない場合は、PL/I は、 ファイル属性および関連付けられたデータ・セットのタイプ に基づいて、デフォルトの行サイズの値を決定します。PL/I が適切なデフォルトの行サイズを与えられない 場合は、UNDEFINEDFILE 条件が発生します。

次の場合には、デフォルトの行サイズが OUTPUT ファイルに与えられます。

なお、LINESIZE オプションが (OPEN ステートメントで) 指定されていて、かつ (ENVIRONMENT 属性、TITLE オプション、または DD ステートメントで) RECSIZE も指定されていて、 (レコード・フォーマットおよび適切な制御バイトのオーバーヘッドを考慮に入れて) レコード・サイズの値が小さ過ぎて LINESIZE を保持できない場合は、以下のようになります。

編集指示ストリーム指向データ伝送を使用して、 直接アクセス・ストレージ・デバイス上にデータ・セットを作成する方法が、 図 24 に示されています。 ファイル SYSIN によって入力ストリームから読み取られるデータには、 名前の付いていない 7 文字サブフィールドが入っているフィールド VREC が含まれており、 フィールド NUM は情報が入っているこれらのサブフィールドの数を定義します。 出力ファイル WORK は、ファイル FREC 全体と、VREC の中で情報の入っているサブフィールドだけをデータ・セットに送ります。

図 24. ストリーム指向データ伝送によるデータ・セットの作成
 //EX7#2  JOB
 //STEP1  EXEC IBMZCBG
 //PLI.SYSIN     DD *
  PEOPLE: PROC OPTIONS(MAIN);
          DCL WORK FILE STREAM OUTPUT,
              1 REC,
                2 FREC,
                  3 NAME CHAR(19),
                  3 NUM CHAR(1),
                  3 PAD CHAR(25),
                2 VREC CHAR(35),
              EOF BIT(1) INIT('0'B),
              IN CHAR(80) DEF REC;
          ON ENDFILE(SYSIN) EOF='1'B;
          OPEN FILE(WORK) LINESIZE(400);
          GET FILE(SYSIN) EDIT(IN)(A(80));
          DO WHILE (¬EOF);
          PUT FILE(WORK) EDIT(IN)(A(45+7*NUM));
          GET FILE(SYSIN) EDIT(IN)(A(80));
          END;
          CLOSE FILE(WORK);
          END PEOPLE;
 /*
 //GO.WORK DD DSN=HPU8.PEOPLE,DISP=(NEW,CATLG),UNIT=SYSDA,
 //           SPACE=(TRK,(1,1))
 //GO.SYSIN DD *
 R.C.ANDERSON       0 202848 DOCTOR
 B.F.BENNETT        2 771239 PLUMBER          VICTOR HAZEL
 R.E.COLE           5 698635 COOK             ELLEN  VICTOR JOAN   ANN    OTTO
 J.F.COOPER         5 418915 LAWYER           FRANK  CAROL  DONALD NORMAN BRENDA
 A.J.CORNELL        3 237837 BARBER           ALBERT ERIC   JANET
 E.F.FERRIS         4 158636 CARPENTER        GERALD ANNA   MARY   HAROLD
 /*

図 25 は、リスト指示出力を使ってグラフィックス をストリーム・ファイルに書き込むプログラムの例を示しています。 なお、この例では、グラフィック・データを印刷できる出力装置があることを想定しています。 このプログラムは、従業員レコードを読み取り、特定の地域に在住する従業員を選択します。 このプログラムはさらに、住所フィールドを編集して、 各住所項目間にグラフィック・ブランクを挿入し、 従業員番号、氏名、および住所を印刷します。

図 25. グラフィック・データのストリーム・ファイルへの書き込み
 //EX7#3  JOB
 //STEP1 EXEC IBMZCBG
 //PLI.SYSIN      DD *
 % PROCESS GRAPHIC;
   XAMPLE1:  PROC OPTIONS(MAIN);
             DCL  INFILE FILE INPUT RECORD,
                  OUTFILE FILE OUTPUT STREAM ENV(GRAPHIC);
  /* GRAPHIC OPTION MEANS DELIMITERS WILL BE INSERTED ON OUTPUT FILES. */
            DCL
                 1 IN,
                    3 EMPNO CHAR(6),
                    3 SHIFT1 CHAR(1),
                    3 NAME,
                       5 LAST G(7),
                       5 FIRST G(7),
                    3 SHIFT2 CHAR(1),
                    3 ADDRESS,
                       5 ZIP CHAR(6),
                       5 SHIFT3 CHAR(1),
                       5 DISTRICT G(5),
                       5 CITY G(5),
                       5 OTHER G(8),
                       5 SHIFT4 CHAR(1);
            DCL EOF BIT(1) INIT('0'B);
            DCL ADDRWK G(20);
      ON ENDFILE (INFILE) EOF = '1'B;
      READ FILE(INFILE) INTO(IN);
      DO WHILE(¬EOF);
              DO;
                  IF SUBSTR(ZIP,1,3)¬='300'
                     THEN LEAVE;
                  L=0;
                  ADDRWK=DISTRICT;
                  DO I=1 TO 5;
                  IF SUBSTR(DISTRICT,I,1)= <   >
                     THEN LEAVE;               /* SUBSTR BIF PICKS 3P  */
                  END;                         /* THE ITH GRAPHIC CHAR */
                  L=L+I+1;                     /* IN DISTRICT          */
                  SUBSTR(ADDRWK,L,5)=CITY;
                  DO I=1 TO 5;
                  IF SUBSTR(CITY,I,1)= <   >
                     THEN LEAVE;
                  END;
                  L=L+I;
                  SUBSTR(ADDRWK,L,8)=OTHER;
                  PUT FILE(OUTFILE) SKIP           /* THIS DATA SET    */
                  EDIT(EMPNO,IN.LAST,FIRST,ADDRWK) /* REQUIRES UTILITY */
                      (A(8),G(7),G(7),X(4),G(20)); /* TO PRINT GRAPHIC */
                                                   /* DATA             */
                  END;                      /* END OF NON-ITERATIVE DO */
          READ FILE(INFILE) INTO (IN);
          END;                                /* END OF DO WHILE(¬EOF) */
      END XAMPLE1;
 /*
 //GO.OUTFILE   DD  SYSOUT=A,DCB=(RECFM=VB,LRECL=121,BLKSIZE=129)
 //GO.INFILE DD *
 ABCDEF<
>300099<           3 3 3 3 3 3 3   >
 ABCD  <
>300011<           3 3 3 3       >
 /*

Terms of use | Feedback

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