6 返信 最新の回答 日時: Jun 20, 2009 11:13 PM ユーザー:user6776

    リレーションによるデータの取得について

    IKG

      タイトル

      リレーションによるデータの取得について

      フォーラムに投稿

      お世話になっています。WinXP+FMPro10の環境でデータベースを作成しています。

      行き詰っております。 

       

      説明がややこしくて分かり辛いかと思いますが、よろしくお願いいたします。 

       

       

      データベースFILE(A)にはユーザーコード(YCD)、材料コード(ZCD)、MEMOのフィールドがあります。

       

      マスターファイルFILE(B)には同じくYCD、ZCD、MEMOのフィールドがあります。

       

      FILE(B)のデータは

      |YCD|ZCD|MEMO|

      |123|  |ALL|

      |     |A1|NOT|

      |789|A1|OR|

       

      FILE(A)にデータを作成した際にFILE(B)のMEMOの値を取得したいのです。 

      |789|A1|の場合は|MEMO|=OR

      |456|A1|の場合は|MEMO|=NOT・・・・・・FILE(B)の|A1|を参照してNOTを取得。

      |123|B1|の場合は|MEMO|=ALL・・・・・・FILE(B)の|123|を参照してALLを取得。

       

      これを取得するためにFILE(A)および(B)に|YCD|&|ZCD|というフィールドを作成して

      これをリレーションさせて試みたのですが、うまく行きません。

       

      何とか、FILE(A)でデータ取得した際にMEMOフィールドを計算フィールドとして値を取得したいと

      思っています。アドバイスお願い致します。 

       

       

       

        • 1. Re: リレーションによるデータの取得について
          user6776
            

          |YCD|ZCD| 

          |456|A1  |

          |123|B1  |

          ↑この二つの場合の条件がわかりません。

          FILE(B)にはYCDが456で、ZCDがA1のレコードは存在しませんよね?

          その場合には、一致する値は存在しないので空っぽを取得することになります。

           

          NOTを取ってくるとしても、なんらかな法則が必要なのですが、どういうルールをお考えでしょうか?

          • 2. Re: リレーションによるデータの取得について
            IKG
              

             

            sago350さん

             

            ご返信ありがとうございます。

            --------------------------------------------------------------

            |YCD|ZCD| 

            |456|A1  |

            |123|B1  |

            ↑この二つの場合の条件がわかりません。

            FILE(B)にはYCDが456で、ZCDがA1のレコードは存在しませんよね?

            その場合には、一致する値は存在しないので空っぽを取得することになります。

            --------------------------------------------------------------

             

            おっしゃる通り、|YCD|&|ZCD|をリレーションとして取得すれば上記は空データになってしまいます。

             

            |YCD|ZCD| 

            |456|A1  |・・・・・この場合は、|ZCD|と一致するNOTを取得する。

             

            ※FILE(B)には|789|A1|OR|がデータとしてあるので、ORともなってしまいますが、|YCD|が空欄で|ZCD|が|A1|より

            NOTを取得する。

             

            |123|B1  |・・・・・この場合は、|YCD|と一致するALLを取得する。

            同じように|YCD|が|123|のみ一致するので|ZCD|が|B1|という値であってもALLを取得する。

             

             

            言い換えますと、

             FILE(B)

            |YCD|ZCD|MEMO|

            |123|  |ALL|

            |     |A1|NOT|

            |789|A1|OR|

             

            FILE(A)で

            |YCD|のみが一致した場合はALL

            |ZCD|のみが一致した場合はNOT

            |YCD|と|ZCD|が一致した場合はOR

            という訳でありますが、これを|YCD|と|ZCD|が一致する条件を|YCD|のみが一致する場合、|ZCD|のみが一致する場合より

            優先してORというデータを取得したいのです。

            そのために|YCD|&|ZCD|というフィールドを作成して、|YCD|,|ZCD|,|YCD&ZCD|の各々においてリレーションを作ってみました。

             

            これをcase関数で出来ないかと思っているのですが、思うようにいっていない次第でございます。

            内容が支離滅裂で申し訳ございません。よろしくご教示お願い致します。 

             

            • 3. Re: リレーションによるデータの取得について
              user6776
                

              それぞれYCD,ZCD,YCD&ZCD 、三つのリレーションを設定しておいて、それぞれのリレーションで取得出来る値を比較すれば良いかと思います。 

              下記のようなリレーションを作成して、

              (文字では説明しにくいので )

              http://skitch.com/sago350/btiey/hoge

               

              FILEAのMEMOフィールドの入力値の自動化の計算値に下記計算式を入れて、「フィールドに既存の値が存在する場合は置き換えないチェック」を外せば希望する動きになるかと思います。

               

              Case(
              not IsEmpty( FILEA_FILEB@YCDandZCD::MEMO ) ; FILEA_FILEB@YCDandZCD::MEMO ;
              not IsEmpty( FILEA_FILEB@YCD::MEMO )             ; FILEA_FILEB@YCD::MEMO ;
              not IsEmpty( FILEA_FILEB@ZCD::MEMO )             ; FILEA_FILEB@ZCD::MEMO ;
              ""
              ) 
               

               

              下記のような場合にFILEAのZCDにA1が入った場合は考えなくてもOKですか?

               

              FILE(B)
              |YCD|ZCD|MEMO| 
              |     |A1 |NOT|
              |     |A1 |OR | 



              • 4. Re: リレーションによるデータの取得について
                IKG
                  

                sagoさん

                 

                ありがとうございます。さっそく試してみます。

                • 5. Re: リレーションによるデータの取得について
                  IKG
                    

                  sago350さま

                   

                  ご無沙汰しております。諸事情ありPCを触れない状態でした。ご提示いただいた方法で

                  実施したのですが、ちょっとうまく行きませんでした。恐らく私のご説明不足だと思います。

                   

                  ファイル(B) 

                  YCD|ZCD|MEMO|

                  |123|  |ALL|

                  |     |A1|NOT|

                  |789|A1|OR|

                   

                  ファイル(A)・・・・・このファイルにおいてYCDとZCDが空欄の場合はありません。

                   

                  YCD|ZCD|MEMO|

                  |123|A1|ALL|

                  |123|B1|ALL|

                  |123|C1|ALL|

                   →この場合、ZCDがどんな値であってもYCDが123であればMEMOはALLとなる。

                  |456|A1|NOT|

                  |456|B1|     |

                  |456|C1|     |

                  →この場合、ファイル(B)にYCDが456は存在しないので、ZCDのみを照合し、ZCDがA1である

                  NOTを返す。

                  |789|A1|OR |

                  |789|B1|     |

                  |789|C1|     |

                  →この場合、YCDが789、ZCDがA1以外は存在しないのでブランクとする。

                   

                  ちなみにファイル(A)にはYCDおよびZCDがかなりの数(種類)あります。

                  ご提示いただいた方法ですとファイル(A)の下記の条件であればMEMOに一致しない値が返されて

                  しまいます。

                  YCD|ZCD|MEMO|

                  |456|A1|OR|

                  |789|B1|OR|

                  |789|C1|OR|

                   

                  ご説明足りずだと思いますが、何卒、お知恵をいただければ幸いでございます。

                   

                   

                   

                   

                   

                   

                   

                   

                   

                  • 6. Re: リレーションによるデータの取得について
                    user6776
                      
                    ------------------------------------------------------------------------------------------

                    ファイル(B) 

                    YCD|ZCD|MEMO|

                    |123|  |ALL|

                    |     |A1|NOT|

                    |789|A1|OR|
                     
                    ファイル(A) 

                    |456|A1|NOT|

                    |456|B1|     |

                    |456|C1|     |

                    →この場合、ファイル(B)にYCDが456は存在しないので、ZCDのみを照合し、ZCDがA1であるNOTを返す。
                    ------------------------------------------------------------------------------------------
                     
                    この場合、ORが入らず、NOTを返すのは、YCDが空白を優先するからですか?