2019年2月25日月曜日

エンドユーザーが全文検索をもっと使いやすくするアイデア

ビューの上部に表示される検索バーへ Japan などとタイプして Enter キーを押す、という操作は多くのエンドユーザーが行っていますが、この場合すべてのフィールドにある Japan というワードがヒットしてしまいます。
検索結果をもっと絞り込みたい場合、例えば
[Country] = "Japan"
といったようにフィールド名を含めたクエリーに書き換えて検索するようエンドユーザーへ勧めますが、これがなかなか浸透しません。

浸透しない理由は、フィールド名はエンドユーザーに馴染みがないからではないか、と推測しています。フィールド名が多く覚えられないことも原因の一つかも?

検索ビルダーを利用してフォームを使って検索できることは承知しているのですが、例えばキーワードリストから選択するようなフィールドの場合は検索ビルダーではキーワードリストが表示されず、タイプするために値を覚えておく必要があったりと使い勝手はいまひとつと言わざるを得ません。

そこで、こういった検索バーにおける不便を解消するため、次のような作りこみを行い、実現しました。
  1. ビューのアクションボタン「詳細検索」をクリックする(ダイアログボックスを表示する)
  2. ダイアログボックスにあるフィールドへ文字列をタイプ(またはリストから選択)して[OK]ボタンをクリックする(検索バーへ転記する文字列を生成してクリップボードへ転記。検索バーを表示してクリップボードの値を貼り付け、Enterキーを押すコードを実行し、ビューに検索結果を表示する)
しかしながら、Enterキーを押すために Win32 API をコールしており Windows 向けのものとなっています。このコードではもうすぐ登場する Domino Mobile Apps に対応できないと考えています。

もし、検索バーへのクエリーの転記をもっとシンプルにしたり、転記後にEnterキーを押すコードを呼ぶこと無しに検索が始まるアイデアなどございましたらシェアしてくださると嬉しいです。

以下、現在のコードです。

ビューのアクションボタン「詳細検索」では次のコードを書いています。

--- 詳細検索ボタンの式 ---
tmp := @DialogBox("MakeQuery"; [AutoHorzFit]: [AutoVertFit]: [NoNewFields]: [NoFieldUpdate]: [NoNote]: [SizeToTable]; "Input for Search String");
@If(tmp=@True; @Success; @Return(""));
@Command([ViewShowSearchBar]; "1");
@Command([EditPaste]);
@Command([RunAgent]; "PressEnterKey")

1行目で呼び出すダイアログボックス内で使用しているサブフォーム「MakeQuery」には、キーワードのリストからの選択が可能なフィールド「Country」を配置しています。
フィールド「Country」で値を選択してダイアログボックスのOKボタンをクリックすると、フィールド「Query」の式がクエリー文を生成します。

--- フィールド Query の式 ---
str := Country;
"[Country] = (\"" + str + "\")"

※MakeQuery には Country 以外にも複数のフィールドがあるのですが、ここでは1つだけとしています

生成されたクエリー文をサブフォームのイベント Postrecalc のコードでクリップボードへ転記します。

--- Postrecalc のコード ---
Sub Postrecalc(Source As Notesuidocument)
    Call Source.GotoField("Query")
    Call Source.SelectAll
    Call Source.Copy
End Sub


「詳細検索」ボタンの3行目以降で、検索バーを表示してクリップボードの値を貼り付け、Enterキーを押すコード(エージェント「PressEnterKey」)を呼び出します。

--- Enter キーを押すコード(エージェント「PressEnterKey」) ---
Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Integer, ByVal bScan As Integer, ByVal dwFlags As Integer,ByVal dwExtraInfo As Integer)
Sub Initialize
    keybd_event &hd,0,0,0 ' Enter key down
    keybd_event &hd,0,2,0 ' Enter key up
End Sub

以上

0 件のコメント:

コメントを投稿