8 返信 最新の回答 日時: Jan 6, 2016 6:49 PM ユーザー:user14047

    FileMaker 13 pro で抽出データが勝手に削除されてしまった

    user14717

      3年以上使用しているFileMakerServerのファイルで親レコードを10件抽出して、

      1レコードのリレーション上の子供レコードを削除するスクリプトを走らせたところ、

      抽出されている親レコードが10件すべて消えてしまいました。3年間で初めてです。

      スクリプトは途中で子供レコードのテーブルのレイアウトに切替えてレコード削除して

      最終的に親レコードのレイアウトにもどる処理です。

       

      修復をかけましたがファイル損傷はなく、再現性もなく以降は発生しません。

      作業者は画面にたくさんアプリを立ち上げて高負荷状態でした。

       

      スクリプト上でレコード削除実行時に何らかの高負荷状態でレイアウトが切り替わる前に

      次行のレコード削除が実行されるようなことが起きたとしか考えられないですが、

      そんなことが起きるのでしょうか?

       

      また別の原因としても、

      ・ファイルの容量が1.3ギガくらいになって重くなってきた、

      ・アクセスが集中し処理がうまくいかなかった

       

      ログには異常はなく、その他は想像がつきません。

       

      よろしくお願いいたします。

        • 1. Re: FileMaker 13 pro で抽出データが勝手に削除されてしまった
          user14047

          よくやってしまうミスとして、[関連レコードへ移動] スクリプトステップを利用して、子テーブルのレイアウトに移動している場合、関連レコードがないため、関連レコードへの移動が行われないまま(親テーブルのレイアウトのまま)削除をしてしまうという、エラー処理を入れ忘れてしまったために起こる惨劇ですが、そのあたりは大丈夫でしょうか?

          • 2. Re: FileMaker 13 pro で抽出データが勝手に削除されてしまった
            user14717

            関連テーブルは使用してます。

             

            はじめに親テーブル(order)にいて、子供レコードポータルでレコードを選択した状態で

            下記のスクリプトを走らせ、子テーブル(job)に関連レコードで移動して削除処理します。

             

            レコードが存在しない場合は4行目ではねられ、

            存在してれば関連レコードへ移動するはずです。

             

            動作テストを行いましたがカスタムダイアログの動線も問題なく

            PCやネットワークのコンディションで関連テーブルに移動できなかったとしか思えません。

             

            そんなことがあるのでしょうか?

             

            よろしくお願いいたします。

             

            script-------------------------------------------------------

             

            エラー処理 [ オン ]

            #

            変数を設定 [ $a; 値:Get ( スクリプト引数 ) ]

            If [ Count ( GetField ( "process_" & $a & "_job::id" ) ) ]

                カスタムダイアログを表示 [ デフォルトボタン: 「OK」, 確定: 「いいえ」; ボタン 2: 「キャンセル」, 確定: 「いいえ」 ]

                If [ Get ( 最終メッセージ選択 ) = 1 ]

                    ####################

                    If [ $a = 1 ]

                        関連レコードへ移動 [ テーブル: 「process_1_job」; 使用するレイアウト: 「job」 (job) ][ 関連レコードのみを表示 ]

                    Else If [ $a = 2 ]

                        関連レコードへ移動 [ テーブル: 「process_2_job」; 使用するレイアウト: 「job」 (job) ][ 関連レコードのみを表示 ]

                    Else If [ $a = 3 ]

                        関連レコードへ移動 [ テーブル: 「process_3_job」; 使用するレイアウト: 「job」 (job) ][ 関連レコードのみを表示 ]

                    End If

                    ####################

                    対象レコードの絞り込み [ 指定された検索条件: レコードの検索; 条件: job::選択チェック: 「1」 ][ 記憶する ]

                    If [ Get ( 対象レコード数 ) > 0 ]

                        対象レコード削除[ ダイアログなし ]

                        レイアウト切り替え [ 元のレイアウト ]

                        ####################

                        If [ $a = 1 ]

                            フィールドへ移動 [ process_1_job::id ]

                        Else If [ $a = 2 ]

                            フィールドへ移動 [ process_2_job::id ]

                        Else If [ $a = 3 ]

                            フィールドへ移動 [ process_3_job::id ]

                        End If

                        ####################

                        ウインドウのスクロール[ End ]

                        レコード/検索条件確定

                    Else

                        レイアウト切り替え [ 元のレイアウト ]

                        カスタムダイアログを表示 [ デフォルトボタン: 「OK」, 確定: 「いいえ」 ]

                    End If

                End If

            End If

            • 3. Re: FileMaker 13 pro で抽出データが勝手に削除されてしまった
              user14047

              きちんと対象レコードの有無で分岐されているので問題ないかと思います。

              いくら高負荷であってもレイアウトが切り替わる前に意図していないテーブルのレコードを削除された経験はありません。

               

              怖いので、17行目の対象レコード削除の前にスクリプト一時停止を入れて、レイアウトテーブル名での判定も入れてみますか?

               

              スクリプト一時停止/続行 [ 間隔(秒): .1 ]
              If [ Get ( 対象レコード数 ) > 0 ]
                If [ Get ( レイアウトテーブル名 ) ≠ "job" ]
                  カスタムダイアログを表示 [ "エラー" ; "何かおかしいです。スクリプトを中止します。" ]
                  現在のスクリプト終了 [false]
                End If
                対象レコード削除[ ダイアログなし ]
              •••
              
              

              大量のレコードを Loop 処理する時とか、スクリプト一時停止0.1秒 を挟むことがままあります。

              このステップを入れると何か負けた気がするので本当は使いたくないのですが。

              それにしても怖いなぁ...

              • 4. Re: FileMaker 13 pro で抽出データが勝手に削除されてしまった
                user14717

                大変参考になりました。

                 

                判定行を入れてみます。

                 

                ありがとうございました。

                • 5. Re: FileMaker 13 pro で抽出データが勝手に削除されてしまった
                  shinsplash

                  現象から見て、気になるのはやはり次の点でしょうか。

                   

                  > 抽出されている親レコードが10件すべて消えてしまいました。

                   

                  内容から見てこれが発生するのでしたら「関連レコードに移動していない」と考えるのが一番素直な気がします。

                  つまり、移動した先で「対象レコード数」の判定をしているつもりですが、実際はレイアウトは切り替わっておらず親テーブルでの対象レコード数を判定すると件数は10件ありTRUE。該当レコードが削除されてしまった。

                   

                  この仮説を元にコードを見ると、

                  > If [ Count ( GetField ( "process_" & $a & "_job::id" ) ) ]

                  これで判定した結果関連レコードに移動しています。

                   

                  ここを次のように変更して確認してみるといかがでしょうか。

                  If [ not isEmpty ( GetField ( "process_" & $a & "_job::id" ) ) ]



                  • 6. Re: FileMaker 13 pro で抽出データが勝手に削除されてしまった
                    qbxxdp

                    ShinNinagawa さんが指摘しているところ

                    > If [ Count ( GetField ( "process_" & $a & "_job::id" ) ) ]

                    ココが私も気になります。

                     

                     

                    >親レコードが10件すべて消えてしまいました。

                    上記は、スクリプト引数を1,2,3以外にする事で再現出来ます。

                     

                    変数を設定 [ $a; 値:Get ( スクリプト引数 ) ]

                    変数「$a」 が 1,2,3 以外の場合(空欄も含む)、

                    If [ ? ] となり、TRUE なので、スクリプトが走ります。

                    この場合、以下のジ条件式も効かないので、

                    If [ $a = 1 ]

                    Else If [ $a = 2 ]

                    Else If [ $a = 3 ]

                    レイアウトが、切り替わらず、親レコードを削除することが出来ます。

                     

                     

                    スクリプト引数 が空欄でこのスクリプトが走ると 現在の対象レコードが、削除されるようなスクリプトになっているので危険です。

                    以下のようにスクリプト引数の空欄対策も入れたほうが良いです。

                    If [IsEmpty ( $a )]

                    現在のスクリプト終了 []

                    End If

                     

                     

                    user14047さんが、追加した以下とか

                    If [ Get ( レイアウトテーブル名 ) ≠ "job" ] 

                     

                     

                    以下のようにしてエラーを検出できるようにする。

                    エラー処理 [ オフ ]

                    対象レコード削除[ ダイアログなし ]

                    エラー処理 [ オン ]

                     

                     

                    あと、動作を確認したいスクリプトの場合は、Logテーブルを作成し、Logを取ることをお勧めします。

                    私は、以下のようにしてLogをとっています。

                     

                     

                    Logsファイルのスクリプト

                    スクリプト名:Add_Log($TimeStamp,$Title,$Log)

                    変数を設定 [$er; 値:Evaluate ( "Let ( [" & Get ( スクリプト引数 ) & "] ; 0 )" )]

                    If [ not IsEmpty ( $TimeStamp )]

                    新規レコード/検索条件

                    フィールド設定 [Logs::TimeStamp; $TimeStamp]

                    フィールド設定 [Logs::Title; $Title]

                    フィールド設定 [Logs::Log; $Log]

                    End If

                    フィールドへ移動 []

                     

                     

                    ログ追加

                    スクリプト中の「対象レコード削除」の前後や気になる箇所や、結果を残したいところに[「Add_log($TimeStamp,$Log)」を追加し、

                    必要な情報を残しておくのが良いと思います。

                     

                     

                    スクリプト実行 [「Add_log($TimeStamp,$Log)」 , ファイル: 「Logs」; 引数: "$TimeStamp=" & Quote ( Get ( タイムスタンプ ) ) &  ";$Log=" & Quote ( ".....")]

                    対象レコード削除[ ダイアログなし ]

                    スクリプト実行 [「Add_log($TimeStamp,$Log)」 , ファイル: 「Logs」; 引数: "$TimeStamp=" & Quote ( Get ( タイムスタンプ ) ) &  ";$Log=" & Quote ( ".....")]

                    • 7. Re: FileMaker 13 pro で抽出データが勝手に削除されてしまった
                      user14717

                      参考にさせていただきます。

                       

                      いずれにしても対策を追加したいと思います。

                       

                      ありがとうございます。

                      • 8. Re: FileMaker 13 pro で抽出データが勝手に削除されてしまった
                        user14047

                        なるほど。$a が想定外の場合を想定していませんでした。

                        If [IsEmpty ( $a )]
                        現在のスクリプト終了 []
                        End If

                        どうせだったら、not ( $a = 1 or $a = 2 or $a = 3 ) と想定外の引数を全て排除してしまった方が良さそうですね。