Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: gere am 21.05.08 - 10:11:45

Titel: Feld im Userprofil befüllen
Beitrag von: gere am 21.05.08 - 10:11:45
Hallo zusammen,

Leider bin ich was Lotus Script angeht noch fleißig am Trainieren. Ich habe gerade ein kleines Problem, bei dem ich nicht weiterkomme. Ich habe eine Notes-Anwendung und dort einen Synchronisations-Button in einer Maske, mit dem unter anderem die Email-Adresse des Benutzers aus dem Domino Directory ausgelesen werden soll und in das Userprofil des aktuellen Benutzers in dieser Notes-Anwendung geschrieben werden soll. Das im Userprofil vorgesehene Feld heißt "EmailAddress".

Ich habe nun geschafft, die Email-Adresse aus dem Domino Directory direkt in das Test-Feld "Email" der gerade geöffneten Maske zu schreiben (siehe nachfolgender Code).

Sub Click(Source As Button)
   Dim s As New NotesSession
   Dim workspace As New NotesUIWorkspace
   Dim namesDb As New NotesDatabase("", "")
   Dim thisdb As NotesDatabase
   Dim namesView As NotesView
   Dim namesDoc As NotesDocument
   Dim nam As NotesName
   Dim doc As NotesDocument
   Dim uidoc As NotesUIDocument
   
   Set nam = s.CreateName(s.UserName)
   
   Call namesDb.Open(s.CurrentDatabase.Server,"names.nsf")
   Set namesView = namesDb.GetView("($VIMPeople)")
   Set namesDoc = namesView.GetDocumentByKey(nam.Abbreviated)
   Set uidoc = workspace.CurrentDocument
   Set doc = uidoc.Document
   
   uidoc.EditMode = True
   doc.Email = namesDoc.InternetAddress(0)
   
   Call doc.Save(True, False, True)
   
End Sub


Wenn ich allerdings von der momentan geöffneten Maske das Feld "EmailAddress" im UserProfile füllen will, bleibt das jeweils leer (siehe nachfolgender Code).

Sub Click(Source As Button)
   Dim s As New NotesSession
   Dim namesDb As New NotesDatabase("", "")
   Dim thisdb As NotesDatabase
   Dim namesView As NotesView
   Dim namesDoc As NotesDocument
   Dim nam As NotesName
   Dim pdoc As NotesDocument
   
   Set nam = s.CreateName(s.UserName)
   
   Call namesDb.Open(s.CurrentDatabase.Server,"names.nsf")
   Set namesView = namesDb.GetView("($VIMPeople)")
   Set namesDoc = namesView.GetDocumentByKey(nam.Abbreviated)
   Set thisDb = s.CurrentDatabase
   
   Set pdoc = thisDb.GetProfileDocument("UserProfile","Database")
   pdoc.EditMode = True   
   pdoc.EmailAddress = namesDoc.InternetAddress(0)
   
   Call pdoc.Save(True, False, True)
   
End Sub


Wo liegt denn hier der Fehler? Muss ich pdoc als NotesUIWorkspace deklarieren, damit das Feld "EmailAddress" befüllt werden kann?

Danke für Eure Hilfe,

gere
Titel: Re: Feld im Userprofil befüllen
Beitrag von: MadMetzger am 21.05.08 - 10:23:48
Was ist denn das für ein Dokument, das gerade offen ist. Irgendwie scheinst du hier Schwierigkeiten mit der Unterscheidung zwischen Backend und Frontend zu haben. Aber eben dieser Punkt ist sehr wichtig, wenn man mit Notes und Script unterwegs ist.

Eigentlich wundert es mich, dass der obere Code so auch funktioniert und die Adresse in dem Dokument ankommt. Oder gibt es in der Maske, mit der das Dokument geöffnet wurde das Feld Email gar nicht?
Titel: Re: Feld im Userprofil befüllen
Beitrag von: Driri am 21.05.08 - 10:29:37
Zitat
pdoc.EditMode = True

