14 返信 最新の回答 日時: Jan 11, 2017 12:20 AM ユーザー:nagnag

    「関連レコードへ移動」が不可解な挙動

    nagnag

      お世話になります。
      「関連レコードへ移動」が不可解な挙動をする場合があり、困っております。

       

      【環境】

      • Windows版のFMS14+FMP12 or 13(どちらでも発生/最新のアップデータ適用済)

       

      【前提】

      • スタッフテーブル(キー:スタッフID)と作業記録テーブル(キー:スタッフID、作業日)があり、スタッフIDでリレーションしています。
        スタッフと作業記録は「1:N」であり、作業記録テーブルはリレーションのソートオプションで「作業日」の降順でソートしています。
      • スタッフテーブルをリスト形式で一覧表示するレイアウトがあり、このレイアウトではスタッフを検索して各スタッフレコード上に配置している「移動」ボタンで該当スタッフの最新の作業記録レコードを表示するスクリプトを呼び出すようにしています。
        そのスクリプトは、作業記録レコードの存在を確認した上で「関連レコードへ移動」で作業記録レコードへ移動する作りで、「関連レコードのみを表示」オプションはOFF、使用するレイアウトは作業記録の詳細画面です。
        なお、このスクリプトでは、「関連レコードへ移動」のあと作業記録テーブルのユニークキーを取出して、そのキーで作業記録テーブルを検索して、対象レコードを該当レコードのみに絞り込んでいます(レコード移動操作を抑制する目的)。

       

      【現象】

      前述の「移動」ボタン押下で、該当スタッフとは異なるスタッフの作業記録レコードが表示されることがあります(頻度はまれ)。
      その現象発生時に表示される作業記録レコードは、他の端末にて新たに追加された作業記録レコードです。
      一度現象が発生すると何度試しても発生し、その間に他の端末にて更に作業記録レコードが追加されると、表示されるレコードがそのレコードに変わります。
      つまり、「関連レコードへ移動」を行うと、該当スタッフの関連レコードに移動せずに作業記録テーブルの最新レコードへ移動してしまう、という現象です。
      なお、FMPを一旦終了させると正しい挙動になります。

       

      現象が発生する環境が遠隔地であり、こちら(開発環境)では再現しないため、非常に困っております。
      スクリプトのロジックに問題がない(と思われる)こと、発生頻度がまれでほとんどの場合問題がないこと、などから、データベースファイルの問題(破損など?)も疑いたくなるのですが、原因としてどういったことが考えられるでしょうか?

      解決へ向けて、アドバイスをいただけると助かります。

        • 1. Re: 「関連レコードへ移動」が不可解な挙動
          sago350@未来Switch

          該当スクリプトのスクリーンショットをアップして頂いた方が特定しやすいかと思います。

          • 2. Re: 「関連レコードへ移動」が不可解な挙動
            nagnag

            アドバイス、ありがとうございます。

            該当スクリプトの画面コピーを添付します。FMP_script.jpg

            • 3. Re: 「関連レコードへ移動」が不可解な挙動
              user19752

              作業記録テーブルのスタッフIDは、どうやって入れてますか?

               

              索引が壊れてるかもしれません。

              • 4. Re: 「関連レコードへ移動」が不可解な挙動
                shin

                テーブルオカレンスが複数ある場合その指定を間違う、というミスを私はよくやります。その可能性は?

                • 5. Re: 「関連レコードへ移動」が不可解な挙動
                  nagnag

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

                  作業記録テーブルのレイアウトに切り替えて、「新規レコード/検索条件」でレコード追加し、フィールド設定でスタッフID、作業日等をセットして、確定しています。

                  スタッフIDや作業日等の情報は、実は外部アプリからCSVファイルで連携されまして、CSVをtmpにインポートして取り出しています。

                  なお、作業記録テーブルのスタッフIDの索引設定を確認したところ、「すべて」になっていました。

                  索引が壊れているとすると、最適化コピーで修復されるでしょうか。

                  • 6. Re: 「関連レコードへ移動」が不可解な挙動
                    nagnag

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

                    作業記録テーブルのテーブルオカレンスは複数あり、私もオカレンスの指定を誤ることはよくやりますが、今回のケースは問題ないようです。

                    • 7. Re: 「関連レコードへ移動」が不可解な挙動
                      MiyukiImaizumi

                      関連レコードに移動する前にRecord_keyを変数に設定されてみては?

                      もしかしたら、関連に移動する前とは違うRecord_keyを設定している可能性もありそうですよ。

                      リスト表示のレイアウトで自動でソートするようなスクリプトは動いてませんでしょうか?

                       

                      それと、関連レコードに移動の時にそのスタッフの関連のみに絞り込んで移動し、その後に目的のレコードに絞り込み検索してはいかがでしょうか?

                      • 8. Re: 「関連レコードへ移動」が不可解な挙動
                        shin

                        そのスクリプトステップの前に、レコードを確定、を入れて、0.5秒ほどのスクリプト停止を入れてみればどうでしょう。

                        • 9. Re: 「関連レコードへ移動」が不可解な挙動
                          nagnag

                          そうですね、移動前にRecord_keyを取得しておくと、関連レコード移動後の絞り込みで確実に意図したレコードにできますね。

                          また、後半のアドバイスで、関連レコード移動の「関連レコードのみを表示」について気になったので、ヘルプの記述を見直してみました。

                           

                          [関連レコードのみを表示] では、関連テーブル内の新規対象レコードを、現在のレコードに一致するか、または対象レコード全体と一致するかのどちらかのオプションで作成できます。対象レコードの最初のレコードが現在のレコードになります。このオプションを選択しないと、[関連レコードへ移動] により、テーブルの未ソート順序内にある最初のレコードが現在のレコードになります。

                           

                          このオプションを指定しない場合、「テーブルの未ソート順序内にある最初のレコードが現在のレコードになります」とあります。
                          このオプションは移動先の対象レコードが絞り込まれるかどうかの違いだけで、レコード移動の振る舞いは変わらないと思い込んでいたのですが、この記述からすると、今回のケースでは目的の作業記録レコード(該当スタッフの最新の作業記録)には移動しないということになるでしょうか?

                          そうなると、ほとんどの場合に目的のレコードに移動できているという実態、および、現象発生時の移動先が作業記録の最新レコード(未ソート順の最後のレコード?)になっているという実態が逆に解せませんが・・・。

                           

                          とりあえず、「関連レコードのみを表示」をONにする(またはRecord_keyで目的のレコ-ドを検索する方式に変更してしまってもいいかもしれません)対応は試したいと思います。ありがとうございました。

                          • 10. Re: 「関連レコードへ移動」が不可解な挙動
                            MiyukiImaizumi

                            ヘルプの説明がなんか違う気がします。この場合の新規対象レコードとは、ポータルで新規入力ができる状態の時のことではないかと思います。

                            例えばデータ入力されたポータル行でボタンをクリックした場合は、移動後もクリックしたレコードにフォーカスがあります。

                            しかし、一番下の空欄行でボタンクリックすると確かに、関連レコードの最初の行に移動しました。

                             

                            移動元のレコードで絞り込みをしていても関連レコードへの移動後は全ての関連レコードが表示されています。A,B,Cと三名のところAだけに絞り込んで置いても、関連レコードはA,B,C全員分が表示されてきます。

                            • 11. Re: 「関連レコードへ移動」が不可解な挙動
                              user19752

                              [このオプションを指定しない場合]って使った記憶がないのでテストしてみました(FM15ローカルファイル)。

                               

                              「テーブルの未ソート順序内にある最初の関連レコードが現在のレコードになります。」

                              という動作のようです。(リレーションでソートしている順で最初)

                               

                              「新規ウィンドウ」でない場合、これに伴って、新しい現在のレコードが除外されていた場合は対象レコードに追加されます。それ以外の検索状態は変わりません。(他の関連レコードがあったとしても除外されたまま)

                              「新規ウィンドウ」の場合は、現在のウィンドウの移動先テーブルの検索状態が引き継がれず、全レコードが対象になるようです。

                               

                              と思ったんですが、リレーションでソートしている場合の新規ウィンドウでない場合の対象レコードが、いまいち規則がつかめませんでした。他の関連レコードだけ除外されたままで関連しないレコードは対象になったり、全レコードになったり。

                               

                              ポータル内で使った場合は試してません。

                               

                              結論としては、とても使う気の起こらない設定でした

                              • 12. Re: 「関連レコードへ移動」が不可解な挙動
                                nagnag

                                コメント下さった皆様、ありがとうございました。

                                不可解な現象の原因解明には至りませんでしたが、「関連レコード移動」の「関連レコードのみを表示」OFFは、ヘルプの記述(いまひとつ意味があいまいですが)と実際の挙動が合っていないようでもあり、今回のケースは別の方式(オプションをONにする、移動先のRecord_keyで検索する、など)に改めることにします。また、念のため、最適化コピーも実施しようと思います。

                                • 13. Re: 「関連レコードへ移動」が不可解な挙動
                                  MiyukiImaizumi

                                  最後に一つだけ

                                  索引の再作成は、フィールド定義で索引のオフをして保存、再度フィールド定義で設定をする、

                                  あるいはデータのインポートで治るかと思います。

                                  最適化はデータのフラグメントを解消するもので索引の最適化ではなかったかと。

                                  • 14. Re: 「関連レコードへ移動」が不可解な挙動
                                    nagnag

                                    アドバイスありがとうございます。

                                    データのインポートで治るのであれば、索引の問題ではなさそうですね。
                                    問題の現象が発生した後、一度、機能追加版を導入する際に全データを旧バージョンからインポートしていますので。

                                    いずれにしましても、対応が奏功したかどうかがすぐにわからないのがつらいところですが、色々とやってみます。