7 返信 最新の回答 日時: Nov 10, 2011 5:07 PM ユーザー:K.Aki

    ルックアップの複数行取得方法について

    K.Aki

      タイトル

      ルックアップの複数行取得方法について

      フォーラムに投稿

       FileMakerPro11を使用しています。
      ルックアップ時に複数行を取得することは可能なのでしょうか?

      例:
      伝票テーブルA
      伝票番号  取引先コード  金額
      1001      A001          1,000
      1002      A001          1,500
      1003      B002          3,000
      1004      A001          1,000
      1005      C003          2,000

      上記のようなテーブルがあり、ルックアップのために同じ構造のテーブルBがあります。
      また、テーブルAとテーブルBは取引先コードでリレーションさせています。(取引先コードでデータを取得したいため)

      伝票テーブルA    伝票テーブルB
      伝票番号          伝票番号
      取引先コード   ⇔ 取引先コード
      金額               金額

      ここで、スクリプトにて伝票テーブルBの取引先コードにA001を渡します。
      伝票テーブルBに3行(1001,1002,1004)入って欲しいのですが、1行(1001)しか入りません。
      これを3行取得するにはどうしたらよいでしょうか?

      ルックアップの機能を理解していない素人な発言かもしれませんが、お力を貸していただきけないでしょうか。
      何卒よろしくお願いいたします。

       

        • 1. Re: ルックアップの複数行取得方法について
          J

          こんにちは

          ルックアップだと関連レコードから一番上(ソート順で)のレコードだけを引いてくるんだと思います(だから1行しか来ない)。

          このような用途の時はルックアップを使うより値一覧を使うほうがよいと思います。

          まず、テーブルは一つですむと思います。

          リレーショングラフで伝票テーブルAのテーブルオカレンスを2つつくり(それを伝票テーブルA、伝票テーブルBとします)、取引先コードでリレーションします。

          値一覧を定義して伝票テーブルBの「伝票番号」フィールドの値を指定し、「次のテーブルからの関連レコードのみふくめる」オプションで「伝票テーブルA」をしていします。

          伝票テーブルに計算フィールドを一つ追加して以下のようにします

          計算式:ValueListItems ( Get ( ファイル名 ) ; "値一覧の名前" )

          次のコンテキストから計算式を評価する:伝票テーブルA

           

          これで伝票テーブルAを基にしたレイアウトを作成し、さっき作った計算フィールドを表示してみて下さい。

          取引先コードが共通するレコードの伝票番号が全部取得できます。

          先々を考えると取引先のマスターとなるテーブルを作って、そちらからリレーションしたほうが良いかもしれませんが..。

          • 2. Re: ルックアップの複数行取得方法について
            K.Aki

             

            J様

            ご回答ありがとうございます。
            このような方法があるとは知りませんでした。
            とても参考になりました、ありがとうございます。

            しかし、今回の件はもう少し複雑で、教えていただいた方法では実現できないのかと考えております。
            私の質問の仕方が悪く申し訳ありませんでした。
            もう少し詳しく今回の事例を書かせていただきます。

            伝票テーブルが2種類あります。
            伝票ヘッダテーブルと伝票明細テーブルです。(仮にそれぞれAと名付けます)
            伝票ヘッダテーブルA:伝票番号、取引日、取引先、合計金額など
            伝票明細テーブルA :伝票番号、行番号、商品コード、商品名、数量、金額など
            ヘッダ1件に対して複数の明細が存在し、伝票番号でリンクします。

            これに対し、伝票ヘッダテーブルBと伝票明細テーブルBを作成し
            それぞれ同じテーブルAと同様の構造を持たせ、それぞれ伝票番号でリレーションし、
            BはAをルックアップします。
            そして、ルックアップしたヘッダテーブルBと明細テーブルBを伝票番号でリレーションし
            画面に表示させたかったのです。

            もちろん、表示させるだけではなく、これを更新しなければなりません。
            画面入力で更新されたルックアップのデータをスクリプトでそれぞれのテーブルAに登録します。

            上記のような内容になります。
            伝票番号で抽出した際に、明細がどうしても1件しか抽出できないので、
            最初の質問の形をとらせていただきました。

            ルックアップで1件しか取れないとなると、処理の最初で対象の明細データを
            ワークテーブルなどに取り込んで処理し、登録時はワークテーブルの内容を
            テーブルAに更新するしかないのかと考えています。
            他に良いアイデアありましたら、ご教授願えればと思います。

            • 3. Re: ルックアップの複数行取得方法について
              J

              K.Akiさん

              少し複雑なようですね。

              ちょっとわからないのは伝票ヘッダテーブルBと伝票明細テーブルBの存在意義です。

              「それぞれ同じテーブルAと同様の構造を持たせ」とありますのでこのテーブルBは別のテーブルオカレンスを作ったということではないわけですよね?

              画面に表示させるときに直接テーブルAの内容を表示させるのではダメなのでしょうか?

               

              >ルックアップで1件しか取れないとなると、処理の最初で対象の明細データを
              >ワークテーブルなどに取り込んで処理し、登録時はワークテーブルの内容を
              >テーブルAに更新するしかないのかと考えています。

              この部分も直接テーブルAを更新してはまずいのでしょうか?

               

              伝票ヘッダテーブルAと伝票明細テーブルAを伝票番号でリレーションして、伝票ヘッダテーブルAを基にしたレイアウト上に伝票明細テーブルAのレコードを表示するポータルを配置するという方法で良い気がしているのですが...。

              いずれにしてもルックアップはちょっと違う気がします。Filemakerの機能から一度離れて、どのような機能を実現したいかを書いていただくとレスが着きやすいかと思います。

               

              • 4. Re: ルックアップの複数行取得方法について
                K.Aki

                J様

                実現したい機能としては以下の通りです。

                テーブルは前述のとおり伝票ヘッダと明細があります。
                伝票画面を開くとヘッダ1件に対して複数の明細が表示されます。


                ------------------------------------------------
                取引先名        2011/01/01
                合計金額 10,000円

                ▽明細
                    商品名   数量 単価  金額
                1. 商品A     10  100 1,000円
                2. 商品B     20  100 2,000円
                3. 商品C     30  100 3,000円
                4. 商品D     20  200 4,000円
                ------------------------------------------------
                | 登録 | キャンセル |
                ------------------------------------------------

                伝票内容を編集し、登録ボタンをクリックするとデータベースを更新します。
                ※入力と同時にデータベースを更新するわけではありません。

                すべて入力後、入力内容のエラーチェックを行いデータベース更新するため、
                上記のようにしています。
                そのため一旦ワークテーブルなどにデータを保管し、登録ボタンのタイミングで
                正データベースに更新するしかないかと考え、前述の内容になりました。

                説明不足で大変申し訳ございません。
                何卒よろしくお願いいたします。

                 

                • 5. Re: ルックアップの複数行取得方法について
                  J

                  K.Akiさん

                  なるほど。直接レコードの値を編集してはまずいということですね。

                  ということでしたら、おっしゃる通りに作業用のテーブルを別に用意して、入力作業時は作業用のテーブルのレコードを編集し、確認後に元のテーブルに値を書き戻すことになりますね。

                   

                  または...フィールド数が多いときはあまりお勧めではありませんが、作用用のフィールドを作ることでも可能だと思います。

                  つまり...

                  伝票明細テーブルには

                  商品名、数量、単価、金額の各フィールドがあると思いますが、temp数量、temp単化、temp金額..等、作業用のフィールドを追加して、入力作業時にスクリプトでtemp〜の作業用フィールドに通常のフィールドから値を持ってきて入力してはどうでしょうか?

                  作業用のフィールドの値は保存用とは見なさない(意味がないものとする)か、作業が終わったら消すようにスクリプトで処理するようにしておけば別のテーブルは必要なくなりますね。

                  どちらが良いかは場合によると思います。

                  • 6. Re: ルックアップの複数行取得方法について
                    Shin

                    テーブルA とテーブルBは、まったく独立させて動かしたいのですよね。伝票番号も同じでいいのでしたら、話は非常に簡単ですよ。

                    まず、伝票テーブルAで、目的のレコードだけを対象レコードにします。(全レコードを表示、レコードを対象外、対象外レコードを表示)

                    伝票詳細テーブルAへ、関連レコードへ移動、を使って移動。

                    伝票テーブルBを表示し、伝票テーブルAをインポート。伝票詳細テーブルBで、伝票詳細テーブルAをインポート。以上です。

                    面倒なことがおきるかもしれませんので、リレーションは切っておいてください。

                    こういう事では無い?。

                    • 7. Re: ルックアップの複数行取得方法について
                      K.Aki

                      J様、Shin様

                      お返事が遅くなってしまい大変申し訳ございません。

                      しばらく反応がなかったため、もうダメかと思い放置していました。

                       

                      結局以下のようにしました。

                      伝票テーブルBで伝票テーブルAをルックアップ(伝票番号でリレーション)。

                      スクリプトにて伝票明細テーブルAから伝票明細テーブルBに対象レコードをコピー。

                      伝票テーブルBと伝票明細テーブルBを伝票番号でリレーションし、ポータルにて明細表示。

                      データ更新はスクリプトにて実行。

                      以上です。

                       

                      丁寧なご指導をいただきありがとうございました。

                      大変助かりました。