9 返信 最新の回答 日時: Mar 24, 2009 4:43 AM ユーザー:user6776

    インクリメンタルサーチの方法(FileMaker10)

    d.o

      タイトル

      インクリメンタルサーチの方法(FileMaker10)

      フォーラムに投稿

      みなさんこんにちは

       

      FileMaker10になってスクリプトトリガが搭載されましたね。これを使ってインクリメンタルサーチを作ってみたいと思います。ネットでも記事を見つけました

       

      http://ascii.jp/elem/000/000/211/211384/index-2.html

       

      さて、実際にやった方法ですが新しく以下のフィールドを追加します

      フラグ用のフィールド フィールドAとします

      フラグ用のフィールドとリレーションさせるためのグローバルフィールド フィールドBとします

      検索したい文字列を入れるグローバルフィールド フィールドCとします

       

      フィールドAとフィールドBをリレーションでつなぎます。フィールドBには1を入力しておきます。

      レイアウトにポータルとフィールドCをおきます。ポータルではリレーションでつながったレコードが表示されるようにします。スクリプトトリガでフィールドCの値が変更されたらスクリプトを実行します。

      スクリプトでは...

      フィールドAの値を全置換でリセット(0とする)してから、検索したい文字列を使って検索をかけます。検索で対象となったレコードに全置換でフィールドAの値を1にします。

      これでポータルに対象のレコードだけが表示されます。

      本当は、検索結果が0件だった場合の処理とか、検索フィールドを空っぽに変更した場合なんかでいろいろと処理を追加しないとダメです。

       

      この方法でスタンドアーロンで使う場合はうまくいきます。

      問題はネットワークで共有しているデータベースです。複数のクライアントが同時に使用するとおかしなことになりますよね。

       

      ネットワークで共有しているデータベースでもインクリメンタルサーチを実現するには?

      みなさまのお知恵をお貸しください。 

        • 1. Re: インクリメンタルサーチの方法(FileMaker10)
          Hiro
            

          原因は「フラグ」「全値置換」なので、これらを使わなくとも済む方法にすると良いでしょう。

          それには「前方一致」条件で照合するリレーションを利用します。

          以下のBBS[12900]番レスを参考ください。

          http://www.russ.jp/stepbbs/step.cgi?mode=view&no=12792&key=12900

          • 2. Re: インクリメンタルサーチの方法(FileMaker10)
            d.o
              

            Hiroさん

            レスありがとうございます。

             

            教えていただいた方法だとFileMaker10以前(つまりスクリプトトリガを使用しなくても) でも実現できていいのですが...。

            検索したい値が漢字を含むような場合はいまいちですね。これって文字列を辞書式に比較ってことになるんでしょうが、漢字の場合は文字コード順だと思うので必ずしも読み順にはなりませんよね。

            この辺はもう少し考えないといけないですね。

             

            私のやった方法だとウェブの検索みたいにスペースを入れてアンド検索になるんで良いんですけど..。

            また考えてみます。他のアイデアがあったらアドバイスお願いします。 

            • 3. Re: インクリメンタルサーチの方法(FileMaker10)
              Hiro
                 不等号式の演算は、漢字でも音順でなく文字コード番号順で比較しているので全く問題ありません。
              ユニコード表から、日本語で使用される最大文字コード番号の漢字をコピぺすればOKです。
              例えば:  龥(#40869)
              http://www.tamasoft.co.jp/ja/general-info/unicode-decimal.html

              • 4. Re: インクリメンタルサーチの方法(FileMaker10)
                d.o
                  

                Hiro様

                 

                すみません書き方がわるかったようです。

                 

                どちらかといえば音順で検索出来た方が良いのです。

                まえの書き込みの「辞書式に」の部分が余計でした。 

                 

                とりあえず実験してみました。

                最大値とするフィールドに教えていただいた「」をいれました。

                入力用のフィールドに何か文字列をいれるとポータルに候補が表示されました。 やり方が悪いのかもしれませんが...この方法だと、コード順に並べたときに、入力用のフィールドにいれた文字列と最大値とするフィールドに入っている文字列の間に来るもの全てがポータルに表示されてしまいます(で良いですよね?もしかしてやり方がわるいですか?)。余計な候補が多すぎて絞り込まれた感じがしませんね。

                 

                漢字での検索をあきらめてフリガナを使用してみました。

                フリガナでの検索の場合良い感じになります。漢字の場合と同様にリストアップは大量にされますが、狙ったものがポータルで上の方に来るので良いです。

                 

                この方法は「フリガナ」や「商品コード」の検索に良いですね。

                 

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

                に D-O により編集されました
                • 5. Re: インクリメンタルサーチの方法(FileMaker10)
                  d.o
                    

                  自分で別の方法も検討してみました。

                   

                  検索したいフィールド(フィールドAとします)とは別に1つ計算フィールドを設けます 

                  計算式は

                   

                  Left(Extend ( フィールドA );Get ( 計算式繰り返し位置番号 )) 

                   

                  計算式の結果はテキストで繰り返し回数は検索に使用する最大の文字数を指定します。例えば8文字目までをつかって検索したい場合は8ですね。

                   

                  この計算フィールドと検索文字を入れるフィールドをリレーションでつなぐとインクリメンタルサーチっぽくなります。

                   

                  例えばフィールドAの内容が「あいうえお」のレコードがあったとすると、計算フィールドの結果は

                  あい

                  あいう

                  あいうえ

                  あいうえお

                  あいうえお

                  あいうえお

                  あいうえお

                  となります。

                   

                  フィールドAの値がそれぞれ

                  あいうえお

                  あいかかか

                  あいうかか

                  あいうえか

                  となっている4つのレコードがあった場合

                  検索文字列が..

                  あい→全部表示

                  あいう→あいうえお、あいうかか、あいうえか が表示

                  あいうえ→あいうえお、あいうえか が表示

                  あいうえお→あいうえお だけ表示

                   

                  となります。 絞り込まれていく雰囲気がインクリメンタルサーチっぽいですよね。

                   

                  「ぽい」と書いたのは、例えば上の例で検索文字を「うえ」と入れても何も表示されません。一般的なインクリメンタルサーチの場合は「うえ」に対して「あいうえお、あいうえか」の2つはかかると思います。ですからちょっと違うかな..。ちょっとまだ違うのですが実用的になってきました。 

                   

                  あと気になっているのは...これってVer10じゃ無くても良いですよね?「10になって出来るようになった」って記事は何だったんだろう?

                   

                  • 6. Re: インクリメンタルサーチの方法(FileMaker10)
                    Hiro
                      

                    > 自分で別の方法も検討してみました。

                    これは基本的に、FM7以前に不等号式のリレーションが組めなかった時代の手法です。

                    今は、先にご案内した「前方一致照合リレーション」法が最善の方法と信じます。

                    この方法では、わざわざ1語づつピラミッド文字列分解を書き出す必要はなく、

                    単にこの「前方一致」リレーション1っ本だけで動的なインクリメント照合が可能です。

                     

                    > これってVer10じゃ無くても良いですよね?「10になって出来るようになった」って記事は何だったんだろう?

                    記事は読んでませんが、

                    上記とv10新機能スクリプトトリガとのコンピ使いで初めて、完全なインクリメンタルサーチが可能となった、という意味かと?

                    (以前は1語ごと手動で入力値確定する必要があり、擬似的インクラ検索しか出来ませんでした。)

                     

                    > 「ぽい」と書いたのは、例えば上の例で検索文字を「うえ」と入れても何も表示されません。一般的なインクリメンタルサーチの場合は「うえ」に対して「あいうえお、あいうえか」の2つはかかると思います。ですからちょっと違うかな..。

                    「部分一致」のインクリメンタルサーチは、まだ見たことがありません。

                    インクリメンタルサーチの本家 Google Sujest でも「前方一致」ですし、これが一般的でしょう。

                    • 7. Re: インクリメンタルサーチの方法(FileMaker10)
                      d.o
                        

                      Hiroさん

                      いつもありがとうございます。

                       

                      >今は、先にご案内した「前方一致照合リレーション」法が最善の方法と信じます。 

                      どうやら私が勘違いしていたようです。

                      もう一度先に示していただいたスレッドを確認したところ

                      >入力用&"ZZZ"(この"ZZZ"は実際に使われることの無い以上に「Z」を繰り返します) 

                      の部分を間違えて理解していたようです。

                      慌てて斜め読みだったもので... 

                       

                      というわけで設定をやり直したところうまく動作させる事が出来ました。 

                      何度もレスいただきありがとうございました。 

                       

                       >(以前は1語ごと手動で入力値確定する必要があり、擬似的インクラ検索しか出来ませんでした。)

                      確かに、フィールドの値を確定させないと絞り込まれないからちょっと面倒ですね。スクリプトトリガなら文字が入力されるたびに処理させられるから良いですよね。 

                       

                       

                      >「部分一致」のインクリメンタルサーチは、まだ見たことがありません。

                      >インクリメンタルサーチの本家 Google Sujest でも「前方一致」ですし、これが一般的でしょう。

                      勘違いだったらすいません

                      Macを使っているのですがiTunesやiPhoto、Bentoといったソフトでは部分一致で検索されます。検索したい項目を曖昧にしか覚えていない場合、適当な単語で絞りこめて良いんですよね。

                       

                      Bentoで可能ならFileMakerでも可能にならないもんでしょうか?>FileMakerさん 

                       

                       

                      • 8. Re: インクリメンタルサーチの方法(FileMaker10)
                        Hiro
                          

                        やはり負荷やスピード面などからも「前方一致.bw.」のインクラ検索が一般的かと思いますが、

                        もしどうしても「含む.cn.」検索(あまりインクラ検索とは思えない)を実装したいのであれば、

                        そのようなリレーションを組めば実装自体可能は可能です(PatternCount関数でフラグを立てこれを照合キーに当てる方法で)。しかし、動的即応のためこのフラグは索引を取るわけに行きませんから、レコード数が増えてくるとスピードが著しく低下しますので、実用性は取り扱いレコード数と相談です。

                        • 9. Re: インクリメンタルサーチの方法(FileMaker10)
                          user6776
                            
                          リレーションを使わないタイプの方法です。 
                           
                          イベント:OnObjectModify
                          を検索文字列が入るグローバルフィールドに設定する。
                          これで、文字が入力される度にスクリプトが起動する。

                          この時のレイアウトはリスト形式で、グローバルフィールドはヘッダ部分にあるとそれっぽいかと。

                          スクリプト内で、入力された文字で検索。
                          この時の検索条件で、前方一致や部分一致をお好みで指定したらいいかと。
                          「うえ*」とか「*うえ*」とか。
                          そうすると、文字を入力される度にレコードが絞り込むように見えます。
                          検索後、検索用のグローバルフィールドにカーソルを戻すとそれっぽいです。


                          さらに特定のフィールドに限らず検索出来るように発展すると。。。
                          改行区切りで検索用にフィールドを作るのもいいです。
                          ですが、せっかくVer10から「フィールドを名前で設定」というスクリプトが増えたので、
                          デザイン関数を使って現レイアウト上にあるフィールドを取得。
                          改行区切りで得られると思うので、分解してループを回して、or検索で全てのフィールドに対して検索条件が入るようにする。
                          検索時に、レイアウトに配置されているフィールド数分検索条件が発生します。
                          そうすると移植しやすいインクリメントサーチスクリプトが出来ると思います。

                          ポータルで実現するには検索結果のユニークな値をポータルの表示キーとなるフィールドに改行区切りで入れてやればできそうですね。

                          この方法であればネットワークで共有しているデータベースでも問題ないかと。
                          ただ、レコード数が多いと負荷が大きくかかりそう。