XML 検索窓を作る -LiveCode備忘録

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

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

タイトルとURLをコピーしました