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

ストリーム入出力による PRINT ファイルの使用

オペレーティング・システムにも PL/I 言語にも、 出力データのフォーマット設定を簡単に行えるようにするための機能がいくつかあります。 オペレーティング・システムで、ユーザーが各レコードの最初のバイトを印刷制御文字として 使用することができるようにしています。 制御文字は、印刷されずにプリンターに改行や改ページを行わせます。(印刷制御文字の詳細については、図 29 お よび 表 17 を参照してください。)

PL/I プログラムでは、PRINT ファイルの使用は、ストリーム指向データ伝送からの 印刷出力のレイアウトを制御するのに便利な方法です。 コンパイラーは、PAGE、 SKIP、LINE オプション、およびフォーマット項目に対応 して印刷制御文字を自動的に挿入します。

関連付けられたデータ・セットを直接印刷するつもりでない 場合でも、PRINT 属性を任意の STREAM OUTPUT ファイルに適用することができます。 PRINT ファイルが直接アクセス・データ・セットに関連付けられていると、 印刷制御文字はこのデータ・セットのレイアウトには効力がありませんが、 レコード内のデータの一部として現れます。

FB または VB でオープンされた PRINT ファイルは、UNDEFINEDFILE 条件が生じる原因になります。PRINT ファイルは、"A" オプションすなわち FBA または VBA でオープンします。

コンパイラーは、PRINT ファイルで伝送される各レコードの最初の バイトが米国標準規格 (ANS) の印刷制御文字用に予約し、自動的に適切な文字を 挿入します。

PRINT ファイルは、次の 5 つの印刷制御文字だけを使用します。

文字
処置
 
1 行空けて (ブランク文字) から印刷する
0
2 行空けてから印刷する
-
3 行空けてから印刷する
+
1 行目から印刷する
1
改ページする

コンパイラーは、現行レコードの残りにブランクを埋め込み、次の レコードに適切な制御文字を挿入することによって、PAGE、SKIP、LINE の 各オプションやフォーマット項目を処理します。SKIP または LINE に 3 行を超えるスペースが指定されている場合は、 コンパイラーは、適切な制御文字を使って必要な数のブランク・レコードを挿入し、 必要なスペーシングを行います。 印刷制御オプションやフォーマット項目がない場合は、レコードがフルになる と、コンパイラーは、次のレコードの最初のバイトにブランク文字 (1 行の スペース) を挿入します。

PRINT ファイルの伝送先が端末の場合は、出力フォーマットを指定しない限り、PAGE、SKIP、LINE の各オプションに 3 行を超えるスキップをさせることはありません。

印刷する行の長さの制御

ユーザーの PL/I プログラムあるいは DD ステートメントにレコード長を 指定する (ENVIRONMENT 属性) か、あるいは OPEN ステートメントに行サイズを指定する (LINESIZE オプション) ことに よって、PRINT ファイルで作成された印刷行の長さを制限することができます。 レコード長には印刷制御文字用の余分のバイト数を含める必要があります。 すなわち、レコード長は印刷される行の長さ より 1 バイト (V フォーマット・レコードの場合は、5 バイト) 長くなければなりません。 ユーザーが LINESIZE オプションに指定した値は、印刷される行の文字数 を参照します。コンパイラーは印刷制御文字を追加します。

レコードをブロック化しても、PRINT ファイルで 生成される出力の外観に影響はありませんが、 直接アクセス装置上でファイルがデータ・セットと関連付けられていれば、 補助記憶域をより効率よく使えるようになります。 なお、LINESIZE オプションを指定する場合は、行サイズとブロック・サイズと の互換性を確認する必要があります。F フォーマットのレコードの場合、 ブロック・サイズは正確に (行サイズ +1) の倍数で なくてはならず、V フォーマットのレコードの場合、 ブロック・サイズは行サイズよりも最低 9 バイト大きくなければなりません。

ファイルをいったんクローズし、新しい行サイズでもう一度オープンすれば、実 行中に PRINT ファイルの行サイズを変更できますが、PRINT ファイルを使って直接 アクセス装置上にデータ・セットを作成する場合は、注意が必要です。 ファイルを初めてオープンしたとき、 データ・セットに設定したレコード・フォーマットは変更できません。OPEN ステートメントに指定した行サイズと、 既に設定されているレコード長が矛盾すると、UNDEFINEDFILE 条件が発生します。 このような矛盾が生じないように、使用する予定の最大行サイズより最低 9 バイト大き いブロック・サイズを指定して V フォーマット・レコードを指定するか、 最初の OPEN ステートメントで最大行サイズを必ず指定するようにしてください。 (プリンターに送る予定の出力は、直接プリンターへ送ろうとする 場合でも、UNIT= を使ってプリンターを指定しない限り、一時的に直接アクセス装置に 保管することができます。)

PRINT ファイルは 120 文字のデフォルトの行サイズを持っています。 したがって、PRINT ファイルのレコード・フォーマットを指定する必要はありません。 また、他の情報がない場合には、コンパイラーは V フォーマットのレコードであると見なします。 完全なデフォルト値は、次のとおりです。

図 27 は、PRINT ファイルと、 ストリーム指向データ伝送ステートメントのオプションを使って、 テーブルをフォーマット設定して、 それを後で印刷できるように直接アクセス装置に書き込む方法を例示しています。 このテーブルは、6' 間隔の、0° から 359° 54' までの角度の正弦から成ります。

ENDPAGE ON ユニット内のステートメントによって、 各ページの下にページ番号が挿入され、次ページの見出しがセットアップされます。

このプログラムで作成されたデータ・セットを定義する DD ステートメントには、 レコード・フォーマットに関する情報は含まれていません。 ファイル TABLE をオープンするステートメントに指定されたファイル宣言およ び行サイズから、コンパイラーは次のように推測します。

