CL

200. CLPで印刷出力するには

 
 
このCLPのカテゴリーでCLPでもRPGと同じように
様々な処理ができることを紹介してきたが
それではCLPによって印刷出力ができるのだろうか?
まさか? できる。

RPGの場合は標準出力をQPRINTというスプール・ファイルとして
出力しているがC言語の場合も標準出力がSTDOUTというスプールに
出力されることになっている。

つまりスプール・データをCLP内で作成して
それを printf というC言語の印刷出力命令で実行してやれば
標準出力として印刷出力することができる。
簡単な例を作ってみよう。

[ TESTPRT:商品マスター印刷]

ソースはこちらから

0001.00              PGM                                                                    
0002.00 /*----------------------------------------------------------------------*/          
0003.00 /*    TESTPRT: :  商品マスターの印刷                                    */          
0004.00 /*                                                                      */          
0005.00 /*     SRCTYPE: CLLE                                                    */          
0006.00 /*     作成 : 2026/09/20  CLLE                                          */          
0007.00 /*     CRTBNDCL OBJLIB/TESTPRT  SRCFILE(R710SRC/QCLSRC)                 */          
0008.00 /*     DFTACTGRP(*NO) ACTGRP(*NEW) AUT(*ALL) DBGVIEW(*SOURCE            */          
0009.00 /*     英小文字 printf を使うので CCSID=5035 で開発 & COMPILE すること  */          
0010.00 /*----------------------------------------------------------------------*/          
0011.00              DCLF       FILE(QTRFIL/SHOHIN)                                         
0012.00              DCL        VAR(&PRTDTA) TYPE(*CHAR) LEN(132)                           
0013.00              DCL        VAR(&CRLF_NULL) TYPE(*CHAR) LEN(2) +                        
0014.00                           VALUE(X'1500') /* EBCDIC 改行コード  */                   
0015.00              DCL        VAR(&CRLF2_NULL) TYPE(*CHAR) LEN(3) +                       
0016.00                           VALUE(X'151500') /* 2 行改行  */                          
0017.00              DCL        VAR(&OS400) TYPE(*CHAR) LEN(6)                              
0018.00              DCL        VAR(&SYSNAM) TYPE(*CHAR) LEN(8)                             
0019.00              DCL        VAR(&UDATE) TYPE(*CHAR) LEN(6)                              
0020.00              DCL        VAR(&DATETIME) TYPE(*CHAR) LEN(20)                          
0021.00              DCL        VAR(&CYY) TYPE(*CHAR) STG(*DEFINED) LEN(4) +                
0022.00                           DEFVAR(&DATETIME 1)                                       
0023.00              DCL        VAR(&MM) TYPE(*CHAR) STG(*DEFINED) LEN(2) +                 
0024.00                           DEFVAR(&DATETIME 5)                                  
0025.00              DCL        VAR(&DD) TYPE(*CHAR) STG(*DEFINED) LEN(2) +            
0026.00                           DEFVAR(&DATETIME 7)                                  
0027.00              DCL        VAR(&HOUR) TYPE(*CHAR) STG(*DEFINED) LEN(2) +          
0028.00                           DEFVAR(&DATETIME 9)                                  
0029.00              DCL        VAR(&MINUTE) TYPE(*CHAR) STG(*DEFINED) +               
0030.00                           LEN(2) DEFVAR(&DATETIME 11)                          
0031.00              DCL        VAR(&SECOND) TYPE(*CHAR) STG(*DEFINED) +               
0032.00                           LEN(2) DEFVAR(&DATETIME 13)                          
0033.00              DCL        VAR(&CURRENTC) TYPE(*CHAR) LEN(32)                     
0034.00              DCL        VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')             
0035.00              DCL        VAR(&SHTANKC) TYPE(*CHAR) LEN(7)                       
0036.00                                                                                
0037.00           /*--------------------------------------*/                           
0038.00              CALLSUBR   SUBR(INZSUBR)                                          
0039.00           /*--------------------------------------*/                           
0040.00                                                                                
0041.00              /******************************************/                      
0042.00              /*STDOUT の出力をスプールに落とす         */                      
0043.00              /******************************************/                      
0044.00              OVRPRTF    FILE(STDOUT) TOFILE(QSYSPRT) OVRSCOPE(*JOB)            
0045.00              CHGVAR     VAR(&PRTDTA) VALUE(&OS400 *CAT ' S' *CAT +             
0046.00                           &SYSNAM *CAT '                ' *CAT +               
0047.00                           ' 商品マスター一覧表 ' *CAT '        ' +             
0048.00                           *CAT &CURRENTC *TCAT &CRLF2_NULL)                 
0049.00              /*( 見出し行の印刷出力 )*/                                     
0050.00              CALLPRC    PRC('printf') PARM((&PRTDTA) (*BYREF))              
0051.00              DOWHILE    COND('1') /* DO-WHILE */                            
0052.00              RCVF       RCDFMT(SHOHINR) /*  商品レコードの読取り  */        
0053.00              MONMSG     MSGID(CPF0864) EXEC(DO)  /* EOF: ファイルの終わり */
0054.00              LEAVE                                                          
0055.00              ENDDO      /* EOF */                                           
0056.00              CHGVAR     VAR(&SHTANKC) VALUE(&SHTANK)                        
0057.00              CHGVAR     VAR(&PRTDTA) VALUE(&SHCODE *CAT ' ' *CAT +          
0058.00                           &SHNAME *CAT ' ' *CAT &SHTANKC *CAT ' ' +         
0059.00                           *CAT &SHSCOD *CAT &CRLF_NULL)                     
0060.00              /*( 明細行の印刷出力 )*/                                       
0061.00              CALLPRC    PRC('printf') PARM((&PRTDTA) (*BYREF))              
0062.00              ENDDO       /* DO-WHILE */                                     
0063.00              DLTOVR     FILE(STDOUT) LVL(*JOB)                              
0064.00              MONMSG     CPF9800                                             
0065.00          /******************************/                                   
0066.00              SUBR       SUBR(INZSUBR)                                       
0067.00          /******************************/                                   
0068.00              RTVJOBA    DATE(&UDATE) DATETIME(&DATETIME)                    
0069.00              RTVNETA    SYSNAME(&SYSNAM)                                    
0070.00              RTVDTAARA  DTAARA(QGPL/QSS1MRI (1 6)) RTNVAR(&OS400)           
0071.00              CHGVAR     VAR(&CURRENTC) VALUE(&CYY *CAT '/' *CAT &MM +       
0072.00                           *CAT '/' *CAT &DD *CAT ' ' *CAT &HOUR +     
0073.00                           *CAT ':' *CAT &MINUTE *CAT ':' *CAT &SECOND)
0074.00              ENDSUBR                                                  
0075.00              ENDPGM     


                                               

 
V7R1M0 SS0667E36                 商品マスター一覧表         2026/09/20 10:33:56      
NV-BS30S    目次ビデオ              0165000 0002                                     
NV-BS50S    ビデオ画王              0200000 0002                                     
NV-CF1      Cカセット編集ビデオ    0058000 0002                                     
NV-CF2      薄型テレビ              0098000 0003                                     
NV-CF81     更新テスト              0058000 0004                                     
NV-CF9      漢字テスト              0019000 0002                                     
NV-F850     音声録画ビデオ          0140000 0002                                     
NV-HK1      歌えるビデオ            0090000 0002                                     
NV-H1T-S    みんなのビデオ          0069800 0002                                     
NV-SX10     ビデオ画王              0115000 0002                                     
NV-W1       世界放送方式ビデオ      0350000 0002                                     
RX-AZ1      液晶テレビ 80 インチ    0300000 0001                                     
RX-BZ1      液晶テレビ 55 インチ    0100000 0002  

