みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
以下のように、テーブル「除外果物」で設定されている値を参照して
テーブル「商品名」の中に、参照文字が入っていれば、計算結果に「1」と点灯させたいのですが、どうすればいいでしょうか?
PatternCount関数を使いましたが、参照元の値を全て参照できず機能しません。
よろしくお願いします。
■テーブル「除外果物」
りんご
みかん
いちご
■テーブル「商品名」
商品名 計算結果
青森りんご 1
東京かき 0
鳥取いちご 1
環境は、FM14 Winです。
データ次第で膨大な計算になるので、基本機能では不可能でしょう。
スクリプトで商品名の入力時に計算するか、カスタム関数を作る。
「部分一致照合」のリレーションを組むのが良さそう。
Offline
Hiroさん
具体的にどのようにすればいいのでしょうか?
チポさん発案の手法なのですが、過去ログに無かったかしら?
まず「前方一致」のリレーションの仕組みを習得して、
その仕組みを拡張すると「部分一致」のリレーションを実現できます。
チポさんお留守かしら?
Offline
Hiroさん
ありがとうございます。
https://fm-aid.com/bbs2/viewtopic.php?id=1911
など拝見しました。
ピラミッドキーを拝見しました。
しかしながら、途中で文字が入った場合に検索されません。
テーブル「除外果物」毎にスクリプトで値を入れるしかないでしょうか?
自動計算で構成できますよ。
ただ今日はあいにく忙しいので、どなたかにホロー頂くか、仕組みを自習されて下さいますか。
前方一致リレーションについては、以下スレッドのサンプルでも実装しています。
https://fm-aid.com/bbs2/viewtopic.php?pid=24907#p24907
Offline
Hiroさん
ありがとうございます。自習していますが、いと口がつかめていません。。
時間ができましたら宜しくお願いします。
前方一致はできたのですが、部分一致ができません。宜しくお願いします。
ちょっと違う手法での解法です。
1商品毎に繰り返しフィールドで計算させ、それを合算しています。
https://www.dropbox.com/s/61dfvr5pjcl5e … 7.zip?dl=0
ただ、商品名に、山梨きいちご という物が入ると、誤動作します。その対応も今後必要かも。
前方一致でのリレーションでの計算を完全に理解していませんが、この事例のように、キーワードの前方や後方に文字が付加される場合も考えると、対象が非常に大きく拡張されますが、それはどうされているのでしょうか。
Offline
Shinさんありがとうございます。
以下に私の理解を書きました。間違っていればご指摘ください。
■g_商品名=
GetValue (
ValueListItems ( Get ( ファイル名 ) ; "商品一覧" ) ;
Get ( 計算式繰り返し位置番号 )
)
これは、値一覧の値を横リスト表示させている。わかりやすくして頂くために配置していただいたもので
今回の目的には必要無い
■商品名_ =
PatternCount ( 商品名[1] ; g_商品名 )
これが今回必要な式。 商品名[1]の[1]は、何のために必要なのでしょうか?
これを書くとどのような効果があるのでしょうか?
また、私は、■g_商品名 は説明のために配置していただいたと理解しましたが、
繰り返しフィールドを使っていただいているので、計算上必要だったのでしょうか?
Shimさん
お返事と質問をさせてください。
>商品名に、山梨きいちご という物が入ると、誤動作します。
→ これは、なぜ、こうなるのでしょうか?
>前方一致でのリレーションでの計算を完全に理解していませんが、この事例のように、キーワードの前方や後方に文字が付加される場合も考えると、
>対象が非常に大きく拡張されますが、それはどうされているのでしょうか。
→ 出来ていると思い試してみましたがダメでした。
以上、宜しくお願いします。
Shinさん
試してみました。するとうまくいきました!ありがとうございます!
でも、計算に時間がかかりますね。
やはりスクリプトで一括で計算させた方がいいように思えました。
要するに、
PattercOunt ( 商品名 ; "りんご" ) + PattercOunt ( 商品名 ; "みかん" ) + PattercOunt ( 商品名 ; "いちご" )
を計算させているのです。3項目くらいでしたらこのままの式で計算フィールドにしたらいいのですが、項目名が数十にもなると書ききれなくなりますね。それを項目毎に展開して計算させています。
サンプルでは、最低限のフィールド構成で、不要な物は無いです。
繰り返しフィールドの中の [1] は、繰り返しフィールドの繰り返し位置1のフィールドを参照する、という意味で、繰り返しでないフィールドを参照する時には必要です。
数のカウントに PatternCount() を使っているので、PatternCount ( "山梨きいちご" ; "いちご" ) は、0となってほしいはずですが、1とカウントしてしまいます。これは、部分一致参照を行っても起こる問題で、対応は結構めんどうです。
計算に時間がかかるとは、どの程度の規模のテーブルですか。スクリプトや全置換で行うのと比べても、こちらの方が早いはずですが。表示を早くしたければ、商品名と結果フィールドのみのレイアウトを作ってください。
Last edited by Shin (2016-01-24 18:20:11)
Offline
ありがとうございます。
参照先は100−300ですので、繰り返しを300に設定しました。
その成果、表示させたい画面では遅く時計が回ります。
計算結果しかだしてないのですが??
何か勘違いしているでしょうか?
参照先とは何をさしていますか。
Offline
今回の例でいえば、
■テーブル「除外果物」
にあたります。これが、100−300あります。
■テーブル「商品名」
も実際は、10万ー30万あります。
①loop処理
国と商品名で検索し、全置換で除外フラグ「商品名」に数字「1」を挿入
②対象レコードのみ全置換処理
これでスクリプトをしましたが、やはり遅いですね。。。
#9 > 前方一致はできたのですが、部分一致ができません。宜しくお願いします。
数年以上前の古い.fp7時代のサンプルが公開してありましたので、取り敢えず「部分一致」の組み方をご覧ください。
それをご覧頂き、不明な点などお再度尋ねくださいますか。
「部分一致照合.fp7」.zip → http://yahoo.jp/box/7e9K5g
Offline
呼ばれた様ですが、、
昨日はおつきあいの旅行で一日飲んだくれていました@@;;
Hiroさんがサンプルをアップしていますので、出る幕はないかと。。
レコード数が多いので、
照合用に分解するフィールド分のサイズアップが大きくなるでしょうね。
それと、
発案時の考え方と照合の向きが逆になるので、検証を十分行ってください。
Offline
結果の値を使うとき(検索)の遅さが問題になるのでは?
計算フィールドにすると結果が保存されないので、毎回表示や検索するたびに計算が発生します。
繰り返しを使うと、実際のレコード数と関係なく設定した繰り返し数の計算が発生します。100~300というのが意味不明ですが、「除外」のテーブルが複数あるんですかね。
保存するような計算式にもできますが、「除外」が編集された場合に全レコードを再計算する必要があります。
#10 > 発案時の考え方と照合の向きが逆になるので、検証を十分行ってください。
あぁ!「逆向・部分一致」照合は論理的にダメですね。残念!
ORキーの「前方一致」照合が論理成立しないのと同じことでした。
Offline
「除外果物」が、100−300あり、それがある程度固定されているのでしたら、g_商品名 をグローバルの計算フィールドに変更すると、計算は格段に速くなります。
除外果物が頻繁に変更されるのでしたら、この方法も取れません。
リレーションを使った方法でも相当の時間がかかると思います。
スクリプトで除外果物毎に300回検索した方が早いかもしれない。
Last edited by Shin (2016-01-25 13:41:02)
Offline
> Hiroさん
いや、
照合の有無は分かりますよ。
Last edited by チポ (2016-01-25 13:40:42)
Offline
ああ、ダメか。
ORで照合ですものね。。
前にも同じ間違いをHiroさんに指摘されたような。
同じ間違いを犯すボケです *_*
Offline
[ Generated in 0.007 seconds, 7 queries executed - Memory usage: 570.64 KiB (Peak: 591.55 KiB) ]