行追加時の行No取得
お世話になっております。
現在、行No取得を行No+1で行っております。
しかし、順番に入力していけば問題ないですが行間に行追加した場合は下記のようになります。
---------------------------------------------------------------------------------------------------------------------------
1
3←行追加した
2
---------------------------------------------------------------------------------------------------------------------------
こういった行追加時の行Noはどのように取得していますでしょうか。
ご教示願います。
-
途中行挿入は皆さん独自の処理をしていると思います。
やり方は人それぞれ異なると思います。
Magicが自動でリナンバーしてくれるような事はないと思います。
途中に割り込ませたい場合は、既存の2行目以降を
今すぐか、あるいは後ほど
1つずつ後ろの座席へ移動してください!
みたいなバッチ書き換え処理を呼ぶ必要があると思います。
私の場合は、途中行挿入を止める事もあるだろうから、
F4行追加をした瞬間の行番号リナンバーはしておりません。
そして伝票入力PGは実テーブル → 明細WFで編集、
伝票保存時に明細WF → 実テーブル書き込みをしております。
(時代遅れかもしれませんが・・・)
処理のしやすさもあり明細WFの行番号は重複可にしています。 -
yamamotoさん、
もしよろしければ、弊社のMagic連載購読コーナーにお越しください。
行番号の自動採番の仕方を詳しく解説しています。
ここで解説するには、ちょっと長くなりすぎますので。第29回 行番号の自動採番について(2010年7月31日)
第30回 行番号の自動採番について(2) (2010年8月31日)
第31回 行番号の自動採番について(3) (2010年9月30日) -
yamamotoさん、
解説のイントロだけ、ちょっとここに書いておきますね。
-----
行番号の自動採番に関する問題は、1989年にリリースされたMagic V4 の頃からの永遠のテーマとも言える問題でした。従来は、レコードの明細表示において途中でレコードが挿入されたり、あるいはレコードが削除されたりすると、その都度、行番号を振り直すためのリナンバリングバッチを走らせるという手法が用いられてきました。実は、このプログラムが結構、難解なプログラムに属する種類のものでして、1989年のMagic V4 当時はセミナーの中級クラス以上で解説されるという内容のものでした。
それが、V10 になってからは、新たに追加された関数を用いてこの問題が容易に解決されるようになりました。今回は、その関数を用いた手法による行番号の自動採番の仕方について解説していきます。
-----
-
yamamoto様
途中行挿入であるかどうかは最終明細行をわかっていないといけないですね。
最終明細行の把握は
・自分で変数を用意してそこへ入れるか
・入力中の明細データを行番号で降順照会リンクをするか
だと思いますが、自分は前者です。
WF → 伝票保存時に、実データ保存時に改めてリナンバーをする事もありますが
明細入力タスクの配下の子タスクでリナンバーを実行しています。 -
tandaさんの書き込みの「新たに追加された関数を用いてこの問題が容易に解決・・・」とありますので、私のよりずっといい方法だと思います。多分私は知らないのかも。また関数見てみます。
-
実験していませんし外れているかもしれませんが以下興味あります。
DbViewRowIdx
DbViewSize -
入力画面上は、DbViewRowIdx をうまく活用し、自前での行番号表示をちょっと止めてみるのも面白そうですね。
データベースに、行番号も保持しなければならない場合は、そこはバッチ処理でCOUNTER(0)を埋めるとか。
DbViewRowIdx関数は活用してこなかったので今後何かに使えそうです。 -
私の予想は外れているかもしれませんのでtanda様の記事購読がいいと思います。
-
連載記事は、月額2,500円と有料ですので、会社によっては決済がおりなかったりしますので、無理はしないでくださいね。
-
うちはレコード後で自分より後ろの行番号を採番しなおしてますね。
DbViewRowIdxは確かに今のメインソースの連番と同じものが表示されるので、
それでリナンバーするにしても、
結局何かしらのソート項目を持たさないと画面と同じ順番にならないのではと悩みますね
tandaさんところの連載とても気になりますねえ・・・ -
vg様の意見も伺えて有難いです。
入力画面上の行番号表示は、DbViewRowIdxを用いるのは面白いと思いました。
その順番で、伝票明細印刷などがある事を考えると
後続行のリナンバータスクは避けられない気もしますね。 -
vgさん、
連載コーナーは本当は無償で公開したいのですが、スポンサーが付かないので、やむを得ず自前で有償で運営しております。よろしくお願いします。
-
自分が作った意欲作は、その明細入力タスクの「レコード後処理」から
途中行挿入時は、行挿入リナンバータスクをコールし
途中行削除時は、行削除リナンバータスクをコールしておりました。
※自分が思っているのと違ってました。
今の所、行番号を保存し、後にその順番で印刷などを行う必要がある場合、
自前リナンバーなのかなと思いました。 -
ちなみに、DbViewRowIdx() 関数だけでは、あらゆる状況に対応したリナンバリングは実現できません。環境設定の仕方で仕組みがいります。
-
yamamoto様、tanda様の記事を読むのがより早道だと思います。
-
まずは、自前のリナンバリングで苦労されてみるのも、勉強になるかと思います。
それによって、他の実力も付いてくるかと思います。 -
nkmtさん、tandaさんありがとうございます!
時間はかかりそうですが、一度自分でチャレンジしてみます!
-
見積書入力画面など、5行目~10行目の明細を範囲指定して、
それらを他の部分へ移動とか複写といった機能を作ったりもしますので
自前で手組で行番号を明細WF等へ書き込むのは避けられない気もします。 -
nkmtさん、ありがとうございます!
まだ形にはなっていませんが、皆さんのおかげで4通りの構想は出来たので
いろんな処理で融通が利くように頑張ってみます。
-
そうですね。構想、実装、実験、試行錯誤ですね。
サインインしてコメントを残してください。
コメント
23件のコメント