この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の操作にも自信が持てるというものである。
