10 返信 最新の回答 日時: Jan 14, 2014 10:08 AM ユーザー:Nu-nrg

    ポータル内のレコード順変更アイデア

    Nu-nrg

      タイトル

      ポータル内のレコード順変更アイデア

      フォーラムに投稿

      立て続けのポストで恐れ入ります。

      ポータル内でデータを入力等するとき、あれ?順序間違った!という時があります。
      関連テーブルにold_order、new_orderフィールドを用意し、new_orderに希望の順位を入力しなおして、new_orderをold_orderへ全置換で現在管理していますが、

      上矢印アイコンや下矢印アイコンなどを利用して、
      上矢印アイコンをクリックすると、ぽんぽんと上にあがっていくようなスマートなアイデアはありますでしょうか?

      ポータル中の関連レコードのIDを、変数$this_record_idにいれて、
      そのIDレコードのorder値を調べ、変数$this_record_orderに入れて、
      前の関連レコードのIDを調べ、変数$previous_record_idに入れて、
      そのレコードのorder値を変数に入れて、$previous_record_orderにいれて、
      $previous_record_idと$previous_record_orderを入れ替える
      orderがユニーク設定等してるとエラーになりますし、

      web開発等なんかで順位を変更する定番なんかがあれば、FMのスクリプトでできるのかな、と思い聴いてみました。
      ご存知の方がいましたらよろしくお願いします。

      この機能ってみなさん欲しがるんじゃないかなと想像しています。

      環境:fm pro 11.0v2 advanced

        • 1. Re: ポータル内のレコード順変更アイデア
          sago350@未来Switch

          そのアイデア出来ますよ。

          簡単な方法としては、ポータルのソートキーとなっているフィールドを表示させておいて、その値を変更すれば順番が変わります。

          1 りんご
          2 みかん
          1.5 なす

          1 りんご
          1.5 なす
          2 みかん

          あとは、SortNoを再ナンバリングしてやればOKです。

          あ、Nu-nrgさんの矢印を使った方法も可能ですよ。ただ、矢印だと1番下の行を1番上に持っていきたい時にたくさんクリックしないといけないので、この方法と併用するのがいいかもしれません。

          • 2. Re: ポータル内のレコード順変更アイデア
            Nu-nrg

            sago35さん、ありがとうございます。
            レス遅くなりすみません。

            なるほど、手入力のソートキーに少数を使うはミソですね!
            再ナンバーリングというのは、シリアル値で全置換となるのでしょうね。

            できることならば、値一覧の順序とかのようにドラックというわけにはいきませんが、矢印でUI操作きるようにやってみたいと思います。
            スマートなコードができましたら、公開いたします。

            • 3. Re: ポータル内のレコード順変更アイデア
              Shin

              矢印で、そのレコードのシリアル番号を、+1.5 や -1.5 します。大きく動かすには、+10.5 や -10.5 してやれば良いでしょう。その後、シリアル番号を、シリアル値で全置換しておきます。スクリプトトリガーで全置換してやるといいでしょう。

              加減する数字を細かく設定していくと、数十個単位での移動も可能なように組む事が出来ます。

              • 4. Re: ポータル内のレコード順変更アイデア
                Nu-nrg

                ポータル内での操作ではないですが、スクリプトを書いてみました。
                これをポータル内のボタンで動くように調整したいと思います。

                上へ移動するスクリプト

                1. #常に順位は整数、処理後も整数となることが必須
                2. レコードのソート [ 特定のソート順: レコード順位並び替えテスト::現在の順位; 昇順 ] [ 記憶する; ダイアログなし ]
                3. #対象レコード総数を把握し、変数に格納
                4. 変数を設定 [ $RecordAmount; 値:Get ( 対象レコード数 ) ]
                5. #
                6. #最初と最後のレコードを判定するために、現在のレコード番号を変数に格納
                7. 変数を設定 [ $SystemRecordNumber; 値:Get ( レコード番号 ) ]
                8. #
                9. #現在のレコードで、現在の順位フィールド値を変数に格納
                10. 変数を設定 [ $CurrentRecordSortNumber; 値:レコード順位並び替えテスト::現在の順位 ]
                11. #選択しているレコードが最初のレコードでない場合に限り、前のレコードに移動し、現在の順位を変数に格納し、
                12. If [ $SystemRecordNumber ≠ 1 ]
                13. レコード/検索条件/ページへ移動 [ 前の ]
                14. 変数を設定 [ $PreviousRecordSortNumber; 値:レコード順位並び替えテスト::現在の順位 ]
                15. レコード/検索条件/ページへ移動 [ 次の ]
                16. #順位の再チェック
                17. If [ $CurrentRecordSortNumber > $PreviousRecordSortNumber and $PreviousRecordSortNumber ≠ "" ]
                18. フィールド設定 [ レコード順位並び替えテスト::現在の順位; $PreviousRecordSortNumber - .5 ]
                19. #現在の並び順でソートし直し
                20. レコードのソート [ 特定のソート順: レコード順位並び替えテスト::現在の順位; 昇順 ] [ 記憶する; ダイアログなし ]
                21. #新しい順位を、増分1、次の値1で、全置換し
                22. フィールド内容の全置換 [ レコード順位並び替えテスト::現在の順位; シリアル番号で置き換える: カスタム値; 初期値: 1; 増分: 1 ] [ ダイアログなし ]
                23. End If
                24. End If

                 

                下へ移動するスクリプト

                1. #常にソート番号は整数、処理後整数となることが必須
                2. レコードのソート [ 特定のソート順: レコード順位並び替えテスト::現在の順位; 昇順 ] [ 記憶する; ダイアログなし ]
                3. #対象レコード総数を変数に格納
                4. 変数を設定 [ $RecordAmount; 値:Get ( 対象レコード数 ) ]
                5. #
                6. #最初と最後のレコードを判定するために、現在のレコード番号を変数に格納
                7. 変数を設定 [ $SystemRecordNumber; 値:Get ( レコード番号 ) ]
                8. #
                9. #現在のレコードで、現在の順位を変数に格納
                10. 変数を設定 [ $CurrentRecordSortNumber; 値:レコード順位並び替えテスト::現在の順位 ]
                11. #選択しているレコードが最後のレコードでない場合に限り、次のレコードに移動し、現在の順位を変数に格納し、
                12. If [ $SystemRecordNumber ≠ $RecordAmount ]
                13. レコード/検索条件/ページへ移動 [ 次の ]
                14. 変数を設定 [ $NextRecordSortNumber; 値:レコード順位並び替えテスト::現在の順位 ]
                15. レコード/検索条件/ページへ移動 [ 前の ]
                16. #順位の再チェック (意味あるか不明)
                17. If [ $CurrentRecordSortNumber < $NextRecordSortNumber and $NextRecordSortNumber ≠ "" ]
                18. フィールド設定 [ レコード順位並び替えテスト::現在の順位; $NextRecordSortNumber + .5 ]
                19. #現在の並び順でソートし直し
                20. レコードのソート [ 特定のソート順: レコード順位並び替えテスト::現在の順位; 昇順 ] [ 記憶する; ダイアログなし ]
                21. #新しい順位を、増分1、次の値1で、全置換し
                22. フィールド内容の全置換 [ レコード順位並び替えテスト::現在の順位; シリアル番号で置き換える: カスタム値; 初期値: 1; 増分: 1 ] [ ダイアログなし ]
                23. End If
                24. End If

                 

                Shinさん、
                スクリプトトリガで全置換とはどういうことでしょうか?

                • 5. Re: ポータル内のレコード順変更アイデア
                  Shin

                  スクリプトトリガーを使う程の事もなかったです。

                  次の3行だけで、4個分のスクリプトが出来てしまいますが。

                  フィールド設定 [ forums9d1d2687f6::No; forums9d1d2687f6::No + Get ( スクリプト引数 ) ]
                  レコードのソート [ 特定のソート順: forums9d1d2687f6::No; 昇順 ] [ 記憶する; ダイアログなし ]
                  フィールド内容の全置換 [ forums9d1d2687f6::No; シリアル番号で置き換える: カスタム値; 初期値: 1; 増分: 1 ] [ ダイアログなし; 入力オプションを更新 ]

                  ボタンに、上向きならば -1.5 を、下向きならば +1.5 上向きの大移動ならば -10.5 などのスクリプト引数を設定して、このスクリプトを動かします。

                  前提として、ソート状態で行なうと、FMが自動的にソートしてくれます。

                  最初や最後のレコードについても、考える必要は有りません。

                  https://files.me.com/hiramatsu/5q7ax4

                  • 6. Re: ポータル内のレコード順変更アイデア
                    Nu-nrg

                    Shinさん、なんですと!たった3行ですと。。。Cool

                    ファイルもダウンロードさせていただいて試しました。恐れ入りました、素晴らしいです!

                    これ親テーブル上のポータル行に設置した上げ下げボタンにスクリプト振っておいて、関連テーブル(子テーブル)を弄れますか???

                    関連テーブルに移動とか必要ないのでしょうか?

                    • 7. Re: ポータル内のレコード順変更アイデア
                      Shin

                      シリアル値の変更は、ポータル行の中で行なった方が楽でしょう。

                      ただ、シリアル値の全置換は、新しいウィンドウを出して関連フィールドを表示し,全置換した方が簡単だと思います。これは2行の追加です。

                      ポータルの中でシリアルを書き換える事も出来ますが、loopで1行ごとにシリアルを書き換えていくと言う処理で良いと思います。ただ、移動の方向によって、loopで動かす方向を変えた方が良いので,少し面倒でしょう。

                      • 8. Re: ポータル内のレコード順変更アイデア
                        Nu-nrg

                        Shinさん方式は、スクリプトに引数を渡しすことで、スクリプトが統一でき、ボタンに割り当てる引数を任意に設定できるので、簡素、また自由度がありますね。

                        親テーブルから子テーブルの操作についてですが、
                        ポータル内でレコード追加ができるようにしていると、レコードに値がないのにボタンを押すことで数値入ってレコードを作成する動きになってしまうので、ボタンが反応しないように条件分岐が必要ですね。

                        再シリアルを親テーブルで行うか、子テーブルで行うかですが、今検討しています。
                        新しいウィンドウを出す、ウィンドウを移動する、っていうのは今回のような大した処理ではないので高速でできますが、こういうのはどうなんでしょうか?
                        バックグラウンド処理なので、極力テーブル表示を移動したくない感覚があります。

                        ポータル内でloop処理というのは、どうすればよいでしょうか?
                        すみませんがちょっと思いつかないので、甘えてご教示いただけませんか?

                        今は見積書、見積もり明細なんかで考えていますが、関連レコードの順位を変更するのは頻繁に使いそうなので、最終的には汎用化しておきたいと思います。

                        • 9. Re: ポータル内のレコード順変更アイデア
                          Shin

                          面白いTipsを。

                          スクリプト引数を与えるときに、修飾キーを見ておくと、例えば、無ならば±1.5、shiftキーならば±10.5 なんて面白いですよ。

                          新しいウィンドウを出すにしても、1秒以内に終了するでしょうから、ほんの一瞬しか表示されないはずです。また、サイズを十分小さくしておけば、ほとんど目立たないですね。

                          loopでの処理は、例えば、ポータルがNoでソートされているとして、

                          フィールド設定 [ forums9d1d2687f6::No; forums9d1d2687f6::No + Get ( スクリプト引数 ) ]
                          レコード確定
                          If( Get ( スクリプト引数 ) > 0 )
                           ポータル行へ移動[最初の]
                           loop
                            フィールド設定 [ forums9d1d2687f6::No; Get ( ポータル行番号 ) ]
                            ポータル行へ移動[次の ;最後になれば終了]
                           end loop
                          else
                           ポータル行へ移動[最後の]
                           loop
                            フィールド設定 [ forums9d1d2687f6::No; Get ( ポータル行番号 ) ]
                            ポータル行へ移動[前の ;最後になれば終了]
                           end loop
                          end If

                          の様なものになるでしょうか。(未検証:最後になれば終了の部分の判断がうまく動かないかも、その際にはexit loop if でポータル行番号を取得して抜けてください)

                          • 10. Re: ポータル内のレコード順変更アイデア
                            Nu-nrg

                                 じぇじぇじぇ、Ajaxのようなすごいのを見つけちゃいました!

                            http://youtu.be/1-gy_zEU2JM