Autor Thema: RunOnServer, ganz komisches Problem  (Gelesen 3417 mal)

botschi

  • Gast
RunOnServer, ganz komisches Problem
« am: 02.03.10 - 15:59:39 »
Hallo,

in einer Maske kann man ein Passwort eingeben, welches beim Speichern das HTTP-Passwort im Personendokument ändern soll.
Im Querysave der Maske wird ein Agent mit
Code
Call agent.RunOnServer(Cstr(gvBackenddoc.NoteID))
aufgerufen.

Der Code des Agenten ist unten aufgeführt.
Nun gehts los:
In der Serverkonsole wird ein "Gooooo" angezeigt, also doc gefunden.
Dann wird ein "Fehler13" in der Serverkonsole ausgegeben, also lief der Agent auf einen Fehler.
Zeile 13 ist diese: Set doc = db.GetDocumentByID(agent.ParameterDocID)

Das Personendokument im Adressbuch hat einen neuen Stempel (also gespeichert durch den Agenten), aber das neue Passwort funktioniert nicht.

Wenn ich den Code aus dem Agenten direkt in das Querysave werfe, läuft alles super.

1. Wisst ihr, warum der Agent meint, er hat einen Fehler in Zeile 13, obwohl er erst fehlerfrei über die Zeile läuft?
2. Wisst ihr vielleicht auch noch, warum das neue HTTP-Passwort per Agent nicht geht, aber aus dem Querysave direkt schon?

Ich brauche den Agenten, damit ich diesen mit dem Server signieren kann und der auf alle Personendokumente im Adressbuch Schreibrechte hat.

Vielen Dank für Hilfe!
Matthias

Code
Sub Initialize
	
	Dim db As notesdatabase
	Dim s As New NotesSession
	Dim doc As NotesDocument
'	Dim coll As NotesDocumentCollection
	On Error Goto fehler
	'#######
	Dim agent As notesagent
	
	Set agent = s.CurrentAgent
	Set db = s.CurrentDatabase
	Set doc = db.GetDocumentByID(agent.ParameterDocID)
	If doc Is Nothing Then
		Print "################ FEHLER ################"
	Else
		Print "################ Gooooooooooooo ################"
	End If
	'#######
	Dim tmp As Variant
	Dim tmp2 As Variant
	
'	Set coll = db.UnprocessedDocuments
'	Set doc = coll.GetFirstDocument
	
	Dim passwort As String
	
	passwort = doc.passwort(0)
	tmp = Evaluate({@Password("| & passwort & |" )}, doc)
	Print passwort
	'tmp2 = Evaluate(|@Password("wurst2010")|, doc)
	
	Dim adressdoc As NotesDocument
	Dim adressdocview As NotesView
	Dim adressbuch As NotesDatabase
	
	Set adressbuch = s.GetDatabase(db.Server, "names.nsf")
	Set adressdocview = adressbuch.GetView("(Person Common)")
	
	Set adressdoc = adressdocview.GetDocumentByKey(doc.user(0), True)
	
	adressdoc.HTTPPassword = tmp(0)
	
	Call adressdoc.ComputeWithForm(True, False)
	Call adressdoc.Save(True, False)
'	Call adressbuch.Replicate( "Sametime2" )
	Exit Sub
	
fehler:
	Print "Fehler" & Cstr(Erl)
	Exit Sub
End Sub
« Letzte Änderung: 04.03.10 - 10:17:31 von botschi »

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: RunOnServer, ganz komisches Problem
« Antwort #1 am: 02.03.10 - 16:13:32 »
Der Agent ist mit der korrekten ID signiert?
Zitat
If a Notes client invokes RunOnServer, security is through the signer of the agent.

Ich würden den Errorhandler umbauen auf
Print "Fehler #" & Str(Err) & ": " & Error$ & " in Zeile " & Cstr(Erl)

Damit solltest Du ein wenig mehr Infos bekommen.
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

botschi

  • Gast
