agent.runWithDocumentContext(NotesDocument) & Zugriff auf Frontend-Daten

  • Hallo zusammen,


    ich versuche gerade die seit Notes 8.5.2 implementierte Agenten-Funktion "runWithDocumentContext" als QuerySave-Agenten zu verwenden. Folgendes sollte der Agent irgendwann koennen:


    a) Der Benutzer veraendert Daten einer XPage ueber den Browser und diese neuen Werte sind dann entsprechend im NotesXspDocument enthalten.
    b) Anschliessend wird vor dem eigentlichen Speichern ein QuerySave-Agent aufgerufen. Dieser soll die neuen Eingaben validieren und am Ende das Dokument zum Speichern freigeben oder eben nicht.


    Als Beispiel habe ich mal eine vereinfachte Version geschrieben, um die Kernfunktionalitaet zu testen:


    Hier ist der JavaScript-Aufruf:

    Code
    var agent:NotesAgent = database.getAgent("WWWQuerySaveAgent"); currentDocument.setValue("currentDocument", "Frontend-Wert gesetzt!") // dieser Wert kann nicht im Agent ausgelesen werdenvar doc:NotesDocument = currentDocument.getDocument();doc.replaceItemValue("doc", "Backend-Wert gesetzt!")agent.runWithDocumentContext(doc)_dump("Auslesen des Feldes per currentDocument: " + currentDocument.getItemValueString("Testfeld"))_dump("Auslesen des Feldes per doc: " + doc.getItemValueString("Testfeld"))


    Und dies ist der QuerySave-Agent:

    Code
    Print "<WWWQuerySaveAgent> Agent Start"Dim doc As NotesDocumentDim s As New NotesSessionSet doc = s.DocumentContextPrint "<WWWQuerySaveAgent> -> DocID: " + doc.UniversalidPrint "<WWWQuerySaveAgent> -> doc: " + Feldinhalt(doc, "doc")	Print "<WWWQuerySaveAgent> -> currentDocument: " + Feldinhalt(doc, "currentDocument")Call doc.Replaceitemvalue("Testfeld", "Testwert wurde gesetzt")Print "<WWWQuerySaveAgent> Agent Ende"


    Schlussendlich ist dies der Code fuer die Hilfsfunktion Feldinhalt:


    Was passiert ist folgendes:
    i) Die DocID des Backend-Dokuments kann im QuerySave-Agenten ausgelesen werden.
    ii) Der Inhalt des Feldes "doc" wurde mit "Backend-Wert gesetzt!" im QuerySave-Agenten ausgelesen.
    iii) Der Inhalt des Feldes "currentDocument" im QuerySave-Agenten ist leer!
    iv) Der Inhalt des Feldes "Testfeld" im JavaScript-Aufruf nach Beendigung des QuerySave-Agenten kann sowohl per currentDocument, als auch mit doc ausgelesen werden.


    Ich habe erwartet, dass der QuerySave-Agent allerdings auch Zugriff auf die Werte im vorliegenden NotesXspDocument hat, weil es sich schliesslich auch um ein InMemory-Dokument handelt. Stimmt etwas am Code nicht, oder habe ich schlicht einen Denkfehler?


    Gruss
    Sascha

  • Danke fuer die Antwort! Sprichst Du von den Sektionen "Supported Configurations" und "Troubleshooting Common Errors"? Dann lautet die Antwort ja, der Agent laeuft ja auch, er hat nur keinen Zugriff auf die geaenderten (und somit im Speicher liegenden) Daten des Frontend-Dokuments.

  • Ich habe jetzt noch einmal alle Bedingungen geprueft und keinen Fehler gefunden. Aber im Grunde sollte doch auch alles mit den erforderlichen Rechten / Einstellungen laufen, denn ich erhalte das veraenderte in-Memory Dokument doch auch in geaenderter Form zurueck. Siehe Punkt iv) in meinem Ausgangsposting:


    iv) Der Inhalt des Feldes "Testfeld" im JavaScript-Aufruf nach Beendigung des QuerySave-Agenten kann sowohl per currentDocument, als auch mit doc ausgelesen werden.


    Ich verzweifel gerade ...

  • Mein Problem dabei ist folgendes: Ich moechte das Aequivalent zum damaligen QuerySave-Agenten haben. Dieser wurde gestartet, bevor das Dokument gespeichert wurde. Hier konnten dann vor dem eigentlichen Speichern noch Daten validiert bzw. anderweitige Berechnungen durchgefuehrt werden und das auf Basis der aktuellen, noch nicht gespeicherten Benutzereingaben.


    Und genau da steckt das Problem: Ich habe Zugriff auf alle bereits gespeicherten, aber nicht auf die vom Benutzer aktuell veraenderten Daten. Und genau das habe ich erwartet, als ich von der neuen NotesAgent-Methode gelesen habe.


    Was ich kann ist: das Dokument uebergeben, Daten innerhalb des Dokuments im QS-Agenten manipulieren und anschliessend wieder zurueckgeben. Das fortlaufende JavaScript hat dann auch Zugriff auf die veraenderten Daten.


    Kurzum 50% geht, die andere Haelfte leider nicht.

  • Ja, ich wollte im Grunde nur wissen, ob ich vom Agenten aus an die XSP-Daten komme. Das geht nicht, also muss ich die XSP-Daten erst ins Backend-Dokument schreiben und anschliessend dem Agenten uebergeben, der wiederum die Validierung durchfuehrt. Haette gerne was anderes gehoert, aber man kann ja nicht alles haben ;)


    Besten Dank fuer die schnelle Hilfe!

  • Moin,


    der Agent konnte keine geänderten Werte auslesen, weil man mit currentDocument.getDocument() keine Änderungen am Dokument bekommt. Die Methode getDocument() hat einen Parameter Namens applyChanges. Dieser ist standardmäßig auf false. Mit currentDocument.getDocument(true) funktioniert es, dass der Agent anschließend auf die geänderten Werte zugreifen kann. :)


    Gruß,
    revle