みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
環境はFM12ADです。
件名のとおり、リレーションを組む際に参照先のリレーションキーが非保存の計算フィールドなんですが
これを成立させられないかと苦慮しています。
仕様上、無理だという事はわかってはいるんですが、今まではポータルのみの表示でOKだったので
デカルト積でリレーションをくんで、ポータルにフィルタを設定して
対象を絞り込んで、擬似的にリレーションがかかってるように見せて処理していた箇所があるのですが
そのリレーションをポータル以外の用途でも使いたいという事になって
さて、どうしたものかと言ったところです。
Aテーブル シリアル
Bテーブル シリアル_A (計算.非保存)
現状は Aテーブル と Bテーブルに Xリレーションを組み
ポータルのフィルタで A::シリアル=B::シリアル_A と設定して
AテーブルにBの関連レコードを表示してます。
何かしら、良いアイデアがあれば よろしくお願いします
Bに
Get(レコードID)(ユニークなフィールドで代替可)
と
Case(A::シリアル=B::シリアル_A ;B::レコードID)
の計算フィールドを作って、Aに
List(B::それ)
の計算フィールドを作って、
A::それ=B::レコードID
のリレーションを使う。
> Case(A::シリアル=B::シリアル_A ;B::レコードID)
この条件式は意味が無いですよ。
さらに
> AにList(B::それ)
これが得られない。。
まず無理と思った方がいいと思いますよ。
ルックアップを使うとかして、
Bのキーを索引保存できる様に考えた方がいいのでは。
Offline
テーブルBのレコードとの関係を具体的に書いていただければ、進展するかも。
特に、Bテーブル シリアル_A (計算.非保存) をどのように取得しているかが非常に重要でしょう。
Offline
Bに
Get(レコードID)(ユニークなフィールドで代替可)
と
Case(A::シリアル=B::シリアル_A ;B::レコードID)
の計算フィールドを作って、Aに
List(B::それ)
の計算フィールドを作って、
A::それ=B::レコードID
のリレーションを使う。
説明が少し分かりにくいだけで、Lististさんの方法で生けると思います。
要するリレーションは2つで、
・リレーション1は、「Bテーブル::シリアル_A」=「Aテーブル::シリアル」
・リレーション2は、「Aテーブル::フィールド」X「Bテーブル 2::フィールド」
> Case(A::シリアル=B::シリアル_A ;B::レコードID)
→ Case(Count(Aテーブル::シリアル);レコードID) //Bテーブル上の設定・リレーション1を利用
> List(B::それ)
→ List(Bテーブル 2::それ) //Aテーブル上の設定・リレーション2を利用
Last edited by Hiro (2013-09-26 15:26:48)
Offline
「ポータルフィルタリングの計算はポータル行で計算されるフィールドと同じものになります。」というのが頭にあったんで、そのままCaseに使ったのですが
それだと常にAの先頭を参照してしまうので「意味が無い」でした。
HIROさんのリレーション1を追加すればいいのかと思ったけど、これもCaseの式は常に同じAのレコードを参照してるので、だめみたいです。
(Aの全レコードで同じ値になる)
Aでリレーション2を利用した計算をするときに、レコードごとに違うAがBから参照されないといけないので、
変数を使ったりしないと無理ですかね。
Case(Bテーブル::シリアル_A = $$S ; レコードID )
にして
Let ( $$S = A::シリアル ; List ( Bテーブル 2::それ )
とか。
みなさん、この書き込みの為にあれこれとご意見いただき有り難う御座います。
ちょっと出先なので、現状、実際にファイルメーカーでテストできないんですが
Hiroさんのリレーション2がデカルト積で、それを利用してList関数を使うという事は
List(Bテーブル 2::それ) はAテーブルの全レコードで共通の値を持ってしまう気がしますが。
それならそれで、カスタム関数で再帰処理的に List(Bテーブル 2::それ) から必要な値(自分のシリアル)だけを抜き出せば
なんとかなりそうな気もしてきました。頭の中だけでシミュレーションしての話なので、的外れな事を言ってたらすいません。
ひとまず、明日以降になりますが、HiroさんとLististさんの書き込みを参考に
あれこれと試してみます。
チポさんとShinさんもありがとうございました
自分の名前を間違えてる上に、やっぱり的外れなこと言ってました。
カスタム関数で再帰処理うんぬんは忘れてください。
とにかく、また週末にゆっくりとテストしてみます。
ありがとうございました
#5レスの計算式に誤りがありましたので、訂正いたします。
先ずは説明代わりにサンプルをご覧下さい。
●サンプル「非索引リレーション.fp7」→ http://yahoo.jp/box/NA7nfZ
(※汎用性からあえて.fp7です。v12は.fmp12へコンバートしてご覧下さい。)
> Case(Count(Aテーブル::シリアル);レコードID) //Bテーブル上の設定・リレーション1を利用
Let([
res=Substitute(List(Aテーブル::レコードID) & ¶;¶;"|" & レコードID & ¶)
];
Left(res;Length(res)-1)
)> List(Bテーブル 2::それ) //Aテーブル上の設定・リレーション2を利用
Evaluate(
"Let([$itm=\""
&
Substitute(List(Bテーブル 2::フラグID);¶;
"\";
$itm1=GetValue(Substitute($itm;\"|\";\¶);1);
$itm2=GetValue(Substitute($itm;\"|\";\¶);2)
];
Case($itm1=レコードID;$itm2 & \¶)
)
&
Let([$itm=\""
)
&
"\";
$itm1=GetValue(Substitute($itm;\"|\";\¶);1);
$itm2=GetValue(Substitute($itm;\"|\";\¶);2)
];
Case($itm1=レコードID;$itm2)
)"
)Offline
Hiroさん
夜中にありがとうございます。
僕も昨晩、あれこれと考えた結果、hiroさんの書かれた計算式と同じような結論に達しました。
Hiroさんのヒントがあってこその話ですし、
きちっと計算式を書き出すのに、僕だと余裕で半日くらいかかりそうなんで
偉そうに言えることでもないですが。
ファイルの中身はこれから、念のために確認させて頂きます。
他にご意見を下さった方々もありがとうございました。
この件はこれで解決とさせて頂きます。
「計算式に誤り」というより、考え方が全然違いますよね^^;
Bテーブルの全レコードをリストにして計算式を生成してるように見えますが、3万文字以下しかEvaluateできませんので、カスタム関数にした方がいいかも?
元々Bテーブルのレコード数は少ないのかも知れませんけど。
Lististさん
アドバイスありがとうございます。
その辺りは、うちのシステムにしっくり合わせられる様に
こちらで適度にアレンジするようにします
Pages: 1
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 588.78 KiB (Peak: 605.69 KiB) ]