LoginSignup
0
0

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