6 返信 最新の回答 日時: Feb 13, 2010 9:51 AM ユーザー:d.o

    計算フィールドはリレーションのキーに出来ないのでしょうか?

    d.o

      タイトル

      計算フィールドはリレーションのキーに出来ないのでしょうか?

      フォーラムに投稿

      みなさんこんにちは

       

      毎度毎度基本的なことですみません。 

      計算フィールドをリレーションのキーに出来ないのでしょうか?

       

      どうも、出来る場合と出来ない場合があるとおもうのですが「こういう場合は出来ない」「こういう場合は出来る」というのが分かりません。

       

      ご存知の方がいらっしゃいましたらご教授いただければと思います。

      よろしくお願いします。 

        • 1. Re: 計算フィールドはリレーションのキーに出来ないのでしょうか?
          Hiro
            

          > 計算フィールドをリレーションのキーに出来ないのでしょうか?

           

           関連するのは、計算フィールドがではなく、照合(先側)キーの索引の有無です。

          • 2. Re: 計算フィールドはリレーションのキーに出来ないのでしょうか?
            d.o
              

            Hiroさん

             

            ありがとうございます。

            実験用のファイルを作って試してみました。

             

            リレーション先のTOのレコードをポータルに表示するようにして、索引の設定をいじってみると...

            「計算結果を保存せず必要時に再計算する」のチェックを入れるとポータルには何も表示されません。

            上記のチェックを外し索引設定を「すべて」とするとポータルにリレーション先のレコードが表示されます。 

             

            おかげさまで理解できました。ありがとうございます! 

             

            さらに試してみたのですが...

            計算フィールドが別のテーブルの値を参照している場合(なにかのマスタから値を持ってくるような場合をイメージ)、「計算結果を保存せず必要時に再計算する」のチェックを外そうとすると...

             

            計算フィールド「○○」はリレーションシップフィールド、集計フィールド、非保存の計算フィールドまたはグローバル格納を使用するフィールドを参照しているため、「○○」の計算結果は保存されないか、またはフィールドの索引設定は行われません。

             

            というメッセージが表示されて「計算結果を保存せず必要時に再計算する」のチェックを外すことが出来ません。

            ということは...計算フィールドが、他のテーブルの値を使用している様な場合は...索引設定が出来ない→リレーションのキーに出来ない。ということになりますよね?

            メッセージにあるように、集計フィールドや非保存の計算フィールド、グローバル格納のフィールドを利用して計算している場合もダメですね。 

             

            この理解で正しいでしょうか?

             

             

            • 3. Re: 計算フィールドはリレーションのキーに出来ないのでしょうか?
              Hiro
                

              > 計算フィールドが、他のテーブルの値を使用している様な場合は...索引設定が出来ない→リレーションのキーに出来ない。ということになりますよね?

              他のテーブルの値がということでなく、計算式の引数に非索引が使われている場合、その計算結果も非保存(非索引)と強制的になります。

               

              例えば、

               「今日」= Get(日付)

               「一週前」=  今日 - 7

              の場合、日付が替わって自動更新するためには「今日」が非保存である必要があります。すると「今日」を引数に取る「一週前」は非保存となり、結果として、リレーションの照合先キーフィールドとなりえなくなります。

              また、

               「契約日」= Get(日付)

               「納品日」= 契約日 + 7

              の場合は、日付が替わって契約日が変っては困りますので、「契約日」は索引必須で「納品日」の計算結果も保存にします。結果として照合先キーフィールドとして有効です。

              • 4. Re: 計算フィールドはリレーションのキーに出来ないのでしょうか?
                d.o
                  

                Hiroさん

                 

                たびたびありがとうございます。

                 

                分かりやすい例もありがとうございます。 

                「計算フィールドが索引設定されているか否か」がリレーションのキーとして使えるかどうかを決めているわけですよね。他のテーブルから持ってくるかどうかが本質的な問題でないことはわかります。

                 

                結果として 

                他のテーブル(マスタのようなもの)から値を持ってくるような計算フィールドの場合は、索引設定が出来ない→リレーションのキーに出来ないということでは間違いでしょうか?

                 

                他のテーブルから値を持ってくるような計算フィールドでも索引設定をすることが出来る→リレーションのキーに出来る。

                ということでしょうか? 

                 

                とりあえず自分で実験した限りでは他のテーブルから値を持ってくる場合に索引設定をする方法がわかりませんでした。

                 

                • 5. Re: 計算フィールドはリレーションのキーに出来ないのでしょうか?
                  Hiro
                    

                  > 他のテーブルから値を持ってくるような計算フィールドの場合は、索引設定が出来ない→リレーションのキーに出来ないということでは間違いでしょうか?

                  リレーションのキー出来ないは、照合()キーに出来ませんが、照合()キーなら出来ます。

                  ※ただし、デカルト積[X]リレーションでは非保存の照合()キーであっても出来ます。

                  (これは、照合キーとは無関係に、[X]リレーションは単に全ての関連レコードを得ればよいからです)

                   どうしても非保存フィールドへリレーションを張りたいときの裏技として重宝します。

                   

                  > 他のテーブルから値を持ってくるような計算フィールドでも索引設定をすることが出来る→リレーションのキーに出来る。ということでしょうか? 

                  索引設定をすることが出来る出来ません後は、上段と同じです。

                   

                  非保存の(先)キーとリレーションを張る時の基本は、保存キーは(先)TO側へ、非保存キーは(元)TO側へ、組み替えることです。

                  このとき、[X]リレーションをうまく中間利用して非保存キーを(先)→(元)変換に有効です。

                  • 6. Re: 計算フィールドはリレーションのキーに出来ないのでしょうか?
                    d.o
                      

                    Hiroさん

                    たびたびありがとうございます。

                    おかげさまで理解できました。

                     

                    >リレーションのキー出来ないは、照合()キーに出来ませんが、照合()キーなら出来ます。

                    今まで理解できなかったのは先、元という考え方を持っていませんでした。

                    やっぱり何となく使っているだけではダメですね。本当に勉強になりました。ありがとうございます。