子タスクから親タスクの値参照(メモリテーブル)
下記の構成でプログラムを作成しています。
親タスク(リッチクライアント)
子タスク(バッチ)←親タスクのレコード後でコール
子タスクで親タスクのメインテーブルの値を参照し別テーブル(メモリテーブル)を更新
する様にしてます。
毎回ではないのですが稀に親タスクの一部の項目の値が参照できない(ゼロになる)事が
発生しています。
トランザクションの設定を変更してみましたが状況が変わりませんでした。
原因として何が考えられるか、ご教示頂ければ幸です。
-
akiraさん、
データを更新したあと、別階層のタスクからその更新内容を参照しようとした場合、トランザクションキャッシュの中身を更新してやらないと、新しい値が参照できない場合がありますよ。
トランザクションキャッシュを更新するには、「画面再表示」とか「ビュー再表示」とかのイベントを発行してやるといいですね。
「画面再表示」と「ビュー再表示」の違いは、こちらでも詳しく解説しています。
●Magic連載購読コーナー
第157回 画面再表示とビュー再表示の違い(2021年3月31日) -
akiraさん、
あと1点ですが、バッチをコールする前に「レコード書込」イベントを発行して、明示的にデータを上書き更新してやるという方法もありますね。
「レコード書込」イベントは、トランザクションの最中であっても、強制的にDBを更新してくれるというすごいパワーを持っています。ただし、これを使用するとトランザクションのロールバックはできなくなります。
-
tanda様
コメントありがとうございます。
バッチタスクのコール前に「画面再表示」イベントを発行し想定通りの動作となりました。
だだ「画面再表示」イベントを発行した影響なのか親タスクで次行へ移動時に最初の項目へ
カーソルが位置づけられるため更に改修が必要となりました。
-
akiraさん、
あるいは、遅延トランザクションを使わずに、物理トランザクションのダーティリードを使うという手もありますね。
ダーティリードはトランザクション中のデータも読み取ることができます。MagicはデフォルトでダーティリードがONになっています。
-
akiraさん、
失礼、ご質問をもう一度見るとリッチクライアントになっていますね。リッチクライアントでは物理トランザクションは使えないです。
サインインしてコメントを残してください。
コメント
5件のコメント