みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
MacOS10.9
FileMakerPro13adovanced で使用しています。
1つ前のレコードの値はGetNthRecord関数を使用し簡単に収得できるのですが、
1つ前のレコードの欲しいフィールドの値が空欄であった場合はさらにもう1つ前のレコードの値がほしいです。
例えば、
リスト表示で
「フィールド1」 「求めたい値」
3
空欄
空欄
8 3
空欄
9 8
3 9
スクリプトを使わずに、計算式のみで処理を試みています。
計算式のみでやろうとして調べてみたのですが、計算式でループ処理をするのにはLet関数を使うみたいですが
上手く理解できません。
どなたか宜しくお願いいたします。
レコードIDとかシリアル値で自己リレーションすると、関連レコードのList
の最初の値で求まりそう。
Offline
Let([
$n=Get(レコード番号);
$res="";
$fnc=
"Case(
$n=1 or Not(IsEmpty($res)); $res;
Let([$n=$n-1;$res=GetNthRecord(フィールド1;$n)];Evaluate($fnc))
)"
];
Case($n>1 and Not(IsEmpty(フィールド1)); Evaluate($fnc))
)
計算結果が忠実に例示の「求めたい値」になるよう、前式を上式に一部修正しました。
Last edited by Hiro (2015-02-18 23:49:04)
Offline
対象レコードなのか、
全レコードなのか、
ソートの有無、
によって変わって来るのでは。
Offline
「フィールド2」を追加すれば、楽?
Case(IsEmpty(フィールド1);GetNthRecord(フィールド2;Get(レコード番号)-1);フィールド1)
(自己参照なので先に一旦フィールド2を作って保存してから式を設定)
「求めたい値」
Case(not IsEmpty(フィールド1);GetNthRecord(フィールド2;Get(レコード番号)-1))
シリアル値等で自己リレーションして
Last関数(繰り返し関数になっていますが、関連フィールドにも使えます)で
関連レコードのフィールド1を指定すれば
空欄は無視して有効な最後の値を取得できたと思います。
リレーションで指定したソートの順番で取得するようなので
レイアウト上でソート状態を変更してもたぶん値は変わらないと思います。
Last edited by にしなな (2015-02-19 14:06:51)
Offline
みなさん
素早い回答有り難うございます。
Hiroさんの記述していただいた式でうまくいきました。
Let関数とEvalute関数を使用してループを作る方法は、調べてみて知っていたのですが
実際どのように記述すればよいかさっぱり分からなかったのですが、この式を例にいろいろ試してみたいと思います。
チポさんのご指摘の通り、実際は、検索やソートをかけた状態で使用したいので
$n=Get(レコード番号) のGet(レコード番号)の所を
新しくフィールド作成し計算式で
=Get ( レコード番号 )
とし、索引オプションで「計算結果を保存せず必要時に再計算する」
に設定しなおしましたら、上手くいきました。
有り難うございます。
旅人さんが教えてくださった、List関数を使用する方法も試してみました。
List関数は空欄があった場合は、その空欄を省いてリストにしてくれるので使えそうなのですが
自己リレーションをはって試して見たのですが、うまくいきませんでした。
よろしければもうしこし詳しく教えていただけませんでしょうか?
宜しくお願いいたします。
新しくフィールド作成し計算式で
=Get ( レコード番号 )
このフィールドは不要ですよ。
Hiroさんの式のままで、そのフィールドを非保存にすればいいでしょう。
検索が入るのなら、
リレーションの方法はめんどうになりますね。
Offline
チポさん
ご指摘有り難うございます。
たしかに、わざわざ新規フィールドをつくらなくとも、そのもののフィールドを非保存にすればOKでした。
ありがとうございます。
Pages: 1
[ Generated in 0.010 seconds, 7 queries executed - Memory usage: 561.94 KiB (Peak: 581.47 KiB) ]