2010年2月15日月曜日

UNID を復活させるには

※UNIDはデザイナーヘルプで DocumentUniqueID, UniversalIDなどと呼ばれているものを指します。

ユーザーから「文書を削除しちゃったから復活してよ~」と泣き付かれると、nsfファイルをバックアップのテープからローカルへ落とし、削除された文書をコピーして本番DBへペーストします。

この場合、手動でコピーペーストするので文書の UNID はもとの文書の UNID とは違います。

もし削除された文書へのリンクが他の文書にある場合、それをクリックした人は「文書が削除されました」と Notes に怒られてしまいます。

そんなことがないよう、コピー後した文書の UNID をコピー元文書と一致させてあげます。
すると文書リンクが機能するようになります。

UNID は文書のプロパティで[ヘッダー情報]タブの"識別子"等で確認できます。
"識別子"の最後の32桁が UNID になります。

ただ、32桁などとても覚えられるわけもなく、コピーする文書が多い場合など、とても大変です。

そんな面倒くさがりな私のために作ったのが下の Lotus Script です。

ビューで文書を選択して Ctrl + C 等で文書をクリップボードにコピーした後、コピー先のアプリケーションへ仕込んだ次のエージェントを実行します。

するとクリップボードへコピーした文書が、現在開いているアプリケーションへコピーされます。
もちろんコピー元の UNID の値と同じになります。
Sub Initialize
    Dim ss As New NotesSession
    Dim db As NotesDatabase, clipbrd As NotesDatabase
    Dim dc As NotesDocumentCollection
    Dim doc As NotesDocument, cdoc As NotesDocument

    Set db = ss.CurrentDatabase
    Set clipbrd = ss.GetDatabase( "", "~clipbrd.ncf" )
    If clipbrd Is Nothing Then Exit Sub
    If Not clipbrd.IsOpen Then Exit Sub

    Set dc = clipbrd.AllDocuments
    If dc.Count = 0 Then Exit Sub

    On Error Goto ERRORHANDLER

    Set cdoc = dc.GetFirstDocument
    While Not ( cdoc Is Nothing )
        Set doc = Nothing
        Set doc = db.GetDocumentByUNID( cdoc.UniversalID )
        If Not (doc Is Nothing) Then
            res = doc.RemovePermanently( True )
        End If
        Set doc = db.CreateDocument
        Call cdoc.CopyAllItems( doc )
        doc.UniversalID = cdoc.UniversalID
        Call doc.Save( True, False )
        Set cdoc = dc.GetNextDocument( cdoc )
    Wend
    Exit Sub
ERRORHANDLER:
    Print Err & ", " & Error 'GetDocumentByUNID で 「4091 ユニバーサル ID が無効です。」がでる
    Resume Next
End Sub
上記の "~clipbrd.ncf" は Windows のクリップボードで処理できないものを一時的にコピーしておく場所です。

"~clipbrd.ncf" については懇談室で紹介したことがありますが、本当はあまり使いたくありません。

ですので上のエージェントを実行した後には、念のためひとつひとつUNIDを確認しています...orz

0 件のコメント:

コメントを投稿