[解説]

わずか75ステップで印刷ファイルも作ることなく手軽にCLPで印刷出力を行っている。
QPRINTなどの印刷ファイルはどこにも指定していない。
読取りファイルは

0011.00              DCLF       FILE(QTRFIL/SHOHIN)

としてひとつだけ定義しているが必要であれば複数のファイルを結合して
読み取ることもできる。
今回の読取りは

0051.00              DOWHILE    COND('1') /* DO-WHILE */                            
0052.00              RCVF       RCDFMT(SHOHINR) /*  商品レコードの読取り  */        
0053.00              MONMSG     MSGID(CPF0864) EXEC(DO)  /* EOF: ファイルの終わり */
0054.00              LEAVE                                                          
0055.00              ENDDO      /* EOF */
 :
062.00              ENDDO       /* DO-WHILE */ 

として DOWHILE(1) ~ ENDDO で RCVFで読み取りをLOOPしている。

0044.00              OVRPRTF    FILE(STDOUT) TOFILE(QSYSPRT) OVRSCOPE(*JOB) 
 :
0057.00              CHGVAR     VAR(&PRTDTA) VALUE(&SHCODE *CAT ' ' *CAT +          
0058.00                           &SHNAME *CAT ' ' *CAT &SHTANKC *CAT ' ' +         
0059.00                           *CAT &SHSCOD *CAT &CRLF_NULL)                     
0060.00              /*( 明細行の印刷出力 )*/                                       
0061.00              CALLPRC    PRC('printf') PARM((&PRTDTA) (*BYREF))

によって変数 %PRTDTAにデータを組み立ててから

0061.00              CALLPRC    PRC('printf') PARM((&PRTDTA) (*BYREF))

によってC言語の標準印刷関数である printf を使って印刷出力している。
スプールは

OVRPRTF    FILE(STDOUT) TOFILE(QSYSPRT) OVRSCOPE(*JOB)

によって一時変更しているので必要あればOUTQなどもここで指定することがでかきる。
変数: &CRLF_NULL は EBCDICの場合の改行コードである。

CLPで印刷出力ができると思う人は少ないだろうが実際はこんなに簡単に印刷出力することができる。
最新の製品Chao!! も内部でジョブ・ログの印刷はCLPで印刷出力している。

CLPの印刷は
・非常に簡単にてごろに印刷プログラムとして作成できる。
・CLPなのでRPGを作成することなくパフォーマンスも大変優れている。
・CLPはどのみち必要となるのでCLPで印刷してしまえば全体のプログラム本数を
少なくできる。

…CLPでの印刷の方法を覚えればパフォーマンスに優れた印刷を短時間のうちに
開発することができ簡単な表はCLPで十分作成することができる。
RPG/COBOLの印刷に比べてバグが少なく品質も安定している。
ちょっとしたジョブログのようなものを出力するのに、いちいち大げさにRPGを
作っていたのではプログラム本数も多くなるし開発工数も増えるばかりである。
ちょっとした印刷であればCLPで簡単に出力したほうがスマートというものである。

RPGしかしらない人はメニューまでRPGで作ってしまう人がいるが
それはむしろ逆でCLPしか知らないほうが望ましい。
CLPであればファイルや装置の制御もなどIBM iのほとんどの作業が
できてしまうがRPGはプログラムの範囲しかできない。
CLPを学習すればこのように印刷もCLPでできてしまう。
RPGよりCLPのほうがはるかに強力なのである。
まだRPGはわからないけれどという人はぜひCLPの勉強からでも始めて欲しい。
CLPをマスターするとIBM iの操作にも自信が持てるというものである。