Re: RunOnServer, ganz komisches Problem
« Antwort #2 am: 02.03.10 - 16:22:38 »
Hatte ich vergessen zu erzählen, tut mir leid.
Der Fehler ist 4270 Invalid note id.

Der Agent ist von mir unterzeichnet und ich bin der Master Blaster  ;D
Also u.a. sämtliche Rechte, jegliche Agenten (auch zeitgesteuert) auszuführen und die Personendoks im Adressbuch zu ändern.

Matthias

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: RunOnServer, ganz komisches Problem
« Antwort #3 am: 02.03.10 - 16:26:31 »
Das Dokument, dessen ID übergeben wird, ist
a) gespeichert und
b) auch in der DB, in welcher der Agent läuft, vorhanden?
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

botschi

  • Gast
Re: RunOnServer, ganz komisches Problem
« Antwort #4 am: 02.03.10 - 16:30:49 »
Ja, ein bereits bestehendes DOkument wird geöffnet und dann editiert.
Beim Speichern im Querysave ist dann der Aufruf des Agenten.
Ich dachte erst, im Querysave aufzurufen ist der Fehler, aber die NoteID darf sich ja nicht mehr ändern.

Der Agent und das Dokument sind in der gleichen DB.
Ich habe sogar aus Verzweiflung eine Vorgabeansicht und eine Vorgabemaske eben nochmal neu deklariert...

Warum läuft der Bock denn erst rüber und sagt "Goooo" und dann irgendwann wieder "nee, mach ich nicht"?
Ich verstehe das nicht....

Matthias

botschi

  • Gast
Re: RunOnServer, ganz komisches Problem
« Antwort #5 am: 02.03.10 - 17:42:27 »
Wenn der ganze Krempel im Postsave läuft (nicht im Querysave), dann wirft der Agent keinen Fehler mehr, das personendokument ist auch gespeichert, aber das Passwort funzt nicht...

Das kann doch nicht sein...?


Matthias

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 248
  • Geschlecht: Männlich
Re: RunOnServer, ganz komisches Problem
« Antwort #6 am: 02.03.10 - 18:00:46 »
Aber der QuerySave-Event ist doch sowieso der falsche, denn da ist das Passwort im Dokument doc ja noch nicht mal abgespeichert und kann somit vom Agenten auch nicht ausgelesen werden.

Die Zeile
Zitat
tmp = Evaluate({@Password("| & passwort & |" )}, doc)
ist ebenfalls gefährlich bzw. "komisch": Da das zu verschlüsselnde Passwort übergeben wird, müsste man doc ja nicht an das Evaluate übergeben. Ich würde aber das sogar so lassen, aber die Formel so umstellen:
tmp = Evaluate({@Password(passwort , doc)})
dann wird das passwort direkt aus dem Dokument gelesen und auch die Eingabe von " im Passwort macht kein Problem, was beim aktuellen Ansatz zu einem Fehler führen würde.

Nach dem Zugriff auf das adressdoc sollte man auch eine Überprüfung machen, ob das Dokument gefunden wurde.

Das ComputeWithForm könnte schließlich das Problem sein, warum das Passwort dann nicht funktioniert, denn durch diesen Aufruf wird das entsprechende Feld ja nochmals neu berechnet.

-Werner

botschi

  • Gast
Re: RunOnServer, ganz komisches Problem
« Antwort #7 am: 02.03.10 - 18:07:05 »
Viel Input, versuche ich und Berichte.


Matthias

botschi

  • Gast
Re: RunOnServer, ganz komisches Problem
« Antwort #8 am: 03.03.10 - 15:29:11 »
In der Maske wird der Agent jetzt im Postsave aufgerufen.
Ich weiss nicht, ob ich gestern schon Wunschgedanken hatte, jedenfalls wirft der Agent immer noch einen Fehler. der Agent besteht mittlerweile nur noch aus:

Code
Dim db As notesdatabase
	Dim s As New NotesSession
	Dim doc As NotesDocument