レコード・フォーマット =
V (PRINT ファイルのデフォルト値)
レコード・サイズ =
98 (行サイズ + 1 バイト (印刷制御文字用) + 4 バイト (レコード制御フィールド用))
ブロック・サイズ =
102 (レコード長 + 4 バイト (ブロック制御フィールド用))

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

図 27. ストリーム・データ伝送による印刷ファイルの作成. 図 31 の例では、結果ファイルが印刷されます。
%PROCESS INT F(I) AG A(F) OP STG NEST X(F) SOURCE ;
%PROCESS LIST;

 SINE: PROC OPTIONS(MAIN);
   DCL TABLE       FILE STREAM OUTPUT PRINT;
   DCL DEG         FIXED DEC(5,1) INIT(0);  /* INIT(0) FOR ENDPAGE  */
   DCL MIN         FIXED DEC(3,1);
   DCL PGNO        FIXED DEC(2)   INIT(0);
   DCL ONCODE      BUILTIN;

   ON ERROR
     BEGIN;
       ON ERROR SYSTEM;
       DISPLAY ('ONCODE = '|| ONCODE);
     END;

   ON ENDPAGE(TABLE)
     BEGIN;
       DCL I;
       IF PGNO ¬= 0 THEN
         PUT FILE(TABLE) EDIT ('PAGE',PGNO)
             (LINE(55),COL(80),A,F(3));
       IF DEG ¬= 360 THEN
         DO;
           PUT FILE(TABLE) PAGE EDIT ('NATURAL SINES') (A);
           IF PGNO ¬= 0 THEN
             PUT FILE(TABLE) EDIT ((I DO I = 0 TO 54 BY 6))
                                  (SKIP(3),10 F(9));
           PGNO = PGNO + 1;
         END;
       ELSE
         PUT FILE(TABLE) PAGE;
     END;

   OPEN FILE(TABLE) PAGESIZE(52) LINESIZE(93);
   SIGNAL ENDPAGE(TABLE);

   PUT FILE(TABLE) EDIT
    ((DEG,(SIND(DEG+MIN) DO MIN = 0 TO .9 BY .1) DO DEG = 0 TO 359))
    (SKIP(2), 5 (COL(1), F(3), 10 F(9,4) ));
   PUT FILE(TABLE) SKIP(52);
 END SINE;

タブ制御テーブルの指定変更

PRINT ファイルへのデータ指示出力およびリスト指示出力は、 事前設定されているタブ位置に合わせて配置されます。 タブ・テーブルの宣言方法の例については、図 14 および 図 28 の例を参照してください。 テーブル内にフィールドを定義する方法は、次のとおりです。

OFFSET OF TAB COUNT:
ハーフワード 2 進整数で表された 『タブ・カウント』 のオフセット。 これは、使用するタブ数を示すためのフィールドです。
PAGESIZE:
デフォルトのページ・サイズを定義するハーフワード 2 進整数。 ページ・サイズは、ストリーム出力時、および PLIDUMP データ・セットへのダ ンプ出力時に使われる値です。
LINESIZE:
デフォルトの行サイズを定義するハーフワード 2 進整数
PAGELENGTH:
端末での印刷で使われるデフォルトのページ長を定義するハーフワード 2 進整数
FILLERS:
3 ハーフワードの 2 進整数。将来の利用のために予約済み
TAB COUNT:
テーブル内のタブ位置の数 (最大 255) を定義するハーフワード 2 進整数。 タブ・カウント = 0 の場合は、指定されたタブ位置はすべて無視されます。
Tab1-Tabn:
印刷行内のタブ位置を定義する n 個のハーフワード 2 進整数。 最初のタブ位置には 1 という番号がつき、最大値は 255 です。 各タブの値は、テーブル内でその前にあるタブの値より大きく なければなりません。 さもなければその値は無視されます。 印刷される出力の最初のデータ・フィールドは、次の有効なタブ位置から始まります。

リンケージ・エディターを使って PLITABS への外部参照を解決すれば、ユーザー・ プログラムで PL/I のデフォルトのタブ設定を変更することができます。 この外部参照を解決するには、PLITABS という名前の テーブルを前述のフォーマットで与えます。

このタブ・テーブルを供給するには、ソース・プログラムに PLITABS という名前の PL/I 構造体を組み込みます。この構造体を、MAIN プロシージャー内、または MAIN プロシージャーとリンクされるプログラム内で、STATIC EXTERNAL として宣言する必要があります。 図 28 は、PL/I 構造体の例です。 この例では、位置 30、60、90 に 3 つのタブを設定し、 ページ・サイズおよび行サイズにはデフォルト値が使われています。TAB1 は行上に印刷される 2 番目の項目の位置を識別することに 注意してください。行上の第 1 項目は常に 左マージンから始まります。 構造体の第 1 項目は、NO_OF_TABS フィールドへのオフセットです。 なお、FILL1、FILL2、FILL3 は、オフセットの値を -6 で調整すれば省略できます。

図 28. 事前設定済みのタブ設定を変更する場合の PL/I 構造体 PLITABS
DCL 1 PLITABS STATIC EXT,
    2 (OFFSET INIT(14),
      PAGESIZE INIT(60),
      LINESIZE INIT(120),
      PAGELENGTH INIT(0),
      FILL1 INIT(0),
      FILL2 INIT(0),
      FILL3 INIT(0),
      NO_OF_TABS INIT(3),
      TAB1 INIT(30),
      TAB2 INIT(60),
      TAB3 INIT(90)) FIXED BIN(15,0);

Terms of use | Feedback

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