これはあるシミレーションの体系を作るために
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がデバッグ環境を自ら動作できる環境をシミレートすることが
できるようになる。
高度な技術もこのような小さな技術の積み重ねである。
_
