7 返信 最新の回答 日時: Dec 13, 2013 8:43 PM ユーザー:株式会社アネビー

    スクリプトでデータを別テーブルにコピーする方法教えてください。

    株式会社アネビー

      タイトル

      スクリプトでデータを別テーブルにコピーする方法教えてください。

      フォーラムに投稿

           Filemaker pro 12を使用しています。(Winodows7で動作)
           スクリプトを用いてテーブル間でレコードをコピーする方法について教えて下さい。

           ある条件で検索したAテーブル内のデータを全件数をBテーブルへコピーするスクリプト作成したいのですが、方法が分かりません。
           Bテーブルは毎回空の状態からのコピーを考えています。
           何方か方法を教えて頂きます様よろしく御願い致します。

           理想としては、LOOP関数等を使用して1レコード毎にコピーしたいのですが。
           (理由)
           コピーしながら、数量等から在庫数計算しある一定の在庫数までのレコードをBテーブルに出力したいためです。Aテーブルは該当の製品コードで検索し、日付でソート済にしてからの処理にするつもりです。

        • 1. Re: スクリプトでデータを別テーブルにコピーする方法教えてください。
          ねこ吉

               自分は、リレーションの設定、「このリレーションシップを利用して、このテーブルでのレコードの作成を許可」

               を使って、レコードをコピーします。

               以下が具体的な手順です。

               (1) テーブルAに、「書き込み用キー」(数字タイプ)フィールドを定義し、

                データの格納を「グローバル格納」にしておきます。

               (2) テーブルBにも、「書き込み用キー」(数字タイプ)フィールドを定義します。

                こちらはグローバル格納ではないです。

               (3) テーブルAとテーブルBの「書き込み用キー」を「=」のリレーションで連結します。

               リレーションシップの詳細設定ダイアログで、テーブルB側の「このリレーションシップを

               利用して、このテーブルでのレコードの作成を許可」にチェックをつけます。

               (4) テーブルBのレコードをすべて削除します。

               (6) テーブルAのレイアウトを表示し、対象となるレコードを抽出状態にします。

               (5) 次のようなスクリプトを実行します。

                フィールド設定[テーブルA::書き込み用キー ; 1]

                レコード/検索条件確定[ダイアログなし]

                Loop

                 フィールド設定[テーブルB::書き込み用キー ; テーブルA::書き込み用キー]

                 フィールド設定[テーブルB::商品名 ; テーブルA::商品名]

                                :

                 レコード/検索条件/ページへ移動[次の;最後まできたら終了]

                 フィールド設定[テーブルA::書き込み用キー;  テーブルA::書き込み用キー + 1]

                 レコード/検索条件確定[ダイアログなし]

                End Loop

                
               なお、この手順はテーブルAにユニークな主キーがないという前提です。
               もしユニークな主キーがあれば、主キーをテーブルA側の書き込み用キーとして使います。
          • 2. Re: スクリプトでデータを別テーブルにコピーする方法教えてください。
            Shin

                 在庫からの出庫へのデータの移動でしょうね。

                 ソート後に、最初のレコードのみを対象にし、出庫側からインポート、レコードを削除か出庫処理、と言う手順にすると、リレーションに気を使わなくていいと思います。

                 loop
                 ソート実行
                 レコードへ移動[最初の]
                 全レコードを表示
                 レコードを対象外
                 対象外のみを表示
                 レイアウトを移動[出庫側]
                 インポート
                 レイアウトを移動[在庫側]
                 レコードを出庫処理
                 exit loop if (出庫量でチェック)
                 exit loop
            • 3. Re: スクリプトでデータを別テーブルにコピーする方法教えてください。
              株式会社アネビー

                   ねこ吉様 アドバイスありがとうございました。

                   いくつか質問させてください。

                   1.ユニークキーが必要な理由は、リレーションが必要なためでしょうか?

                    リレーション設定なしでも(新規レコード)でも可能なものでしょうか?

                    現状では、Aテーブルにユニークキー(データ入力の永久連番)をもっていますので、それを利用可能です。

                    ※リレーションにこだわっているわけではなく、今後の参考のための質問です。

                   2.テーブルBをすべて削除する方法がよくわかりません。

                   3.フィールド設定を必要な項目数分繰り返し、次に「レコード/検索条件/ページへ移動」をなっていますが、

                    このタイミングでAテーブルから次テーブルが読み込まれ、Bテーブル確定と認識していますが、間違いないでしょうか?

                    Aテーブルよりデータ読み込み、数量等を計算しある条件でLOOPを抜け出す条件を作成する予定ですので、確認させていたきました。

                   以上、よろしくお願い致します。

              • 4. Re: スクリプトでデータを別テーブルにコピーする方法教えてください。
                株式会社アネビー

                     Shin様 アドバイスありがとうございました。

                     いくつか質問させてください。

                     1.「レコードへ移動[最初の]⇒全レコードを表示⇒レコードを対象外⇒対象外のみを表示」となっていますが、私の勉強不足であまりよく理解できません。
                       もう少しくわしく教えてください。
                     2.インポートはFileMakerDBからにインポート可能なのですね。
                       また1件目データインポート時にBテーブルを空にする必要がありますよね。
                       2件目以降は、追加になりますよね。
                      
                     以上、よろしくお願い致します。
                      
                      
                      
                • 5. Re: スクリプトでデータを別テーブルにコピーする方法教えてください。
                  Shin

                       ソートされた状態で、最初のレコードだけを対象にするための動作です。(現在のレコードだけを対象にする、というステップが無いので)

                       インポートは、テーブルから直接インポートできますが、上のように対象レコードを指定しておくと、そのレコードのみがインポートできます。
                       比較インポートを行う行うとき以外では、インポート操作の中で新規追加は意識する必要はありません。インポート直後は、インポートされたレコードのみが対象レコードになっています。

                       > 1件目データインポート時にBテーブルを空にする必要がありますよね。

                       運用上の必要でしょうから、作業の前に予め空にしておかれるといいでしょう。ただ、そのような運用が必要な場面は思いつきませんし、聞いたこともありません。何の目的で空にするのですか。

                  • 6. Re: スクリプトでデータを別テーブルにコピーする方法教えてください。
                    ねこ吉

                         > 1.ユニークキーが必要な理由は、リレーションが必要なためでしょうか?

                         Yes.

                         >リレーション設定なしでも(新規レコード)でも可能なものでしょうか?

                         Yes.

                         テーブルAのためのレイアウトで各値をスクリプト変数に保持し、

                         テーブルBのためのレイアウトに切り替えて新規レコードを作ってからフィールドに格納、

                         再度、テーブルAのレイアウトに戻す、

                         ということでも同じ処理になります。ただし、その方法よりも、リレーションで格納する

                         ほうが処理速度が速いと思います。(検証したわけではないですが。)

                          

                         > 2.テーブルBをすべて削除する方法がよくわかりません。

                         (1) テーブルBのレイアウトを表示する。

                         (2) 全レコードを表示。

                         (3) 対象レコードを削除。

                         になります。

                          

                         >3.フィールド設定を必要な項目数分繰り返し、次に「レコード/検索条件/ページへ移動」をなっていますが、

                         >このタイミングでAテーブルから次テーブルが読み込まれ、Bテーブル確定と認識していますが、間違いないでしょうか?

                         No.

                         Bテーブルのフィールドひとつを格納するステップごとに自動的に確定されます。

                         Bテーブルは、「フィールド設定[テーブルB::書き込み用キー ; テーブルA::書き込み用キー]」ステップを

                         実行したときに新規レコードが作られ、かつ、書き込み用キーに値が入り、かつ、確定されます。

                          

                         なお、Aテーブルのキーをインクリメントしたあと、神経質に確定するステップを入れているのは、

                         そのフィールドがリレーションの関係項目だからです。グローバル格納タイプのフィールドが、

                         リレーションの起点に使われている場合、スクリプトで値を書き換えたら、確定しないと、

                         リレーションが正しく更新されないためです。

                         通常、レコードを編集するだけであれば、そこまで神経質に確定を意識する必要はないと思われます。

                          

                    • 7. Re: スクリプトでデータを別テーブルにコピーする方法教えてください。
                      株式会社アネビー

                           ねこ吉様

                           Shin様

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

                           勉強になりました。