Q143:関連ファイル「テーブル検索3」をすこし修正して動かしているのですが、テキストフィールドに条件を入れて曖昧検索部を複数入力してみたいと思い、現在の1つからテキスト1つ、コンボBOX1つ追加を行い、複数条件指定ができるようにしようかとテストしたところうまく動きません。
Q143-1:
貴研究所HP内のMZプラットフォーム研究会のFAQで関連ファイルがございますが、参考となりそうな関連ファイルを社内にて自習を行なっておりまして、動作が思うようにいかずつまずいてしまったので質問いたします。参考とした関連ファイルは「テーブル検索3」(「実現したい処理別」 Q&A35)です。
これをすこし修正して動かしているのですが、テキストフィールドに条件を入れて曖昧検索部を複数入力してみたいと思い、現在の1つからテキスト1つ、コンボBOX1つ追加を行い、複数条件指定ができるようにしようかとテストしたところうまく動きません。
このケースの場合では新たになにかコンポーネントを介在させないといけないでしょうか?
なるべくシンプルにしようと思ったのですがアドバイスお願いします。
一応、途中まで手を加えたファイルを添付いたします。
関連ファイル:テーブル検索4.mzax
A143-1:
「テーブル検索3」では[文字列格納変数]のメソッド「matches(String)」を使用し、行データ内に該当文字列が存在するか判定を行い、該当行を取り出しています。
「テーブル検索3」を変更し、複数の条件で検索するようにすると関連ファイル「テーブル検索4a.mzax」のようになります。
[テーブルサブセットフィルタ]に都度、選択したデータを全体データとして入れ直すという考え方です。
MZPlatformver.2.4からは[テーブルサブセットフィルタ]に
メソッド「列データの日時で行を選択する(int,Date,boolean,Date,boolean)」
「列データの数値で行を選択する(int,Number,boolean,Number,boolean)」
「列データの正規表現で行を選択する(int,String)」
「列データの文字列で行を選択する(int,String)」
が追加され、さらにテーブルデータを検索し易くなっています。
「列データの文字列で行を選択する(int,String)」では「あいまい検索」と同様の結果となります。
(関連ファイル:「テーブル検索4b.mzax」)
FAQの関連ファイルは、以前会員の方からお問い合わせがあった内容に基づいております。目的に応じて選択するメソッドや処理の内容も違ってくる場合がございますので、関連ファイルについてもお気付きの点がございましたら、お気軽にお問い合わせを頂ければ幸いです。
どうぞ今後ともよろしくお願い申し上げます。
関連ファイル:テーブル検索4a.mzax、テーブル検索4b.mzax
Q143-2:
テーブル検索4bというサンプルを送って頂きましてありがとうございます。
実はこれを参考にサンプルデータに数値項目と日付項目を加えて動作テストを行なっているのですが、どうも文字列形式の場合のようにうまく動作ができません。
<AND条件>に関して
現在日付の場合は、開始日〜終了日の指定はうまくいきますが、開始日と終了日を同じ値にするとその値と同じデータが存在していても選択をしてくれません。
数値の場合は全く駄目です。
定義方法を色々試してみましたが、煮詰まってしまいましたので、またアドバイスをいただきたいと思いメールいたしました。
サンプルファイルをご確認ください。
関連ファイル:テーブル検索4c.mzax
A143-2:
お送り頂いたファイルを拝見すると、[ボタン(AND検索)]に繋がる処理のうち6番目、「全体データを設定する(PFObjectTable)」の引数が「コンポーネント:テーブルサブセットフィルタ、メソッド/値:全体データを取得する」となっていました。
AND検索の場合、条件によってデータを絞っていくという考え方なので、選択データを[テーブルサブセットフィルタ]に入れ直しています。
全体データ:選択対象となるデータ
選択データ:行・列の選択位置を指定した後で取得できるデータ
選択データを取得した後でも、そのデータが削除されてしまったわけではなく、[テーブルサブセットフィルタ]には元のデータが全部残っています。
6番目の「全体データを設定する(PFObjectTable)」の引数を「コンポーネント:テーブルサブセットフィルタ、メソッド/値:選択データを取得する」としてお試し下さい。
Q143-3:
ご指摘の件、了解いたしました。修正し動作確認をしました。
ところで、前回のメールで、AND条件での日付検索及び数値検索の動作がおかしいと書きましたが、どのような動作結果になっているかもう少し説明を加えます。
@日付検索について
既に送ったメールで添付しているファイルをこちらのPC環境で動作させますと、サンプルテーブルには、1/21、1/22、1/23、1/24、1/30という日付が入っています。
これを検索項目へ1/21、1/30指定をした場合、5件全部ヒットします。しかし1/22、1/30と指定した時は、なぜか1/22が外れ、1/23、1/24、1/30しか選択されません。(本来は1/22も対象になるべきでは)
更に 同日指定(例えば、1/22、1/22)と指定した場合は、1/22が表示される筈が対象データとして選択されません。(コンポーネント定義は指定日付含む(TRUE指定)にしています。)
この動作は正常でしょうか。定義方法に問題ないでしょうか。
A数値検索について
現在ここを「起動しない」にしていますが、ここを起動するとデータがヒットしなくなります。(動作自体はしているようですが、対象データとして除外されているような感じです。)定義方法に問題ありますでしょうか?
A143-3:
[テーブルサブセットフィルタ]を使った処理の順番は
@全体データを設定する
A選択列/行を指定
B選択データが取得できる
という考え方です。
特に今回のAND検索では
[B選択データを取得→@全体データを設定する]を同時に一つの処理で行っている(メソッド「全体データを設定する」の引数が「選択データを取得する」)箇所があります。
途中、「全体データを設定する」の引数が違っていたのと、「列データの数値で行を選択する」を「起動しない」に設定することにより
1.@全体データを設定する(データA)
2.A選択列/行を指定
×[B選択データを取得→@全体データを設定する]
3.A選択列/行を指定
4.B選択データを取得→@全体データを設定する(データB)
×[A選択列/行を指定]
5.B選択データを取得
という具合に順番が狂ってしまい「データAに基づく選択列/行位置」で選択した「データBからの選択データ」が表示されてしまいます。
「2.」「3.」で連続して「選択列/行を指定」した形となりますが、先に指定した行位置はクリアされ、後から指定した行位置が選択されます。
全体データを入れ直しても、選択列/行を指定し直したりクリアしない限り、選択位置は残っています。
「全体データを設定する」の引数を修正して頂きましたが、さらに「列データの数値で行を選択する」の処理を「定常起動」としてお試し下さい。
Q143-4:
テーブルサブセットフィルタの動作の説明ありがとうございます。そのような動作特性があったわけですね。非常に参考になりました。
それでは、現在まだ条件内容が狂ったままだということですね。
テーブルサブセットフィルタ内を何らかのタイミングでクリアする必要があると考えますが、テーブルサブセットフィルタ内には、
選択対象列インデックスをクリアする。
選択対象行インデックスをクリアする。
という2つの機能がありますが、これを使えばいいでしょうか
条件をクリアするボタンを新たに追加して実行。
後で試してみようと思いますがこのような考え方で問題ないですか。
A143-4:
・「全体データを設定する」の引数修正
・「列データの数値で行を選択する」の処理を「定常起動」
として頂けば
1.@全体データを設定する
2.A選択列/行を指定
3.[B選択データを取得→@全体データを設定する]
4.A選択列/行を指定
5.B選択データを取得→@全体データを設定する
6.[A選択列/行を指定]
7.B選択データを取得→テーブルにデータを設定
と@ABが順番に行われ、問題はないはずです。
ただ新しく検索をする時にも以前の選択位置が残っていますので、[(検索)ボタン]に繋がる一番最後に
> 選択対象列インデックスをクリアする。
> 選択対象行インデックスをクリアする。
を入れて頂くとより良いかと思います。
全回の回答に書きましたように、「列データの数値で行を選択する」等のメソッドで選択位置を指定した時にも、選択位置は上書きされますので、@ABを順番に行うという前提で、一連の処理の途中に選択対象行/列クリアの処理は追加していません。
逆に、選択対象行/列が指定されていない状態で、「選択データを取得」しようとするとエラーが発生します。
Q143-5:
テーブルサブセットフィルタの検索動作の件、別のPCにて昨日行ってみたところ正常な動作が確認できました。
ただこれまで使っていたPC環境で同じファイルを実行すると正常な動作ができません。(列・行インデックスクリア指定有り)この場合、他に何か残っているようなのですがリセットできる方法ないでしょうか?
これとは別に表題に書きましたように、テーブルサブセットフィルタそのものの能力について確認したくメールをしました。
例えば下記の条件でこのコンポーネントを使用した際、そのレスポンスはどの程度になるかが気になっています。
MYSQLの中に数万件のデータを持つファイルを直接テーブルサブセットフィルタにSetして今回のような検索処理を行なった場合、検索ボタン押下後その待ち時間は?
又、テーブルサブセットフィルタそのものに件数制限等の有無(もしあるのなら何件位まで可能か)。
使用しているPCのハード環境にも左右される部分もあるかと思いますが、大凡どのようなものでしょうか?
A143-5:
テーブルサブセットフィルタにつきまして、以下の質問にご回答いたします。
1.PCによってテーブルサブセットフィルタが正常に動作しない
まず、正常に動作しないPCにインストールされているMZ Platformのバージョンが2.6であることをご確認ください。
バージョン2.6にて、テーブルサブセットフィルタについて
「数値指定で行選択するメソッドにおいて対象列が数値型の場合に正常に動作しない不具合」に関しまして修正がされており、今回の処理が該当する可能性が高いです。
バージョンは、アプリケーションビルダーの「ヘルプ」メニューの「バージョン情報」から、ご確認できます。
2.テーブルサブセットフィルタの能力について
あいにく、データを持ち合わせてなく、お察しのとおり、PCの性能、メモリ容量、テーブルの行数・列数等により異なるとしか申し上げられません。
当方で試した結果をご参考のためお伝えしますと、レスポンスにつきましては、お送りいただいたデータで約50,000行の場合、AND検索に2秒弱、約200,000行で8秒弱程度でした。
環境は、Windows7、Intel Core 2 Duo T9900 3.07GHz、メモリ4GB のノートPC (Sony Vaio type Z)です。
確保できるデータ件数につきましては、PCのメモリに依存するとしか申し上げられません。
当研究会といたしましては、テーブルサブセットフィルタの検索速度は遅いとはいえませんが、大量のデータの検索につきましてはデータベースの方が得意としておりますので、そちらの機能を使用していただくことを お勧めいたします。
真に必要な最小限のデータをSQL文にて検索を実行して取得し、MZ側でその最小限のデータを処理すると言う形です。
ご連絡:
質問の件、ご回答頂きましてありがとうございます。
1.の件につきまして、動作結果がNGのPC環境をよく確認したところ、2.6のセットアップはしていたのですが、いつもWindowsのスタートボタンから表示されているメニューよりMZのアイコンを指定して立ち上げており、なんと、このバージョンが2.5のままでした。
つまり2.5で操作していたことが原因でした。
気を取り直して2.6で起動し正常動作確認ができました。
2.の件了解致しました。
今後の設計及び運用面を検討していく上で参考にいたします。
ありがとうございました。
備考:「テーブルフィルタ類」の「Q&A2」にも掲載。