みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になります。
テーブルAをフィールド名「あいう」同士で自己リレーション(リレーション先:テーブルA')を
組んだとします。
テーブルAから見て、テーブルA'のフィールド名「かきく」の数字で最大値をとりたいです。
「かきく」の場合、最小値は1ですが、最大値は連続していない場合があります。
MAX関数をとれば、最大値は取れますが、本当にほしい数字は連続した数字の最大値なのです。
例;
1,2,3⇒3
1,3⇒2
2,3⇒1
このような数字を実現する関数はありますでしょうか?
どなたかご教授をお願いいたします。
fm13 ad
windows7
Offline
多分再起計算式の提案が出ることともいますが、
私は、スクリプトでLOOPでソートされたレコードを
最初から見て行って、途切れたところの値を返すという方法を提案して起きます。
カスタム関数で、処理する方法もありますが、
再帰計算になるので、ちょいと面倒かなぁ?
ということで わたしはスクリプトをお勧めします。
Offline
シーラカンス様
ありがとうございます。
数字は1と2と3しか使わないのですが、
case関数とcount関数の組み合わせで何とかならないでしょうか?
Offline
1,3⇒2
2,3⇒1
の法則性がわかりません。また、最小値が1の意味は?
Let(
[
$t = ¶ & List ( リレーション::かきく ) & ¶ ;
$max = 1 ;
$fnc =
"Case (
PatternCount ( $t ; \¶ & $max & \¶) = 0 ; Max ( 1 ; $max - 1 ) ;
Let(
[
$max = $max + 1
] ; Evaluate ( $fnc ) )
)"
] ;
Evaluate ( $fnc )
)が、1から始まる連続数の最大値を求める一般解になります。
1,2,3 だけならば、
Case (
ValueCount ( FilterValues ( リレーション::かきく ; List ( 1 ; 2 ; 3 ) ) = 3 ; 3 ;
ValueCount ( FilterValues ( リレーション::かきく ; List ( 1 ; 2 ) ) = 2 ; 2 ;
1
)
でも良いかもしれません。
1,3⇒1
2,3⇒3
ということでしたら、不連続は 1,3 の時だけですので、
Case (
ValueCount ( FilterValues ( リレーション::かきく ; List ( 1 ; 3 ) ) = 2 ; 1 ;
Max ( リレーション::かきく )
)
でもいいかも。
Last edited by Shin (2017-04-08 14:54:23)
Offline
Shin様
ご教授、ありがとうございます。
上記パターンですが、フィールド「あいう」=注文番号、「かきく」⁼各注文番号毎の分番号です
そのため、最小値は1なのです。
例えば、注文番号で分番1、2、3番とデータがあったとして、1番をキャンセルしたとして、再度入力し、分番を取得するときは、4番ではなく、
1番を取得したいと考えています。
また、2番をキャンセルし、2番が空欄になったところで、2番を再度入力したときに分番は2番を取得したいのです。
もし、1、2ともにキャンセルして、再度入力するときには、先ず1番の分番を取得することになります
上のLET関数は私にはレベルが高すぎて理解、応用できそうにありません、
上記観点で再度教えていただけないでしょうか?
お手数をおかけししますが、ご確認をお願いします。
Offline
最初の説明からは全然違っている様に思いますが。
要するに、1を使っていなければ1、2を使っていなければ2、それ以外は3を返せば良いのでは。
Case (
PatternCount ( List ( リレーション::かきく ) ; "1" ) = 0 ; 1 ;
PatternCount ( List ( リレーション::かきく ) ; "2" ) = 0 ; 2 ;
3
)
Offline
Shin様
ありがとうございます。
出来ました!
Offline
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 558.19 KiB (Peak: 582.3 KiB) ]