RPGで印刷というい必ずファイル仕様書にQPRINTを
宣言して印刷出力するものであるが
サービス・プログラム(*SRVPGM)などで
いちいちQPRINTを宣言して印刷するのも大げさな気がする。
ここではC言語のprintf関数を使った本当に簡単な洗練された
表示と印刷の方法を紹介しよう。
目からウロコのテクニックである。
DISPLY命令より簡単に長いフィールドの表示も印刷もできる。
これは本当に覚えていて役に立つ便利なテクニックである。
[ QPRINTを使わない印刷 : TESTPRT4 ]
ソースはこちらから
0001.00 H DFTNAME(TESTRPT4) DATEDIT(*YMD/) BNDDIR('QC2LE')
0002.00 F********** QPRINT を使わない印刷出力 ****************************
0003.00 F*
0004.00 F*****************************************************************
0005.00 *( printf 関数 )
0006.00 D printf PR 10I 0 EXTPROC('printf')
0007.00 D STR * OPTIONS(*STRING) VALUE
0008.00 D VALUE * OPTIONS(*STRING:*NOPASS) VALUE
0009.00
0010.00 D VALUE S 132
0011.00 D CRLF S 1A INZ(X'15')
0012.00
0013.00 /FREE
0014.00 printf('** QCMDEXC 開始 **' + CRLF);
0015.00 VALUE = '** ABCD **';
0016.00 printf('%s' + CRLF: VALUE);
0017.00 /END-FREE
0018.00 C SETON LR
[解説]
H-仕様書で BNDDIR(‘QC2LE’) を宣言しておくと
C言語の標準関数ライブラリーをインクルードすることができる。
テクニックはC言語のprintf関数のプロシージャー定義である。
0005.00 *( printf 関数 )
0006.00 D printf PR 10I 0 EXTPROC('printf')
0007.00 D STR * OPTIONS(*STRING) VALUE
0008.00 D VALUE * OPTIONS(*STRING:*NOPASS) VALUE
*STRING はRPGからパラメータとして渡すときに必要な最後の
NULL-STOPをつけてくれる。
EBCDICの改行コード
0011.00 D CRLF S 1A INZ(X'15')
がRPGの場合は必要である。
0016.00 printf('%s' + CRLF: VALUE)
の %s は VALUEを式に代入することょ意味している。
さてこのまま実行すれば結果は
** QCMDEXC 開始 **
** ABCD **
実行キーを押して端末セッションを終了してください。
のように画面表示される。C言語のgetchar()のような
停止命令を入れる必要もなくても自動的に停止する。
DSPLY命令の場合は40バイトまでしか表示できないが
printfによる表示の制限はない。
このprintfによる出力はC言語では標準出力と呼ばれる
ファイルSTDOUTに出力されるので
OVRDBF FILE(STDOUT) TOFILE(QGPL/QPRINT) OVRSCOPE(*JOB) CALL MYPGM DLTOVR FILE(STDOUT) LVL(*JOB)
とすれば印刷出力することができる。
このようにprintf関数を使うと
①40バイト以上の文字列も表示することができる。
②OVRPRTF STDOUT でQPRINTを使わずに印刷出力することができる
という優れものである。
ぜひ活用して頂きたい素晴らしいテクニックである。
