みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
OS:[MacOSX10.6]FileMaker Ver:[12]
商品名 | 10代 | 20代 | 30代 | 40代 | 50代 | 60代 | 70代 | 仕入先 |...
A | | 5% | 10% | 30% | 50% | 5% | | A社 |
B | 40% | 30% | 20% | 10% | | | | B社 |
C | | 20% | 40% | 30% | 10% | | | B社 |
D | | | 20% | 40% | 30% | 10% | | A社 |
E | | 80% | 20% | | | | | C社 |
F | | | | 10% | 30% | 50% | 10% | C社 |
...
最初のA〜の列が商品名として、それぞれの売れ筋を世代ごとに集計したものがあります。
仕入先で検索してソートがしたいのですが、ひとつの世代でなく複数、例えば30代と40代と50代の合計の%でソートがしたいのですが方法が思い浮かびません。
動作としては仕入先をプルダウンで選んで年代をチェックボックスでチェックして検索するイメージなのですが。
要は、チェックボックスでチェックした年代の比率合計を算出すれば、ソート出来ますよネ?
例えば 30代と40代と50代 をチェックした場合なら、算出式は、
・ Sum(GetField("30代");GetField("40代");GetField("50代"))
この静的な式例を拡張して、
チェック内容に応じた動的な式を自動生成、合計算出する式は、
Let([
$vl=チェックボックスフィールド;
$n=ValueCount($vl);
$sub="Let([$i=$i+1;$nm=GetValue($vl;$i)];GetField($nm))";
$fnc="Sum(" & Substitute(10^$n-1;9;$sub & ";") & "0)"
];
Evaluate($fnc)
)
ここで、「年代値一覧の各項目内容」と「各年代フィールドのフィールド名」は完全一致の文字列であることとします。
Offline
早速のご回答有難うございます。
伝え方に問題があるのか、折角のご回答が理解できていないのかすら怪しいですが、
比率合計の計算フィールドを作成する方法だと解釈しました。
チェックを入れたもので検索・ソートをするのではなくて、
検索時にチェックを入れたものだけで計算してソートがしたいのですが、この方法で可能なのでしょうか。
大変申し訳ありませんが、理解できていません。
よろしくご教示ください。
実際に、式を試してみましたか?
式は、初めからそのつもりで書かれた式です。
なお、チェック年代は全レコードで共通でしょうから、グローバルフィールドで一括指定するものと想定します。
その場合、式の計算結果は非保存となるためソートにより時間を要します。この為、検索絞り込みの後にチェック指定した方が有利かもしれませんネ。
Last edited by Hiro (2016-10-25 12:09:46)
Offline
ご教示いただいた通り試してみました。
値一覧とフィールド名もあわせて作成しましたがうまく動きませんでした。(「0」になります。)
最後の「Evaluate($fnc)」を$fncにしてテキストで内容をみると、
テェックひとつで「Sum(Let([$i=$i+1;$nm=GetValue($vl;$i)];GetField($nm));0)」チェックを増やすと真ん中が繰り返されて動作しているのではないかと思いました。
そうしているとグローバルフィールドで検索できないなと考えだして訳がわからなくなってしまいました。
そこで、仮にブラウズモードで動作したとして検索モードでどうすればよいのかわからすに上記のような返信をしてしまいました。
ド素人にわかるようなヒントはないでしょうか。
検索するのは仕入れ先で、ですよネ?
年代比率はソートの方だから、検索モードで「入力の可否」云々は全く関係ありません。
> 値一覧とフィールド名もあわせて作成しましたがうまく動きませんでした。(「0」になります。)
値一覧とフィールド名の不一致が強く疑われます。完全一致かを再度調べてみて下さい。
Last edited by Hiro (2016-10-25 13:24:28)
Offline
年代比率はソート条件ですが、その値を決定するのに年代の選択(絞り込み?)が必要になります。
日本語で言えば、例えば
A社の商品で、30〜50代に人気の商品を検索・ソートしたい。
という事になるので、検索条件として、仕入れ先と年代が選択できるようになればと考えました。
見当ハズレでしょうか。
値一覧とフィールド名はもう一度確認してみます。
> A社の商品で、30〜50代に人気の商品を検索・ソートしたい。
この内容の実現は、実質以下のように考えます。
・A社のレコードを検索。
・ソート対象の希望年代(30〜50代)を値一覧候補から選択指定。
・この選択年代を引数に受けて式が更新計算、選択年代に人気の商品比率の合計を自動算出。
・この合計計算フィールドを対象にソート実行。
・その結果、指定30〜50代に人気の順で、A社の商品をリスト表示します。
Offline
例えば 30代と40代と50代 をチェックした場合なら、算出式は、
・ Sum(GetField("30代");GetField("40代");GetField("50代"))
Sum(30代;40代;50代)
でいいですよね。フィールド名がこの通りでなく(数字で始まったりせず)ちゃんとしてればの話ですが。
Hiroさん
式の中で
$i = 0
の宣言がないですよ。
ないとダメじゃないでしょうか?
Hiroさんの式をお借りして、
各年代を一つずつ加えて行く式にしてみました。
Let([
$vl = チェックボクス ;
$n = ValueCount ( $v ) ;
$i = 0 ;
$sum = 0 ;
$fnc = "Case ( $i = $n ; $sum ;
Let ( [ $i = $i + 1 ; $sum = $sum + GetField ( GetValue ( $vl ; $i ) ) ] ; Evaluate ( $fnc ) ) ) " ] ;
Evaluate ( $fnc ) )
少しは分かりやすいかも。
Offline
チポさん
私の式(非再帰式)の方では、
$i はLet()内だけに使われているため、
初期値の宣言は敢えて不用です。
Offline
私もそう思ったのですが、
試してみたらダメでした・・?
Offline
sort_key というグローバルフィールドに、10代¶20代¶30代¶40代¶50代¶60代¶70代 という値一覧でチェックボックスフィールドにして、
Evaluate ( "Sum ( " & Substitute ( sort_key ; ¶ ; " ;" ) & ")" )
で良いのでは。
会社もグローバルフィールドにして、トリガーで検索かけて、上のフィールドでソートをかければいいでしょう。
ただ、フィールド名は上のままでは駄目なので、それに合わせて値一覧も変更する必要がありますが。
https://www.dropbox.com/s/zy0j080a0wacq … 7.zip?dl=0
Offline
私もそう思ったのですが、
試してみたらダメでした・・?
私の式で問題があるとすれば、$i=0の初期値宣言ナシの点ではなく、
チェックボックスが無チェックで空欄の場合に「?」が返る点かと...。
その点の修正式なら、(空欄は計算しない)
Let([
$vl=チェックボックスフィールド;
$n=ValueCount($vl);
$sub="Let([$i=$i+1;$nm=GetValue($vl;$i)];GetField($nm))";
$fnc="Sum(" & Substitute(10^$n-1; [9;$sub & ";"]) & "0)"
];
Case($n; Evaluate($fnc))
)
Offline
> 空欄の場合に「?」が返る
そこではなく、
チェックボックスの値に関わらず、
0しか返しません。
Offline
私の試作テスト専用の既存汎用ファイルでは、宣言ナシでも問題ありませんでしたが、
> チポさん#14「0しか返しません。」 なおそうなら、
もしかして、
フィールド名が命名規則違反("30代"の様に数字で始まるなど)のファイルで
テストされているのかと思い、
新たにファイルを作り試してみました。
・新ファイルでの結論としては、$i=0宣言は必須でした。訂正しお詫び致します。m(_ _)m
・残念ながら、新・旧ファイル環境下でのテスト結果の相違原因は分かりませんでした。
・もちろん、命名規則違反フィールド名の場合では、常に「0」しか返しませんけど。
【 訂正式 】
Let([
$vl=チェックボックスフィールド;
$n=ValueCount($vl);
$i=0;
$sub="Let([$i=$i+1;$nm=GetValue($vl;$i)];GetField($nm))";
$fnc="Sum(" & Substitute(10^$n-1; [9;$sub & ";"]) & "0)"
];
Case($n; Evaluate($fnc))
)
Last edited by Hiro (2016-10-26 14:31:01)
Offline
実装方法が分かり難いかも知れませんので、作例サンプルをアップしときます。
●サンプル「動的ソート.fmp12」 → http://yahoo.jp/box/jWhN4I
Offline
大変勉強になりました。有難うございました。
チポさん
私の式(非再帰式)の方では、
$i はLet()内だけに使われているため、
初期値の宣言は敢えて不用です。
時として、連続計算をすると
クリアされていない時がなぜかありました。
私は、確実のために 初期値宣言するようにしてます。
原因、再現性は不明です。
Offline
Pages: 1
[ Generated in 0.015 seconds, 7 queries executed - Memory usage: 565.27 KiB (Peak: 586.18 KiB) ]