Was willst Du mit dieser Zeile ? Die Property EditMode gibt es für ein NotesDocument nicht.

Du hast überhaupt kein Errorhandling drin. Zumindest eine Prüfung, ob die Objekte überhaupt sauber zugewiesen wurden, solltest Du einbauen (so ala "If Not (namesDoc Is Nothing)...").

Was sagt der Debugger, wenn Du den Code Step für Step laufen läßt ?
Titel: Re: Feld im Userprofil befüllen
Beitrag von: gere am 21.05.08 - 10:58:06
Hallo zusammen,

Danke für Eure Antworten.

@MadMetzger:

Der Synchronize-Button wird in der Aktionsleiste der momentan geöffneten Eingabemaske gedrückt. Ich habe mit dem oberen Code die Email-Adresse aus dem DD ausgelesen und in das Feld "Email" in der gerade offenen Maske geschrieben. Das hat soweit funktioniert. Wenn ich nun aber mit dem selben Button in der momentan geöffneten Maske die Emailadresse aus dem DD in das Feld "EmailAddress" im Userprofil schreiben will, funktioniert das nicht. Benutzt habe ich hierfür den unteren Code.

@Driri:

Mit der Zeile "uidoc.EditMode = True" versetze ich das aktuell geöffnete Dokument in den Edit-Modus. Das klappt sogar.

Die Frage ist nun, wie ich mit einem Button in der Aktionsleiste einer Maske einen Wert ins Userprofil schreiben kann. Irgendwie muss ich das Userprofil ja im Backend den Edit-Modus versetzen, das Feld füllen und dann wieder im Backend speichern. Nur wie?

Danke + Gruss
gere
Titel: Re: Feld im Userprofil befüllen
Beitrag von: koehlerbv am 21.05.08 - 11:04:11
Ingo meinte eine ganz andere Zeile.

Und: Im Backend gibt es keinen EditMode (ist auch unnötig).

Bernhard
Titel: Re: Feld im Userprofil befüllen
Beitrag von: gere am 21.05.08 - 11:12:16
@koehlerbv

Sorry, falsch gelesen. Damit dachte ich, das Userprofil irgendwie in den Edit-Modus zu versetzen. War eben ein Versuch, aber genau das ist ja der Knackpunkt, an dem ich gerade hänge. Wie kann ich einen Wert in eine (Profil-)Maske schreiben, die momentan nicht geöffnet ist.

gere
Titel: Re: Feld im Userprofil befüllen
Beitrag von: Driri am 21.05.08 - 11:16:50
Zitat
Die Frage ist nun, wie ich mit einem Button in der Aktionsleiste einer Maske einen Wert ins Userprofil schreiben kann. Irgendwie muss ich das Userprofil ja im Backend den Edit-Modus versetzen, das Feld füllen und dann wieder im Backend speichern. Nur wie?

Falsch  ;)

Im Backend gibt es keinen EditMode, wie Bernhard schon sagte. Wenn Du das Backend-Dokument sauber im Zugriff hast, kannst Du die Items direkt ändern und das Dokument speichern.

Entweder so, wie Du das schon im Code stehen hast oder über ReplaceItemValue.

doc.Itemname = Wert
Call doc.ReplaceItem("Itemname", Wert)


Darum auch die Frage nach dem Debugger. Bis auf die Zeile pdoc.EditMode = True sieht das auf den ersten Blick korrekt aus.

Titel: Re: Feld im Userprofil befüllen
Beitrag von: Driri am 21.05.08 - 11:18:46
Was mir gerade noch auffällt, ist diese Codezeile hier :

Zitat
Set pdoc = thisDb.GetProfileDocument("UserProfile","Database")

