原文はこちらへ:IN UPDATE TASKを使用した汎用モジュールの呼出
命令
CALL FUNCTION update_function IN UPDATE TASK [EXPORTING p1 = a1 p2 = a2 ...] [TABLES t1 = itab1 t2 = itab2 ...].
はじめに
汎用モジュールを実行する際にIN UPDATE TASKオプションを指定することにより、汎用モジュールが即時に実行されずに 後続のCOMMIT処理がトリガーとなって処理を実行することができるようになります。標準の伝票登録などの更新処理は この仕組みを利用して更新タスクで処理を実行するケースが多いと思います。
更新タスクについて
更新タスクとはプロセスのことを意味します。更新タスクは以下の2種類あり、呼出す汎用モジュールの処理タイプの定義によって 使用されるプロセスが分かれます。
- UPDプロセス
汎用モジュールの属性定義の処理タイプが[更新モジュール]-[更新即時開始]の場合に使用されるプロセスになります。 汎用モジュールは更新タスクで直ちに処理されます。
- UP2プロセス
汎用モジュールの属性定義の処理タイプが[更新モジュール]-[遅延更新]の場合に使用されるプロセスになります。 更新時刻が問題にならいない場合の優先度の低い処理の場合にこのプロセスを使用して処理をさせます。
DAIプロセスについて
プログラムの実行元のオンライン処理はDAIプロセスにて実行がされます。プログラム内でIN UPDATE TASKを指定した 汎用モジュールの呼出を行った場合、DIAプロセスは IN UPDATE TASK の処理を待たずに終了します。 このとき、オンライン処理の画面終了後もUPDプロセスで処理が続行され論理ロックもUPDプロセスの処理が完了するまで 解除されません。UPDプロセスでエラーがあった場合は、ROLL BACKが発生しエラーがあった旨のSAPメールが送信されます。
注意事項
複数の処理が同一のプロセスに割り当てられた場合、そのプロセスになげられた全ての処理が完了するまでデータベースの ロックなどが保持されてしまいます。例えばあるテーブルを更新する処理とリストを出力する処理が同一のプロセスで実行する場合、 更新処理が一瞬で終了してもリストの出力処理が完了するまでデータのロックが維持されてしまいます。
使用例
要件:ある標準伝票登録処理のカスタマEXIT内で、COMMITされる(であろう)登録伝票の内容のアドオンリストをリアルタイムで出力する
実装のポイント
- 標準伝票の登録処理はIN UPDATE TASKによって実行される
- アドオンリストを汎用モジュール化する
- アドオンリスト出力の汎用モジュールの処理タイプ定義を[更新モジュール]-[遅延更新]とする
- カスタマEXIT内にアドオンリストを出力する汎用モジュールをIN UPDATE TASKによって実行する
これにより、標準伝票の登録処理がUPDプロセスで完了してから*1UP2に なげられたアドオンリスト出力の汎用モジュールが実行され、COMMITされたデータの内容のリストが出力される。
IN UPDATE TASK に関する文書
CALL FUNCTION ... IN UPDATE TASK 命令を使用して汎用モジュールを呼び出すと、その汎用モジュールには特別な更新ワークプロセスを 使用して実行フラグが立てられます。つまり、プログラムの代わりに汎用モジュールにデータベース変更のためのオープン SQL 命令を記述し、 プログラム内で本来なら命令を取り込んでいるはずのポイントで汎用モジュールを呼び出すことができます。 IN UPDATE TASK オプションを 使用して汎用モジュールを呼び出すと、その汎用モジュールとそのインタフェースパラメータがログエントリとして VBLOG という名称の特別な データベーステーブルに格納されます。 プログラムが COMMIT WORK 命令まで達すると、汎用モジュールは更新ワークプロセスを使って実行されます。 COMMIT WORK プロセスのあと、 ダイアログワークプロセスは自由にそれ以降のユーザ入力を受け取ることができます。トランザクションのダイアログ部は COMMIT WORK 命令で 終了します。そのあと SAP LUW の更新部が始まり、それは更新ワークプロセスの責任になります。更新プロセスがデータベースの変更をすべて コミットするかロールバックした時点で、 SAP LUW が完了します。 更新の際にエラーが発生するのは例外的なケースだけです。なぜならば、 SAP LUW のダイアログ段階で不正エントリなどの論理エラーがすべて チェックされるからです。論理エラーが発生すると、プログラムは ROLLBACK WORK 命令を使用して更新を終了することができます。その後は 汎用モジュールは呼び出されることがなく、ログエントリはテーブル VBLOG から削除されます。更新自体でのエラーは、通常はたとえばメモリ 不足などの技術的なものです。技術的エラーが発生すると、更新ワークプロセスはデータベースロールバックを開始し、ログエントリが VBLOG に戻されます。そのあと、最初に VBLOG エントリを生成したダイアログのユーザに終了の詳細を含むメールが送信されます。このようなエラー はシステム管理者が修正しなければなりません。そのあと、返された VBLOG エントリを再度処理することができます。
参考文献: