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
検索結果には 項目のナンバーとこの場合は(日付)が表示されますので、項目のナンバーを使えばすぐにその伝票を表示されることができるわけです。