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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2578
現在:2


フォーム上でのテキストボックスを使った検索

ページOpenOffice.org FAQの登録ページ
投稿者urudakara
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-12-19 00:05:01 (日)
OSLinux Ubuntu10.04
依存するページ
バージョン
edit/refer

メッセージ

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

こんにちは。いつもお世話になっております。 今回もよろしくお願いします。

今回やりたいことはフォーム上でのレコードの検索です。

フォーム上のテキストボックスに数値を入れたらそれを含むレコードが 抽出されるというマクロを実現したいと思ってます。

まず取っ掛かりとしてfaq/5/347の方のsample3のマクロを参考に入れたのですがどうも動作しません。私のサンプルを添付します。

自分としてはこの方のマクロのコード

Sub StartFilter(oEvent)
Dim oForm As Object, sSearchStr As String, sSearchField As String
oForm = oEvent.Source.getModel().getParent()
 
 ' 検索文字列と検索フィールド名を取得
 sSearchStr = oForm.getByName( "検索氏名" ).String
 sSearchFiled = "氏名"
   
 If sSearchStr = "" Then
   msgbox "検索する氏名を入力してください。"
   Exit Sub
 End If
 
'oForm.Filter = """氏名"" LIKE '*検索氏名*'"
oForm.Filter = """" & sSearchFiled & """ LIKE '*" & sSearchStr & "*'"
oForm.ApplyFilter = True
oForm.reload()

'If getString( sSearchFiled ) = "" Then
' sSearchFiled = setString ( sSearchStr )
'End if

End Sub

の検索氏名を検索用テキストボックスにし、氏名を検索したいフィールド名に変更すればいいと考えましたが動作しませんでした。

また最終的には検索ボタンは使わずに、検索数値入力用のテキストボックスに入力がある場合は抽出を、無い場合はフィルタが解除されるようにしたいと思っています。

自分としては上記の

msgbox "検索する氏名を入力してください。"

oForm.ApplyFilter = Fale

に変更しこのコードを検索数値入力用テキストボックスのイベントの更新後にすれば、思っている動作が出来るような気がしていますが・・・。

なにぶん分からない事ばかりなのでよろしくお願いします。


無題

ike@九州 (2010-12-19 13:03:00 (日))

sub search_shikibetsu を以下に
sub search_shikibetsu(oEvent)

sSearchStr = oForm.getByName( "tb_検索番号" ).string を以下に
sSearchStr = oForm.getByName( "tb_検索番号" ).text

msgbox 〜 を以下に
oForm.Filter=""
oForm.ApplyFilter = false
oForm.reload()

イベントは"テキストの変更時"に割り当てかと思います。

実現は出来たのですが・・・

urudakara (2010-12-20 12:49:04 (月))

ike@九州さんレスありがとうございます。

指摘された変更点を直したら実現出来ました!!
感謝します。

ただテキストの変更時に割り当てたら確かに1文字入力毎にフィルタが更新されて便利なのですが、動作がかなり重くなってしまいました。
私のPCのせいなのかも知れませんが、ちょっと実務上問題のある程のスピードです。ちなみにCPUはCore2duo P8700 2.53GHzを積んでいるのでそれほど遅いCPUとは思わないのですが・・・。それともopenofficeの問題でしょうか?


テキストボックスの入力全部が終ったとき(更新後にあたるのでしょうか?)にフィルタがかかるようにしようと思い、マクロをテキストボックスのイベントの更新後に登録したのですがその場合だと動作がしませんでした。

更新後にフィルタがかかるようにするにはどうすればいいのでしょうか?
お手数ですが、また教えていただけたらと思います。よろしくお願いします。

Re: 実現は出来たのですが・・・

M.Kamataki (2010-12-20 13:59:51 (月))

一応、「検索数値入力用のテキストボックスに入力がある場合は抽出を」かつ「無い場合はフィルタが解除されるようにしたい」という最初のメッセージの目的をかなえるイベントは「テキストの変更後」しかないと思うので、

>更新後にフィルタがかかるようにするにはどうすればいいのでしょうか?

ということだと、元のボタンを使ったイベントが良いと思います。

