みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつも参考にさせていただいてます。
自分の知識ではわからない箇所が出てきてお知恵を拝借したくお願いします。
マスタテーブルと履歴テーブルの2つがあります。マスタテーブルと履歴テーブルはidで1対多のリレーションを組んでいます。
■マスタテーブル
id
-----
1
2
3
4
5
・・・
■履歴テーブル
id 状態 日付
-------------------------------------
1 A 2001/1/1
1 B 2010/1/1
1 C 2012/1/1
2 A 2012/1/1
2 D 2015/1/1
3 B 2013/1/1
4 ・・・・・
マスタテーブルに、履歴テーブルの状態から「C」と「D」を除いたレコードのうちの最大日付を計算表示させるフィールドを作りたいです。
(上記例示ですと 1: 2010/1/1, 2: 2012/1/1, 3: 2013/1/1)
計算式の記述方法をご教示いただけると助かります。
よろしくお願いいたします。
情態の選択肢が有限ならば、CDを覗いた文字列(改行区切り)を持たせたグローバルフィールドを作ります。
ID で自己リレーションを張り、上のグローバルフィールドから状態へのリレーション条件を追加します。
Max ( リレーション::日付 ) で求められるでしょう。
表示でよければ、
日付の最大を求める集計フィールドを作っておきます。CDを除外する検索し、idをキーにした小計パートのみのレイアウトを作ります。そこでidでソートすればいいでしょう。または、集計フィールドを作らずとも、IDと日付(降べき)でソートすればいいです。
Offline
関数でやるなら
ExecuteSQL("
SELECT MAX(\"日付\")
FROM \"履歴\"
WHERE \"id\"=?
AND \"状態\"<>'C'
AND \"状態\"<>'D'
";"";"";マスタ::id)
マスタのレコード数が膨大な場合は、計算フィールドにすると最初の計算(フィールド定義)時に膨大な時間がかかるので要注意。
shin様、himadanee様
お返事ありがとうございます。
次の計算の基準値データとして欲しかったので、Shin様から提案いただいた自己リレーションを試したのですが、うまくいきませんでした。
状態が非保存の計算フィールドで保持しているからでしょうか?(いまだにリレーション設定が苦手です・・・。)
himadanee様からいただいたExecuteSQL関数を使用したところ、欲しかったデータが取得できました。ありがとうございます。
マスタ件数が6000件超だったので処理時間が心配でしたが、すぐに表示されました。
ありがとうございました。
あ、忘れてましたが、このSQLの計算式だとフィールドは「マスタ::id」しか参照してないので、計算結果が保存されると履歴テーブルが更新されても影響しません。
多分それだとだめなんでは?
「計算結果を保存せず~」にすると「処理時間が心配」が現実化する可能性が?リスト表示は危険かも。SQLが単純だから問題ないかも?
表示するだけなら計算フィールドにしないでレイアウト上にボタンバーで表示するとか
この値で検索したりはしないと思いますが
Offline
himadanee様
あ、忘れてましたが、このSQLの計算式だとフィールドは「マスタ::id」しか参照してないので、計算結果が保存されると履歴テーブルが更新されても影響しません。
多分それだとだめなんでは?「計算結果を保存せず~」にすると「処理時間が心配」が現実化する可能性が?リスト表示は危険かも。SQLが単純だから問題ないかも?
はい、非保存計算でリスト表示させていますが、今のところ処理が遅くなったという実感はないです。(FM Server 19, FM pro 19)
Shin様、
サンプルデータの提供、ありがとうございます!
あっ、マスタデータに抽出条件のフィールドを作成すればよかったのですね。
履歴データに抽出条件のフィールドを作成して自己リレーションを貼って抽出を試みていたのですが、うまくいかずに四苦八苦していました。
今のところ非保存計算でうまくいっていますので、今後処理速度が遅くなるようであれば、いただいたリレーションによる抽出方法に変更するようにいたします。
ありがとうございました。
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 563.1 KiB (Peak: 582.21 KiB) ]