処理フロー: ユーザイベントの強制終了

強制終了ユーザイベントには「強制終了」という設定欄があります。
デフォルトは「N=なし」ですが、他に「C=コントロール」、「E=編集」、「R=レコード」というものがあります。
V10では、レコードの部分が、「R=レコード更新前」と「P=レコード更新後」となり、更に細分化されています。
分かりにくいかもしれませんが、この機能が使いこなせなければイベントの面白さは味わえません。

以下、簡単に説明しておきますが、サンプルプログラムもあるので活用してください。

・「C=コントロール」と「E=編集」の違い
レコードメインに処理系コマンド(コールや項目更新等)を記述せず、イベント中心で開発するようになると、項目の表示がリフレッシュされるタイミングに悩まされます。
ボタンを押して、ハンドラで項目更新をしても、カーソルがパークしている項目の表示は変更されません。
内部的に値は更新されているのですが、表示が反映されるのは、カーソルがその項目から移動したときです。
コールコマンドのパラメータによる更新も同様です。
そこで、強制終了欄を「C=コントロール」や「E=編集」にしておくと、ハンドラ内のコマンドによって変更された値を自動的に再表示してくれるようになります。
「C=コントロール」と「E=編集」の違いは、コントロールイベントを処理するか/しないか、です。
「C=コントロール」は、ハンドラ内のコマンドを実行後、コントロール変更・検証・後処理を処理します。
「E=編集」は、コントロールイベントを処理せず、表示だけをリフレッシュしてくれます。
多くの場合、「E=編集」を使うと目的が果たせるはずです。
サンプルプログラムの「ユーザイベントの強制終了-1」で動作を確認できます。

・「R=レコード」
オンラインタスクでユーザが画面に入力できるのはレコードメイン処理です。
このとき、入力された値はメモリにあるだけで、データベース内の値は、まだ書き換えられていません。
レコード後処理を通った後にデータベースへの書き込みは行われます。
場合によっては、強制的にレコード後処理を通して、データベースへの書き込みを実行したいことがあります。
そのようなときに、強制終了の「R=レコード」を使います。
但し、レコード書き込みが実行されるのは、ハンドラ内のコマンドを全て実行した後です。
このタイミングを注意しておかなければ、思い通りのプログラムは作れません。

実際には、ハンドラ内のコマンドを実行する前にレコード書き込みを終えてほしいケースの方が多いと思いますが、そのためには、ちょっとした技が必要です。
サンプルプログラムの「ユーザイベントの強制終了-2」で、それを使っています。
ユーザイベントを2つ作成して、ボタンを押したときに強制終了が実行される方を使います。

ウエイトそのハンドラの中で、イベント実行コマンドを使って、もう一方のユーザイベントをコールするのですが、最大のポイントは、イベント実行コマンドのウェイト欄を「No」にすることです。
この箇所でヘルプ表示(F1)していただくと解説されていますが、ウェイト欄が「Yes」では強制終了の機能は無視されます。

尚、V9Plusの「R=レコード」は、V10の「R=レコード更新前」と同じになります。
V10の「P=レコード更新後」は、V9Plusには無い機能です。
こちらは、ハンドラ内のコマンドを実行する前にレコード書き込みしてくれる新機能なので、上述のようなユーザイベントを2つ作るのような技を使わなくても直感的なプログラミングで思い通りの結果を得ることができます。