今回は 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 点です。
- 第 3 回で作成した関数を利用し、DXL を操作するための NotesDOMParser クラスのオブジェクトを取得
- "NewFld" という新規フィールドを作成し、値をセット
- 文書を更新として保存
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 件のコメント:
コメントを投稿