「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:4
昨日:0
総数:10081
現在:4


フォームベースの検索・絞込み

ページOpenOffice.org FAQの登録ページ
投稿者M.Kamataki
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2008-04-16 20:25:45 (水)
OSAll
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

Accessでは、テキストボックス、コンボボックスなどを非連結コントロールとして配置し、入力された値をもとにフォームに表示されたレコードの検索・絞込みができます。Baseではどのように実現したらよいでしょう。


コンボボックスを使った絞込み

M.Kamataki (2008-04-16 20:57:51 (水))

http://www.pitonyak.org/database/AndrewBase.pdf
の47ページで紹介されたマクロを参考にサンプルを作成してみました。以下をお試しください。2.3以降のBaseで実行するためには、オプションの「マクロのセキュリティ」を適切に変更する必要があります。

filebusiness_sample3.odb

下図のように「T_売上」テーブルは日付順に店舗ごとの売上データが格納されています。

faq4_976_01.png

フォームでは、店名フィールドをもとにしたコンボボックスを新たに設置し、下図のように店名フィールドに入力されたデータをもとにレコードを絞り込むことができます。フォームナビデータの「フィルタまたは並べ替えの解除」ボタン(下図の赤丸部分)をクリックすればフィルタを解除できます。

faq4_976_02.png

このフォームは、コンボボックスのイベント「テキストを変更した時」に、以下のマクロを割り当てています。

