Hallo Community,
wie der Titel bereits besagt, habe ich ein Problem mit Lotus-Script und persönlichen Profilen.
Kurz zum Sachverhalt:
In einer bestehenden Datenbank müssen alle Benutzer auf fremde persönliche Profile zugreifen (das sieht der Prozess innerhalb der Datenbank vor). Ich bin aktuell damit beauftragt, die Performance dieser Datenbank zu verbessern und bin auf einen "bösen" Code zum Auslesen der Profil-Dokumente gestoßen:
Public Function getPersonalProfileFromName( userName As String) As NotesDocument
Dim session As NotesSession
Dim db As NotesDatabase
Dim personalConfigDoc As NotesDocument
Dim tmpPersonalConfigDoc As NotesDocument
Dim personalConfigDocs As NotesDocumentCollection
Set session = New NotesSession
Set db = Session.CurrentDataBase
Set personalConfigDocs = db.Getprofiledoccollection("(ProfilePersonal)")
Set tmpPersonalConfigDoc = personalConfigDocs.Getfirstdocument()
While (Not tmpPersonalConfigDoc Is Nothing)
If (tmpPersonalConfigDoc.DocumentAutor(0) = userName) Then
Set personalConfigDoc = tmpPersonalConfigDoc
End If
Set tmpPersonalConfigDoc = personalConfigDocs.Getnextdocument(tmpPersonalConfigDoc)
Wend
Set getPersonalProfileFromName = personalConfigDoc
End Function
Dieser Code funktioniert zwar, hat jedoch offensichtlich 2 Schwachstellen:
- er iteriert immer über alle vorhandenen Profildokumente
- der Code bricht nicht ab, sobald er das gesuchte Profil gefunden hat
Somit steigen die Dokumenten-Zugriffe mit jedem neuen Profildokument immens an.
Folgende Änderung habe ich vorgenommen:
Public Function getPersonalProfileFromName( userName As String) As NotesDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Dim personalConfigDoc As NotesDocument
Set db = Session.CurrentDataBase
Set personalConfigDoc = db.Getprofiledocument("(ProfilePersonal)", userName)
If (Not personalConfigDoc.Isnewnote) Then
Set getPersonalProfileFromName = personalConfigDoc
Else
Set getPersonalProfileFromName = Nothing
End If
End Function
Und genau an dieser Stelle geht mein Verständnisproblem los.
Laut der API-Beschreibung gibt die Function "db.getProfileDokument( ... )" ein existierendes Dokument zurück, oder legt es neu an (warum auch immer?).
Weiter kann über die Eigenschaft "isNewNote" geprüft werden, ob ein Dokument neu ist oder bereits im Backend gespeichert wurde.
Falls ein persönliches Profil existiert, wird dieses zurückgegeben. Existiert noch kein persönliches Profil, sollte die Function "Nothing" liefern.
Beim ersten Durchlauf ohne existierendes Profil klappt die Prüfung auf "isNewNote" und die Function liefert "Nothing". Führe ich anschließend die gleiche Function nochmals aus, liefert die Eigenschaft "isNewNote" false und ich erhalte ein Profil.
Wie ist hier der Zusammenhang zu verstehen, bzw. wo wurde das Profil jemals gespeichert?
Falls die Function "db.getProfileDokument( ... )" das Dokument speichern sollte, würde doch die "isNewNote"-Eigenschaft bereits beim ersten Durchlauf "false" liefern?
Da ich das "neue" Profil im Anschluss selbst nicht speichere, müsste "isNewNote" beim 2. Durchlauf ebenfalls "false" liefern (macht sie aber nicht).
Ich habe den Code dann um eine Zeile erweitert:
Public Function getPersonalProfileFromName( userName As String) As NotesDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Dim personalConfigDoc As NotesDocument
Set db = Session.CurrentDataBase
Set personalConfigDoc = db.Getprofiledocument("(ProfilePersonal)", userName)
If (Not personalConfigDoc.Isnewnote) Then
Set getPersonalProfileFromName = personalConfigDoc
Else
'Hier die kleine Erweiterung:
personalConfigDoc.Remove(true)
Set getPersonalProfileFromName = Nothing
End If
End Function
Und damit scheint die Function so zu funktionieren, wie sie sollte (zumindest aus einem Schnelltest heraus scheint es zu klappen).
Ist an dieser Stelle die API-Beschreibung falsch, ist es ein Bug oder verstehe ich das was komplett falsch?
Ich freue mich auf euer Feedback.
Grüße Thomas :-)