Hallole,
wie versprochen ein Ansatz, es gibt wie immer natürlich verschiedene Wege ans Ziel.
Ich gehe davon aus, daß du mit Version 5 arbeitest.
Grundsätzliches:
Mit @DBColumn kannst du Spalten auslesen, mit @DBLookup kannst du die Felder eines Dokumentes lesen.
Dazu benötigst du einen eindeutigen Key, der das gewünschte Dokument identifiziert, und eine Ansicht in der zu lesenden DB, die in der ersten Spalte nach diesem Key sortiert ist.
Der Key ist also wichtig, wenn du Dokumente finden willst. In der Names.nsf gibt es die Ansicht "Contacts"/"Kontakte".
In ihrem Alias heißt die Ansicht "People". Diese Ansicht ist in der ersten Spalte sortiert. In der Spaltenformnel siehst du, wie der Key (1. Spalte) gebildet wird.
KeyName := @Name([CN]; @UserName);
server := "";
OffPhoneNo := @DbLookup( "" : "NoCache" ; server : "names.nsf" ; "People" ; KeyName ; "OfficePhoneNumber" );
Diese Formel liest dir dein Bürotelefonnummer aus deinem lokalen Adressbuch...
Entspprechend kannst du so auch Werte aus fernen Datenbanken lesen => Server eingeben...
Das Ding hat einen Haken: Du kannst doppelte Namenseinträge haben => Notes nimmt den ersten...
Wenn du keine doppelten Einträge hast, könntest du mit einem flauen Gefühl im Magen damit glücklich werden...
Der eindeuige Weg führt über LotusScript. Hier gibt es den Weg über die UniversalID eines Dokumentes Zugriff zu erhalten.
Du mußt also bei der Anlage deiner Dokumente darauf achten, die UNID des Originaldokumentes deines Adressbuches mitzunehmen.
In der Regel legt man dazu ein Feld namens "ParDocID" und speichert den Wert dort.
Zur Überprüfung, ob das Adressdokument bereits vorhanden ist, benötigst du noch eine Ansicht aller Personnendokumente, in der ersten Spalte sortiert nach ParDocID.
' # #### Übernahme von Adressen #####
' # Denkbar in einer Ansichts-Aktion oder einem Button...
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dbNAB As NotesDatabase
Dim vwParDocID As NotesView
Dim dc As NotesDocumentCollection
Dim docNew As NotesDocument
Dim i As Integer
Set dbThis = session.CurrentDatabase
Set vwParDocID = dbThis.getView("PersonByParDocId")
Call vwParDocID.Refresh
Set dbNAB = session.GetDatabase("","names.nsf")
Set dc = ws.PickListCollection(1,True,"","names.nsf","People","Auswahl der Dokumente","Wählen Sie die gewünschten Dokumente")
If dc.Count > 0 Then
Set docNAB = dc.GetFirstDocument
For i = 1 To dc.Count
' # Überprüfen. ob es dieses Dokument bereits gibt
Set docNew = vwParDocID.GetDocumentByKey(docNAB.UniversalID)
If docNew Is Nothing Then
' # Die Adresse ist noch nicht vorhanden
Set docNew = dbThis.CreateDocument
With docNew
.Form = "Person"
.ParDocID = docNAB.UniversalID
.LastName = docNAB.LastName
.FirstName = docNAB.FirstName
.OfficePhoneNumber = docNAB.OfficePhoneNumber
' # ... die gewünschten Felder eben...
Call .Save(True, True)
End With
Else
' # Die Adresse gibt es bereits - überspringen
End If
Set docNAB = dc.GetNextDocument(docNAB)
Next
Else
' # Es wurden keine Dokumente gewählt
End If
' # #### ENDE: Übernahme von Adressen #####
' # #### Synchronisation der Dokumente #######
Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dbNAB As NotesDatabase
Dim dc As NotesDocumentCollection
Dim docNAB As NotesDocument
Dim doc As NotesDocument
Dim sUNID As String
Dim dt As New NotesDateTime("01/01/1990")
Dim sSearch As String
Dim i as Integer
Set dbThis = session.CurrentDatabase
Set dbNAB = session.GetDatabase("","names.nsf") ' # lokales Adressbuch
' # Ich gehe davon aus, daß deine Personendokumente mit einer Maske namens "person" erstellt wurden
' # ... In der Maske gibt es ein Feld "ParDocID" mit der UNID des Original-Adress-Dokumentes
' # ... Die Feldnamen aus dem Original-Adressdokument wurden 1:1 in der DB übernommen
sSearch = |SELECT Form="Person"| ' # Suchformel bilden
Set dc = dbThis.Search(sSearch,dt,0) ' # alle Personendokumente in eine Collection holen...
If dc.Count > 0 Then
' # Personendokumente gefunden
Set doc = dc.GetFirstDocument
For i = 1 to dc.Count
sUNID = doc.ParDocID(0) ' # die UNID des Adressdokumentes lesen
Set docNAB = dbNAB.GetDocumentByUNID(sUNID)
If Not docNAB Is Nothing Then
doc.OfficePhoneNumber = docNAB.OfficePhoneNumber ' # Synchronisation der Büro-Telefonnummer
' # ...
End If
Set doc = dc.GetNextDocument(doc)
Next
Else
' # Keine Personen-Dokumente gefunden
End If