RPG

555. QPRINTを使わない印刷出力とは

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を使わずに印刷出力することができる

という優れものである。
ぜひ活用して頂きたい素晴らしいテクニックである。