Persönliches Adressbuch inkl. öffentlicher Einträge für Blackberry unter Domino

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.