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

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

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

You are not logged in.

Announcement

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


#1 2014-07-29 22:57:01

qq
Guest

別テーブルの内容を検索してポータルで表示したい

こんにちは。
Win7でFMP11を使用しています。


・その日の商品を記録する「商品」
・商品のマスター情報(企業名、商品名、値段など)を記録した「マスター」
という2つのテーブルがあります。

・テーブル「商品」には、日付や時間の他に、マスター検索用のキーワードを一時的に入力する
「キーワード」というテキストフィールドがあります。(グローバルでは無いです)

テーブル「商品」のデータをカード表示したレイアウトを作成し、
同レイアウト内に、「マスター」のデータをポータルで表示します。

この状態からテーブル「商品」のキーワードフィールドに文字を入力すると、
マスターテーブルの商品名または企業名フィールドに同キーワードを含んだレコードのみが
ポータルの中に表示されるようにしたいのですが上手く行きません。

【試した事】
テーブル「商品」とテーブル「マスター」をXリレーションで繋げて、
ポータルのフィルタに
(PatternCount ( マスター::商品名 ; 商品::キーワード ) + PatternCount ( マスタ::企業名 ; キーワード ))>1
と設定する

【結果】
レコード数が50万件以上あるためか、処理が重すぎて砂時計アイコンが消えなかったので断念。


なにか良い方法がある方がいましたら、ご教授頂けると助かります。

よろしくお願いします。

#2 2014-07-30 08:52:49

sorter
Guest

Re: 別テーブルの内容を検索してポータルで表示したい

「キーワードを含んだ」では索引が使えないので遅くなります。
キーワードを=でリレーションすれば速いです。

#3 2014-07-30 09:07:29

qq
Guest

Re: 別テーブルの内容を検索してポータルで表示したい

sorter様

ご回答ありがとうございます。

実はその方法も試したのですが、キーワードの=リレーションだと完全一致が条件になりますよね?
キーワードの文字数が長く頭にぱっと浮かぶようなものではないため
「キーワードを含んだ」の形で実現出来ないかと悩んでおります。

#4 2014-07-30 09:23:25

チポ
Member

Re: 別テーブルの内容を検索してポータルで表示したい

「キーワードを含んだ」

これは部分一致で、
前方一致ではない?

とすると相当苦しいのでは。


それと、

(PatternCount ( マスター::商品名 ; 商品::キーワード ) + PatternCount ( マスタ::企業名 ; キーワード ))>1

>1
と言うことは2以上一致していると言うことになりますが、そうでしょうか?

Offline

#5 2014-07-30 10:49:36

ad
Guest

Re: 別テーブルの内容を検索してポータルで表示したい

キーワードが最大10文字だとして、繰り返し10の計算フィールドに先頭位置をずらして切りだして索引にすれば、先頭一致でリレーションできるかな?

#6 2014-07-30 14:18:25

qq
Guest

Re: 別テーブルの内容を検索してポータルで表示したい

チポ様

前方一致だと何か方法があるのでしょうか?

>1
→「>0」でしたね。すみません。

#7 2014-07-30 17:49:46

チポ
Member

Re: 別テーブルの内容を検索してポータルで表示したい

前方一致のリレーション法があるのですが、
照合先が
企業名 or 商品名
の様な複数の値では無理ではないかな。


以前誰かが考えてたような記憶があるのですが、、
見つかりませんでした。。


一つずつ照合して、二つのポータルではダメでしょうか?

Offline

#8 2014-07-30 18:53:01

旅人
Member

Re: 別テーブルの内容を検索してポータルで表示したい

前方一致なら、例えば企業名が赤城乳業、製品名がガリガリ君なら、マスタに(スクリプトで?)

赤城
赤城乳
赤城乳業

ガリ
ガリガ
ガリガリ
ガリガリ君
を作ればできますよね。

Offline

#9 2014-07-30 18:54:31

qb_dp
Member

Re: 別テーブルの内容を検索してポータルで表示したい

「マスター」のIDでリレーション組んで
「マスター」テーブル側で検索。
IDのリストを「商品」のリレーション用のフィールドに設定でイケると思います。


「商品」
「マスター」
を「マスター」のIDでリレーション(「マスター」にIDがなければふりましょう。)


テーブル「商品」の「キーワード」フィールドの内容を
「マスター」に投げて検索するスクリプトを組む。

検索結果のIDを「Loop」、または、「全レコード/検索条件コピー」で取得。

001
002
003
102
...
100

みたいな!

そのIDのリストを「商品」のリレーション用のフィールドに設定すれば、
検索結果がポータルに表示されます。

とか、どうでしょう!?

Offline

#10 2014-07-30 19:27:42

wader
Member

Re: 別テーブルの内容を検索してポータルで表示したい

検索するスクリプトが索引を使えるようにしないと、ポータルフィルタと同じぐらい時間がかかると思われる。

先頭一致は範囲指定のリレーションにすれば。

Offline

#11 2014-07-30 20:39:52

Hiro
Member

Re: 別テーブルの内容を検索してポータルで表示したい

#7 チポさん発案の「前方一致照合」リレーション法に、
#8 旅人さん提案の複合照合キーの「ピラミッド」分解を、
適用するのがベストかな?

なお、ピラミッド分解は計算フィールド(再帰計算式)で自動算出できるので、
スクリプトは一切不要の上、ポータル表示は俊足です。

Offline

#12 2014-07-31 00:03:24

qb_dp
Member

Re: 別テーブルの内容を検索してポータルで表示したい

検索でもそんなに遅くないですよ~。
検索演算子が使えるというメリットもあったりします。

ネックは、Loop でのID取得ですが、取得数を制限すれば、問題ないです。

あ~。入力補助的に使うのかとかってに思ってましたが、常時表示したいのかな~!?

※「遅くないですよ~。」が、しかし、50万件は、試したことないです。

Last edited by qb_dp (2014-07-31 00:05:55)

Offline

#13 2014-07-31 03:08:55

Hiro
Member

Re: 別テーブルの内容を検索してポータルで表示したい

#11の前方一致照合リレーション法によるサンプルをアップしておきます。

●サンプル「前方一致照合リレーション.fp7」→ http://yahoo.jp/box/HhjbN6

Offline

#14 2014-08-04 13:04:59

Hiro
Member

Re: 別テーブルの内容を検索してポータルで表示したい

Hiro wrote:

#11の前方一致照合リレーション法によるサンプルをアップしておきます。

●サンプル「前方一致照合リレーション.fp7」→ http://yahoo.jp/box/HhjbN6

【修正報告 2014/8/4 13:4】
より面倒な「部分一致」照合リレーション法で作ってしまっていました。
サンプルをより軽快な「前方一致」照合リレーションに作り直して上書きアップしました。
済みませんが、前作と差替えてください。

なお、複数照合キーのピラミッド分解する計算式は、
Let([
  $fnc="Case(
    IsEmpty($txt); $res;
    Let([$res=List($txt;$res);$txt=Left($txt;Length($txt)-1)]; Evaluate($fnc))
   )"
];
  List(
    Let([$txt=企業名;$res=""]; Evaluate($fnc));
    Let([$txt=製品名;$res=""]; Evaluate($fnc))
  )
)

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 531.13 KiB (Peak: 552.03 KiB) ]