Sub NewTitleSelected(oEvent)
Dim oForm
oForm = oEvent.Source.getModel().getParent()
oForm.Filter = """店名""='" & oEvent.Source.getText() & "'"
oForm.ApplyFilter = True
oForm.reload()
End Sub

http://www.pitonyak.org/database/AndrewBase.pdf
をご覧いただければわかりますが、上記のコードは紹介されたものを「T_売上」テーブルにあわせただけです。

上記のコードは、
oFormがフォーム内容の読み込み(かな)
oForm.Filterがフィルタ条件の指定
oForm.ApplyFilterがフィルタの適用(Trueが適用、Falseが非適用)
oForm.reload()でフォーム上のデータがフィルタ適用のものに変わる
となります。なお、oForm.Orderというパラメータもあり、並べ替えフィールドの指定もできるようです。

このサンプルではコンボボックスを用いていますが、テキストボックスでもフィルタが適用されるのを確認しました。テキストボックスと「検索」ボタンの組み合わせで、フォームベースの検索もできそうです。

わたしが調べたのはとりあえずここまで。できれば、皆さんにテキストボックスによる検索フォームの作成に挑戦していただきたいと思います。

挑戦してみよう

はにゃ? (2008-04-30 01:26:33 (水))

検索に挑戦してみてくださいとのことなので、試してみました。

fileT_売り上げフォーム(簡素な検索).odt

上記の business_sample3.odb のコンボボックスによるフィルタフォームを改変したものです。データソースに登録する、またはフォームのデータに指定する必要があります。

検索はひどく簡素なもので、一つずつレコードを進めていきつつ指定したフィールドの文字列データに検索文字列が含まれているかどうかを調べています。(InStr(..) > 0 としているので部分一致)

検索用のメソッドなどが見当たらなかったためソースコードを見たところ、検索は API 関数から利用できそうにありませんでした (双眼鏡ボタンによる検索)。また、内部での検索も一つずつレコードをめくって一致するかどうか確認しているようです。

次の課題は、フィールドのタイプによって文字列以外の数値で比較 (>, >=, <, <=, = など) できるようにといったとこでしょうか。

挑戦ありがとう

M.Kamataki (2008-05-01 09:50:16 (木))

なかなか良い感じですね。はにゃ?さん、ありがとうございます。

Baseの持つ検索機能は遅いですね。ちょっと考えて見ます。

Re: 遅い

はにゃ? (2008-05-01 14:58:28 (木))

フォームのフィールドが next ごとに更新されるために遅いようです。
今のフォームから createResultSet で同じレコードを含む ResultSet が取得できるようなので、そっちで検索してから元のフォームに反映するように変更してみました。

fileT_売り上げフォーム(簡素な検索)2.odt

更新が減った分早くなったでしょうか…。

早くなってます

M.Kamataki (2008-05-01 18:03:48 (木))

レコードは全部で5003件あります。4900件目からヒットしないキーワードを設定して「検索」ボタンをクリックしたところ、最初のバージョンが11、2秒、改善バージョンが5、6秒となりました。

あと書き忘れましたが、Writerのフォームはプロパティで「読み取り専用」にしておくと良いと思います。

フィルタによる検索

M.Kamataki (2008-05-01 22:45:56 (木))

>Baseの持つ検索機能は遅いですね。ちょっと考えて見ます。
ということでフィルタによる検索に書き換えてみました。

fileT_売り上げフォーム(入力フォームでフィルタ).odt

例えば店名が「北町店」というレコードを追加します。検索文字列を「北町店」、検索フィールドを店名にすると、ID「5004」のレコードをほんの一瞬で表示します。これはBaseの検索機能よりもSQLを使った絞込みのほうが速度的に有利なのだと思います。DBならやはりこちらの方法でしょうか。また、これでAccessの[forms]![フォーム名]![コントロール名]の代替え[※]になるのではと思います。

なお、検索文字列の入力フォームがテキストフィールドのため適した検索フィールドもテキスト型になります。リストボックスで選択できるフィールドはテキスト型の2種類だけにしました。

加えて初期フィルタも ID=0 として加えてあります。これはWriterフォームなので、フィルタを加えたら単に保存するだけです。そしてファイルの属性を「読み取り専用」にします。これで少しWriterフォームの起動が早くなるのではと期待しています。

faq/4/788「[forms]![フォーム名]![コントロール名]の書式代替について」

フィルタによる検索+数値比較

はにゃ? (2008-05-02 02:26:46 (金))

フィルタで絞り込む検索は早くていいですね。

せっかくテキストのみに制限されているものを数値を比較演算子でフィルタできるようにいじってみました。

fileT_売り上げフォーム(入力フォームでフィルタ+数値比較).odt

数値らしきフィールド NUMERIC や INTEGER などなどといったときに比較演算子をフィルタに入るようにしてみました。フィールドタイプが文字列の時には比較演算子のリストは無効化されます。また、フィールドが数値などの場合でも比較演算子が空の時にはテキストと同じフィルタになります。フィールドのデータタイプを取得する例ということで…。

書式設定されたフィールドでテキストと数値をフォーマット制限すればいいかなと思って試したのですが、書式を "@" にしても文字列が拒否されたのでやめました。あと、日付の比較がよく分からなかったのでいれてません。
数値比較のときに数字以外の文字が混じっているとヒットするレコードがゼロになりますが、フィルタ文字列は SQL 文みたいなので、他の文字も含めてチェックが必要でしょう。

データベースをさっぱり利用しない私はここまでで。

フォームが使いやすく

M.Kamataki (2008-05-03 11:46:59 (土))

なりましたね。ありがとうございます。

日付はDBのデータ型、Basicのデータ型を適切に扱う必要があったはず。こちらはtaniさんにでも。お暇な時に。 :)

お名前:
題名:


添付ファイル: fileT_売り上げフォーム(入力フォームでフィルタ+数値比較).odt 2756件 [詳細] fileT_売り上げフォーム(入力フォームでフィルタ).odt 3197件 [詳細] fileT_売り上げフォーム(簡素な検索)2.odt 2703件 [詳細] fileT_売り上げフォーム(簡素な検索).odt 3912件 [詳細] filefaq4_976_02.png 1003件 [詳細] filefaq4_976_01.png 988件 [詳細] filebusiness_sample3.odb 2931件 [詳細]