みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
mac OSX + FileMaker Pro12(adv)です。
リストA(改行区切り文字列)と
リストB(同じく改行区切り文字列)を引数にした場合、
Aだが、Bでない改行区切り文字列、を出力したいのです。
【例】
リストA
A
B
C
D
E
F
リストB
B
C
E
の場合、
A
D
F
を出力したいのです。
このような要求を満たすカスタム関数または、考え方がありましたら、お教え下さい。
カスタム関数例は、ZapValues(ListA;ListB)関数 http://www.briandunning.com/cf/193。
FilterValues関数を利用した再帰計算で求めますが、
考え方は、ご自身で再帰ループ スクリプトを組んでみると理解し易いかな。
因みに、非Adv版でカスタム関数が使えない場合でも、一般標準関数だけで求めることも、
●最大リスト行数が290行までなら
Let([
$lst_a=リストA;
$lst_b=リストB;
$i=0;
$res="";
$fnc="Case(
$i=ValueCount($lst_a); $res;
Let([
$i=$i+1;
$stg=GetValue($lst_a;$i);
$stg=Case(IsEmpty(FilterValues($stg;$lst_b)); $stg);
$res=List($res;$stg)
]; Evaluate($fnc))
)"
];
Evaluate($fnc)
)●最大リスト行数が291行以上なら
Let([
$prm[1]=リストA;
$prm[2]=リストB;
$m=150; /*再帰分割単位数を指定*/
$skp[1]=100; /*速度と再帰限界アップ、スキップ数を設定*/
$skp[2]=10;
$all=ValueCount($prm[1]);
$n[1]=0;
$n[2]=Div($all-1;$m);
$res="";
/*再帰計算限界回避の分割処理*/
$fnc[1]="Case(
$n[1]>$n[2]; $res;
Let([
$i[1]=$m*$n[1];
$i[2]=$i[1]+Min($all-$m*$n[1]; $m);
$res=Evaluate($fnc[2]);
$n[1]=$n[1]+1
]; Evaluate($fnc[1]))
)";
/*逆FilterValues関数の主式*/
$fnc[2]="Case(
$i[1]>=$i[2]; $res;
Let([
$add=Case(
Let([$x=MiddleValues($prm[1];$i[1]+1;$skp[1])];$x=FilterValues($x;$prm[2])); Let($i[1]=$i[1]+$skp[1];\"\");
Let([$x=MiddleValues($prm[1];$i[1]+1;$skp[2])];$x=FilterValues($x;$prm[2])); Let($i[1]=$i[1]+$skp[2];\"\");
Let([$i[1]=$i[1]+1;$x=GetValue($prm[1];$i[1])]; IsEmpty(FilterValues($x;$prm[2]))); $x
);
$res=List($res; $add)
]; Evaluate($fnc[2]))
)"
];
Evaluate($fnc[1])
)Last edited by Hiro (2014-01-05 12:54:59)
Offline
ズバリのカスタム関数があるのですね!ありがとうございます。
標準関数だけでやるのも、ご紹介有難うございます。
ちょっと難しそうですが、勉強になりそうです!
Pages: 1
[ Generated in 0.007 seconds, 7 queries executed - Memory usage: 548.59 KiB (Peak: 579.66 KiB) ]