3 返信 最新の回答 日時: Oct 24, 2009 5:28 AM ユーザー:uno_o_1

    リレーションの限界なのでしょうか?

    uno_o_1

      タイトル

      リレーションの限界なのでしょうか?

      フォーラムに投稿

      入金と出金を管理する帳簿を作ろうとしているのですが、レコードが180を超えたあたりでリレーションで引数を導き出せず、結果の欄が「?」になってしまいます。

       

      具体的には以下のようなデータベースを作成し、データを入力しました。 

       

      データベースの設定======================================================

       

      [フィールド名]  [タイプ]  [オプション]

       レコード番号    数字     自動番号入力(作成時/シリアル 1から1増分)

       出金        数字

       入金        数字

       残額        計算     If ( レコード番号 = 1 ; 最初の残額 ; 前のレコードを参照::残額 ) - 出金 + 入金

       前のレコード番号  数字     レコード番号 - 1

       最初の残額     数字     (※最初のレコードにだけ数値を入力)

       

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

      リレーションシップで「前のレコード番号」と「レコード番号」を関連づけしています 

      =================================================================

       

      FileMaker Pro 10.0v3 Macでは、180〜190レコードを超えたあたり、

      FileMaker Pro 10.0v3 Winでは、280〜290レコードを超えたあたりで

      「残額」欄に「?」表示が出て、以降のレコードの「残額」欄は全て「?」になります。

       

      ちなみに「?」が出ているレコードから前レコードの他のフィールドは表示されます。

       

      これは、リレーションの限界なのでしょうか?

      回避する巧い手立てはないものでしょうか? お知恵をお貸しください。

        • 1. Re: リレーションの限界なのでしょうか?
          yasuhiro
            

          考えられているように、リレーションの限界だと思います。

          再帰的に自己リレーション先を参照し続ける「残額」フィールドの構造が原因ですね。 

          発想を変えて、「残額」を各レコードごとに参照計算させるのではなく、Sum()で過去の入力値の合計額を計算してみてはどうでしょう。

           

           <方法>

          この自己リレーションを不等号リレーションにする。(「入出金::前のレコード番号」>「以前のレコード::レコード番号」)

           

          索引つきの「収支」という計算フィールドを1つ追加して、式は「If( レコード番号= 1 ; 最初の残額) +入金-出金」にする。

          この計算式でリレーション先の参照データは一切使わないことが重要です。

           

          そして「残額」計算フィールドの式を 「Sum(以前のレコード::収支) +入金-出金」に変更してください。

          うまく表示されるはずです。 

          • 2. Re: リレーションの限界なのでしょうか?
            yasuhiro
              

            追記です。

            「入出金::前のレコード番号」>「以前のレコード::レコード番号」

            ではなく、

             「入出金::レコード番号」>「以前のレコード::レコード番号」

            のまちがいでした。

             

             この方法にする場合は「前のレコード番号」というフィールドは特に必要なくなります。

             

            あとこの主キーフィールドに「レコード番号」 という名前をつけておられますが、

            ファイルメーカーでは 「レコード番号」は別の意味(対象レコードやポータルの行番号)で使われていますので、区別するためにも「主キー」とか「id」とか「kp」とかにすると誤解がなくなるとおもいます。

            • 3. Re: リレーションの限界なのでしょうか?
              uno_o_1
                

              Tambara 様、ご助言ありがとうございました!

              なんとか解決できました。前レコードの値を参照して求めるということに囚われすぎていたようです・・・。 

              しかし、Excel的な使い方を想定すれば安直に使ってしまいそうな方法に落とし穴が潜んでいたとは、急がば回れですねぇ・・・。

               

              それと、フィールド名の「レコード番号」ですが、実際に作成しているデータベースでは全く別の名称で作成しており、今回トラブルの切り分けのために他の用件を削ぎ落としたものだったため、これまた安直な名称を付けていました。例としては不適切だったかもしれません。スイマセン