みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になっております。
環境:Win10 FM18.1です。
図のようなリレーションは不可でしょうか?
https://i.imgur.com/FgHIKmt.jpg
目的:テーブルBに、マスタCのテキストと、マスタDのテキストを呼びたい。
作業テーブルAのGlobal_Fieldの値を動的にし、マスタからテキストを引っ張ってきたいです。
試したところ、マスタDからは望んだテキストが引っ張れますが、マスタCへの参照が思うようにいきません。
例えば、テーブルBのレイアウトに1000レコードあったとして、マスタCに存在するものだけを絞りたい時、マスタCのテキストを「*」検索すると
テーブルAのGlobal_FieldとマスタCのIDのリレーションが無視されます。(Global_Fieldに値は入っています。)
マスタCのCodeとIDは索引すべて としております。
よろしくお願いいたします。
Offline
> 目的:テーブルBに、マスタCのテキストと、マスタDのテキストを呼びたい
なのに、テーブルAを間に介しているのが分かりません。
また、このリレーションも理解できません。
テーブルA::Code = マスタC::Code
and
テーブルA::GloblField = マスタC::ID
もう少し具体的な説明が必要かと。。
Last edited by チポ (2022-12-15 14:01:57)
Offline
チポ様、ありがとうございます。
テーブルAはユーザーが操作しており、置換等のスクリプトとの競合を避けたり、データ量が莫大であるために
テーブルBをエクスポート専用のユーザー不可視テーブルとしております。構造が回りくどく見えるかもしれませんがご承知ください。
作業用の不可視テーブルが他にも複数あり、それぞれからマスタへのリレーションを張ると、リレーションが多量で複雑になるためこのようにしております。
マスタCには
Code:AAA
ID:001
Code:AAA
ID:002
といったCodeだけでリレーションを張れない理由があります。
テーブルBで作業する際に、テーブルAのGlobal_Fieldを入れ替えることでマスタC、マスタDから任意のテキストを持ってきたいと考えております。
よろしくお願いいたします。
Offline
説明は了解しました、
しかし
> マスタCへの参照が思うようにいきません
この理由は書かれた説明では分かりません。
CodeとIDが一致すれば照合できますよね。。
Offline
チポ様
はい・・・ 照合できると思って組んでみたらできないので、今回お聞きしてみました。
テーブルBのレイアウトに、マスタCの全フィールドを置いていろいろな動きを試したところ
Codeに「*」検索では、IDが加味されず結果が返されましたが、
適したIDで検索した結果、思うような結果が得られました。
(グローバルフィールドを使用した?)リレーションの理解が全く足りていないと痛感しました。
もっと自分で色々試してから質問すべきでした。
ありがとうございました。
Offline
この形のリレーションをよく使っていますが、問題なく参照できるはずです。
ただし、リレーション先の孫リレーションですので、孫リレーションは、それぞれの先頭レコードのみが対象になります。
孫リレーションの対象レコードを全て表示させたいのでしたら、直接リレーションをはります。
かなり特殊な構造ですが、具体的に何を管理されているのですか。
Last edited by Shin (2022-12-17 14:16:34)
Offline
Shin 様
マスタCに、
・Code AAA、ID 001(レコード1とします)
・Code BBB、ID 001(レコード2とします)
・Code AAA、ID 002(レコード3とします)
テーブルAには、Code AAA、BBBが存在。GlobalFieldは002。
テーブルBには、Code AAA、BBBが存在。テーブルBレイアウトで検索を行うと以下の結果になりました。
検索条件1 マスタC::Code * = レコード1~3がHIT
検索条件2 マスタC::ID * = レコード1~3がHIT
検索条件3 マスタC::ID 002 = レコード3のみHIT
私の認識では上記検索条件1、検索条件2でもレコード3のみHITすると思っており、嵌っておりました。
孫リレーションは、それぞれの先頭レコードのみが対象になることは認識しているのですが、リレーションの組み方が悪いのかと質問した次第です。
マスタCには過去のとある地点の情報を保持しており、
それを呼びたいシーンがあるためこのような構造となっております。
Offline
「テーブルBレイアウトで検索」であれば、HITしたかどうかはテーブルBのレコードで判定しますから、「レコード1~3がHIT」「レコード3のみHIT」というのは意味がないです。
「テーブルBには、Code AAA、BBBが存在。」の状態から検索結果に出てくるのは、CodeAAAとBBBのそれぞれがHITするかしないかだけです。
「マスタC、マスタDから任意のテキストを持ってきたい」というのと、「テーブルBレイアウトで検索」とでは、全然操作に関連がないと思いますが...
himadanee 様
流れを書いていないため、操作に関連がなさそうに見えますね。申し訳ございません。
テーブルBに10000レコードあり、うちマスタCに存在する関連レコードが500件を全置換したい場合
テーブルB上で、500に絞ってから全置換した方が早いためです。(検証済み)
この全置換にマスタCの情報をつかう(任意のテキストを持ってくる)ということです。
Last edited by Valon (2022-12-20 10:43:35)
Offline
う~ん、わかりません。置換するのはBとCどっちなんですか?
思ったようにいかないというのは、Aのグローバルフィールドを使ってるから逆方向(CからAの関連レコード)は参照できないのが原因かもしれません。
FM6以前での話ですが、関連フィールドを使った検索は非常に遅かったので、関連テーブル側で検索してから関連レコードに移動、ということをやってました。
このリレーションではそういうことはできませんね。(Bを絞り込むのにCで検索してから関連レコードへ移動、は不可能)
と思ってテストしてみたら、逆方向の場合「参照できない」ではなくグローバルフィールドの条件は無視されてますね...こんなものだったかなあ?
自分では複数フィールドのリレーションで片方だけグローバルというのは今までやった記憶がありませんが...
himadanee 様
置換を行うのはテーブルBです。マスタCでも置換を試しましたがうまく動きませんでした。
(共にテーブルBがフォーカスされている場合)
そうなんです。グローバルフィールドの条件は無視されていると思います。 #1で書きました。
ここが私の認識違いなのか、仕様なのか知りたいという質問でもありました。
Offline
#1だとBとCの間にAが入ってるのですが、もっと単純にAとCだけでやった場合に、
CをAのレイアウトのポータルに表示してポータル内で検索すると、ポータル内に存在しない値で検索してもHITしてしまうので、自分としてはバグのように思います。
リレーショングラフでグローバルフィールドのところは
https://help.claris.com/ja/pro-help/con … graph.html
「結合ができないことを示します。たとえば、照合フィールドが欠如している、または索引未設定フィールド (非保存の計算フィールドまたはグローバルフィールド)、またはインジケータに最も近いテーブルが欠如しているか利用できない場合などです。」
になってるわけですが、複数フィールドのリレーションは条件がANDとして定義されてるはずなので「参照できないものは無視する」というのは変ですよね?
なんと?単数フィールドのリレーションでもメイン側がグローバルだとポータル側でポータル内にない値で検索してもHITになってしまいますね???
これはFM11があったので実験してみましたが、同じでした。前からこうだったみたいです。
メイン側がグローバルフィールドだけの場合、関連レコードといっても「そのレコードの」関連レコードではない(全レコードで同じ)なので、検索条件として意味がないのは確かです。
関連テーブルを検索する時には、そのテーブルで検索を行って、マスターテーブルで関連するレコードを抽出し、そこでさらにマスター側の条件で絞り込んでいる、というような動きをしているのでは。
それを踏まえて、関連レコード側の条件に、そのグローバルフィールドの相手側のフィールドに条件を設定して検索すれば、求める結果がでるのでは、と思います。
Offline
Shin 様
ありがとうございます。
ご説明で少し腑に落ちた気がします。
あとは実践で身に着けていきたいと思います。
Offline
Pages: 1
[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 553.55 KiB (Peak: 574.46 KiB) ]