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

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

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

You are not logged in.

Announcement

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


#1 2018-08-01 14:09:16

まさたか
Member

部分一致でのリレーション

FileMakerpro12 Macです。
名前テーブルの名前フィールドにある値に、文字テーブルの文字フィールドにある値があれば、名前テーブルの結果フィールドに文字テーブルの対応フィールドの値を入れたいです。
以下の例では、結果フィールドに「異体字」の値を入れたいです。

■名前テーブル
名前フィールド 結果フィールド
渡邉

■文字テーブル
文字フィールド 対応フィールド
邉       異体字
辺       別字形


名前フィールドの部分一致でのリレーションと言う感じになるのか?と思いましたが、ここから検討がつかなくなりました。
いくつかの方法があるのかもしれないのですが、可能であれば新たなフィールドを増やさずにできるとありがたいです。
どなたかご存知の方がいらっしゃいましたらご指南頂ければと思います。よろしくお願いします

Offline

#2 2018-08-01 14:32:27

Hiro
Member

Re: 部分一致でのリレーション

名前の複数文字でヒットした場合の結果への代入値は?
例えば、邉﨑
・邉→異体字
・﨑→異体字
のような場合?



それと、部分一致のリレーションは、マルチキーの逆引きとなるのでかなり難しいでしょう。
代わって、ExecuteSQL を利用するのが良いかな?
   ExecuteSQL(
   "
      SELECT ""対応フィールド""
      FROM ""文字テーブル""
      WHERE ""文字フィールド"" IN ('邉','﨑')
   "
   ; ""
   ; " , "
   )

から
結果 → 異体字 , 異体字
を得る式例。

Last edited by Hiro (2018-08-01 15:31:29)

Offline

#3 2018-08-01 16:13:21

まさたか
Member

Re: 部分一致でのリレーション

Hiro wrote:

      WHERE ""文字フィールド"" IN ('邉','﨑')

Hiroさんありがとうございます。
この場合だとINの後の( )に文字を一字ずつ入力が必要になるってことですかね?

Last edited by まさたか (2018-08-01 16:13:43)

Offline

#4 2018-08-01 16:40:47

チポ
Member

Re: 部分一致でのリレーション

名前の中に、文字を指定しないで異体字か別字形があることを表示できればいいのなら、
繰返しフィールドを一つ作って部分一致リレーションでできます。


名前フィールドを繰返しフィールドに一文字ずつ分解して、
これと文字テーブルの文字フィールドとでリレーションすればいいですね。

Offline

#5 2018-08-01 18:12:24

Hiro
Member

Re: 部分一致でのリレーション

そうだ!
チポさん案の繰り返し計算(式:※下式)フィールドを照合[元]キーにしたリレーションで、
繰り返し[Lookup計算]フィールドで文字別の対応フィールド値が個別に得られますネ。

※  Middle(名前フィールド[1]; Get(計算式繰り返し位置番号); 1)

これなら、ExecuteSQLより楽かな。

それと、> 『INの後の( )に文字を一字ずつ入力が必要』
は、ループ再帰式で計算代入できます。
ただ、その具体式は、もはや必要性ないですよね!

Last edited by Hiro (2018-08-01 18:22:09)

Offline

#6 2018-08-01 21:15:25

Hiro
Member

Re: 部分一致でのリレーション

一応、他に何の設定もいらない ExecuteSQL 式の方も記しておきますネ。

● 名前「邉﨑」から結果「邉→異体字 , 﨑→異体字」を得る式例、

Let([
   $txt=名前フィールド;
   $res="";
   $fnc=
      "Case(Length($txt)=0; $res;
         Let([
            #cha=Char(39)& Left($txt;1) &Char(39);
            $res=List($res;#cha);
            $txt=Middle($txt;2;Length($txt))
         ]; Evaluate($fnc) )
      )";
   #ary=Substitute(Evaluate($fnc); [¶;","])      // 再帰計算結果「'邉','﨑'」を変数「#ary」へ格納
];
   ExecuteSQL(
   "
      SELECT ""文字フィールド"" , ""対応フィールド""
      FROM ""文字テーブル""
      WHERE ""文字フィールド"" IN ("& #ary &")
   "
   ; "→"
   ; " , "
   )
)

Offline

#7 2018-08-02 09:08:48

まさたか
Member

Re: 部分一致でのリレーション

チポさん、Hiroさんありがとうございます。
頂戴しました内容を参考に自分なりに考え一つの答えだしました

名前テーブルに該当文字フィールドを作成し、以下の計算式を設定


Let([
   #対象文字 = ExecuteSQL("SELECT \"文字\" FROM \"文字\""; ""; "")
];
  Filter(名前; #対象文字)
)

これで文字フィールドと該当文字フィールドのリレーションで、結果フィールドに対応フィールドの値を入れることができました。
ただ該当文字が2文字になると機能しないのですが・・・

Offline

#8 2018-08-02 20:45:32

Hiro
Member

Re: 部分一致でのリレーション

再帰式 と IN句 をどうしても使いたくないなら、それの代替えとしては、
繰り返し計算フィールド1つだけで、簡単に複数個別取得する方法もあります。
(繰り返し回数は、名前の最大文字数、例えば6回もありれば十分でしょう)

名前:|辺﨑 太郎|のとき、結果:|辺→別字体|﨑→異体字| | | | |
を得る式例は、

ExecuteSQL(
   "
      SELECT \"文字\" , \"対応\"
      FROM \"文字テーブル\"
      WHERE \"文字\"=?
   "
   ; "→"
   ; ""
   ; Middle(名前[1]; Get(計算式繰り返し位置番号); 1)
)


繰り返し計算フィールド1つで非常に簡単ですが、念のためサンプルもアップしておきます。
●サンプル「異体字検出.fmp12」 → https://yahoo.jp/box/w3B21N

Offline

#9 2018-08-03 09:24:53

まさたか
Member

Re: 部分一致でのリレーション

Hiroさんありがとうございます。
サンプルデータとても理解しやすくて助かります。

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: 566.48 KiB (Peak: 581.25 KiB) ]