Notes はロケーション文書に $Saved* というフィールド名で過去に接続したサーバーのネットワーク情報を保持しています。そして、その値をキャッシュとして使っています。
機能しているときは良いのですが、たとえばサーバーのネットワークアドレスが変わってしまった、などで接続ができなくなった場合、これらを全てクリアすることで解決できることがあります。ということで、今日はそのフィールドを全部 Remove してしまうスクリプトのサブルーチンです。
Where are Server Addresses Cached in Notes and Domino? に詳細が載っていますが、Notes クライアントの場合はロケーション文書に、Domino の場合はサーバー文書にこれらのデータは保持されています。
それぞれに対応できるように、NotesDocument オブジェクトを引数として受け取るサブルーチンにしてみました。Notes の場合はロケーション文書の NotesDocument オブジェクトを、Domino の場合はサーバー文書の NotesDocument オブジェクトを引数として渡してあげればいいわけです。
たとえばこれを個人アドレス帳のエージェントとして登録する場合は、以下のようなコードをアクションメニューエージェント (トリガーはなし) として作成してあげれば、現在のロケーションのキャッシュをクリアできますね。
尚、上記のコードでは GetLocalAddressBook と GetLocationID を使っていますが、引数に NotesSession オブジェクトを渡す形にしています。なので、Function スコープ内の Dim s As New NotesSession はアポストロフィーでコメントアウトして、Function を GetLocalAddressBook(s As NotesSession) のようにして引数を受け取る形に改良してください。過去のサンプルではわかりやすくするため Function の中で NotesSession オブジェクトを Initialize していましたが、ここでは引数にしています。理由はまた別の機会で触れたいと思います。
機能しているときは良いのですが、たとえばサーバーのネットワークアドレスが変わってしまった、などで接続ができなくなった場合、これらを全てクリアすることで解決できることがあります。ということで、今日はそのフィールドを全部 Remove してしまうスクリプトのサブルーチンです。
Where are Server Addresses Cached in Notes and Domino? に詳細が載っていますが、Notes クライアントの場合はロケーション文書に、Domino の場合はサーバー文書にこれらのデータは保持されています。
それぞれに対応できるように、NotesDocument オブジェクトを引数として受け取るサブルーチンにしてみました。Notes の場合はロケーション文書の NotesDocument オブジェクトを、Domino の場合はサーバー文書の NotesDocument オブジェクトを引数として渡してあげればいいわけです。
Sub ClearNetworkCache(doc As NotesDocument)
'#### Network Cache Fields
Dim nwCache(4) As String
nwCache(0) = "$SavedAddresses"
nwCache(1) = "$SavedDate"
nwCache(2) = "$SavedPorts"
nwCache(3) = "$SavedServers"
nwCache(4) = "$SavedTriedDate"
Dim isCleard As Integer
isCleard = 0
Dim i As Integer
For i = 0 To Ubound(nwCache)
If doc.HasItem(nwCache(i)) Then
Call doc.RemoveItem(nwCache(i))
isCleard = 1
End If
Next
If isCleard = 1 Then
Call doc.Save(True,True)
End If
End Sub
たとえばこれを個人アドレス帳のエージェントとして登録する場合は、以下のようなコードをアクションメニューエージェント (トリガーはなし) として作成してあげれば、現在のロケーションのキャッシュをクリアできますね。
Sub Initialize
Dim s As New NotesSession
Dim aBook As NotesDatabase
Dim locID As String
Dim locDoc As NotesDocument
Set aBook = GetLocalAddressBook(s)
If Not aBook.IsOpen Then
Call aBook.Open(aBook.Server,aBook.FilePath)
End If
locID = GetLocationID(s)
Set locDoc = aBook.GetDocumentByID(locID)
Call ClearNetworkCache(locDoc)
End Sub
尚、上記のコードでは GetLocalAddressBook と GetLocationID を使っていますが、引数に NotesSession オブジェクトを渡す形にしています。なので、Function スコープ内の Dim s As New NotesSession はアポストロフィーでコメントアウトして、Function を GetLocalAddressBook(s As NotesSession) のようにして引数を受け取る形に改良してください。過去のサンプルではわかりやすくするため Function の中で NotesSession オブジェクトを Initialize していましたが、ここでは引数にしています。理由はまた別の機会で触れたいと思います。