2023/10/24

DXL Step-by-Step:#5)設計要素の取得

これまではノーツの文書を DXL で操作する方法について説明してきましたが、今回は設計要素のアクセス方法について紹介します。


設計要素の確認

まず、ノーツ DB 内の設計要素の状態について確認します。

デザイナーで設計要素のプロパティを表示すると、設計要素も文書のようにフィールドを持っていていることが確認できます。例えば次の図は、エージェントのプロパティですが、$TITLE というフィールド名にエージェントの名称が記録されていることがわかります。

別名が "|" で連結されおり、いかにもノーツらしいですね...


NotesNoteCollection クラス と利用の流れ

LotusScript に標準搭載のクラス群の中に NotesNoteCollection というクラスが存在します。DXL を利用するまで、このクラスは使用したことがありませんでしたが、このクラスで設計要素にアクセスすることができます。

NotesNoteCollection (LotusScript®)


まずこのクラスには、SelectAgentSelectImageResources など、Select で始まるプロパティが多数存在します。このプロパティで取得する設計要素を限定できます。

また、SelectionFormula プロパティで、取得する設計要素を検索することができます。このプロパティと $TITLE フィールドを利用して、必要な設計要素を決定することになります。

取得条件が決定したら、BuildCollection メソッドを実行します。条件に一致したコレクションがこのオブジェクトにセットされ、そこから設計要素を取得するという流れとなります。


エージェントの取得方法

それでは実際にエージェントを取得してみます。

まずはメインルーチンです。赤字の部分がエージェントを検索して取得(コレクションの作成)をしている部分となります。SelectAgent プロパティと検索条件(後述)をセット、BuildCollection でコレクションを作成しています。

Option Declare
Private xns As NotesSession

Sub Initialize
   Dim ndb As NotesDatabase
   Dim ndAgent As NotesDocument

   Set xns = New NotesSession
   Set ndb = xns.CurrentDatabase

   Dim nnc As NotesNoteCollection
   Set nnc = ndb.CreateNoteCollection(False)
   nnc.SelectAgents = True
   nnc.SelectionFormula = xGetFormula("SampleAgent")
   Call nnc.BuildCollection()

          ・・・
End Sub

なお、検索条件は以下の xGetFormula 関数で作成しています。

Function xGetFormula(ByVal vsName As String) As String
   Dim s As String

   s = {xTitleList := @Explode($TITLE; "|");}
   s = s & {@IsMember("} & vsName & {"; xTitleList)}

   xGetFormula = s
End Function

この関数の戻り値は、引数の設計要素名を検索する式を返します。"SampleAgent" を指定した場合、次の文字列が返されます(見やすくなるよう改行を挿入)。

   xTitleList := @Explode($TITLE; "|");
   @IsMember("SampleAgent"; xTitleList)

この式では、$TITLEE フィールドの値を別名の区切り文字 "|" でリスト値に分離、その要素に引数の値が含まれていたらTrue を返します。

これで、引数の名前が設定されたエージェントだけが抽出できます。


BuildCollection を実行するとコレクションが作成されます。その後のプログラムでコレクション内の最初の文書を取得することで設計要素を文書として取得します。

Sub Initialize
         ・・・
   Call nnc.BuildCollection()

   Dim dprs As NotesDOMParser
   If nnc.Count > 0 Then
      Set ndAgent = ndb.GetDocumentByID(nnc.GetFirstNoteID)
      Set dprs = xGetDOMParser(ndAgent)

      Call xSaveDXL(dprs)    'DXL の文字列を文書に保存
   End If
End Sub


取得した設計要素 ndAgent をデバッガで中身を確認すると、次のように文書と同様に表示され、フィールドの中身が確認できます。内部的には、設計要素も文書として保存されていることがよくわかりますね。

次回は、この取得したエージェント(設計要素)の文書を DXL に変換して確認します。


前回 DXL Step-by-Step 次回

0 件のコメント:

コメントを投稿