みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
filemaker13をつかっています。
リレーション先が6レコードあって、それぞれのレコードの同一フィールドに
AA
BB
BB
CC
CC
CC
という値がある場合、「6」件ではなく「3」種類という値を求めたいのですが
count関数では出来ませんでした。
できれば値一覧などを使わずシンプルに求められればと思うのですが
こういったことは可能でしょうか?
重複を禁止した別テーブルへインポート、はどうでしょう。
Offline
想定外のアイデアをありがとうございます。
説明を簡易にするためにリレーション先が6件と書きましたが
実際はもっと多く、「種類数」の増減もあります・・・
できれば毎回インポートさせるのではなく
計算式で求めたいのですがやはり値一覧をつかわないと難しいでしょうか・・・?
動的値一覧と同じ結果をExecuteSQL()のDISTINCTで算出、その結果をValueCount()する、とか。
Offline
関連テーブル側で現照合フィールドとその値を連結したフィールドを作って
関連テーブル側で照合フィールドと値の自己リレーション(関連2)を作って
逆カウント=1/Count(関連2::連結したフィールド)の計算フィールドも作れば
ポータルのあるテーブルで=Sum(関連::逆カウント)で出そう?
Offline
値一覧が一番シンプルで速いはず。
SQLはせっかくの新機能で設定自体はシンプルになるけど、レコード数によっては遅すぎる。
ValueCount(
ExecuteSQL("
SELECT DISTINCT field
FROM table
WHERE リレーションの条件
”;"";"")
)
実際には条件は親レコードの値を引数に使うことになるでしょう。
他に考えられるとしたら、カスタム関数(List(table::field))で数える方法かな。
間違ってた。
ANDリレーションなので連結は要らなかった。
http://pupld.net/28/141220/p6bht559yd/index.cgi
ユニーク数.fmp12
Offline
どう云う訳で一押しの値一覧を使いたくないのか分かりませんが、
ExecuteSQL案の他に、もう2案。
●計算式だけで求める案。(ただし、標準関数による再帰式なので、リストの最大行数は260行以下であること)
Let([
$lst=List(ポータルテーブル::フィールド);
$vl="";
$fnc="Case(
IsEmpty($lst); $vl;
Let([
$itm=GetValue($lst;1);
$vl=List($vl;Case(IsEmpty(FilterValues($vl;$itm));$itm));
$lst=MiddleValues($lst;2;ValueCount($lst))
]; Evaluate($fnc))
)"
];
ValueCount(Evaluate($fnc))
)
●「関連レコードへ移動」+「フィールド内容の全置換」スクリプトで求める案。
・ポータルテーブルにカウント結果を書き込むグローバルフィールドを追加する。
・「関連レコードへ移動[のみ表示]」で、関連のレコードだけを抽出しておく。
・「フィールド内容の全置換[グローバルフィールド; 下式]」で、グローバルフィールドを計算値で全置換して算出。
Let(
[$vl=List($vl;Case(IsEmpty(FilterValues($vl;ポータルテーブル::フィールド));ポータルテーブル::フィールド))];
Case(Get(対象レコード数)=Get(レコード番号); ValueCount($vl))
)
Offline
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 534.88 KiB (Peak: 539.79 KiB) ]