Steht das wirklich so bei Dir im Code ? Weil dann würde ich mal einen Blick in die Designer Hilfe werfen.
Titel: Re: Feld im Userprofil befüllen
Beitrag von: koehlerbv am 21.05.08 - 11:20:16
Lies Ingos Posting doch mal bitte aufmerksam. Ingo schreibt da auch was vom Debugger, vom Überprüfen von Objekten und vom ErrorHandling.

Und: Dein Code schreibt schon einen Wert in ein ProfileDocument. Die Frage ist nur, ob Du da überhaupt das ProfileDocument beschreibst, welche Du eigentlich beschreiben willst bzw. das, was Du dann öffnest. Du schreibst von "UserProfile", verwendest aber den String "Database" als Schlüssel. Ungewöhnlich ...

Bernhard
Titel: Re: Feld im Userprofil befüllen
Beitrag von: gere am 21.05.08 - 11:45:36
Also der Debuggen zeigt, dass die Variable pdoc ins Leere zeigt. Also liegt mein Problem dort begraben.
Habe nun die Zuweisung folgendermaßen geändert:

Set pdoc = thisDb.GetProfileDocument("UserProfile", s.getUserName(0))

Die Maske des Userprofils heißt "UserProfile", das ist soweit korrekt. Und da ich ja in das UserProfile des aktuellen Benutzers schreiben will, habe ich nun s.getUserName(0) als Sting verwendet. Allerdings wirft mir Notes nun beim Speichern den Fehler "Not a member: GETUSERNAME" aus. Hier nochmal der ganze Code zur Übersicht:

Sub Click(Source As Button)
   Dim s As New NotesSession
   Dim namesDb As New NotesDatabase("", "")
   Dim thisdb As NotesDatabase
   Dim namesView As NotesView
   Dim namesDoc As NotesDocument
   Dim nam As NotesName
   Dim pdoc As NotesDocument
   
   Set nam = s.CreateName(s.UserName)
   
   Call namesDb.Open(s.CurrentDatabase.Server,"names.nsf")
   Set namesView = namesDb.GetView("($VIMPeople)")
   Set namesDoc = namesView.GetDocumentByKey(nam.Abbreviated)
   Set thisDb = s.CurrentDatabase
   
   Set pdoc = thisDb.GetProfileDocument("UserProfile", s.getUserName(0))
   pdoc.EditMode = True   
   pdoc.EmailAddress = namesDoc.InternetAddress(0)
   
   Call pdoc.Save(True, False, True)
   
End Sub


Wie kann ich denn der Variable pdoc das Userprofil zuweisen?

gere
Titel: Re: Feld im Userprofil befüllen
Beitrag von: DAU-in am 21.05.08 - 11:50:48
es ist:

To get: name$ = notesSession.UserName

also einfach:


Set pdoc = thisDb.GetProfileDocument("UserProfile", s.username)


grüsse

Dau-in


Edit PS: Das ist eine Property und liefert einen String und kein Array, daher kein 'get', siehe Hilfe (ist normal eine Methode) und kein (0), da kein Arrayelement spezifizierbar.
Titel: Re: Feld im Userprofil befüllen
Beitrag von: Driri am 21.05.08 - 11:58:20
Und noch einmal der Hinweis : Benutz die Designerhilfe, die ist wirklich gut.

Ich kann mir auch nicht jeden Befehl und jede Syntax merken und nutze beim Programmieren immer mal wieder die Hilfe  ;)


Achja, Du hast immer noch die Zeile pdoc.EditMode = True drin, die kannst Du rausnehmen. Vermutilch füllt dir das Script sonst ein Item "EditMode" in dem Profildokument mit True.
Titel: Re: Feld im Userprofil befüllen
Beitrag von: gere am 21.05.08 - 12:58:09
OK vielen Dank. Es kommt momentan bei der Ausführung des Codes kein Fehler mehr. Allerdings wird das Feld "EmailAddress" im Profil auch nicht befüllt. Das sollte eigentlich durch die Zeile
pdoc.EmailAddress = namesDoc.InternetAddress(0) passieren. Was fehlt mir denn jetzt noch? Bin da etwas ratlos im Moment.

