7 返信 最新の回答 日時: Apr 22, 2011 10:35 PM ユーザー:ゴルビー

    テーブル間のデータ処理

    ゴルビー

      タイトル

      テーブル間のデータ処理

      フォーラムに投稿

      下記データテーブルのIDを、X,Y値により表示用テーブルに並び変えて表示する方法を検討しています。

      データテーブルは複数存在し、3フィールドでデータ数が400~900件です。表示用テーブルは1つで、30フィールド×30データとなります。


      「データテーブルn」 

      ID    X Y

      A001  1 1

      A002  1 2

      A003  1 3

      A004  2 1

      A005  2 2

      A006  2 3

      A007  3 1

      A008  3 2

      A009  3 3

      ・・・

      「表示用テーブル」

      X1      X2     X3  ・・・ X30

      A001 A004 A007

      A002 A005 A008

      A003 A006 A009

      ・・

      とりあえず下記スクリプト(概要)を作成しましたが、コピーおよび貼り付けスクリプトに計算値が使用できないため下記問題をかかえています。


      ・データテーブルの複数対応ができない。

      ・フィールドの切り替えにIf文を使うしかない。

      Loop

      レイアウト切り替え ["データテーブル"&テーブル番号指定::g_n]

      レコード/検索条件/ページに移動[ダイアログなし;$$count] 

      コピー[選択; データテーブルn::ID]

      変数を設定[[$$x_pos; 値:${データテーブルn}::X] 

      変数を設定[[$$y_pos; 値:${データテーブルn}::Y]

      レイアウト切り替え [「表示用テーブル」(表示用テーブル)] 

      レコード/検索条件/ページに移動[ダイアログなし;$$y_pos] 

      If[$$x_pos=1]

      貼り付け[選択;表示用テーブル::X1]

      ・ 

      Else If[$$x_pos=30]

      貼り付け[選択;表示用テーブル::X30]

      End_If# 変数を設定[[$$count; 値:$$count+1] 

      Exit Loop If[$$count=30]

      End_Loop


      また、上記スクリプトでは処理に3分ぐらいかかりあまり実用的ではありません。

      長文で申し訳ございませんが、ご教示お願いいたします。

        • 1. Re: テーブル間のデータ処理
          ゴルビー

          お世話になっています。ゴルビーです。

          利用環境の記述を失念していました。

          FileMakerPro V11 Windows版になります。

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

          • 2. Re: テーブル間のデータ処理
            YukioTakaoka

            ゴルビーさん、

            たかおか と申します。

            直接的なご回答となるかはわかりませんが、御参考までに。

            値を書き込む先のフィールド指定を、現在のIfスクリプトステップによる分岐ではなく、
            フィールドを名前で設定 スクリプトステップに変えてみてはいかがでしょうか。

            このスクリプトステップでは、フィールド設定スクリプトステップの、ターゲットフィールドを指定する部分が計算式で指定できますので、Ifスクリプトステップの分岐に使用している値をそのまま計算式で使ってしまうことができると思います。

            例)
            変数を指定 [$ID;値:データテーブルn::ID]
            変数を指定 [$Target;値:"表示用テーブル::X"&$$x_pos]
            フィールドを名前で設定 [$Target; $ID]

            処理時間が短くなるか否かは実験してみないとわかりませんが、スクリプトの構成はだいぶシンプルになるとは思います。

            以上、御参考になれば幸いです。

            • 3. Re: テーブル間のデータ処理
              ゴルビー

              たかおかさん

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

              都合により次週になりますが、試してみます。

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

              • 4. Re: テーブル間のデータ処理
                ゴルビー

                たかおか さん

                ゴルビーです。お世話になっております。

                ご教示のとおり変更したところ、劇的に処理が早くなりました。ありがとうございました。

                残るは、「データテーブルの複数対応」ですが、難しいようです。

                苦肉の策として、データテーブルnのデータをWork_Tableへコピーし、使用する下記スクリプト(概略)作成しましたが、処理に時間がかかります。

                Loop

                レイアウト切り替え ["データテーブル"&テーブル番号指定::g_n]

                レコード/検索条件/ページに移動[ダイアログなし;$$count] 

                コピー[選択]

                #

                レイアウト切り替え [「Work_Table」(Work_Table)]

                レコード/検索条件/ページに移動[ダイアログなし;$$count]

                貼り付け[「Work_Table」::tmp]

                変数を設定 [$$x_pos; 値:Work_Table::X] 

                変数を設定 [$$y_pos; 値:Work_Table::Y] 

                変数を設定 [$$ID; 値:Work_Table::ID]

                変数を指定 [$Target;値:"表示用テーブル::X"&($$x_pos)]

                #

                レイアウト切り替え [「表示用テーブル」(表示用テーブル)]

                レコード/検索条件/ページに移動[ダイアログなし;$$y_pos] 

                フィールドを名前で設定 [$Target; $ID]

                #

                変数を設定[[$$count; 値:$$count+1] 

                Exit Loop If[$$count=30]

                End_Loop

                (補足) 

                work_TableのID,X,Yの各フィールドデータは、「work_Table」::tmpにコピーされた全フィールドデータからMiddleWordsを使い格納しています。

                以上、改善すべき点等がございましたなら、ご教示頂けると幸いです。


                • 5. Re: テーブル間のデータ処理
                  Shin

                  表示用のテーブルに、繰り返しフィールドを使ってもいいのでしたら、普通のフィールド設定でも作れるでしょう。

                  データファイルが複数の時に、別のデータテーブルの表示が同一の表示テーブルでも良いのでしたら、

                  表示テーブル側に、

                  レイアウト切り替え [「表示用テーブル」(表示用テーブル)]

                    変数を指定 [$Target;値:"表示用テーブル::X"&(GetAsNumber( GetValue ( Get ( スクリプト引数 ) ; 2 ))]

                  レコード/検索条件/ページに移動[ダイアログなし;GetAsNumber( GetValue ( Get ( スクリプト引数 ) ; 3 )

                  フィールドを名前で設定 [$Target; GetValue ( Get ( スクリプト引数 ) ; 1 )]

                  だけのスクリプトを作っておきます。

                  各データテーブルには、

                  loop

                  スクリプト実行(上のスクリプト ; ID & ¶ & X & ¶ & Y

                  次のレコードへ(最後になれば終了)

                  end loop

                  というスクリプトを置いておけば良いでしょう。

                  • 6. Re: テーブル間のデータ処理
                    YukioTakaoka

                    ゴルビーさん、

                    そもそも、データテーブルを複数持たずに、1つのテーブルに「データ種別」といったフィールドを設けて、そのフィールドの値で検索をするなどしてグルーピングすれば、テーブルが1つで済むような気がしますが、いかがでしょうか?

                    D   X Y 種別
                    A001  1 1 A
                    A002  1 2 A
                    A003  1 3 A
                    A004  2 1 A
                    A005  2 2 A
                    A006  2 3 A
                    A007  3 1 A
                    A008  3 2 A
                    A009  3 3 A
                    A001  1 1 B
                    A002  1 2 B
                    A003  1 3 B
                       ・
                       ・
                       ・
                    A030  1 3 n  



                    いっぽう、データテーブルが複数存在することが必須で、動的にテーブルの名称を変えたいのであれば、以下の様な方法ではどうでしょう?

                    ------------
                    フィールドを名前で設定 [$Target ; Evaluate ("データテーブル" & $table_shikibetsu & "::ID")]
                    ------------

                    このEvaluate関数を使用すれば、関数の引数に指定した計算式を実行した結果を得ることができます。
                    上記の例では....
                    「$table_shikibetsu」が「1」だった場合、
                    「データテーブル1::ID」というフィールドを指定していることと同じ意味になります。
                    この方法であれば、データテーブルの名称が動的に変えられるので、データテーブルが複数存在しても対応可能だと思います。
                    Evaluate関数の詳しい使用方法については、FileMaker Proのヘルプをご覧頂ければ幸いです。

                    ちなみにEvaluate関数を使わずに単に、

                    フィールドを名前で設定 [$Target ; "データテーブル" & $table_shikibetsu & "::ID"]

                    としただけでは、「データテーブル1::ID」という文字列が得られるだけですので、これでは目的は果たせませんので注意が必要です。

                    最後に、スクリプトを拝見すると「コピー[選択]」「貼り付け[「Work_Table」::tmp]」といった感じでスクリプトを記述されておりますが、これらを「フィールド設定」や「フィールドを名前で設定」スクリプトステップを使用するように工夫をすれば、スクリプトの処理速度は少し改善するかも知れません。

                    以上、御参考になれば幸いです。

                    • 7. Re: テーブル間のデータ処理
                      ゴルビー

                      Shinさん、たかおか さん


                      コメントありがとうございます。
                      (おそらく私の能力の問題ですが)shinさんにご教示頂いた下記コマンドの引数渡しとデータの移動が,うまく処理できませんでした。

                      >スクリプト実行(上のスクリプト ; ID & ¶ & X & ¶ & Y)
                      >次のレコードへ(最後になれば終了)

                      その後、たかおか さんにご教示頂いた、Evaluateを用いることにより解決できました。
                      参考までに作成したスクリプト概要を示します。

                      <Mainスクリプト>

                      各種設定後、データテーブルスクリプトを実行します。引数1はデータテーブル名です。



                      <データテーブルスクリプト>

                      変数を設定[$count; 値:1]

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

                      #

                      Loop

                      レイアウト切り替え [$TargetTable]

                      レコード/検索条件/ページに移動[ダイアログなし;$count] 

                      スクリプト実行[「表示スクリプト」;引数:Evaluate("$"&"{"&$TargetTable&"}"&"::ID") & ¶ & Evaluate("$"&"{"&$TargetTable&"}"&"::X") & ¶ & Evaluate("$"&"{"&$TargetTable&"}"&"::Y")

                      変数を設定[$count; 値:$count+1] 

                      Exit Loop If[$$count=900+1]

                      EndLoop



                      <表示スクリプト>

                      レイアウト切り替え [「表示用テーブル」(表示用テーブル)]

                      変数を指定 [$Target;値:"表示用テーブル::X"&(GetAsNumber( GetValue ( Get ( スクリプト引数 ) ; 2 )))]

                      レコード/検索条件/ページに移動[ダイアログなし;GetAsNumber( GetValue ( Get ( スクリプト引数 ) ; 3 ))] 

                      フィールドを名前で設定 [$Target; GetValue ( Get ( スクリプト引数 ) ; 1 )]



                      お二人のおかげで、満足のいくものができそうです。

                      お忙しい中、ご教示頂きありがとうございました。(ゴルビー)