On Error Goto fehler
	'#######
	Dim agent As notesagent
	
	Set agent = s.CurrentAgent
	Set db = s.CurrentDatabase
	Set doc = db.GetDocumentByID(agent.ParameterDocID)
	Print doc.UniversalID
	Print "####### 4 #########"
	Exit Sub
	Print "###### ENDE ########"
fehler:
	Print "Fehler #" & Str(Err) & ": " & Error$ & " in Zeile " & Cstr(Erl)
	Exit Sub
End Sub

und in der Serverkonsole steht
UniversalID
####### 4 #########
Fehler 4270 Invalid note id in Zeile 13

Wo ist mein Fehler?

Matthias

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 248
  • Geschlecht: Männlich
Re: RunOnServer, ganz komisches Problem
« Antwort #9 am: 03.03.10 - 17:36:43 »
Kann es sein, dass der Agent 2 mal aufgerufen wird?
Einmal korrekt und einmal mit falschem Parameter?
Also am besten noch ein paar Prints einbauen:
1.) Ganz am Anfang
2.) Angabe von agent.ParameterDocID
3.) Am Ende (das aktuelle Print steht hier hinter dem Exit Sub)

-Werner

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: RunOnServer, ganz komisches Problem
« Antwort #10 am: 04.03.10 - 07:40:00 »
Hallo,

Ich mag mich taeuschen, aber ich sehe in dem Code an keiner Stellen den Aufruf des Agenten mit einem Parameter-Dokument a la agent.Run(doc.NoteID) bzw.
agent.RunOnServer(doc.NoteID).

Hier wuerde ich doch erst einmal meine Nachforschungen nach dem Fehler ansetzen.


Andreas

botschi

  • Gast
Re: RunOnServer, ganz komisches Problem
« Antwort #11 am: 04.03.10 - 10:15:19 »
So läuft es jetzt ohne Fehler und das neue Passwort geht auch:

Code
Sub Postsave(Source As Notesuidocument)
	
	Dim db As NotesDatabase
	Dim s As New NotesSession
	Dim doc As NotesDocument
	
	Set doc = source.Document
	Set db = s.CurrentDatabase
	
	Dim agent As NotesAgent
	' nur replizieren, wenn es eine veränderung am passwort gab
	If passwort_alt <> doc.passwort(0) Then
		Set agent = db.GetAgent("ag_kennwort")
		Call agent.RunOnServer(doc.NoteID)
	End If
	
End Sub

und der Agent
Code
Sub Initialize
	
	Dim db As notesdatabase
	Dim s As New NotesSession
	Dim doc As NotesDocument
	On Error Goto fehler
	'#######
	Dim agent As notesagent	
	Set agent = s.CurrentAgent
	Set db = s.CurrentDatabase
	Set doc = db.GetDocumentByID(agent.ParameterDocID)
	
	If doc Is Nothing Then
		Exit Sub
	End If
	Print doc.UniversalID
	'#######
	Dim passwort As String
	passwort = doc.passwort(0)
	
	Dim adressdoc As NotesDocument
	Dim adressdocview As NotesView
	Dim adressbuch As NotesDatabase
	
	Set adressbuch = s.GetDatabase(db.Server, "names.nsf")
	Set adressdocview = adressbuch.GetView("(Person Common)")
	
	Set adressdoc = adressdocview.GetDocumentByKey(doc.user(0), True)
	
	If adressdoc Is Nothing Then
		Exit Sub
	End If
	adressdoc.HTTPPassword = passwort
	
	Call adressdoc.Save(True, False)
'	Call adressbuch.Replicate( "Sametime2" )
	
	Print "##### FERTIG ####"
	Exit Sub
	
fehler:
	Print "Fehler #" & Str(Err) & ": " & Error$ & " in Zeile " & Cstr(Erl)
	Exit Sub
End Sub

Ich glaube, mein Code in der Maske war nicht richtig. Ich hatte im Postsave noch den alten Code drin, wo ich das Dok noch mit Werten füllen wollte- im Postsave natürlich blödsinn.

Hätte ich mal den ganzen Code posten sollen  ;D

Danke für eure Hllfe!

Matthias

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz