2023/09/29

DXL Step-by-Step:#4)文書の更新

今回は DXL で文書を更新する方法についてまとめます。前回取得した文書を更新してみましょう。


フィールドの追加

今回は文書を再保存する方法が主題なので、保存する文書の更新は、テキストフィールドを一つ追加するだけとしたいと思います。

ただ、以前と同じようにベタ書きしてもつまらないので、テキストフィールドを追加する関数 xAppendField_Text を作成しました。これで、メインルーチンでは簡単にフィールドを追加できます。

Function xAppendField_Text( _
                            vddn As NotesDOMDocumentNode, _
                            ByVal vsFldName As String, _
                            ByVal vsText As String) As Boolean
   'document ノード取得
   Dim denCur As NotesDOMElementNode
   Set denCur = vddn.DocumentElement

   'item ノード作成とフィールド名の指定
   Dim denNew As NotesDOMElementNode
   Set denNew = vddn.CreateElementNode("item")
   Call denNew.SetAttribute("name", vsFldName)
   Set denCur = denCur.AppendChild(denNew)

   'text ノードと値のセット
   Dim dtnNew As NotesDOMTextNode
   Set denNew = vddn.CreateElementNode("text")
   Set denCur = denCur.AppendChild(denNew)
   Set dtnNew = vddn.CreateTextNode(vsText)
   Call denCur.AppendChild(dtnNew)
End Function

引数は、文書を表す NotesDOMDocumentNode と 作成するフィールド名 vsFldName、設定する値の vsText となっています。


文書の更新と DocumentImportOption プロパティ

新規文書の保存は、NotesDXLImporter クラスの Import メソッドで、DXL をデータベースに反映しました。文書の更新も同じく Import メソッドを使用します。

ただし、Import メソッドは、文書を保存する設定をコントロールするオプション DocumentImportOption プロパティにより動作が変わります。

DocumentImportOption (NotesDXLImporter - LotusScript®)

具体的には、インポートする DXL を使って文書をどのように処理するか指定することになります。今回は文書の更新なので 5 を指定します。

デフォルト値である 2 は新規文書を作成する設定です。第1回、第2回でこのプロパティを指定せずに新規作成できたのは、デフォルト設定の効果ですね。


文書を保存する関数

DXL を Import する関数も修正します。今回は、保存も更新もできるよう、DocumentImportOption に使用する値を引数に組み込みます。また、DXL もテキストではなく、NotesDOMParser のオブジェクトに変更しています。

Function xImportDXL(vdprs As NotesDOMParser, _
           ByVal viOption As Integer) As Boolean
   'DXL の抽出準備
   Dim nst As NotesStream
   Set nst = xns.CreateStream()
   Call vdprs.SetOutput(nst)
   Call vdprs.Serialize()

   '保存(インポート)
   Dim ndb As NotesDatabase
   Dim dimp As NotesDXLImporter
   Set ndb = xns.CurrentDatabase
   Set dimp = xns.CreateDXLImporter()
   dimp.DocumentImportOption = viOption
   Call dimp.Import(nst.ReadText(), ndb)

End Function


メインルーチン

関数が一通り完成したのでメインルーチンを作成します。

ビューで選択した文書に対するエージェントとして作成し、最初の文書に対して実行します。重要な部分は次の 3 点です。

  1. 第 3 回で作成した関数を利用し、DXL を操作するための NotesDOMParser クラスのオブジェクトを取得
  2. "NewFld" という新規フィールドを作成し、値をセット
  3. 文書を更新として保存

Option Declare
Private xns As NotesSession

Sub Initialize
   Dim ndb As NotesDatabase
   Dim ndc As NotesDocumentCollection
   Dim nd As NotesDocument

   Set xns = New NotesSession
   Set ndb = xns.CurrentDatabase
   Set ndc = ndb.UnprocessedDocuments
   Set nd = ndc.GetFirstDocument()

   Dim dprs As NotesDOMParser
   Set dprs = xDocToDXL(nd)
   Call xAppendField_Text(dprs.Document, "NewFld", "#4 文書の更新")
   Call xImportDXL(dprs, 5)

End Sub


エージェントの実行

ビューで第 2 回で新規作成した文書に対して実行してみます。結果は次のように、希望通りフィールドが追加されました。

ところが、同じ文書に対してもう一度エージェントを実行すると、同じ名前のフィールドがもう一つ追加されてしまいました !?

DXL でフィールドを追加する場合、同名のフィールドが存在するかは関係なく追加できてしまうようです。実際にアプリで利用する際には、NotesDocument クラスの ReplaceItemValue のような関数が必要となりそうですね。


前回 DXL Step-by-Step 次回

0 件のコメント:

コメントを投稿