みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
こんにちは。
Win7でFMP11を使用しています。
・その日の商品を記録する「商品」
・商品のマスター情報(企業名、商品名、値段など)を記録した「マスター」
という2つのテーブルがあります。
・テーブル「商品」には、日付や時間の他に、マスター検索用のキーワードを一時的に入力する
「キーワード」というテキストフィールドがあります。(グローバルでは無いです)
テーブル「商品」のデータをカード表示したレイアウトを作成し、
同レイアウト内に、「マスター」のデータをポータルで表示します。
この状態からテーブル「商品」のキーワードフィールドに文字を入力すると、
マスターテーブルの商品名または企業名フィールドに同キーワードを含んだレコードのみが
ポータルの中に表示されるようにしたいのですが上手く行きません。
【試した事】
テーブル「商品」とテーブル「マスター」をXリレーションで繋げて、
ポータルのフィルタに
(PatternCount ( マスター::商品名 ; 商品::キーワード ) + PatternCount ( マスタ::企業名 ; キーワード ))>1
と設定する
【結果】
レコード数が50万件以上あるためか、処理が重すぎて砂時計アイコンが消えなかったので断念。
なにか良い方法がある方がいましたら、ご教授頂けると助かります。
よろしくお願いします。
「キーワードを含んだ」では索引が使えないので遅くなります。
キーワードを=でリレーションすれば速いです。
sorter様
ご回答ありがとうございます。
実はその方法も試したのですが、キーワードの=リレーションだと完全一致が条件になりますよね?
キーワードの文字数が長く頭にぱっと浮かぶようなものではないため
「キーワードを含んだ」の形で実現出来ないかと悩んでおります。
「キーワードを含んだ」
これは部分一致で、
前方一致ではない?
とすると相当苦しいのでは。
それと、
(PatternCount ( マスター::商品名 ; 商品::キーワード ) + PatternCount ( マスタ::企業名 ; キーワード ))>1
>1
と言うことは2以上一致していると言うことになりますが、そうでしょうか?
Offline
キーワードが最大10文字だとして、繰り返し10の計算フィールドに先頭位置をずらして切りだして索引にすれば、先頭一致でリレーションできるかな?
チポ様
前方一致だと何か方法があるのでしょうか?
>1
→「>0」でしたね。すみません。
前方一致のリレーション法があるのですが、
照合先が
企業名 or 商品名
の様な複数の値では無理ではないかな。
以前誰かが考えてたような記憶があるのですが、、
見つかりませんでした。。
一つずつ照合して、二つのポータルではダメでしょうか?
Offline
前方一致なら、例えば企業名が赤城乳業、製品名がガリガリ君なら、マスタに(スクリプトで?)
赤
赤城
赤城乳
赤城乳業
ガ
ガリ
ガリガ
ガリガリ
ガリガリ君
を作ればできますよね。
Offline
「マスター」のIDでリレーション組んで
「マスター」テーブル側で検索。
IDのリストを「商品」のリレーション用のフィールドに設定でイケると思います。
「商品」
「マスター」
を「マスター」のIDでリレーション(「マスター」にIDがなければふりましょう。)
テーブル「商品」の「キーワード」フィールドの内容を
「マスター」に投げて検索するスクリプトを組む。
検索結果のIDを「Loop」、または、「全レコード/検索条件コピー」で取得。
001
002
003
102
...
100
みたいな!
そのIDのリストを「商品」のリレーション用のフィールドに設定すれば、
検索結果がポータルに表示されます。
とか、どうでしょう!?
Offline
検索するスクリプトが索引を使えるようにしないと、ポータルフィルタと同じぐらい時間がかかると思われる。
先頭一致は範囲指定のリレーションにすれば。
Offline
#7 チポさん発案の「前方一致照合」リレーション法に、
#8 旅人さん提案の複合照合キーの「ピラミッド」分解を、
適用するのがベストかな?
なお、ピラミッド分解は計算フィールド(再帰計算式)で自動算出できるので、
スクリプトは一切不要の上、ポータル表示は俊足です。
Offline
検索でもそんなに遅くないですよ~。
検索演算子が使えるというメリットもあったりします。
ネックは、Loop でのID取得ですが、取得数を制限すれば、問題ないです。
あ~。入力補助的に使うのかとかってに思ってましたが、常時表示したいのかな~!?
※「遅くないですよ~。」が、しかし、50万件は、試したことないです。
Last edited by qb_dp (2014-07-31 00:05:55)
Offline
#11の前方一致照合リレーション法によるサンプルをアップしておきます。
●サンプル「前方一致照合リレーション.fp7」→ http://yahoo.jp/box/HhjbN6
Offline
#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
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 531.13 KiB (Peak: 552.03 KiB) ]