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
実行結果
ファイルの種類について
ファイル名 | 内容 | 画像 |
---|---|---|
Notes文書のユニバーサルID.csv | 「正」の文書のフィールド情報リスト | ![]() |
|
|Notes文書のユニバーサルID_Conf.csv|競合文書のフィールド情報リスト|
|
|Notes文書のユニバーサルID.csv|「正」の文書と競合文書をFileCompareするバッチファイル|
|
|Notes文書のユニバーサルID.csv|バッチファイルの実行結果|
|
競合文書が2つ以上の場合について
このLotusScriptは正の文書と競合文書の2文書だけの状態を想定して書きましたが、この記事を書いているときに「複数の競合文書が作成される状況もある」ということに気付きました…。その場合は、ファイル名に連番を振るなどの記述を追記してください。(経験上、競合文書が2つ以上というのは、あまり見たことないですが……)