競合文書の差分チェックを全自動で行うLotusScript

LotusNotesはデフォルトの設定では文書の排他制御を行っていません。1つの文書に同時に複数のユーザーが更新をした場合、最後に更新した文書が「正」の文書となり、他の文書が競合となります。
運用保守をしていると、競合している文書のどちらかを削除したいが、どちらの文書が正しいのかを判断するため、文書の差異を確認したいという問い合わせが来ることがあります。
そのため、競合している文書の全フィールド（システムフィールドを含む）の情報をテキストファイルに出力し、FileCompareするバッチファイルを作成した上で、キックまで行うスクリプトを作成してみました。

### 補足説明
* 文書の全フィールドの情報をテキストファイルに出力する処理は、「正」の文書も競合文書も同じ動作になるため、関数(ItemsOutPut) にして呼び出すようにしています。
* 変数 FileNum と FileName は、メイン処理と関数をまたいで使用するため、Declare での宣言となります。
* 出力先は C:\Temp で、ファイル名は「正」のNotes文書のユニバーサルIDを基準にしています。

##Lotus Script
```
%REM
	Agent 競合チェック
	Created 2021/01/07 by Taro Yamada/Taro Yamada
	Description: Comments for Agent
%END REM
Option Public
Option Declare

	Dim FileNum As Integer
	Dim FileName As String
	
Sub Initialize
	
	Dim ss As New NotesSession
	Dim db As NotesDatabase
	Set db = ss.currentdatabase

	Dim ws As New NotesUIWorkspace
	Dim uiview As NotesUIView
	Dim view As NotesView
	Dim doc As NotesDocument
	Dim conf As NotesDocument
	'ファイル名はUNIDを使用する
	Dim Stamp As String
	Dim Stamp_Conf As String
	'DiffのDOSコマンド
	Dim Dos As String

	Set uiview = ws.Currentview
	Set view = uiview.View
	Set doc = view.GetFirstDocument
	While Not(doc Is Nothing)
		'競合文書であれば
		If doc.HasItem("$Conflict") Then
			Stamp_Conf = doc.Getitemvalue("$REF")(0)& "_Conf"
			'アイテムを全て書き出す
			Call ItemsOutPut(doc, Stamp_Conf)
			'競合先の文書を取得する
			Set Conf = db.GetDocumentByUNID(Stamp_Conf)
			Stamp = Conf.Universalid
			Call ItemsOutPut(Conf, Stamp)
			
			'差分チェックファイルの作成
			FileNum = FreeFile()
			FileName = "C:\Temp\" & Stamp & ".bat"
			Open FileName For Output As FileNum
			Dos = "fc /N " & "C:\Temp\" & Stamp & ".csv " &_
			"C:\Temp\" & Stamp_Conf & ".csv > C:\Temp\" & Stamp & "_FC.txt"
			Print #fileNum%, Dos
			Close fileNum
			
			'バッチファイルの実行
			Dim result As Integer
			result = Shell(FileName, 1)
			'Dim wsh As Variant
			'Set wsh = CreateObject("WScript.Shell")
			'wsh.Run FileName, 1, True
			
		End If

		Set doc = view.GetNextDocument(doc)
	Wend

End Sub
Sub Terminate
	
End Sub


%REM
	文書のフィールド情報書き出し処理
%END REM
Sub ItemsOutPut(doc As NotesDocument, Stamp As string)
	
	FileNum = FreeFile()
	FileName = "C:\Temp\" & Stamp & ".csv"
	
	Open fileName For Output As fileNum
	
	'自分自身の情報を書き出す
	ForAll item In doc.Items
		Write #fileNum, item.name & "," & item.text
	End ForAll

	Close fileNum

End Sub
```
##実行結果
![kyougou01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/933fb2f4-e86f-4b6d-515c-8c54a3229617.png)

ファイルの種類について
>
|ファイル名|内容|画像|
|:---|:---|:---:|
|Notes文書のユニバーサルID.csv|「正」の文書のフィールド情報リスト| ![kyougou02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/3e04f152-2382-4c71-2fae-6d7478d7a8ff.png)
|
|Notes文書のユニバーサルID_Conf.csv|競合文書のフィールド情報リスト|![kyougou03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/1831d02e-75d7-531d-92bd-3985a48e6ee1.png)
|
|Notes文書のユニバーサルID.csv|「正」の文書と競合文書をFileCompareするバッチファイル| ![kyougou04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/c2b5a08e-788d-ead7-d1c5-7994e374ffba.png)
|
|Notes文書のユニバーサルID.csv|バッチファイルの実行結果| ![kyougou05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/93864561-8002-ba16-3419-362d23e49c95.png)
|
>

### 競合文書が２つ以上の場合について
このLotusScriptは正の文書と競合文書の２文書だけの状態を想定して書きましたが、この記事を書いているときに「複数の競合文書が作成される状況もある」ということに気付きました…。その場合は、ファイル名に連番を振るなどの記述を追記してください。（経験上、競合文書が2つ以上というのは、あまり見たことないですが……）