
XMLを利用して作成中の帳簿アプリで、検索機能を付け加えようと考えました。
属性の中で探すのならば revXMLMatchingNode が使えます。けれど普通の項目の内容を検索することはできません。
revXMLEvaluateXPath を使えば、指定した項目の内容が条件と一致したものをリストアップしてもらえるはずなのですが、なぜか自分の環境ではこのコマンドがうまく動いてくれませんでした。
そこでこんなことをやってみました。
on mouseUp pButtonNumber
get field "IDfield" --xmlのIDを納めたフォルダー
put it into gDenTree
put textEncode("伝票","utf8")into tDenp--テキストなのでエンコードしておく
put textEncode("日付","utf8")into tDay
get fld KensakuFld
put it into tStext
if it is empty then exit mouseUp
put textEncode(tStext,"utf8")into uStext--日本語はエンコードしておく
put revXMLNumberofChildren(gDenTree,"/",tDay,-1) into tNum--日付ノードを数える
put empty into field kensakuKekka
repeat with x=1 to tNum
put tDenp&"/"&tDay&"["&x&"]" &"/"into tNode
put revXMLChildContents(gDenTree, tNode, tab, return, true, 3) into kotae
put textDecode(kotae,"utf8")into uKotae
if uKotae contains tStext then
put tDenp&"/"&tDay&"["&x&"]" &"/"&tDenDays into ansDay
put revXMLNodeContents(gDenTree,ansDay)into xmlDay
put x&tab&xmlDay& return after field kensakuKekka
end if
end repeat
end mouseUp
検索ボタンに置いたスクリプトです。
項目(child)の内容をその親(ここでは日付)ごとに変数に集めて入れ、その中に検索語があるかどうか調べる。あれば検索結果を収納するフイールドにいれ、次の項目へいく。これを項目の数だけ繰り返す。ハイパーカード的に考えるとトンデモなく時間がかかりそうな気がしますが、500項目(伝票500枚)くらいなら一瞬で答えが出ます。xmlは早いですね。
検索窓には send mouseUp to btn (検索ボタン名) を置いて、リターンキー、エンターキーで検索される様にしておくと便利です。
on returnInField send "mouseUp" to button "検索" end returnInField on enterInField send "mouseUp" to button "検索" end enterInField
検索窓の右端には検索窓の内容を消去するボタンを作ります。プロパティインスペクタで、opaque とshow boderのチェツクを外して、アイコンは263を指定。スクリプトは以下の様に。
on mouseUp pButtonNumber put empty into fld KensakuFld put empty into fld kensakuKekka end mouseUp
検索結果には 項目のナンバーとこの場合は(日付)が表示されますので、項目のナンバーを使えばすぐにその伝票を表示されることができるわけです。
