遅延トランザクション 行番号
お世話になります。
度々お勧め頂いた遅延トランザクションを使ってみようとテストしているのですが、表示行のリナンバはどのようにされておりますでしょうか。色々試しながら下記のようなプログラムになったのですが、リナンバ(行追加の場合は以降の表示行を+1、行削除の場合は-1)の段階では新規登録したレコードが書き込まれていないため、以降の表示行の変更ができません。
強制レコード後を試してみたのですが、条件をYesにしてしまうとテーブルスクロールで無限に行ができてしまうので、Not Stat(0,'C'MODE)としています。
レコード書き込みイベントも試してみましたが、挙動がおかしくなったりうまくいきませんでした。
トランザクション開始はレコード前の前です。
ご教授頂けますと幸いです。よろしくお願いいたします。
-
KMさん
こんにちは。
皆さんいろんなやり方をされていると思います。
自分の場合は、最下位行への追加の場合は、自分の行以降も存在しないと思うので行番号リナンバはしておりません。
追加を指示した行が最終行よりも前の場合は、現在の行よりも大きい行を降順で+1リナンバの子タスク等を実行させております。
ビュー再表示イベントの発行ではなく、タスク特性のウィンドウ再表示をYesにしております。
という私もシステムによって試行錯誤で違う方式もしてます。
基本的に現在パーキング行の下への追加としておりますが、1行目の場合はお客様要望で「上の行に追加」イベントも使う事があります。 -
nkmtさん
返答頂きありがとうございます。
現在抱えている問題でいうと、例えば上記のプログラムで、新規行を連続で3つ登録すると以下になります。

この後に現カーソルの位置(1行目)で行挿入をした場合、本来であれば、名称B、Cの表示行を+1してほしいのですが、下記画像のように表示行が変更されません。

物理トランザクションであればこの時点でリナンバされると思うのですが、遅延トランザクションの場合はどういった処理をしたらいいのでしょうか。
それとも遅延トランザクションなど関係なしにプログラムの作りが間違っているのでしょうか。。
ウィンドウ再表示は気にしたことがありませんでした。試してみたいと思います。
-
内部行が4になっているのはGoodですね。
Max行が3 > パーキング行=1での追加
なので
3行目 → 4行目へ書き換え
2行目 → 3行目へ書き換えを行う子タスクの実行
1行目でF4 追加した私は、パーキング行+1 → 2
みたいな事をしております。
※私の場合は、Max行、パーキング行 の両方を変数で保持しております。 -
KMさん、
DBに書き込みを行うと、その時点でトランザクションのコミットになってしまいますので、遅延トランザクションを使う意味がなくなってしまいますよ。
トランザクション中に画面を更新するには、状況に応じて「画面再表示」または「ビュー再表示」を使って、トランザクションキャッシュを更新してやればいいです。
「画面再表示」と「ビュー再表示」の違いについては、よろしければ下記の記事をご参照ください。
第157回 画面再表示とビュー再表示の違い(2021年3月31日)また、行番号のリナンバリングについては下記の記事も参考になるかと思います。予算の関係上、記事が無償公開できないのが残念でなりません。
第31回 行番号の自動採番について(3) (2010年9月30日)
第30回 行番号の自動採番について(2) (2010年8月31日)
第29回 行番号の自動採番について(2010年7月31日) -
良し悪し有ると思いますが、最近の自分の作りです。


追記:ちなみに遅延トランザクションではありませんが恐らく同じ作りでいけるのではないかと思います。
一昨日ぐらいからお客様ご要望で1行目の上に追加にも対応する事にしましたが、それはまた上記に条件など付けております。 -
Tandaさん、nkmtさん
コメントありがとうございます。
現状のプログラムでテストしている際、リナンバタスクのサブタスクのレコード後を通っていなかったため、遅延トランザクションの場合はトランザクションをコミットするまでレコードが登録されない=どうやって行をリナンバするんだろう?と思っているのですが、まずこの考えは合っているのでしょうか。
-
1、2、3行と登録して、そのサブタスクではその3行が見られないかもしれないのですね。
私も試してみます。 -
遅延トランザクションのオンラインタスクでキー項目の書き換え、レコードの追加を行い
同一DBを表示する子タスクを呼んでみました。
親と同一トランザクション(オンラインタスク、バッチタスク)
親タスクで変更した内容になってました。 -
行リナンバータスクは、行番号の大きい順から(降順読みで)書き換えていますかね?
3を4へ書き換え
2を3へ書き換え
mgerror.logなどはいかがですか? -
nkmtさん
コメントありがとうございます。
原因がわかりまして、リナンバサブタスクのトランザクションが物理になっていました。こちらを親と同一に変更したら思い通りに動くようになりました。
お手数おかけしまして申し訳ございません。
ありがとうございました。
-
解決して良かったですね。
-
KMさん、
ちょっと補足です。
遅延トランザクションは、レコード後処理を通過しても、トランザクション中であればトランザクションキャッシュに入るだけです。物理DBには反映されません。トランザクションがコミットされてはじめて、物理DBに保存されます。
それと、「レコード書込」イベントは、レコード後処理を通過しなくても、指定されたトランザクションキャッシュに書き込みが行われます。そして、そのトランザクションがコミットされると、物理DBに書き込みが行われます。
「DBへの書き込み」と、「レコード書込イベント」がごっちゃになっているところがありましたので、補足させていただきました。
遅延トランザクションは物理トランザクションと違って、Magic独自のトランザクションですが、世界最強のテクノロジーですね!20年前は、分かりずらいと思ってたりしたこともありましたが、今では無くてはならない存在となっています。
-
Tandaさん
コメントありがとうございます。
おっしゃる通り、レコード書き込み=トランザクションのコミットと認識していたため今回の事象がなぜ起こるのか気づけなかったのだと思います。勉強になりました。
今まで物理トランザクションでしかプログラムを作っていなかったため、これからが非常に楽しみです。また躓いたらフォーラムで諸先輩方に助けて頂くことになると思います。よろしくお願いいたします。
-
KMさん、
すみません、私が早とちりしていた部分がありましたので、補足させていただきました。
今のMagicは、遅延トランザクションがデフォルトになっているだけの価値はありますね。
物理トランザクションは、入れ子構造にすることができないところが残念です。
サインインしてコメントを残してください。
コメント
14件のコメント