gere
Titel: Re: Feld im Userprofil befüllen
Beitrag von: DAU-in am 21.05.08 - 13:06:26
was zeigt der Debugger für namesDoc.InternetAddress(0)  denn an?

ist namesDoc das richtige Dokument?

und heisst das Feld auf dem Profildokument wirklich EmailAddress?

Ist ein Lieblingsfehler von mir, im Backend das Item Adress belegen und im Frontend sich über den Wert des Feldes Address wundern.

grüsse

Dau-in
Titel: Re: Feld im Userprofil befüllen
Beitrag von: gere am 21.05.08 - 16:53:29
Also das Feld heißt wirklich EmailAddress.
Der Debugger zeigt für namesDoc.InternetAddress(0) folgendes an:

bla bla...
+NAMESDOC
   +ITEMS
      +[16]
         +Name ----> "InternetAddress"
         +Values ---> "Vorname.Nachname@Firma.xy"
bla bla...


Wenn ich namesDoc.InternetAddress(0) als Msgbox ausgeben lasse, bekomme ich den richtigen Wert angezeigt. Nur ins Profil läßt er sich nicht schreiben! Komme hier keinen Schritt weiter.

gere
Titel: Re: Feld im Userprofil befüllen
Beitrag von: MadMetzger am 21.05.08 - 16:59:50
Was sagt denn der Debugger für dein pdoc, nachdem du die "Übernahme" ausgeführt hast?

Wird überhaupt ein Profildokument gefunden? Was klappt genau nicht?
Titel: Re: Feld im Userprofil befüllen
Beitrag von: gere am 21.05.08 - 17:14:56
Der Debugger sagt für pdoc:

bla bla...
+PDOC
   +ITEMS
      +[3]
         NAME ---> "EmailAddress"
         VALUES ---> "vorname.nachname@firma.xy"
         .
         .
         TEXT ---> "vorname.nachname@firma.xy" 
bla bla...

Das Userprofil wird gefunden, allerdings wird nach Ausführen der "Übernahme" das Feld "EmailAddress" nicht befüllt.

Titel: Re: Feld im Userprofil befüllen
Beitrag von: DAU-in am 21.05.08 - 17:40:36
Kannst du bitte einmal den aktuellen Code posten?


edith: du hast aber schon Schreibrechte auf dem Profildokument?
Titel: Re: Feld im Userprofil befüllen
Beitrag von: MadMetzger am 21.05.08 - 20:12:15
Woran machst du das denn eigentlich fest, dass die Adresse nicht in das Feld übernommen wird? Denn der Debugger sagt glasklar, dass in dem Dokument ein Item (nicht Feld) mit Namen "EmailAdresse" mit der richtigen Füllung existiert.
Titel: Re: Feld im Userprofil befüllen
Beitrag von: WildVirus am 21.05.08 - 22:55:47
Hat das Profildokument Autorenfelder ?

Prüf mal mit Notespeek, wieviele Profildokumente es in der DB für den Benutzer gibt  ;)

Woran machst Du fest, dass das reinschreiben nicht klappt ?
Titel: Re: Feld im Userprofil befüllen
Beitrag von: gere am 22.05.08 - 16:53:52
Das Profildokument hat keine Autorenfelder.

Wenn ich auf den Aktionsbutton klicke, der das Profilfeld befüllen soll, wird der Code problemlos durchlaufen. Wenn ich dann ins UserProfile wechsle, ist das Feld noch leer. Auch wenn ich in der Maske des UserProfile in den Edit-Modus wechsle und mit F9 aktualisiere, bleibt das Feld leer. Der Feldname im Userprofil ist 100%ig richtig geschrieben, es ist ein leeres, berechnetes Feld ohne DEFAULT-Wert. Als Formel für das berechnete Feld ist lediglich der Feldname angegeben. Ich werde morgen das Ganze nochmal mit NotesPeek überprüfen.

gere