みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
お待たせしました。
公開サービス終了でリンク切れしたホルダーファイル「特殊照合リレーション(全6サンプル一覧)」の移動先です。
公開サービス終了でリンク切れした(全6サンプル一覧)ホルダーファイルの移動先です。
意図するものは、所謂「動的値一覧」ではないかしら?
だとすると、設定方法は過去ログに色々あります。
>『の「果物」の部分が、たとえば「いちご」だったり「りんご」だったり「みかん」だったりして、絶対変換ではないのです・・・』
実際に式を試してみましたか? 質問事項は織り込み済ですよ。
式は前から順に精査判定してゆきます。その前半部で、「いちご」「りんご」「みかん」は「果物」に変換されていますよ!
#3で具体的に例示されている5種項目についてのみ絶対変換するだけで良いのなら、
式は、
Substitute( Aフィールド
; ["いちご";"果物"]
; ["りんご";"果物"]
; ["みかん";"果物"]
; ["果物春赤";"春赤"]
; ["果物春";"春"]
)
生徒別の集計結果を繰り返し[12回]SQL計算フィールドに一発取得する案です。
その計算式に以下のSQL関数式を設定します。(他に必要な設定は一切ありません)
ExecuteSQL(
"
SELECT COUNT(*)
FROM ""このテーブル名""
WHERE ""生徒""=? AND ""平均点"">? AND ""平均点""<=?
"
; ""
; ""
; 生徒[1] & Left(平均点[1]; 0)
; Case(
Get(計算式繰り返し位置番号)=1; -.01;
Get(計算式繰り返し位置番号)=12; 99.99;
(Get(計算式繰り返し位置番号)-2)*10
)
; Case(
Get(計算式繰り返し位置番号)=11; 99.99;
Get(計算式繰り返し位置番号)=12; 100;
(Get(計算式繰り返し位置番号)-1)*10
)
)
|りんご|りんご|ばなな|めろん|ばなな| ➡ |りんご|ばなな|めろん|空白|空白|
目的が例示通り、順序を維持した一意配列化に在るなら、
UniqueValues関数はソート処理が基準の機能のため、今回は使えないでしょう。
地道に前から1項づつ重複精査しながらループ回しする作案です。
【値一覧化スクリプト】サンプル
変数を設定[ $UniqueValues ;
値 :
Let(
[
$val=List(フィールド1);
$i=0;
$n=0;
$res="";
$LOOP="Case($i=5; $res;
Let([
$i=$i+1;
$itm=GetValue($val;$i);
$res=List($res; Case(IsEmpty(FilterValues($res;$itm)); $itm))
]; Evaluate($LOOP))
)"
];
Evaluate($LOOP)
)
]
Loop
Exit Loop If [ Let($n=$n+1; $n>5) ]
フィールド設定 [ フィールド1[$n] ; GetValue($UniqueValues; $n) ]
End Loop
Lookup関数を使えば、その条件計算式に組み込めば、目的のことを実装出来ます。
判別式は、論理式で、
Length(Filter(商品名A;商品名B))>=3
担当者をキーに自己リレーションを組み、
その担当者の関連入力日付の最大値と最小値から日数を算出します。
その式は、
Max(自己リレーション::入力日) - Min(自己リレーション::入力日)
ベタベタと書くと
・Ceiling((小計+小計*0.1+(小計+小計*0.1)*0.1)/100)*100
要約すると
●Ceiling((小計*1.1^2)/100)*100
Substitute(
Choose(IsEmpty(List(繰り返しフィールド)); Char(32)&List(繰り返しフィールド))
; [Char(13);Char(13)&Char(32)]
)
・If (IsEmpty(Filter(A&B; "〇")) * Not(IsEmpty(A)) * Not(IsEmpty(B)))
・ YESの時の処理
・Else
・ NGの時の処理
・End If
終わっていますが、
>#8『ExecuteSQL関数式を使ったことはありませんが、・・・これから勉強してみます。』
今回のようにFMでは難解なケースでも、
SQLを利用するといとも簡単に実装できることもあるので、
一度勉強しておくと非常に便利な機能です。
●ExecuteSQL関数式の作例サンプルを残しておきます。
※ただこの式指定だけですべて完了、超簡単ですネ!!
(テーブルAの「氏名」繰り返し[42回]計算フィールドの設定式)
ExecuteSQL(
"
SELECT ""氏名""
FROM ""テーブルB""
WHERE ""検査日""=?
"
; ""
; "¶"
; 日付
)
●ついでに、「日付」繰り返し[42回]計算フィールドの式例も記して置くと、
(一般的な日曜日始まり6週次の月間カレンダー表示向けとしています)
Let([
#日=Get(計算式繰り返し位置番号) - DayOfWeek(Date(月;1;年))
];
Date(月;#日+1;年)
)
氏名[42]にExecuteSQL関数式を適用して一発計算するのが、一番楽でしょう。
他の設定は一切必要ありません。
また、カレンダー表示するなら6週分の42回の日付枠が必要ですよ。
移動先の新リンクです。
●サンプル「日次価格情報ダウンロード.fmp12」 → h ttps://yahoo.jp/box/wKE5Uq → https://1drv.ms/u/s!AlaCGhTKTWEOgZpc1LN … A?e=EpQa4L
リレーションの照合条件は「フィールド内容の完全一致」照合で、
「部分一致」照合ではありません。ですから、質問内容は全く杞憂ですネ。
ご自身で動作試験をして貰えれば、即確認できると......。
「30行の固定行リスト」を得るものとして、その関数を生成してEvaluateで実行して求める方法です。
定義関数#fnc: "品名[1]&¶&品名[2]&¶&品名[3]&¶&・・・・・&¶&品名[30]&¶" & "&""|"""
Let([
#fnc=Evaluate(Substitute(10^30-1; [9; "Let([$i=$i+1];""品名[""&$i&""]&""&Quote(""\¶"")&""&"")& " ]) &Quote("""|""")); //定義関数を生成
#res=Evaluate(#fnc); //定義関数#fncを実行
#res=Substitute(#res;["¶|";""]) //余分な末尾改行を除去
];
#res
)
非効率と思われる「集計フィールド」や「リーレーション集計」の代わりに、ソート下を前提にした全置換式です。
結果はどうでしょうか?
Let(
[
#flg=test::item<>$val;
#cnt=Case(#flg; $num);
$num=Case(#flg;1;$num+1);
$val=test::item;
$itm=Case(#flg; Case(#cnt=$cnt;List($itm;$val); #cnt>$cnt;$val; $itm); $itm);
$cnt=Max($cnt; #cnt)
];
Case(Get(レコード番号)=Get(対象レコード数); List($cnt; $itm))
)
ExecuteSQLやループスクリプトなど100万レコードで色々試した中で、最もパフォーマンスが良かった方法です。
「フィールド内容の全置換」をグローバルフィールドに適用するだけの至って簡便な方法です。
【設定手順】
itemフィールドは索引済であること
itemフィールドで照合する自己リレーション「テーブル 2」を設定しておく
結果を格納するグローバルフィールド「result」を用意する
「result」に計算値による全置換を掛けて結果を代入します
その式は、
Let(
[
#cnt=Count(テーブル 2::item);
$itm=Case(
$cnt=#cnt; List($itm; Case(FilterValues(テーブル::item;$itm)=Char(0); テーブル::item));
$cnt<#cnt; テーブル::item;
$itm);
$cnt=Max($cnt; #cnt)
];
Case(Get(レコード番号)=Get(対象レコード数); List($cnt;$itm)) //最後のレコードになったら最終結果を書き出す。
)
パフォーマンス問題が主題なら、FM内解法での高速化をもう一度検討し直してみても良いかも?
解決済ですが、
もしWindows環境であるなら、 最新「webビューア+javascript関数」手法を使わない方法もあります。
「mshta javascript: ~JS構文~ 」でjsを外部実行して、その結果はクリップボード経由で返す方法です。
この方法は、最新v19版でなくとも有効な手法となります。
面倒に考え過ぎているようです。
>#1『この商品番号の在庫状況を確認したいので、在庫状況レイアウトに飛ぶのですが』
ポータル内の移動先商品番号のレコードを選択指定した状態で、「関連レコードへ移動」で在庫状況レイアウトに移動するだけです。
>#1『類似商品の在庫も一緒に見れればとと思っております。』
移動した在庫状況レイアウトに類似商品を表示するポータルを設置します。
あぁ、タイトル付MERで標準書き出して、Powershell でUTF-8へ単純一括変換するのが安全確実ですネ!
[ Generated in 0.024 seconds, 8 queries executed - Memory usage: 643.8 KiB (Peak: 874.43 KiB) ]