1 2 前へ 次へ 16 返信 最新の回答 日時: Jan 12, 2012 7:59 AM ユーザー:jintakatomoz

    List(A)とList(B)を比較

    jintakatomoz

      タイトル

      List(A)とList(B)を比較

      フォーラムに投稿

      List(A)とList(B)を比較してList(A)に無いList(B)の項目を追加したいのですが

      上手く行かないのです

      どなたか上手い方法をご享受下さいCry

      $ListA=ValueListItems ( Get(ファイル名) ; "値一覧A")

      $ListB=ValueListItems ( Get(ファイル名) ; "値一覧B")

      ValueCount ( FilterValues ( $ListA; $ListB ) ) だと数えるだけ

      FilterValues ( $ListA; $ListB ) だと共通な項目は分るが...

      値一覧Aは4000レコード

      値一覧Bは2000レコード

      MacOSX10.6 FMP11

       

        • 1. Re: List(A)とList(B)を比較
          hiro_

           命題は「集合の和」を求めるわけですが、FMはDistinct関数がないので、代わって値一覧機能を利用するのが楽でしょう。

          グローバルフィールドとデカルト積[X]のリレーションを用意して、

          フィールド設定で、グローバルフィールドに下記の計算値を代入します。

            List(ValueListItems(Get(ファイル名);"値一覧A");ValueListItems(Get(ファイル名);"値一覧B"))

          このグローバルフィールドと先の[X]リレーションとから動的値一覧を作ります。(FMに索引が無いので無効と叱られますが、構わず設定します。)

          この動的値一覧の結果がお求めの「AB2集合の和」です。結果を取り出すなら、ValueListItems関数が使えます。また、結果が即時自動反映しないときは、Windowの再表示(キャッシュを反映)で強制更新します。

          • 2. Re: List(A)とList(B)を比較
            jintakatomoz

            とっても不思議です

            理解に苦しみますが出来ました

            いつもありがとうございます

            助かりますm(_ _)m

            • 3. Re: List(A)とList(B)を比較
              jintakatomoz

              更に...

              値一覧C=List(ValueListItems(Get(ファイル名);"値一覧A");ValueListItems(Get(ファイル名);"値一覧B"))

              これで値一覧Aと値一覧Bが合体しました

              値一覧Bにあって値一覧Aに無いレコードはどうやったら探せるのでしょう?

              • 4. Re: List(A)とList(B)を比較
                Shin

                再帰計算させても可能ですが、繰り返しフィールドで処理した方が早いでしょう。

                Rep1 を、

                 GetValue ( ValueListItems ( Get ( ファイル名 ) ; "値一覧B" ) ; Get ( 計算式繰り返し位置番号 ) )

                としておき、Rep2を

                 Case ( not PatternCount ( ValueListItems ( Get ( ファイル名 ) ; "値一覧A" ) ; Rep1 ) ; Rep1 )

                としておきます。

                 List ( Rep2 )

                で表示できます。

                • 5. Re: List(A)とList(B)を比較
                  jintakatomoz

                  折角回答頂いたのに理解出来ないCry

                  Rep1は繰り返しフィールドのグローバル?

                  Rep2はグローバル?

                   

                  再帰計算だとどうなるのでしょう?

                  • 6. Re: List(A)とList(B)を比較
                    Shin

                    どちらも、グローバルではない、計算繰り返しフィールドです。最後のList ( Rep2 ) は、繰り返しでない計算フィールドです。

                    • 7. Re: List(A)とList(B)を比較
                      jintakatomoz
                      • 8. Re: List(A)とList(B)を比較
                        jintakatomoz
                        • 9. Re: List(A)とList(B)を比較
                          hiro_

                           今度は「集合の差」の命題ですネ。

                          Advanced版なら再帰計算カスタム関数を定義すればよいのですが、標準版なので代わって繰り返しフィールドで代用すると良いでしょう。

                          今回求答にレコードは関係ないので、グローバルフィールドだけを使うものとします。「ListA」「ListB」「ListB∩A」の3つのグローバルフィールドを用意します。

                          「ListB∩A」は計算繰り返しフィールドで、その式は、以下とします。

                            Let(
                             $ItemB=GetValue(ListB[1];Get(計算式繰り返し位置番号));
                             Case(FilterValues($ItemB;ListA[1])="";$ItemB)
                            )

                          設定は以上。

                          後は「フィールド設定」で、2つのフィールドに下式の計算値を代入して、

                            「ListA」フィールド = ValueListItems(Get(ファイル名);"値一覧A")

                            「ListB」フィールド = ValueListItems(Get(ファイル名);"値一覧B")

                          「ListB∩A」計算フィールドの計算結果がお求めの「AB2集合の差」です。結果を取り出すなら、List(「ListB∩A」フィールド)で取得できます。また、結果が即時自動反映しないときは、Windowの再表示(キャッシュを反映)で強制更新します。

                           

                          ※ 判別式で、PatternCountは部分照合なのでダメです。FilterValuesで完全一致照合しないと。

                          • 10. Re: List(A)とList(B)を比較
                            jintakatomoz

                            Let(
                               $ItemB=GetValue(ListB[1];Get(計算式繰り返し位置番号));
                               Case(FilterValues($ItemB;ListA[1])="";$ItemB)
                              )

                            ↓これですね

                            Let(
                               [

                               $ItemB=GetValue(ListB[1];Get(計算式繰り返し位置番号))

                               ];
                               Case(FilterValues($ItemB;ListA[1])="";$ItemB)
                              )

                            上手く出来ました

                            繰り返しの回数が32000行までなのが不安と思いましたが2回実行すれば良いのでOKです

                            いつもありがとうございますSmile

                            • 11. Re: List(A)とList(B)を比較
                              jintakatomoz

                              [ ]無くても動きますね

                              ListAとListBのフィールドは

                              テキストフィールドの計算?

                              計算フィールド?

                              どっちでも動きますけど...

                              キャッシュが上手く行かない

                              新規レコードにすると大丈夫の様です

                              • 12. Re: List(A)とList(B)を比較
                                jintakatomoz

                                これってカスタム関数で再帰計算も可能なのでしょうか?

                                カスタム関数はアドバンスがあれば出来るの?

                                • 13. Re: List(A)とList(B)を比較
                                  hiro_

                                   再帰計算は標準FMでも可能ですが、再帰回数が200から300回(環境と式により変化)程度に限られます。

                                  そこで今回の案件では、Advanced版でカスタム関数が使えればと申しました。カスタム関数の再帰計算では確か5万回?まで可能だからです。

                                  カスタム関数の登録はAdvanced版の機能です。もちろん、advancedが有ればできるというものではなく、再帰計算式を立てられるスキルも必要です。

                                  また、再帰計算と同じ結果は、ループ・スクリプトを使うと比較的簡単に実現可能です。(簡単な分、スピードはかなり遅くなりますが)

                                  • 14. Re: List(A)とList(B)を比較
                                    jintakatomoz

                                    普通の計算式もカスタム関数にすると処理が速いって聞いたので

                                    Loopのスクリプトよりカスタム関数で再帰計算の方が動作が速いのかなって思いました?

                                    「再帰計算式を立てられるスキルも必要」う〜んCry無理か...

                                    再帰計算を上手く使えるとい〜なぁ

                                    勉強したいが、切っ掛けが無くどうしたものか...

                                    例として今回のを再帰計算式にするとどうなるのでしょうか

                                    教えて頂けると嬉しいデス!

                                    1 2 前へ 次へ