CL

203. CLP印刷の留意点

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印刷のスプールも正しくファイル変換することができる。
_