初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2022-12-15 13:23:56

Valon
Member

グローバルフィールドのリレーション

お世話になっております。
環境: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

#2 2022-12-15 14:01:29

チポ
Member

Re: グローバルフィールドのリレーション

> 目的:テーブルBに、マスタCのテキストと、マスタDのテキストを呼びたい
なのに、テーブルAを間に介しているのが分かりません。

また、このリレーションも理解できません。
テーブルA::Code = マスタC::Code
and
テーブルA::GloblField = マスタC::ID

もう少し具体的な説明が必要かと。。

Last edited by チポ (2022-12-15 14:01:57)

Offline

#3 2022-12-15 14:19:56

Valon
Member

Re: グローバルフィールドのリレーション

チポ様、ありがとうございます。


テーブルAはユーザーが操作しており、置換等のスクリプトとの競合を避けたり、データ量が莫大であるために
テーブルBをエクスポート専用のユーザー不可視テーブルとしております。構造が回りくどく見えるかもしれませんがご承知ください。
作業用の不可視テーブルが他にも複数あり、それぞれからマスタへのリレーションを張ると、リレーションが多量で複雑になるためこのようにしております。

マスタCには
Code:AAA
ID:001

Code:AAA
ID:002

といったCodeだけでリレーションを張れない理由があります。

テーブルBで作業する際に、テーブルAのGlobal_Fieldを入れ替えることでマスタC、マスタDから任意のテキストを持ってきたいと考えております。
よろしくお願いいたします。

Offline

#4 2022-12-15 14:39:47

チポ
Member

Re: グローバルフィールドのリレーション

説明は了解しました、

しかし
> マスタCへの参照が思うようにいきません
この理由は書かれた説明では分かりません。

CodeとIDが一致すれば照合できますよね。。

Offline

#5 2022-12-15 15:01:13

Valon
Member

Re: グローバルフィールドのリレーション

チポ様

はい・・・ 照合できると思って組んでみたらできないので、今回お聞きしてみました。

テーブルBのレイアウトに、マスタCの全フィールドを置いていろいろな動きを試したところ
Codeに「*」検索では、IDが加味されず結果が返されましたが、
適したIDで検索した結果、思うような結果が得られました。

(グローバルフィールドを使用した?)リレーションの理解が全く足りていないと痛感しました。
もっと自分で色々試してから質問すべきでした。

ありがとうございました。

Offline

#6 2022-12-17 11:33:22

Shin
Member

Re: グローバルフィールドのリレーション

この形のリレーションをよく使っていますが、問題なく参照できるはずです。
ただし、リレーション先の孫リレーションですので、孫リレーションは、それぞれの先頭レコードのみが対象になります。
孫リレーションの対象レコードを全て表示させたいのでしたら、直接リレーションをはります。

かなり特殊な構造ですが、具体的に何を管理されているのですか。

Last edited by Shin (2022-12-17 14:16:34)

Offline

#7 2022-12-20 09:37:56

Valon
Member

Re: グローバルフィールドのリレーション

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

#8 2022-12-20 10:05:31

himadanee
Guest

Re: グローバルフィールドのリレーション

「テーブルBレイアウトで検索」であれば、HITしたかどうかはテーブルBのレコードで判定しますから、「レコード1~3がHIT」「レコード3のみHIT」というのは意味がないです。
「テーブルBには、Code AAA、BBBが存在。」の状態から検索結果に出てくるのは、CodeAAAとBBBのそれぞれがHITするかしないかだけです。

「マスタC、マスタDから任意のテキストを持ってきたい」というのと、「テーブルBレイアウトで検索」とでは、全然操作に関連がないと思いますが...

#9 2022-12-20 10:40:30

Valon
Member

Re: グローバルフィールドのリレーション

himadanee 様

流れを書いていないため、操作に関連がなさそうに見えますね。申し訳ございません。

テーブルBに10000レコードあり、うちマスタCに存在する関連レコードが500件を全置換したい場合
テーブルB上で、500に絞ってから全置換した方が早いためです。(検証済み)

この全置換にマスタCの情報をつかう(任意のテキストを持ってくる)ということです。

Last edited by Valon (2022-12-20 10:43:35)

Offline

#10 2022-12-20 21:30:36

himadanee
Guest

Re: グローバルフィールドのリレーション

う~ん、わかりません。置換するのはBとCどっちなんですか?

思ったようにいかないというのは、Aのグローバルフィールドを使ってるから逆方向(CからAの関連レコード)は参照できないのが原因かもしれません。

FM6以前での話ですが、関連フィールドを使った検索は非常に遅かったので、関連テーブル側で検索してから関連レコードに移動、ということをやってました。
このリレーションではそういうことはできませんね。(Bを絞り込むのにCで検索してから関連レコードへ移動、は不可能)

と思ってテストしてみたら、逆方向の場合「参照できない」ではなくグローバルフィールドの条件は無視されてますね...こんなものだったかなあ?
自分では複数フィールドのリレーションで片方だけグローバルというのは今までやった記憶がありませんが...

#11 2022-12-21 08:34:23

Valon
Member

Re: グローバルフィールドのリレーション

himadanee 様

置換を行うのはテーブルBです。マスタCでも置換を試しましたがうまく動きませんでした。
(共にテーブルBがフォーカスされている場合)

そうなんです。グローバルフィールドの条件は無視されていると思います。 #1で書きました。
ここが私の認識違いなのか、仕様なのか知りたいという質問でもありました。

Offline

#12 2022-12-21 09:45:38

himadanee
Guest

Re: グローバルフィールドのリレーション

#1だとBとCの間にAが入ってるのですが、もっと単純にAとCだけでやった場合に、
CをAのレイアウトのポータルに表示してポータル内で検索すると、ポータル内に存在しない値で検索してもHITしてしまうので、自分としてはバグのように思います。

リレーショングラフでグローバルフィールドのところは
https://help.claris.com/ja/pro-help/con … graph.html
「結合ができないことを示します。たとえば、照合フィールドが欠如している、または索引未設定フィールド (非保存の計算フィールドまたはグローバルフィールド)、またはインジケータに最も近いテーブルが欠如しているか利用できない場合などです。」
になってるわけですが、複数フィールドのリレーションは条件がANDとして定義されてるはずなので「参照できないものは無視する」というのは変ですよね?

なんと?単数フィールドのリレーションでもメイン側がグローバルだとポータル側でポータル内にない値で検索してもHITになってしまいますね???
これはFM11があったので実験してみましたが、同じでした。前からこうだったみたいです。
メイン側がグローバルフィールドだけの場合、関連レコードといっても「そのレコードの」関連レコードではない(全レコードで同じ)なので、検索条件として意味がないのは確かです。

#13 2022-12-21 11:16:07

Shin
Member

Re: グローバルフィールドのリレーション

関連テーブルを検索する時には、そのテーブルで検索を行って、マスターテーブルで関連するレコードを抽出し、そこでさらにマスター側の条件で絞り込んでいる、というような動きをしているのでは。
それを踏まえて、関連レコード側の条件に、そのグローバルフィールドの相手側のフィールドに条件を設定して検索すれば、求める結果がでるのでは、と思います。

Offline

#14 2022-12-22 08:53:23

Valon
Member

Re: グローバルフィールドのリレーション

Shin 様

ありがとうございます。
ご説明で少し腑に落ちた気がします。

あとは実践で身に着けていきたいと思います。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 553.75 KiB (Peak: 574.66 KiB) ]