メインコンテンツへスキップ

行追加時の行No取得

コメント

23件のコメント

  • nkmt

    途中行挿入は皆さん独自の処理をしていると思います。
    やり方は人それぞれ異なると思います。
    Magicが自動でリナンバーしてくれるような事はないと思います。

    途中に割り込ませたい場合は、既存の2行目以降を
    今すぐか、あるいは後ほど
    1つずつ後ろの座席へ移動してください!
    みたいなバッチ書き換え処理を呼ぶ必要があると思います。

    私の場合は、途中行挿入を止める事もあるだろうから、
    F4行追加をした瞬間の行番号リナンバーはしておりません。
    そして伝票入力PGは実テーブル → 明細WFで編集、
    伝票保存時に明細WF → 実テーブル書き込みをしております。
    (時代遅れかもしれませんが・・・)
    処理のしやすさもあり明細WFの行番号は重複可にしています。

  • yamamoto

    nkmtさん、コメントありがとうございます。

    バッチ書換処理を呼ぶ場合、割り込みがあった場合という指定が必要になると思うのですが

    どのように指定すればよいのでしょうか。

    nkmtさんのやり方というのは”伝票保存時に行番号を取得”し実テーブルに書き込みをしているということでしょうか?理解できていなかったらすみません。

  • Tanda

    yamamotoさん、

    もしよろしければ、弊社のMagic連載購読コーナーにお越しください。
    行番号の自動採番の仕方を詳しく解説しています。
    ここで解説するには、ちょっと長くなりすぎますので。

    https://www.tandacomp.com/

    第29回 行番号の自動採番について(2010年7月31日)
    第30回 行番号の自動採番について(2) (2010年8月31日)
    第31回 行番号の自動採番について(3) (2010年9月30日)

     

  • Tanda

    yamamotoさん、

    解説のイントロだけ、ちょっとここに書いておきますね。

    -----

     行番号の自動採番に関する問題は、1989年にリリースされたMagic V4 の頃からの永遠のテーマとも言える問題でした。従来は、レコードの明細表示において途中でレコードが挿入されたり、あるいはレコードが削除されたりすると、その都度、行番号を振り直すためのリナンバリングバッチを走らせるという手法が用いられてきました。実は、このプログラムが結構、難解なプログラムに属する種類のものでして、1989年のMagic V4 当時はセミナーの中級クラス以上で解説されるという内容のものでした。

     それが、V10 になってからは、新たに追加された関数を用いてこの問題が容易に解決されるようになりました。今回は、その関数を用いた手法による行番号の自動採番の仕方について解説していきます。

    -----

  • nkmt

    yamamoto様

    途中行挿入であるかどうかは最終明細行をわかっていないといけないですね。
    最終明細行の把握は
    ・自分で変数を用意してそこへ入れるか
    ・入力中の明細データを行番号で降順照会リンクをするか
    だと思いますが、自分は前者です。

    WF → 伝票保存時に、実データ保存時に改めてリナンバーをする事もありますが
    明細入力タスクの配下の子タスクでリナンバーを実行しています。

  • nkmt

    tandaさんの書き込みの「新たに追加された関数を用いてこの問題が容易に解決・・・」とありますので、私のよりずっといい方法だと思います。多分私は知らないのかも。また関数見てみます。

  • nkmt

    実験していませんし外れているかもしれませんが以下興味あります。
    DbViewRowIdx
    DbViewSize

  • nkmt

    入力画面上は、DbViewRowIdx をうまく活用し、自前での行番号表示をちょっと止めてみるのも面白そうですね。
    データベースに、行番号も保持しなければならない場合は、そこはバッチ処理でCOUNTER(0)を埋めるとか。
    DbViewRowIdx関数は活用してこなかったので今後何かに使えそうです。

  • nkmt

    私の予想は外れているかもしれませんのでtanda様の記事購読がいいと思います。

  • yamamoto

    tandaさん、nkmtさんコメントありがとうございます!

    せっかくヒントを頂いたので一度試行錯誤してみようと思います。

    試行錯誤の結果、上手くいかない場合にはtandaさんの記事にお世話になります^^

  • Tanda

    連載記事は、月額2,500円と有料ですので、会社によっては決済がおりなかったりしますので、無理はしないでくださいね。

  • vg

    うちはレコード後で自分より後ろの行番号を採番しなおしてますね。
    DbViewRowIdxは確かに今のメインソースの連番と同じものが表示されるので、
    それでリナンバーするにしても、
    結局何かしらのソート項目を持たさないと画面と同じ順番にならないのではと悩みますね
    tandaさんところの連載とても気になりますねえ・・・

  • yamamoto

    tandaさん、ありがとうございます!

     

    vgさんコメントありがとうございます。

    >レコード後で自分より後ろの行番号を採番しなおしてますね。

    一度やってみます。ありがとうございます!

  • nkmt

    vg様の意見も伺えて有難いです。
    入力画面上の行番号表示は、DbViewRowIdxを用いるのは面白いと思いました。
    その順番で、伝票明細印刷などがある事を考えると
    後続行のリナンバータスクは避けられない気もしますね。

  • Tanda

    vgさん、

    連載コーナーは本当は無償で公開したいのですが、スポンサーが付かないので、やむを得ず自前で有償で運営しております。よろしくお願いします。

  • nkmt

    自分が作った意欲作は、その明細入力タスクの「レコード後処理」から
    途中行挿入時は、行挿入リナンバータスクをコールし
    途中行削除時は、行削除リナンバータスクをコールしておりました。
    ※自分が思っているのと違ってました。

    今の所、行番号を保存し、後にその順番で印刷などを行う必要がある場合、
    自前リナンバーなのかなと思いました。

  • Tanda

    ちなみに、DbViewRowIdx() 関数だけでは、あらゆる状況に対応したリナンバリングは実現できません。環境設定の仕方で仕組みがいります。

  • nkmt

    yamamoto様、tanda様の記事を読むのがより早道だと思います。

  • Tanda

    まずは、自前のリナンバリングで苦労されてみるのも、勉強になるかと思います。
    それによって、他の実力も付いてくるかと思います。

  • yamamoto

    nkmtさん、tandaさんありがとうございます!

    時間はかかりそうですが、一度自分でチャレンジしてみます!

  • nkmt

    見積書入力画面など、5行目~10行目の明細を範囲指定して、
    それらを他の部分へ移動とか複写といった機能を作ったりもしますので
    自前で手組で行番号を明細WF等へ書き込むのは避けられない気もします。

  • yamamoto

    nkmtさん、ありがとうございます!

    まだ形にはなっていませんが、皆さんのおかげで4通りの構想は出来たので

    いろんな処理で融通が利くように頑張ってみます。

  • nkmt

    そうですね。構想、実装、実験、試行錯誤ですね。

サインインしてコメントを残してください。