みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
OS:macOS Big Sur
FileMaker Ver:18 Pro Adv.
以下の様なテーブル構成で会員情報を管理していたとします。
・テーブルA(会員情報)
ID / 名前
・テーブルB(年会費情報)
ID / 年度 / 入金額 / 入金ステータス / 会員区分
*IDでリレーション
テーブルAのレイアウトに、テーブルBの入金情報をポータル表示します。
テーブルBの "会員区分" は計算フィールドとなっています。
"入金ステータス" のプルダウンで選択した値によって、前年度レコードの"入金ステータス"と比較して "会員区分" が変動するので、それより上にあるレコードの "会員区分" も同時に自動で変更されます。
しかし、この"会員区分" フィールドがあることで、会員情報の表示が使い物にならないくらい時間がかかります。
このフィールドは、表示されていればいいだけなので、フィールド表示である必要もないのですが、どの様に対処すべきでしょうか。
Last edited by u1 (2020-12-21 13:16:42)
Offline
会員区分
の計算式が分かりませんが、
計算が連鎖して、以前の全てのレコードを参照することになっているのでは?
計算フィールドとしないで、入力値の自動化ではだめでしょうか?
もし試されるのでしたら、
フィールドの変更ではなく、新たなフィールドを作った方がよろしいかと。。
くれぐれもバックアップを忘れずに。
Offline
会員区分
の計算式が分かりませんが、
計算が連鎖して、以前の全てのレコードを参照することになっているのでは?計算フィールドとしないで、入力値の自動化ではだめでしょうか?
もし試されるのでしたら、
フィールドの変更ではなく、新たなフィールドを作った方がよろしいかと。。
くれぐれもバックアップを忘れずに。
現在入っている計算式が以下です。
入金ステータス= status
会員区分= membership_auto
としてみてください。
Case (
status = "納入済" or status = "免除" or status = "特免" ; "正会員" ;
status = "未納" and membership = "非会員" ; "非会員" ;
status = "未納" and ( GetNthRecord ( membership_auto ; Get ( レコード番号 ) + 1 ) = "正会員" ) ; "滞納者" ;
status = "未納" and ( GetNthRecord ( membership_auto ; Get ( レコード番号 ) + 1 ) = "非会員" ) ; "非会員" ;
status = "未納" and ( GetNthRecord ( membership_auto ; Get ( レコード番号 ) + 1 ) = "滞納者" ) ; "休眠者" ;
status = "未納" and ( GetNthRecord ( membership_auto ; Get ( レコード番号 ) + 1 ) = "休眠者" ) ; "元会員" ;
status = "未納" and ( GetNthRecord ( membership_auto ; Get ( レコード番号 ) + 1 ) = "元会員" ) ; "元会員"
)
以上ですが、もしかして、その会員情報のみに紐づいている、入金情報をみているのでは無く、他の入金情報前レコードをみて計算している形でしょうか?
Last edited by u1 (2020-12-21 13:45:12)
Offline
現在のレコードは前年を参照していますよね。
前年はその前年、その前年はさらにその前年・・・
と連鎖していますよ。
入力値の自動化にできるのでは。
または、
前年の会員区分をルックアップしてそれを計算に使えばいいのでは。
Offline
その計算式を評価する際に、昨年の同じデータを参照しています。その昨年のデータは、一昨年のデータを参照していて、.......
という事で、以前の全てのレコードを参照する式です。
その計算式を、結果を保存する設定に変更してはいかがですか。
さらに悪いことに、GetNthRecord ( membership_auto ; Get ( レコード番号 ) + 1 ) で、昨年のデータを最大5回参照している、つまり同じ計算を5回しているため、さらに遅くなっています。
スクリプト内の変数で処理すると、少しだけマシになるでしょうね。
Offline
その計算式を評価する際に、昨年の同じデータを参照しています。その昨年のデータは、一昨年のデータを参照していて、.......
という事で、以前の全てのレコードを参照する式です。
その計算式を、結果を保存する設定に変更してはいかがですか。さらに悪いことに、GetNthRecord ( membership_auto ; Get ( レコード番号 ) + 1 ) で、昨年のデータを最大5回参照している、つまり同じ計算を5回しているため、さらに遅くなっています。
スクリプト内の変数で処理すると、少しだけマシになるでしょうね。
保存というのは、索引設定をするという事でよろしいでしょうか。
その場合は、ポータル内の status はいつでも変更しますので、それに合わせて都度同一会員の入金データレコードの membership_auto は変動して欲しいのですが、どの様な設定になるのでしょうか。
また、計算式が最大5回参照しているという部分ですが、Case内に書かれた分、現在レコードと昨年レコードとの組み合わせがあるのですが、これはどの様に修正するのが良いでしょうか。
ご教授をお願いします。
Offline
索引設定をするという事とほぼ同じです。(索引は設定しないで、保存するモードもありますので)
> ポータル内の status はいつでも変更します
おそらくそうなんだろう、と思いますが、過去のstatus も変更しますか。
それも合わせて、別のアプローチを行った方がいいかと思います。
会費管理テーブル側で、自分以前を参照する自己リレーションを張り、年度で降べきにソートしておきます。そのリレーションを通してstatusをリストで取り出し、先頭の3行に注目します。その並びが、未納、未納、未納、ならば元会員、未納、未納、既納、ならば元会員、未納、既納、既納、ならば未納者、でしょう。それを使った簡易型の式です。(未納、既納、未納 は無いという仮定)
Let (
[
st3 = LeftValues ( List ( テーブルB 2::status ) ; 3 ) ;
st = Min ( ValueCount ( FilterValues ( st3 ; "未納" ) ) ; 3 )
] ;
Case (
status = "納入済" or status = "免除" or status = "特免" ; "正会員" ;
membership = "非会員" ; "非会員" ;
status = "未納" ;
Choose ( st ; "" ; "滞納者" ; "休眠者" ; "元会員" )
)
)Offline
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 565.45 KiB (Peak: 581.27 KiB) ]