Autor Thema: Verständnisproblem mit Lotus-Script und persönlichen Profilen  (Gelesen 4059 mal)

Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
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:

Code
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:

Code
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:
Code
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 :-)

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Hallo

GetProfiledocument erstellt immer ein neues Profile Dokument, falls noch keins vorhanden ist.
Ich würde jetzt auf ein separates Feld im Profil prüfen, ob dies ein gültiges Profil ist oder nicht.
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Ich verstehe es so, dass ein nicht existierendes Profildokument beim Aufruf automatisch angelegt und gespeichert wird. Dass IsNewNotes beim ersten Mal True ist, kann ich nachvollziehen, da das Profildokument möglicherweise erst beim Verlassen der Datenbank oder des aufrufenden Dokuments oder zeitgesteuert später (-> keine Ahnung) gespeichert wird.

Die Lösung, die Du eingebaut hast, solltest Du sofort wieder vergessen. Um das Profildokument zu löschen, benötigt der User Editor und Löschrecht, denn das Profil wird kein Autorenfeld haben. Und Du willst NIE !!! eine Datenbank bauen, bei der ein gewöhnlicher Benutzer diese hohen Rechte aus technischen Gründen haben MUSS. Das funktioniert bei Dir mit Designerrechten, aber knallt später, oder die Benutzer haben jetzt schon das Recht, jedes Dokument beliebig zu ändern und zu löschen. Dann knallt es halt an einer anderen Stelle.

Ich würde, wenn ich schon mit Profilen arbeite, auf die "kreuz und quer" zugegriffen werden muss, eine eigene Steuerung einbauen, mit der bei bewusster Anlage des Profiles ein Flag hineingesetzt wird, mit dem klar ist, dass dieses Profil in Benutzung ist (unabhängig davon, dass es vielleicht durch den Zugriff automatisch angelegt wurde). Anstelle der Abfrage auf IsNewDoc prüfst Du das eigene Flag ab.

Ich persönlich würde auf Profildokumente an der Stelle verzichten, normale Dokumente verwenden und auf diese mit "normalen" Methoden zugreifen.

Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
Vielen Dank für die schnellen Antworten :-)

@umi: Das ein neues angelegt wird, ist ja so in der Doku beschrieben, nur in Verbindung mit "isNewNote" war mir das ganze nicht klar (warum erstmal "true" wobei das Dokument scheinbar schon gespeichert wurde, die Erläuterung von Peter würde das allerdings erklären).

@Peter: Das mit "isNewNote" muss ich wohl als gegeben hinnehmen :-) Danke für den Hinweis mit dem Editoren-Rechten, das werde ich mal prüfen, aber soweit ich weiß, ist das sogar der "default"-Zugriff. Dann würde der Code ja funktionieren (das grundlegende Design will ich nicht anzweifeln, da habe ich keinen Einfluss drauf).

Die Umstellung auf normale Dokumente war auch mein erster Gedanke, wurde aber schnell eines besseren belehrt, da ansonsten alle Kunden-Instanzen migriert werden müssten, die aber nicht alle auf dem gleichen Template-Stand sind und die Migration auch nicht bezahlen würden... fällt also leider flach :-(.

Ich denke das mit dem eigenen Flag könnte die Lösung werden, wobei ich dann noch das Problem habe, dass die Function "db.getProfileDocument()" pro Benutzer je ein "ungültiges" Profil in der Datenbank erzeugen würde, oder?

Grüße Thomas :-)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Ja, bei jedem Nachschauen, ob ein Profildokument für einen Benutzer exisitiert, besteht danach eines.

Ihr habt als Default Editor und Löschrecht? Damit mag Dein Code funktionieren, aber das ganze System nicht. Lass mal einen Benutzer STRG-A + Entf drücken. Tolle Sache. Für sowas habt Ihr Kunden finden können?

In meiner Branche gehört man dafür zu Recht an die Wand gestellt ...

Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
Hi Peter,

"wir" haben dafür keine Kunden gefunden... ich trete hierbei als Dienstleister für einen Dienstleister auf :-)

Ich habe geschaut, der default ist "Author" und besitzt auch keine Lösch-Berechtigung, somit ist mein Code nicht zu verwenden und ich muss eine andere Lösung finden, die ohne Update aller Kunden-Installationen und am besten ohne Migrations-Agenten auskommen kann.

Grüße

PS:Teile deine Meinung mit "an die Wand stellen" - aber leider finden sich solche Sachen immer wieder (auch von großen Anbietern).

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Da bin ich aber beruhigt, dass Ihr mit vernünftigen Rechten arbeitet ...

Ich könnte mir als Zwitterlösung vorstellen, an einer Stelle die Information über alle vorhandenen Profildokumente abzulegen. Wenn diese Stelle noch nicht exisitiert bzw. gefüllt ist, iterierst Du einmal über alle Profildokumente, wie im alten Code angegeben, und stellst Dir die Liste zusammen. Bei Anlage eines neuen Profiles muss die Liste natürlich aktualisiert werden (evtl. auch periodisch). ACHTUNG 32 kB-Problematik beachten!

Dann schaust Du erst in der Liste nach, ob es das Profil gibt und greifst nur im Erfolgsfall darauf zu. Damit ersparst Du Dir die Erstellung unnötiger Profile.

Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
Danke Peter, die Idee klingt gut .. denke so werde ich es mal versuchen.

Grüße Thomas :-)

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
Es gibt auch die Möglichkeit über

Dim ProfilCollection As Notesdocumentcollection
Set ProfilCollection = DB.GetProfileDocCollection(ProfilTyp)

zu gehen und sich darüber vorzuhangeln.

Die Collection kannst Du durchgehen und dann auf den Namen prüfen. Dabei werden -falls noch keines für "Emil Mustermann" existiert- angelegt.

Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
@WildVirus: ähm.. du hast den ursprünglichen Code im Thread schon gelesen, oder?

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
Guten Morgen Thomas,

wo Du Recht hast .... - war wohl zu spät gestern.

Wenn Du keine Möglichkeit hast, den Grundprozess, dass User in fremde Profile schauen wollen/müssen, zu ändern, bleibt nur Peters Ansatz. Sprich der eigentliche Fehler wird nicht korrigiert, sondern es wird noch eine Umgehung angeflanscht.

CU,
Axel



Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
Hi WildVirus,

kein Problem, kenne ich :-)

Ich werde die Sache von Peter mal versuchen.

Grüße Thomas :-)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz