Rollback について
- このフォーラムに新しいトピックを立てることはできません
- このフォーラムではゲスト投稿が禁止されています
null
投稿数: 191

RIA の画面で画面上に配置したクリアボタンを押すと入力前の状態に戻したり、終了ボタンを押すと入力途中の内容を破棄して終了したいので、Rollback('FALSE'LOG, 1) で出来ないかやっているのですが上手くいきません。良い方法は無いでしょうか?
プログラムとしては伝票入力形式の画面になります。
HEAD と BODY のタスクがあり、サブフォームで繋がれています。
HEAD はスクリーン形式の入力で HEAD 用ワークテーブルの項目が配置されており、
BODY はライン形式の入力で BODY 用ワークテーブルの項目がテーブルに配置されています。
HEAD は N=新規の遅延トランザクション T=タスク前の前 エラー発生時は A=アボートです。
BODY は W=親と同一
この状態で入力途中に終了ボタンを押し、そこで Rollback を実行すれば内容を破棄し、終了します。
これは良いのですが、クリアボタンで Rollback を実行した時は入力前の状態に戻し、再入力がしたいです。
ちなみに、エラー発生時を R=復帰に変更して、Rollback('FALSE'LOG, 1) を実行すると
入力前の状態にほぼ(※)戻るのですが、画面が終了してくれません。
※困ったことにたまに上手く戻らないことがある…
以上、Rollback について、又、上記の内容を実現する良い方法がありましたら、教えてください。
プログラムとしては伝票入力形式の画面になります。
HEAD と BODY のタスクがあり、サブフォームで繋がれています。
HEAD はスクリーン形式の入力で HEAD 用ワークテーブルの項目が配置されており、
BODY はライン形式の入力で BODY 用ワークテーブルの項目がテーブルに配置されています。
HEAD は N=新規の遅延トランザクション T=タスク前の前 エラー発生時は A=アボートです。
BODY は W=親と同一
この状態で入力途中に終了ボタンを押し、そこで Rollback を実行すれば内容を破棄し、終了します。
これは良いのですが、クリアボタンで Rollback を実行した時は入力前の状態に戻し、再入力がしたいです。
ちなみに、エラー発生時を R=復帰に変更して、Rollback('FALSE'LOG, 1) を実行すると
入力前の状態にほぼ(※)戻るのですが、画面が終了してくれません。
※困ったことにたまに上手く戻らないことがある…
以上、Rollback について、又、上記の内容を実現する良い方法がありましたら、教えてください。
投票数:0
平均点:0.00
Tanda
投稿数: 2151

null さん、こんにちは。
Rollback() 関数はトランザクション開始の時点を起点とするところまで
元に戻すものです。ですので、タスク前の前になっていれば、レコード
件数の数にかかわらず、タスクの最初にまで戻ってしまいます。
あと、ワークテーブルに対して、トランザクションをロールバックさせる
というのも、二重の入れ子で無駄が多いようですね。
トランザクションとロールバックの関係はMSJからも資料がダウンロード
できると思いますので、まずはドキュメントに目を通されてみてはいかが
でしょうか。
タンダコンピュータ/丹田 昌信
Rollback() 関数はトランザクション開始の時点を起点とするところまで
元に戻すものです。ですので、タスク前の前になっていれば、レコード
件数の数にかかわらず、タスクの最初にまで戻ってしまいます。
あと、ワークテーブルに対して、トランザクションをロールバックさせる
というのも、二重の入れ子で無駄が多いようですね。
トランザクションとロールバックの関係はMSJからも資料がダウンロード
できると思いますので、まずはドキュメントに目を通されてみてはいかが
でしょうか。
タンダコンピュータ/丹田 昌信
投票数:0
平均点:0.00
null
投稿数: 191

ようやく、希望する動作が実現出来ましたので自己レスです。
覚書き兼、同じことをやりたい人向けのメモとして書いておきます。
まずは回答ありがとうございました。
ワークテーブルを使用しているのは直接テーブルを更新出来ない
仕様なのでそうなっています。無駄と言う訳ではありません。
後は遅延トランザクションをフル活用すればシンプルになる部分も
あるだろうと思いつつ、すでにある雛形を流用しての開発なので
こうせざるおえないというのもあります。
「たまに上手く戻らないことがある」件については
テーブルコントロール上で Rollback() を発行すると
元に戻った後、フォーカスがある項目だけクリアされる現象があります。
1.9g の RIA で確認しています。これは恐らく不具合でしょうが、
報告しても中々修正されないし、回避策があるので放置することにします。
不味いと思う人は MSJ 辺りに投げてください。
回避策としてはテーブルコントロールから CtrlGoto() で親タスクの
ダミー項目へ移動させた後、Rollback() を発行しています。
前回、エラー発生時は A=アボートとしていましたが、R=復帰に変更しました。
これで、クリアボタン押下時の動作は希望する動作になりました。
ただ前回も書いた通り、終了ボタンを押下時の動作が希望した動作にならないので、
終了ボタン押下時は Rollback() は使用せず、一つタスクを作成して、
それを CALL しています。
そのタスクで何をやっているかと言うと、読取専用テーブルに無理やり更新させ
(ようは何でも良いので例外を発生させる) エラーのイベントハンドラで
発生したイベントを破棄した後、そこで、A=アボートさせることで、
親タスクまるごとアボートするので、Rollback() に近い状態にすることが出来ました。
(このタスクが一つあれば Rollback() は要らない子になりそうな気が…)
Rollback 一発で OK な上、セーブポイントも利用できる他言語に
慣れた人間に話したところ、メンドクサイと苦笑されましたけど、
uniPaaS だから仕方ないよねということにしています。
覚書き兼、同じことをやりたい人向けのメモとして書いておきます。
まずは回答ありがとうございました。
ワークテーブルを使用しているのは直接テーブルを更新出来ない
仕様なのでそうなっています。無駄と言う訳ではありません。
後は遅延トランザクションをフル活用すればシンプルになる部分も
あるだろうと思いつつ、すでにある雛形を流用しての開発なので
こうせざるおえないというのもあります。
「たまに上手く戻らないことがある」件については
テーブルコントロール上で Rollback() を発行すると
元に戻った後、フォーカスがある項目だけクリアされる現象があります。
1.9g の RIA で確認しています。これは恐らく不具合でしょうが、
報告しても中々修正されないし、回避策があるので放置することにします。
不味いと思う人は MSJ 辺りに投げてください。
回避策としてはテーブルコントロールから CtrlGoto() で親タスクの
ダミー項目へ移動させた後、Rollback() を発行しています。
前回、エラー発生時は A=アボートとしていましたが、R=復帰に変更しました。
これで、クリアボタン押下時の動作は希望する動作になりました。
ただ前回も書いた通り、終了ボタンを押下時の動作が希望した動作にならないので、
終了ボタン押下時は Rollback() は使用せず、一つタスクを作成して、
それを CALL しています。
そのタスクで何をやっているかと言うと、読取専用テーブルに無理やり更新させ
(ようは何でも良いので例外を発生させる) エラーのイベントハンドラで
発生したイベントを破棄した後、そこで、A=アボートさせることで、
親タスクまるごとアボートするので、Rollback() に近い状態にすることが出来ました。
(このタスクが一つあれば Rollback() は要らない子になりそうな気が…)
Rollback 一発で OK な上、セーブポイントも利用できる他言語に
慣れた人間に話したところ、メンドクサイと苦笑されましたけど、
uniPaaS だから仕方ないよねということにしています。
投票数:0
平均点:0.00
Tanda
投稿数: 2151

null さん、こんにちは。
> Rollback 一発で OK な上、セーブポイントも利用できる他言語に
> 慣れた人間に話したところ、メンドクサイと苦笑されましたけど、
> uniPaaS だから仕方ないよねということにしています。
「遅延トランザクション」は、他の言語や開発ツールにはない、
uniPaaS 特有の機能です。
私は、このような優れた機能を開発した MSE に感動しています。
23年くらい前に Magic ロックという排他制御の機能が Magic から
リリースされましたけど、そのときと同じくらいの感動ですね。
他言語に慣れた人には uniPaaS のコンセプトが理解できないかも
しれませんが。。。
タンダコンピュータ/丹田 昌信
> Rollback 一発で OK な上、セーブポイントも利用できる他言語に
> 慣れた人間に話したところ、メンドクサイと苦笑されましたけど、
> uniPaaS だから仕方ないよねということにしています。
「遅延トランザクション」は、他の言語や開発ツールにはない、
uniPaaS 特有の機能です。
私は、このような優れた機能を開発した MSE に感動しています。
23年くらい前に Magic ロックという排他制御の機能が Magic から
リリースされましたけど、そのときと同じくらいの感動ですね。
他言語に慣れた人には uniPaaS のコンセプトが理解できないかも
しれませんが。。。
タンダコンピュータ/丹田 昌信
投票数:0
平均点:0.00
Tanda
投稿数: 2151

null さん、こんにちは。
> ワークテーブルを使用しているのは直接テーブルを更新出来ない
> 仕様なのでそうなっています。無駄と言う訳ではありません。
遅延トランザクションは、言い方を変えれば、それ自体がワークです。
ですので、ワークファイルに遅延トランザクションを掛けるという
ことは、ワークファイルを二重に作るようなものとなります。
タンダコンピュータ/丹田 昌信
> ワークテーブルを使用しているのは直接テーブルを更新出来ない
> 仕様なのでそうなっています。無駄と言う訳ではありません。
遅延トランザクションは、言い方を変えれば、それ自体がワークです。
ですので、ワークファイルに遅延トランザクションを掛けるという
ことは、ワークファイルを二重に作るようなものとなります。
タンダコンピュータ/丹田 昌信
投票数:0
平均点:0.00