2023/09/22

DXL Step-by-Step:#1)文書の新規作成

『DXL Step-by-Step』シリーズでは、DXL 活用の調査・検証で、実現できたこと、発見したことなどをとりとめなく紹介します。


はじめに

DXL(Domino XML Language)は、ドミノ内の文書や設計を XML アクセスできる機能です。DXL の基本的な情報については、『連載:DXL ことはじめ』にまとめております。はじめての方はこちらを先に参照ください。

連載:DXL ことはじめ』の 第1回 にも書きましたが、DXL を使用すると LotusScript 標準のノーツクラスだけでは操作できないことが実現できます。

例えば、これまでの検証で次のようなことが実現できたと紹介しました。

◇ リッチテキストに対する操作

  • 画像をインラインイメージで添付
  • 表を動的に作成し、罫線や背景色などを設定
  • ボタンなどアクションをコードとともに動的に生成

◇ 設計に対する操作

  • イメージリソースを登録/変更/削除
  • エージェントの実行時間設定など詳細な情報の取得

これまであきらめていた機能が実現できる可能性がありますよね。この連載の中で、順にご紹介していく予定ですのでお楽しみに!


なお、DXL に関しては、現在も調査を進めている段階です。手探りで記述しコードをご紹介することになります。必要に応じて訂正や効率的なコードを改めて記載することになるかもしれません。その点はご容赦ください。


通常の文書作成

第 1 回の今回は、文書の新規作成です。

LotusScript のエージェントで、普通に文書を新規作成するには、次のようなコードになります。

Sub Initialize
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase
   Dim nd As NotesDocument

   Set ndb = ns.CurrentDatabase
   Set nd = ndb.CreateDocument()
   nd.Form = "DXL_SbS"
   nd.Title = "#1 LotusScript から普通に文書を作成"

   Call nd.Save(True, False)
End Sub

データベースに対して、CreateDocument メソッドで文書を作成し、フォーム名を含むフィールドに値をセット、最後に Save メソッドで保存しています。


DXL の文書作成

これを DXL で作成するように書き直すと、次のようになります。

Sub Initialize
   Dim sDXL As String

   sDXL = xGetDXL() 'DXL文字列を作成
   Call xCreateNewDoc(sDXL)
End Sub

Function xGetDXL() As String
   Dim s As String

   'DXL文字列を作成
   s = "<document form='DXL_SbS'>"
   s = s & "<item name='Title'>"
   s = s & "<text>"
   s = s & "#1 DXL文字列から文書を作成"
   s = s & "</text>
   s = s & "</item>"
   s = s & "</document>"
   
   xGetDXL = s
End Function

Function xCreateNewDoc(ByVal vsDXL As String) As Boolean
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase
   Dim dimp As NotesDXLImporter
   
   Set ndb = ns.CurrentDatabase
   
   Set dimp = ns.CreateDXLImporter()
   Call dimp.Import(vsDXL, ndb)
End Function

ポイントは、文書を作成する DXL と文書を保存する方法の2点です。それぞれ関数化しており、メインルーチンからコールするようにしてます。

実行すると以下のように Form と Title フィールドがセットされた文書が作成されます。


DXL の作成

DXL の作成を行っているのは xGetDXL 関数です。

今回は、単純に DXL をコード内に直接定数として記述したリテラル文字列を連結させて作成しています。作成される文字列は以下の通りです(見やすくなるよう改行とインデントしています)。

<document form='DXL_SbS'>
   <item name='Title'>
      <text>
         #1 DXL文字列から文書を作成
      </text>
   </item>
</document>

まず、文書を表す document ノードを作成します。DXL ではフォーム名は、フィールドではなく、document ノードの form という属性で表します。

フィールドは、document ノード配下に item ノードを作成し、フィールド名は name という属性で指定します。フィールドの値は、フィールドの型を表すノード、今回は文字列なので text ノードを作成します。実際の値は、text タグの中にセットします。

既存文書を DXL に変換すると様々なノードや属性が設定されています。ですが、新規作成の場合は、必要最低限の DXL だけで正常に登録できます。


文書の作成

文書の作成は、xCreateNewDoc 関数で実施しています。

DXL を使って更新(今回は文書の作成)を行うには、NotesDXLImporter クラスを使用します。NotesSession クラスの CreateDXLImporter メソッドで、オブジェクトを取得して利用します。

Import メソッドが、DXL をデータベースに反映するメソッドです。引数は、反映するDXL と反映先となるデータベースとなります。どこに(データベース)何を(DXL)反映するのか一目瞭然でわかりやすいですね。

この Import メソッドを実行すると DXL がドミノオブジェクトに変換されデータベースに反映されます。今回の場合では、文書が作成されるということになります。


なお、Import メソッド実行時に DXL に問題があると、エラーが発生します。よって、DXL の生成を失敗したからと言って、データベースを壊すようなことはないようです。

DXL Step-by-Step 次回

0 件のコメント:

コメントを投稿