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:
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:
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:
Public Function Feldinhalt(doc As NotesDocument,Quelle As String) As Variant
On Error GoTo Fehler
Dim i As Integer
Dim itemvalue As Variant
itemvalue = doc.Getitemvalue(Quelle)
If UBound(itemValue) = 0 Then
Feldinhalt = itemvalue(0)
Else
Feldinhalt = itemValue
End If
Ende:
Exit Function
Fehler:
If Err <> 0 Then
Feldinhalt = ""
End If
Resume Ende
End Function
Alles anzeigen
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