CLPでも印刷できることを先に「200.CLPで印刷出力するには」で紹介したが
ここで少し注意点を紹介する。
最初に印刷CLPのサンプルとして
TESTPRT1
ソースはこちらから
001.00 PGM
002.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(128)
003.00 DCL VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')
004.00 DCL VAR(&CRLF_NULL) TYPE(*CHAR) LEN(3) +
005.00 VALUE(X'1500')
006.00
007.00 CHGVAR VAR(&CMD) VALUE('TESTPRT1' *CAT &CRLF_NULL)
008.00 OVRPRTF FILE(STDOUT) TOFILE(QSYSPRT) +
009.00 OUTQ(CHAO.USR/QEZJOBLOG) HOLD(*YES) +
010.00 SECURE(*YES) OVRSCOPE(*JOB) SHARE(*YES)
011.00 CALLPRC PRC('printf') PARM((&CMD *BYREF))
012.00 DLTOVR FILE(STDOUT) LVL(*JOB)
013.00 ENDPGM
[解説]
これはOUTQ: CHAO.USR/QEZJOBLOG に QSYSPRTという名前でスプールを
出力する例であるがこれは正常に出力される。
_
次にこのスプールをCLPの中でCPYSPLFでQTEMPのファイルとして
変換してみよう。
TESTPRT2
ソースはこちらから
0001.00 PGM
0002.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(128)
0003.00 DCL VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')
0004.00 DCL VAR(&CRLF_NULL) TYPE(*CHAR) LEN(3) +
0005.00 VALUE(X'1500')
0006.00
0007.00 CHGVAR VAR(&CMD) VALUE('TESTPRT2' *CAT &CRLF_NULL)
0008.00 OVRPRTF FILE(STDOUT) TOFILE(QSYSPRT) +
0009.00 OUTQ(CHAO.USR/QEZJOBLOG) HOLD(*YES) +
0010.00 SECURE(*YES) OVRSCOPE(*JOB) SHARE(*YES)
0011.00 CALLPRC PRC('printf') PARM((&CMD *BYREF))
0012.00 DLTOVR FILE(STDOUT) LVL(*JOB)
0013.00 CRTPF FILE(QTEMP/TESTPRT2) RCDLEN(132) +
0014.00 IGCDTA(*YES) AUT(*ALL)
0015.00 CPYSPLF FILE(QSYSPRT) TOFILE(QTEMP/TESTPRT2) JOB(*) +
0016.00 SPLNBR(*LAST)
0017.00 ENDPGM
[解説]
0013.00 CRTPF FILE(QTEMP/TESTPRT2) RCDLEN(132) + 0014.00 IGCDTA(*YES) AUT(*ALL) 0015.00 CPYSPLF FILE(QSYSPRT) TOFILE(QTEMP/TESTPRT2) JOB(*) + 0016.00 SPLNBR(*LAST)
としてライブラリーQTEMPにファイルTESTPRT2を作成してそこに
スプールをCPYSPLFでコピーするというものであるが
実行してみるとCPYSPLF で
CPF3482:コピー要求は正常に実行されなかった。スプール・ファイル QSYSPRT はオープ ンされています。
というエラーになる。
このエラー・メッセージはFILEに指定されたスプール・ファイルはオープンされており
まだクローズされていないというエラーを示している。
スプールはそれを出力しているプログラムが実行中はOSのメモリ内にあり
プログラムの終了とともにクローズされる。
このCLPはまだ終了していないのでスプールはまだクローズされておらず
従ってコピーすることができない、というものである。
スプールは通常はRPG/COBOLなどでプログラムが終了した後で処理かするので
このようなエラーが発生することはないがCLPで印刷するときは
CLP内部ではまだ終了していないのでこのような問題が発生する。
_
次はこの問題を対策した例である。
TESTPRT3
ソースはこちらから
0001.00 PGM
0002.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(128)
0003.00 DCL VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')
0004.00 DCL VAR(&CRLF_NULL) TYPE(*CHAR) LEN(3) +
0005.00 VALUE(X'1500')
0006.00
0007.00 CHGVAR VAR(&CMD) VALUE('TESTPRT2' *CAT &CRLF_NULL)
0008.00 OVRPRTF FILE(STDOUT) TOFILE(QSYSPRT) DFRWRT(*NO) +
0009.00 SPOOL(*NO) OUTQ(CHAO.USR/QEZJOBLOG) +
0010.00 HOLD(*YES) SECURE(*YES) OVRSCOPE(*JOB) +
0011.00 SHARE(*YES)
0012.00 CALLPRC PRC('printf') PARM((&CMD *BYREF))
0013.00 DLTOVR FILE(STDOUT) LVL(*JOB)
0014.00 CRTPF FILE(QTEMP/TESTPRT3) RCDLEN(132) +
0015.00 IGCDTA(*YES) AUT(*ALL)
0016.00 CPYSPLF FILE(QSYSPRT) TOFILE(QTEMP/TESTPRT3) JOB(*) +
0017.00 SPLNBR(*LAST)
0018.00 ENDPGM
[解説]
それならば印刷出力はスプールしないというのがこの例である。
0008.00 OVRPRTF FILE(STDOUT) TOFILE(QSYSPRT) DFRWRT(*NO) + 0009.00 SPOOL(*NO) OUTQ(CHAO.USR/QEZJOBLOG) + 0010.00 HOLD(*YES) SECURE(*YES) OVRSCOPE(*JOB) + 0011.00 SHARE(*YES)
の中で
DFRWRT(*NO) SPOOL(*NO)
とすれば印刷出力はスプールされないが後続の CPYSPLF は
ちゃんと正しく機能する。
IBM iは良くできていて CPYSPLFはスプールされていない
印刷出力に対しても昨日するように設計されているのであろう。
これによってCLP印刷のスプールも正しくファイル変換することができる。
_
