rexx プログラムでは、COBOL プログラムが呼び出され、その SYSOUT が一時データセット割り当て (TSO 割り当て) を使用してキャプチャされ、次に EXECIO 読み取りが使用されます。通常は問題なく動作します。
ユーザーの 1 人 (別のマシンを使用) が、EXECIO 読み取りで問題を報告しました。
IRX0562E Abnormal completion of the GET Data Management macro.
IRX0565E SG0 ,$LOGON ,3420,D,SYSOUT ,GET ,WRNG.LEN.RECORD,0000003500000 0,QSAM.
IEC020I 001-4,SG0,$LOGON,SYSOUT,3420,BWS858,
IEC020I SYS15089.T170858.RA000.SG0.R0278041
IEC020I DCB EROPT=ABE OR AN INVALID CODE, AND/OR NO SYNAD EXIT SPECIFIED
IRX0250E System abend code 001, reason code 00000004.
IRX0255E Abend in host command EXECIO or address environment routine MVS.
この問題は、特に COBOL プログラムが SYSOUT にいくつかの出力を持っている場合に発生することがわかりました。TSO 割り当てで「VB」属性を指定することにより、z/OS システムで同様の状況を再現できました。この場合、割り当てられたデータセットは ISPF で表示できません。ISPF で表示しようとすると、次のエラー メッセージが表示されます。
'I/O error occurred reading the edit data'
この破損したデータが SHARED/OLD モードを使用して割り当てられた場合、問題は解決されます。したがって、この種の問題は、新しい割り当てと COBOL プログラムの実行中に発生します。
COBOL プログラムの実行後、さらに SHR/OLD モードを割り当てることで、この問題が修正されました。ここで何がうまくいかなかったのかについてのアイデアはありますか?
テスト版では、カタログ化されたファイルを次のように使用します。COBOL プログラム実行直前の SYSOUT の割り当ては次のとおりです。レコード形式を「VB」に変更した場合にのみ問題が発生することを確認してください (これは、別の zos マシンでユーザーから報告された同じエラーの再作成です)。
if (existsDSN(tmpDS)) then do ADDRESS TSO, /* ここで動作します */ "ALLOC DS('"tmpDS"') F(SYSOUT) SHR REUSE" 終わり そうでなければする ADDRESS TSO /* ここに ds 作成エラー */ "ALLOC DS('"tmpDS"') F(SYSOUT) NEW DSORG(PS)", "BLKSIZE(121) SPACE(5,15) TRACKS RECFM(FBA) DIR(0)" 終わり
カタログ化された SYSOUT データセットは、ISPF ブラウズ モードでも読み取ることができないことに注意してください。
以下は、bill で言及されている COBOL プログラムの出力ですが、最初のレコードが SYSOUT に 2 回 (つまり、合計 4 つのメッセージ行) 表示されます。
0000000121
4FFFFFFFFFF
00000000121
' ` expected message text
4070007004
00D0009000