苦肉の策としては、フォームを表示したら、日本語入力システム(IME)をオンにしておくというのも考えられます。

>それともopenofficeの問題でしょうか?

多くの方が誤解されていることですが、OpenOffice.orgの問題というよりもBaseの標準のデータベースエンジンであるHSQLDBが遅いのです。Baseはデータベースを選べるので、データベースの規模に応じてエンジンを選んでいただきたいと思います。

今想定するデータベースのレコード数はどのくらいでしょうか? もし、1万レコードを越えるならBase標準のデータベースエンジン以外の選択をお薦めします。当Q&Aでは、MySQL、PostgreSQL、加えてWindowsならAccessのmdb形式ファイルなどの動作実績があります。

イベントに関して補足

ike@九州 (2010-12-20 15:35:40 (月))

"リンクしていないテキストボックス" なので更新イベントは発生しません。

なので、文字入力中、入力後でユーザーが発生させる実用的なイベントは
・テキストの変更
・フォーカスが外れた時(EnterKey他、他の箇所のマウスクリック時)
位に絞り込まれます。
フォーカスが外れた時であればボタンをクリックするのと同じ手間になりますね。

テキストボックスでの検索は、あいまい検索で使用されるのが普通ですが
どうしてもテキストボックスの方がよい場合は
文字数で動作を制限する事でしょうか(条件は追加できますね)

Select Case LEN(sSearchStr)
 Case 0
  oForm.Filter = ""
  oForm.ApplyFilter = false
 Case 7 '7桁入力時に反応
  oForm.Filter = """" & sSearchFiled & """ = '" & sSearchStr & "'"
  oForm.ApplyFilter = True
 Case Else '何もしない
  Exit Sub
End Select
oForm.reload()


もし単純に特定の1件のレコードだけで良いのであれば
リストボックスにして、番号をマウスで選択するだけで目的のレコードが選択されるようにすれば良いと思います。

リストボックスに置換後、プロパティのデータタブで
・リストの内容の種類 SQL
・内容  SELECT "個体識別番号" FROM "個体個別情報"

BASIC コードは sSearchStr = oEvent.Source.selecteditem に変更して、
イベント"実行時"に割り当てます。

速度が問題でした

urudakara (2010-12-21 11:45:31 (火))

ike@九州 さん、Kamatakiさんコメントありがとうございます。

まずike@九州 さんの

"リンクしていないテキストボックス" なので更新イベントは発生しません。

というのは知らなかったので勉強になりました。
それにコードまで考えていただき大変感謝します。ありがとうございました。

自分としてはike@九州さんの最初のコメントで提示していたやりかたが一番いいと思ってます。
1文字入力毎に絞り込まれるのは大変便利だと思っています。
私が更新後にマクロが実行されるようにしたいと思ったのは、機能の面からでなくスピードの問題からです。それでギリギリ妥協の線でしたから・・・。

そこでKamatakiさんのコメントを見てデータベースエンジンの問題なのかなあと思い始めました。
ちょっと文章では説明しずらいのですが、扱う親データ数は約2000件で、それぞれのレコードに子サブフォームで3〜4件のレコードがリンクされています。
さらに子サブフォームのそれぞれのレコードにも孫サブフォームで数件のレコードが記録されていたり、無かったりします。
これらのデータは今後も増えていきます。

一度データベースエンジンを変えて試してみないといけないなあと思いました。
今はKamatakiさんが挙げてくれたMysql やpostgreSQLについて調べています。
多分どうやってそれをopenofficeに接続させるのか分かりませんから、
間違いなくまた今度ここで聞くことになると思いますので、その時はお願いします。

データベースエンジンの変え方等をこのままこの質問ですると、ちょっとタイトルの趣旨と違うと思いますし、他の方の参考にする面から考えてもまた新たな質問を起こしたいと思います。

とりあえずタイトルの「フォーム上でのテキストボックスを使った検索」というのは私の思った形に出来るようになりましたので、今回はここで完了とさせてください。よろしくお願いします。

Kamatakiさん・ike@九州さん色々考えてくれてありがとうございました !!!

お名前:
題名:


添付ファイル: filesample.odb 719件 [詳細]