0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

ファイルの種類について

ファイル名 内容 画像
Notes文書のユニバーサルID.csv 「正」の文書のフィールド情報リスト kyougou02.png

|
|Notes文書のユニバーサルID_Conf.csv|競合文書のフィールド情報リスト|kyougou03.png
|
|Notes文書のユニバーサルID.csv|「正」の文書と競合文書をFileCompareするバッチファイル| kyougou04.png
|
|Notes文書のユニバーサルID.csv|バッチファイルの実行結果| kyougou05.png
|

競合文書が2つ以上の場合について

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?