Mir stellte sich ein interessantes Problem in Zusammenhang mit einem Blackberry und Notes. Einer unserer Mitarbeiter wollte gerne sowohl Zugriff auf das öffentliche Notes Adressbuch haben aber auch seine eigenen, persönlichen Adressen verwalten. Da diese persönlichen Adressen nicht für jeden zugänglich sein sollten und er zudem die Verwaltung auf auf dem Blackberry verfügbar haben wollte kam die Lösung über Directory Assistance nicht in Frage. Ich habe dann kurzerhand eine eher „Quick & Dirty“ Lösung gefunden.
Hierfür ist es zum Einen notwendig eine Kopie eines lokalen Adressbuches auf dem Server zu erstellen, von wo für den Blackberry erreichbar ist. Im Blackberry Manager auf dem BES stellt man nun dieses Adressbuch als das zuständige für das entsprechende Gerät ein. Nun kann der Benutzer ein eigenes Adressbuch verwalten, was noch fehlt sind die Einträge aus dem öffentlichen Adressbuch, diese werden mit dem folgenden Agenten in regelmäßigen Abständen abgeglichen:
[Update: Habe den Code noch etwas angepasst damit nicht alle Dokumente ständig aktualisiert werden, was den Trafik in die Höhe treibt.]
Der Code befindet sich jetzt im vollständigen Artikel.
Sub Initialize
Dim sess As New NotesSession
Dim persdb As NotesDatabase
Dim perscol As NotesDocumentCollection
Dim persdoc As NotesDocument
Dim persdoc2 As NotesDocument
Dim adrdb As NotesDatabase
Dim adrcol As NotesDocumentCollection
Dim adrdoc As NotesDocument
Dim adritem As NotesItem
'Aktuelle Datenbank setzten
Set persdb = sess.CurrentDatabase
'Allgemeines Adressbuch öffnen
Set adrdb = sess.GetDatabase("SERVER","names.nsf",False)
'Alle Persondokumente holen
Set adrcol = adrdb.search({Form = "Person"},Nothing,0)
Set adrdoc = adrcol.GetFirstDocument
'Print Start Agent
Print "Start sync: " & persdb.FileName & " um " & Format(Now())
'Alle Personen aus öffentlichem Adressbuch durchgehen
While Not (adrdoc Is Nothing)
'Nur prüfen wo ein FullName vorhanden ist
If adrdoc.FullName(0) <> "" Then
'Prüfen ob Person in persöänlichen Adressbuch vorhanden
Set perscol = persdb.Search({Form = "Person" & FullName = "} & adrdoc.FullName(0) & {"},Nothing,0)
'Wenn ein oder mehrere Dokumente gefunden wurden diese eventuell updaten
If perscol.Count > 0 Then
Set persdoc = perscol.GetFirstDocument
'Alle gefundenen Dokumente prüfen
While Not (persdoc Is Nothing)
'Änderung zunächst aus setzten
change = False
'Alle Items im Dokument prüfen
Forall persitem In persdoc.Items
'Internes Kennzeichen und Werte die keine Arrays (Bilder) sind sowie Systemfelder (z.B. beginnend mit $) ignorieren
If persitem.Name <> "FromPublicAddressbook" _
And Isarray(persitem.values) _
And Left(persitem.Name,1) <> "$" _
And persitem.Name <> "CIntDate" Then
'Korrespondierendes Item aus öffentlichen Adressbuch holen
Set adritem = adrdoc.GetFirstItem(persitem.Name)
'Prüfen ob Item gefunden wurde
If Not (adritem Is Nothing) Then
'Nur prüfen wenn Item ein Array ist
If Isarray(adritem.Values) Then
'Felder ausschliessen
If adritem.Name <> "CIntDate" Then
'Maximale Anzahl der Werte ermitteln
max = Ubound(adritem.Values)
'Wenn Anzahl der Werte schon unterschiedlich wurde das Dokument geändert
If Ubound(persitem.values) <> max Then
change = True
chgfield = persitem.name
Else
'Alle Werte durchgehen
For i = 0 To max
If (persitem.values(i) <> adritem.values(i)) Then
change = True
chgfield = persitem.name
End If
Next
End If
End If
End If
End If
End If
End Forall
If change Then
Print "Geändert: " & persdoc.Fullname(0) & " wegen " & chgfield
Call adrdoc.CopyAllItems(persdoc,True)
'als aus dem öffentlichen Adressbuch markieren
Call persdoc.AppendItemValue("FromPublicAddressbook","1")
Call persdoc.Save(True,False)
End If
Set persdoc = perscol.GetNextDocument(persdoc)
Wend
Else
'Dokument in persönliches Adressbuch kopieren
Set persdoc = adrdoc.CopyToDatabase(persdb)
'als aus dem öffentlichen Adressbuch markieren
Call persdoc.AppendItemValue("FromPublicAddressbook","1")
Call persdoc.Save(True,False)
End If
End If
'Nächstes Dokument holen
Set adrdoc = adrcol.GetNextDocument(adrdoc)
Wend
'Prüfen ob Person aus persönlichem Adressbuch gelöscht werden müssen
Set perscol = persdb.Search({Form = "Person" & FromPublicAddressbook = "1"},Nothing,0)
'Wenn ein oder mehrere Dokumente gefunden wurden diese prüfen
If perscol.Count > 0 Then
Set persdoc = perscol.GetFirstDocument
While Not (persdoc Is Nothing)
'Prüfen ob Person in öffentlichem Adressbuch vorhanden
Set adrcol = adrdb.Search({Form = "Person" & FullName = "} & persdoc.FullName(0) & {"},Nothing,0)
'Wenn nicht vorhanden im persönlichen löschen
If adrcol.Count = 0 Then
Set persdoc2 = persdoc
del = True
Else
del = False
End If
Set persdoc = perscol.GetNextDocument(persdoc)
If del Then
Call persdoc2.Remove(True)
End If
Wend
End If
End Sub