みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
<環境>FileMaker Pro 16 Adv.(Win 64bit)
フィールドの数が6つあり、その数値を比較して最大値はMax関数で、最小値はMin関数で取得出来るのは理解出来たのですが、その最大値のフィールド名・最小値のフィールド名というのは取得出来るのでしょうか?
例えば、1レコード内で
フィールド名 数値
酸素 15
窒素 10
水素 5
二酸化炭素 11
フッ素 3
ヨウ素 7
のような場合、
最大:酸素
最小:フッ素 というように表示させたいのですが。
また、最大値の次の値(上から2番目)、最小値の次の値(下から2番目)の値も取得出来ますでしょうか?
よろしくお願いいたします。
Offline
・f1~f3 数字
・field_names 計算[3]
Choose ( Get ( 計算式繰り返し位置番号 )
; GetFieldName ( Extend ( f1 ) )
; GetFieldName ( Extend ( f2 ) )
; GetFieldName ( Extend ( f3 ) )
)
・values 計算[3]
Choose ( Get ( 計算式繰り返し位置番号 )
;Extend ( f1 )
;Extend ( f2 )
;Extend ( f3 )
)
・max 計算 Max ( values )
・max_fields 計算[3] If ( Extend ( max )=values ; field_names )
・max_field_name 計算 List ( max_fields )
簡略化のため対象フィールドを3個にしていますが、こんな感じにするとmax_field_nameに最大値をもつフィールドの名前が改行区切りで表示されます。
テーブル名も含んでいるので不要なら別途抽出する必要があります。
最小値はMaxをMinに変えるだけですね。
次点を対象にする場合は、雑ですが以下を追加して出しました。
・expect_max 計算[3] If ( values < Extend ( max ) ; values )
・second 計算 Max ( expect_max )
・second_fields 計算[3] If ( Extend ( second )=values ; field_names )
・second_field_name 計算 List ( second_fields )
Last edited by mic (2017-08-11 20:20:04)
Offline
015酸素¶
010窒素¶
005水素¶
011二酸化炭素¶
003フッ素¶
007ヨウ素
という文字列を、Right ( "000" & 酸素 ; 3 ) & "酸素" & ... という式で作ります。SortValues() 関数を通せば、後は GetValue() で順に応じた値をとり、後半の文字列だけを取り出すのが簡単かも。(手元にFM16が無いので検証できませんが)
Last edited by Shin (2017-08-13 06:04:27)
Offline
挑戦してみました。
かなりアナログですが。。
フィールド設定:
1:レコード内の数字をリスト化し、昇順・降順にならべかえる。
・LIST_MAX_SORT(計算F) 値:SortValues ( List ( 酸素;窒素;水素;二酸化炭素;フッ素;ヨウ素 ) ;-2 )
・LIST_MIN_SORT(計算F) 値:SortValues ( List ( 酸素;窒素;水素;二酸化炭素;フッ素;ヨウ素 ) ;2 )
2:最大最小値、2番目値
・最大1(計算F) 値:GetValue ( LIST_MAX_SORT;1 )
・最小1(計算F) 値:GetValue ( LIST_MIN_SORT;1 )
・最大2(計算F) 値:GetValue ( LIST_MAX_SORT;2 )
・最小2(計算F) 値:GetValue ( LIST_MIN_SORT;2 )
3:最大最小フィールド名、2番目フィールド名
最大1フィールド名(計算F) 値:
Case (
最大1 = 酸素;"酸素";
最大1= 窒素;"窒素";
最大1 = 水素;"水素";
最大1 = 二酸化炭素;"二酸化炭素";
最大1 = フッ素;"フッ素";
最大1 = ヨウ素;"ヨウ素"
)
最大2フィールド名(計算F) 値:
Case (
最大2= 酸素;"酸素";
最大2= 窒素;"窒素";
最大2= 水素;"水素";
最大2= 二酸化炭素;"二酸化炭素";
最大2 = フッ素;"フッ素";
最大2= ヨウ素;"ヨウ素"
)
最小も同様に、最小1と最小2を設定。
って色々と試行錯誤してるうちに、みなさんの答えがシンプルで泣。
話は変わりますが、LISTのソート化ってどうすんだ?とヘルプをみてたら、FMP16から関数で出来ることに気づいて、はしゃいでました。
私はFM15なので、16体験版をインストールして感動しました。
追記:
あっこれ、同じ数字の場合はどうなるんでしょうか。
Last edited by tomato (2017-08-11 18:00:07)
Offline
最新版FM16のValueSort()関数が無かった時代に、
苦労して自作した自家関数が調度ありましたのでので、
公開します。
この自家関数式を利用すれば、フィールド内リスト項目の条件指定ソートが可能です。
============================
/*************************
リストのバブルソート計算式
**************************/
//・リスト内容を条件指定ソート。(アルゴリズム:バブルソート)
//・入れ子の再帰式で求める。
//・用法: SortValues[PRM,SOR,, TYP]
// 「PRM:一覧」→引数[1] 「SOR:順」→引数[2] 「TYP:型」→引数[3]
Let([
//パラメータ引数設定
$prm=引数[1]; //←(一覧リストを指定)
$sor=引数[2]; //←(ソート条件指定:昇順=1 , 降順=0)
$typ=引数[3]; //←(ソートタイプ指定:テキスト比較=1 , 数値比較=0)
//サブルーチン関数定義
$lst=$prm;
$sub="Case(
$i<=1;$top;
Let([
$i=$i-1;
$itm=GetValue($lst;$i);
$_top=Case($typ;$top;$top*1);
$_itm=Case($typ;$itm;$itm*1);
$flg=Case($sor;$_top<$_itm;$_top>$_itm);
$rtn=Case($flg;List($rtn;$itm);List($rtn;$top));
$top=Case($flg;$top;$itm)
];Evaluate($sub))
)";
//バブルソート関数定義
$n=0;
$res="";
$fnc="Case(
$n=ValueCount($prm);$res;
Let([
$n=$n+1;
$i=ValueCount($lst);
$top=GetValue($lst;$i);
$rtn=\"\";
$res=List($res;Evaluate($sub));
$lst=$rtn
];Evaluate($fnc))
)"
];
Evaluate($fnc) //バブルソート計算実行
)
============================
この式を今回事案に適用すれば、v16以前の方にも良いでしょう。
・「名称=数値」形式で全6行の一覧リストを生成する計算フィールド「リスト」を作る、式は、
List(
"酸素="&酸素フィールド;
"窒素="&窒素フィールド;
"水素="&水素フィールド;
"二酸化炭素="&二酸化炭素フィールド;
"フッ素="&フッ素フィールド;
"ヨウ素="&ヨウ素フィールド)
から、以下リストを生成します。
酸素=15
窒素=10
水素=5
二酸化炭素=11
フッ素=3
ヨウ素=7
・ソート結果を格納する計算フィールド「ソート結果リスト」を作る、式は上記バブルソート式を、
また式内3つの引数パラメータに以下を設定。
$prm=リストフィールド ; //←(引数[1]:一覧リストを指定)
$sor=0 ; //←(引数[2]:ソート条件指定:昇順=1 , 降順=0)
$typ=0 ; //←(引数[3]:ソートタイプ指定:テキスト比較=1 , 数値比較=0)
から、以下ソート結果リストを得ます。
酸素=15
二酸化炭素=11
窒素=10
ヨウ素=7
水素=5
フッ素=3
・この「ソート結果リスト」から目的の各必要な答えを算出します。
上位1番 → GetValue(Substitute(GetValue(ソート結果リストフィールド; 1); ["=";¶]); 1)
上位2番 → GetValue(Substitute(GetValue(ソート結果リストフィールド; 2); ["=";¶]); 1)
下位2番 → GetValue(Substitute(GetValue(ソート結果リストフィールド; 5); ["=";¶]); 1)
下位1番 → GetValue(Substitute(GetValue(ソート結果リストフィールド; 6); ["=";¶]); 1)
Offline
micさん、Shinさん、tomatoさん、Hiroさん
色々な答え、ありがとうございます。
質問の項目で記述し忘れた事があります。
数値は固定値ではなく、レコード毎に数値が変わります。
ですので、レコード毎の最大値、最小値、最大値の次の値(上から2番目)、最小値の次の値(下から2番目)のフィールド名を得たいのですが・・・・・
この条件を追加しても、皆様の答えで問題ないでしょうか?
現在、micさんの方法の最大値をもつフィールドの名前の表示を試みている所ですが、思っている答えが出てきません。
Last edited by きっさん (2017-08-12 03:17:57)
Offline
一度みなさんの案を試されてはいかがでしょうか?
やればわかると思いますし、その方が勉強になりますよ。。
横レスですが
HIROさん、これ凄いですね!
私はFM15なので感動です。今後利用させてください。
Offline
Let (
[
text = Right ( "000" & 酸素 ; 3 ) & "酸素¶"
& Right ( "000" & 窒素 ; 3 ) & "窒素¶"
& Right ( "000" & 水素 ; 3 ) & "水素¶"
& Right ( "000" & 二酸化炭素 ; 3 ) & "二酸化炭素¶"
& Right ( "000" & フッ素 ; 3 ) & "フッ素¶"
& Right ( "000" & ヨウ素 ; 3 ) & "ヨウ素" ;
text = SortValues ( text ; -1 )
] ;
Replace ( GetValue ( text ; 1 ) ; 1 ; 3 ; "" )
)
という式で最大が求められます。最小は SortValues のパラメーターを変えます。2番目は、GetValue のパラメーターを変えます。
検証したサンプルです。
https://www.dropbox.com/s/uoqgmd20mg9ng … 2.zip?dl=0
昔は、別のテーブルにデータを移して、値一覧やポータルで作っていましたね。
Last edited by Shin (2017-08-12 11:27:09)
Offline
一度みなさんの案を試されてはいかがでしょうか?
やればわかると思いますし、その方が勉強になりますよ。。
はい、皆さんの答えを実行してみたいと考えてはいるのですが、中々内容が理解出来ず、四苦八苦しています。
Offline
はい、皆さんの答えを実行してみたいと考えてはいるのですが、中々内容が理解出来ず、四苦八苦しています。
> #5 関数式の設定説明代わりに実装例サンプルをアップしときます。
関数式の内容は解らなくとも実行するのは難しくはありませんよ。
●実装例サンプル「SortValues関数.fmp12」 → https://yahoo.jp/box/iYlTJk
Last edited by Hiro (2017-08-13 00:59:16)
Offline
ご教示頂きました皆様、ありがとうございます。
理解出来るところもあれば、???のところもあったりしますが、出来る限り吸収して行こうと思います。
しかし、皆さんの知識の奥深さにただただ驚かされるばかりです。
FileMaker Proが世の中に登場した頃から関わっていますが、未だ納得ゆくカスタムAppを作ることが出来ないのが現状です。
様々な関数の機能を理解するのにも四苦八苦している私にとって、その関数をどう組み合わせると、どのような結果が得られるのかを導き出す方々をただただ尊敬するばかりです。
今後も、色々お尋ねする事があるかと思いますが、その時はご教示の程、宜しくお願い致します。
Offline
Pages: 1
[ Generated in 0.010 seconds, 9 queries executed - Memory usage: 560.17 KiB (Peak: 581.08 KiB) ]