CL

191. SBMJOB した親ジョブと子ジョブが会話する方法

これはあるシミレーションの体系を作るために
SBMJOBで投入した別の子ジョブと通信する方法を
AIに相談したところから始まった。

AIはいくつかの方法を提案してきたのだが
どれも複数ユーザー環境で使える方法ではなく
パラメータを子ジョブに渡すなどスマートさに欠ける
不細工な方法であった。
一般に SBMJOBすると

ジョブ 707772/QTR/CHILDJOB がライブラリー QGPL のジョ
ブ待ち行列 QBATCH に投入された。

とメッセージが残るのでこのメッセージを取れないかと
AIに相談するとAIが教えてくれたのが
次の方法である。
[ CLP: TESTOYA ]

ソースはこちらから

0001.00 PGM                                                                       
0002.00                                                                           
0003.00     DCL VAR(&MSG) TYPE(*CHAR) LEN(256)                                    
0004.00     DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)                                    
0005.00     DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                          
0006.00              DCL        VAR(&JOB) TYPE(*CHAR) STG(*DEFINED) LEN(10) +     
0007.00                           DEFVAR(&MSGDTA 1)                               
0008.00              DCL        VAR(&USER) TYPE(*CHAR) STG(*DEFINED) LEN(10) +    
0009.00                           DEFVAR(&MSGDTA 11)                              
0010.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) STG(*DEFINED) +          
0011.00                           LEN(6) DEFVAR(&MSGDTA 21)                       
0012.00                                                                           
0013.00     /*  子ジョブ投入  */                                                  
0014.00     SBMJOB CMD(CALL PGM(TEST.COM/CHILDCLP)) JOB(CHILDJOB)                 
0015.00                                                                           
0016.00     /* SBMJOB  が返すメッセージを受信  */                                 
0017.00              RCVMSG     MSGTYPE(*COMP) MSG(&MSG) MSGDTA(&MSGDTA) +        
0018.00                           MSGID(&MSGID)                                   
0019.00                                                                           
0020.00     SNDPGMMSG MSG(' 受信したメッセージ ID=' *CAT &MSGID)                  
0021.00     SNDPGMMSG MSG(' メッセージ内容 =' *CAT &MSG)                          
0022.00                                                                           
0023.00 ENDPGM    


                                                                  
0005.00     DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                          
0006.00              DCL        VAR(&JOB) TYPE(*CHAR) STG(*DEFINED) LEN(10) +     
0007.00                           DEFVAR(&MSGDTA 1)                               
0008.00              DCL        VAR(&USER) TYPE(*CHAR) STG(*DEFINED) LEN(10) +    
0009.00                           DEFVAR(&MSGDTA 11)                              
0010.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) STG(*DEFINED) +          
0011.00                           LEN(6) DEFVAR(&MSGDTA 21)                       

の部分は処理しやすくなるように小職が &MSGDTAを分割したもので
AIは MSGDTAの受信までは気づかなかった。
AIが教えてくれたのは

0016.00     /* SBMJOB  が返すメッセージを受信  */                                 
0017.00              RCVMSG     MSGTYPE(*COMP) MSG(&MSG) MSGDTA(&MSGDTA) +        
0018.00                           MSGID(&MSGID) 

の部分だけであるがこれで十分である。
あとは子ジョブでデータ待ち行列にデータを投入すれば
親ジョブで受信することができるので親ジョブと子ジョブの
会話ができるという仕組みが成立する。

一見すると地味な処理に見えるのだがこれは
AIがデバッグ環境を自ら動作できる環境をシミレートすることが
できるようになる。
高度な技術もこのような小さな技術の積み重ねである。

_