CALL TRANSACTION のリターンコード
- このフォーラムに新規トピックを投稿できます
- このフォーラムではゲスト投稿が許可されています
- このトピックは管理者もしくはモデレータによりロックされています。
CALL TRANSACTION のリターンコード
msg# 1
ishikawa
投稿数: 10
アドオン機能にて、課題が発生しています。
ご存知でしたら教えてください。
CALL TRANSACTION で発伝トランザクションをCALL後、
SY-SUBRCが0にもかかわらず、伝票番号が返却されない場合があるのでしょうか?
しかも、処理後に発伝されたはずの伝票番号を参照すると
正常に発伝がされているのです。
会計系のアドオンですが、
仕様としては以下2ステップの処理をしています。
?内部処理にてCALL TRANSACTION を利用して発伝のトランザクションを呼び出し同期更新のバッチインプットを行う。
?SY-SUBRC=0なら
このバッチインプットの結果としてSY-MSGV1に返却される
伝票番号を取得して、アドオンテーブルを更新する。
これまで約5〜6年ほど稼働しており、特に問題が発生していなかったアドオン機能なのですが、今年3月下旬・7月上旬と決算関連でシステム負荷が高まった場合に?の処理で”伝票番号”が取得できない事象が発生しました。
?の後続処理にてアドオンテーブルは更新されており、伝票番号が””(空文字)のまま保存されている状態でしたので、
SY-SUBRC=0 ですが、伝票番号がSY-MSGV1に返却されていないことになります。
自分なりに調べたところ、以下の2つの情報からSY-SUBRC=0でも
エラーが発生している場合がある?ように読み取れますが
そんなことあるのでしょうか・・・?
<CALL TRANSACTION が正常終了したかどうかの確認>
http://help.sap.com/saphelp_470/helpdata/ja/78/21763651ce11d189570000e829fbbd/content.htm
<CALL TRANSACTIONの命令について>
http://www.ab.auone-net.jp/~s0410/masa/abap/abap20.html
負荷の状況にもよるのか、テスト環境で何度試してみても再現せず
原因が特定できないため、安易に改修も入れられない状況となり困っております。
何かご存知の方がいらっしゃいましたら、ご教示ください。
よろしくお願いします。
ご存知でしたら教えてください。
CALL TRANSACTION で発伝トランザクションをCALL後、
SY-SUBRCが0にもかかわらず、伝票番号が返却されない場合があるのでしょうか?
しかも、処理後に発伝されたはずの伝票番号を参照すると
正常に発伝がされているのです。
会計系のアドオンですが、
仕様としては以下2ステップの処理をしています。
?内部処理にてCALL TRANSACTION を利用して発伝のトランザクションを呼び出し同期更新のバッチインプットを行う。
?SY-SUBRC=0なら
このバッチインプットの結果としてSY-MSGV1に返却される
伝票番号を取得して、アドオンテーブルを更新する。
これまで約5〜6年ほど稼働しており、特に問題が発生していなかったアドオン機能なのですが、今年3月下旬・7月上旬と決算関連でシステム負荷が高まった場合に?の処理で”伝票番号”が取得できない事象が発生しました。
?の後続処理にてアドオンテーブルは更新されており、伝票番号が””(空文字)のまま保存されている状態でしたので、
SY-SUBRC=0 ですが、伝票番号がSY-MSGV1に返却されていないことになります。
自分なりに調べたところ、以下の2つの情報からSY-SUBRC=0でも
エラーが発生している場合がある?ように読み取れますが
そんなことあるのでしょうか・・・?
<CALL TRANSACTION が正常終了したかどうかの確認>
http://help.sap.com/saphelp_470/helpdata/ja/78/21763651ce11d189570000e829fbbd/content.htm
<CALL TRANSACTIONの命令について>
http://www.ab.auone-net.jp/~s0410/masa/abap/abap20.html
負荷の状況にもよるのか、テスト環境で何度試してみても再現せず
原因が特定できないため、安易に改修も入れられない状況となり困っております。
何かご存知の方がいらっしゃいましたら、ご教示ください。
よろしくお願いします。
投票数:206
平均点:2.77
Re: CALL TRANSACTION のリターンコード
msg# 1.1
ojojojojojoj
投稿数: 1
時間が経っているので、もう解決しているかもしれませんが・・・
ロジックを見ていないので、文面から憶測で気になったことを返信します。
通常、伝票登録のバッチインプットPGでは、オプションのmessage intoを使用して、
バッチインプットメッセージを内部テーブルに格納し、
その中から伝票登録時のメッセージID,NOが存在するかをチェックして、判断します。
メッセージ変数も、内部テーブルから取得します。
システム変数直接だと、途中で何かメッセージが出力されれば、
その値で書き換わってしまうので、処理としては良くないですね。
SY-SUBRCですが、モードNで実行した場合、エラーがあると必ず0以外が設定されるので、
SY-SUBRC=0でエラーが発生しているのはあり得ないと思います。
可能性は薄いですが、バッチインプット時のプログラムは、
COMMITが発行された時点でプログラムの処理が終了します。
オプションRACOMMITをONにすると、COMMIT後も続行されます。
COMMIT後に何かメッセージが出力されるロジックがあって、
偶然そのパターンになってSY-MSGVが書き換わったのかもしれません。
(何もしなければデフォルトでOFFなので、あり得ないと思いますが念のため)
message intoを使用したロジックになっているのであれば、
ちょっと厳しいかもしれませんね。。。
<CALL TRANSACTION が正常終了したかどうかの確認>
に書いている内容ですが、モードA,またはEで実行した場合、
エラーが発生しても、手動で画面を戻ったりして終了させた場合、subrcに0が設定されると言う説明です。
ロジックを見ていないので、文面から憶測で気になったことを返信します。
通常、伝票登録のバッチインプットPGでは、オプションのmessage intoを使用して、
バッチインプットメッセージを内部テーブルに格納し、
その中から伝票登録時のメッセージID,NOが存在するかをチェックして、判断します。
メッセージ変数も、内部テーブルから取得します。
システム変数直接だと、途中で何かメッセージが出力されれば、
その値で書き換わってしまうので、処理としては良くないですね。
SY-SUBRCですが、モードNで実行した場合、エラーがあると必ず0以外が設定されるので、
SY-SUBRC=0でエラーが発生しているのはあり得ないと思います。
可能性は薄いですが、バッチインプット時のプログラムは、
COMMITが発行された時点でプログラムの処理が終了します。
オプションRACOMMITをONにすると、COMMIT後も続行されます。
COMMIT後に何かメッセージが出力されるロジックがあって、
偶然そのパターンになってSY-MSGVが書き換わったのかもしれません。
(何もしなければデフォルトでOFFなので、あり得ないと思いますが念のため)
message intoを使用したロジックになっているのであれば、
ちょっと厳しいかもしれませんね。。。
<CALL TRANSACTION が正常終了したかどうかの確認>
に書いている内容ですが、モードA,またはEで実行した場合、
エラーが発生しても、手動で画面を戻ったりして終了させた場合、subrcに0が設定されると言う説明です。
投票数:206
平均点:4.47
Re: CALL TRANSACTION のリターンコード
msg# 1.1.1
ishikawa
投稿数: 10
返事が遅れてすみません。
ojojojojojoj 様 ご教示頂きありがとうございました。
現在、事象の再発は発生しておらず、次回発生するまで様子見・・の状態となっており
解決そのものには至っていない状況です。
やはり 「message into itab」でメッセージを拾わないと、
予期せぬことが起こる可能性があるのですね。
オンラインプログラムでログ採取もしておらず
メッセージ表示そのものはされていないのでわかりませんが、
同期更新(UPDATE "S")のため、伝票番号採番にてメッセージ返却後、
処理遅延のワーニングメッセージが実は出力されたりしているのかもしれないと考えていました。
ソースは以下の通りで、サブルーチンにて未転記伝票発伝を行い、
その未転記伝票の伝票番号をアドオンテーブルに追加更新するという処理です。
この処理にて伝票番号が取得出来ない状態("")でアドオンテーブルが更新される不具合が発生しました。
CALL TRANSACTION直後にSY-MSGV1の伝票番号を変数に格納しているので問題ないと考えていました。
伝票番号なしですが、アドオンテーブルの更新自体はされているため、
SY-SUBRCとしては"0”ですが、伝票番号が返却されていない(または変数が上書きされた)という
状況になったという事になります。
なお、何故 FLG_SUBRC が"USING"なのか等、突っ込みどころはあるかもしれませんが
通常は何の問題もなくこのプログラムにて稼働しています。
急ぎではありませんが、もしお分かりの点があればご教示頂ければと思います。
■■■■■■■■
■サブルーチン■
■■■■■■■■
FORM BATCH_INPUT USING FLG_SUBRC
〜略〜
* トランザクション呼出し
CALL TRANSACTION 'FBV1' USING IT_BDCDATA " FBV1
MODE W_BDC_MODE
UPDATE 'S'.
* 結果判定
IF SY-SUBRC <> 0.
ELSE.
MOVE SY-MSGV1 TO ZSK0010-BELNR. " 伝票番号
ENDIF.
MOVE SY-SUBRC TO FLG_SUBRC.
ENDFORM
■■■■■■
■呼出元 ■
■■■■■■
PERFORM BATCH_INPUT USING FLG_SUBRC. " バッチインプット
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
IF FLG_SUBRC <> 0. " エラーあり
IF FLG_LOCK = C_ON. " ロックされてる?
PERFORM DEQ_ZTK0010 USING ZSK0010-BUKRS
ZSK0010-BELNR
ZSK0010-GJAHR.
ENDIF.
ELSE.
MOVE ZSK0010-BELNR TO ZSK0010-XBLNR.
PERFORM BELNR_ZTK0010. " 内部テーブルへ伝票番号を反映
PERFORM UPDATE_ZTK0010 USING FLG_SUBRC.
IF FLG_SUBRC = 0.
MESSAGE S000(ZK01) WITH TEXT-005 ZSK0010-BELNR ')'. " 更新OK
MOVE C_XOFF TO W_INIT. " 初期化する
MOVE C_XOFF TO FLG_SL_INIT.
CLEAR W_SELLINE.
ENDIF.
ENDIF.
ojojojojojoj 様 ご教示頂きありがとうございました。
現在、事象の再発は発生しておらず、次回発生するまで様子見・・の状態となっており
解決そのものには至っていない状況です。
やはり 「message into itab」でメッセージを拾わないと、
予期せぬことが起こる可能性があるのですね。
オンラインプログラムでログ採取もしておらず
メッセージ表示そのものはされていないのでわかりませんが、
同期更新(UPDATE "S")のため、伝票番号採番にてメッセージ返却後、
処理遅延のワーニングメッセージが実は出力されたりしているのかもしれないと考えていました。
ソースは以下の通りで、サブルーチンにて未転記伝票発伝を行い、
その未転記伝票の伝票番号をアドオンテーブルに追加更新するという処理です。
この処理にて伝票番号が取得出来ない状態("")でアドオンテーブルが更新される不具合が発生しました。
CALL TRANSACTION直後にSY-MSGV1の伝票番号を変数に格納しているので問題ないと考えていました。
伝票番号なしですが、アドオンテーブルの更新自体はされているため、
SY-SUBRCとしては"0”ですが、伝票番号が返却されていない(または変数が上書きされた)という
状況になったという事になります。
なお、何故 FLG_SUBRC が"USING"なのか等、突っ込みどころはあるかもしれませんが
通常は何の問題もなくこのプログラムにて稼働しています。
急ぎではありませんが、もしお分かりの点があればご教示頂ければと思います。
■■■■■■■■
■サブルーチン■
■■■■■■■■
FORM BATCH_INPUT USING FLG_SUBRC
〜略〜
* トランザクション呼出し
CALL TRANSACTION 'FBV1' USING IT_BDCDATA " FBV1
MODE W_BDC_MODE
UPDATE 'S'.
* 結果判定
IF SY-SUBRC <> 0.
ELSE.
MOVE SY-MSGV1 TO ZSK0010-BELNR. " 伝票番号
ENDIF.
MOVE SY-SUBRC TO FLG_SUBRC.
ENDFORM
■■■■■■
■呼出元 ■
■■■■■■
PERFORM BATCH_INPUT USING FLG_SUBRC. " バッチインプット
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
IF FLG_SUBRC <> 0. " エラーあり
IF FLG_LOCK = C_ON. " ロックされてる?
PERFORM DEQ_ZTK0010 USING ZSK0010-BUKRS
ZSK0010-BELNR
ZSK0010-GJAHR.
ENDIF.
ELSE.
MOVE ZSK0010-BELNR TO ZSK0010-XBLNR.
PERFORM BELNR_ZTK0010. " 内部テーブルへ伝票番号を反映
PERFORM UPDATE_ZTK0010 USING FLG_SUBRC.
IF FLG_SUBRC = 0.
MESSAGE S000(ZK01) WITH TEXT-005 ZSK0010-BELNR ')'. " 更新OK
MOVE C_XOFF TO W_INIT. " 初期化する
MOVE C_XOFF TO FLG_SL_INIT.
CLEAR W_SELLINE.
ENDIF.
ENDIF.
投票数:261
平均点:2.68