見出し画像

DXL活用例 -動的な印刷画面- その2

前回に引き続き、DXLを利用した動的な印刷画面の構築していきます。今回は、印刷画面生成エージェントについて、解説していきます。
※前回の記事と連動していますので、もし読まれてない場合は、先に以下の記事をご確認ください。

処理概要

印刷画面生成エージェントの処理の概要は以下の通りです。

1:印刷用文書を新規作成、保存する
2:印刷用文書のDXLを取得する
3:取得したDXLを加工する
  →実行元文書に対する返答文書の情報を集約した表を示すDXLを追加する
4:加工したDXLを利用して、印刷用文書を更新する
5:印刷用文書を表示する

今回の処理のポイントは、3のDXLの加工です。LotusScriptには、NotesDOMParserなどDXLを解析したり修正を扱う為の様々なクラスやメソッドが準備されています。しかし、今回は空のリッチテキストフィールドに一度だけ表を追加する処理の為、より簡単なプログラムとする為、DXLをテキストベースで編集し、HTMLを書いていく感覚で操作可能なものにします。

【補足】
このエージェントでは、印刷用文書がアプリケーション内に保存されます。その為、別途、以下の考慮が必要です。
・印刷用文書を削除する為のスケジュールエージェントを準備する
・ユーザーが利用するビューに、印刷用文書が表示されないようにする

エージェントの作成

印刷画面生成エージェント(LotusScript)を作成します。

$$
\begin{array}{|l|l|} \hline
\text{名前} & \text{印刷画面生成}  \\ \hline
\text{別名} & \text{agPrint} \\ \hline
\text{トリガー} & \text{イベント} \\
\text{} & \text{エージェントリストの選択} \\ \hline
\text{対象} & \text{すべての選択文書} \\ \hline
\end{array}
$$

印刷画面生成 | agPrint

Initialize

ここでは、大きく以下の3つの処理があります。
 1:印刷用文書の作成、保存
 2:DXLで印刷用文書を更新
 3:印刷用文書の表示

2については、別途解説するので、ここでは1、3をについて解説します。

■印刷用文書の作成、保存
DXLのインポートだけでも印刷用文書を作成することは可能ですが、今回は最終的に印刷用文書を画面に表示したい為、より処理が簡単にできるように最初に文書を作成しておきます。
そして、ここでのポイントは、空の「Body」フィールドを作成しておくことです。またリッチテキストフィールドとして作成しないことも、後々生きてきます。

■印刷用文書の表示
ここでのポイントは、印刷用文書は既に取得済みなのですが、DXLで更新などしている為、一度印刷用文書を開放して、再度取得している点です。

Sub Initialize
	Dim ns			As New NotesSession
	Dim ndb			As NotesDatabase
	Dim ndCur		As NotesDocument	'実行元文書
	Dim ndPnt		As NotesDocument	'印刷文書
	
	Set ndb = ns.CurrentDatabase
	Set ndCur = ns.DocumentContext

	'印刷用文書の作成、保存
	Set ndPnt = ndb.CreateDocument()
	Call ndPnt.ReplaceItemValue("Form", "fmPrint")
	Call ndPnt.ReplaceItemValue("Subject", ndCur.GetItemValue("Subject"))
	Call ndPnt.ReplaceItemValue("Body", "")
	Call ndPnt.Save(True, True, True)

	'DXLで文書を更新
	Call SetPrintTable(ns, ndb, ndCur, ndPnt)

	'印刷用文書を表示
	Dim unid As String
	unid = ndPnt.UniversalID
	Set ndPnt = Nothing
	Set ndPnt = ndb.GetDocumentByUNID(unid)

	Dim ws			As New NotesUIWorkspace
	Call ws.EditDocument(False, ndPnt)
End Sub

DXLで印刷用文書を更新

ここからDXLの登場ですが、今回の処理は非常にシンプルです。

まず、NotesDXLExporterクラスのExportメソッドを利用して、印刷用文書のDXLをString型で取得します。

次に、取得したDXLを編集していきます。ここでは[Body]フィールドの内容を設定します。
印刷用文書には、事前に[Body]フィールドを設定している為、DXLの中には「<item name='Body'><text/></item>」という単純なタグが含まれています。今回は、これをプログラムで生成するDXLで置換します。
※置換用のDXLについては、次回解説します。

最後に、NotesDXLImporterクラスのImportメソッドで、修正したDXLを利用して印刷用文書を更新します。
DXLのインポート先として指定できるのは、NotesDatabaseクラスのみです。どの文書を更新するかは、DXL内に文書UNIDが必要となりますが、今回は印刷用文書を基にDXLを取得している為、既に文書UNIDはDXLに含まれています。

Sub SetPrintTable(ns As NotesSession, ndb As NotesDatabase, ndCur As NotesDocument, ndPnt As NotesDocument)
	Dim dxlExp			As NotesDXLExporter
	Dim dxlImp			As NotesDXLImporter
	Dim strDXL			As String
	Dim strDXLAF		As String
	Dim strBody			As String
	Dim strBodyAF		As String

	'印刷用文書のDXLを取得
	Set dxlExp = ns.CreateDXLExporter()
	strDXL = dxlExp.Export(ndPnt)

	'DXLを編集する
	strBody = |<item name='Body'><text/></item>|
	strBodyAF = GetBodyAF(ndCur)
	strDXLAF = Replace(strDXL, strBody, strBodyAF)
	
	'DXLをインポートして、印刷用文書を更新
	Set dxlImp = ns.CreateDXLImporter()
	dxlImp.DocumentImportOption = 5
	Call dxlImp.Import(strDXLAF, ndb)
End Sub

次回予告

今回は、ここまでです。
次回は、[Body]フィールドの置換用のDXLを生成処理を解説します。

この記事が気に入ったらサポートをしてみませんか?