Replizierkonflikt in Webapplikation

  • Hallo,


    ich habe eine Webapplikation mit einer Maske und einem Button.
    Der Button speichert das Dokument und führt danach einen Agenten aus, der ein Feld in der Maske ändert, das Dokument im Backend speichert und über den Printbefehl eine neue Seite anzeigt.


    Wenn ich den Button drücke funktioniert auch alles wunderbar!
    Wenn ich aber dann über den zurück Button im Browser das Dokument erneut anzeigen lasse und dann den Button in der Maske drücke wird ein Konfliktdokument angelegt.
    Das hängt damit zusammen, dass ich das Dokument nach dem Ausführen des Agenten nicht erneut speichere.
    Aber, wenn ich das Dokument speichere wird ein Submit ausgelöst und die Seite in dem Feld $$Return aufgerufen und nicht die Seite, die im Agenten über den Printbefehl aufgerufen wird.
    Kann die Folgeseite aber leider nicht im $$Return Feld berechnen, weil ich hierfür Zugriff auf das Feld brauche, das vom Agenten im Backend geändert wurde.


    Kann mir da jemand Helfen?
    Bin für jeden Tipp dankbar!

  • Das Problem scheint doch etwas größer zu sein.


    Also ich habe jetzt folgendes:


    Der Button in der Maske:


    @Command([FileSave]);
    @Command([ToolsRunMacro];"(WebAgent)");
    @Command([FileSave])


    Der WebAgent:


    Sub Initialize
    Dim s As New notessession
    Dim db As notesdatabase
    Dim doc As notesdocument
    Dim id As String
    Dim agent As notesAgent
    Set db = s.CurrentDatabase
    Set doc = s.DocumentContext
    Set agent = db.GetAgent("(JCoAgent)")
    id = doc.NoteID
    Set doc = Nothing
    Call agent.RunOnServer(id)
    End Sub


    Der JCoAgent ändert das Feld "output_document_id" im Backend!!!


    Im WebQuerySave starte ich folgenden Agenten:


    Sub Initialize
    Dim s As New notessession
    Dim db As notesdatabase
    Dim doc1 As notesdocument
    Dim doc2 As notesdocument
    Dim outputdoc As String
    Dim url As String
    Set db = s.CurrentDatabase
    Set doc1 = s.DocumentContext
    Set doc2 = db.GetDocumentByUNID( doc1.GetItemValue("id")(0) )
    Print doc2.output_document_id(0)
    End Sub


    Beispielszenario:


    Ich öffne ein Dokument
    im Feld "output_document_id" steht ein "X"
    ich drücke den Button
    der Java Agent ändert das Feld in "123" (die Änderungen sind bei den Eigenschaften des Dokumnets zu sehen!!!)
    Über den WebQuerySave Agenten folgt die Ausgabe "X" und nicht "123"


    Kann mir jemand sagen warum???

  • Das könnte an der reihenfolge liegen in der die Aktionen ausgeführt werden.
    Schau dir doch dazu mal die Hilfe an.
    Es könnte helfen wenn du bei dem Agenten und dem zweiten FileSave statt @Command @PostedCommand verwendest

  • Warum ist der FileSave doppelt ???
    Das könnte durchaus das problem sein, der webagent wird das dokument wohl selber speichern können, und dafür muß das ding nicht zweimal in der aktion gespeichert werden.

  • taurec


    Habe es mit @PostedCommand versucht, funktioniert leider auch nicht.
    In der Hilfe habe ich folgendes gefunden:


    Execution of an @Command function occurs in the order it appears with some exceptions. The exceptions execute in @PostedCommand order, that is, at the end of the formula. The exceptions are: [FileCloseWindow], [FileDatabaseDelete], [FileExit], [NavigateNext], [NavigateNextMain], [NavigateNextSelected], [NavigateNextUnread], [NavigatePrev], [NavigatePrevMain], [NavigatePrevSelected], [NavigatePrevUnread], [NavigateToBackLink], [ToolsRunBackgroundMacro], [ToolsRunMacro], [ViewChange], [ViewSwitchForm].


    Das heißt also @Command([ToolsRunMacro],"Agent") wird auch als @PostedCommand ausgeführt, oder?
    Würde die Frage offen bleiben, in welcher Reihenfolge die @PostedCommand ausgeführt werden.


    Ronka


    Der Webagent speichert das Dokument ja eigentlich auch indirekt im Backend und zwar durch den JavaAgenten, der am Ende ausgeführt wird. Im Frontend kann ich es aber leider unter LS im Web nicht speichern, oder?
    Lasse ich den 2. Savebefehl weg, kommt es wie oben beschrieben zu dem Replizierkonflikt!

  • Wieso machst du die gesamten Aktionen eigentlich nicht in einem einzigen Agenten ?
    Diesen könntest du dann als WebQuerySave Agenten aufrufen.
    Dann brauchst du die ganze Sache mit dem doppelten Speichern und dem Aufruf des Agenten nicht.


    Auch im Notes kannst du beim Speichern Aktionen durchführen: siehe QuerySave/QueryClose Events

  • Hab jetzt mal im QuerySave unter Notes experimentiert, bin aber leider nicht wirklich zu einem Erfolg gekommen.
    Wenn der Benutzer Felder ändert und dann den Button betätigt wird diesmal nur ein FileSave ausgeführt!
    Im QuerySave rufe ich dann meinen JavaAgenten auf und übergebe diesem die id des Dokuments um darauf zugreifen zu können.
    Der JavaAgent holt sich das Dokument über die id, aber er bekommt dann nicht die Werte, die geändert wurden, sondern die alten Werte, die beim Öffnen in dem Dokument stehen. Das liegt wohl daran, dass das QuerySave ja vor dem Speichern ausgeführt wird.
    Über das CurrentDocument komme ich im JavaAgenten nicht an das Dokument, weil dieser Agent ja aus einem Agenten gestartet wird!


    Gibt es eine Möglichkeit dem JavaAgenten die geänderten Werte verfügbar zu machen?

  • Wieso so kompliziert ?
    Du kannst doch im WebQuerySave direkt deinen JavaAgenten aufrufen.
    Dann kann dieser auch direkt auf das aktuelle Dokument zugreifen.
    Da WebQuerySave vor dem Abspeichern aufgerufen wird, kann nur ein Agent der im Kontext von WebQuerySave arbeitet auch auf die aktuellen Werte zugreifen.
    Falls der Java Agent nicht immer beim Speichern gestartet werden soll, kannst du die Ausführung auch mit einer Formel bestimmen

  • Sorry, habe was falsches geschrieben, ich habe versucht den Java Agenten aus dem QuerySave zu starten aber das funktioniert nur, wenn ich die ID übergebe.


    Mein Versuch mit getDocumentContext():


    JavaAgent:


    ...
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();
    docContext = agentContext.getDocumentContext();
    System.out.println(docContext);
    ...


    QuerySave:


    ...
    Set agent = db.GetAgent("(JCoAgent)")
    Call agent.Run
    ...


    In der Java Konsole bekomme ich aber leider null ausgegeben!
    Das mit DocumentContext funktioniert wohl nur wenn ich den Agenten direkt über den Button aus der Maske starte.

  • Wenn Du den Agent aus dem QuerySave mit Agent.run startest, dann läuft dieser in einem eigenen Kontext ab, welcher nicht mehr auf den Document Context zugriff hat. Damit der Document Context funktioniert, musst Du den Agent direkt aus dem QuerySave heraus starten z.B. mit
    @Command([ToolsRunMacro];"(JCoAgent)");
    Dann hat der JCoAgent zugriff auf den DocumentContext.


    mfg
    umeli

  • Mir ist nochwas eingefallen, warum ich keine Formelsprache verwenden kann, und zwar soll der Agent auf einem Server ausgeführt werden und für RunOnServer gibt es meines Wissens kein Befehl in der Formelsprache, oder???


    Kann mir hier noch jemand weiterhelfen?

  • Das ist aber aus oben genanntem Grund nicht möglich.


    Ich muss den Java Agenten auf dem Server ausführen, weil nur dort die benötigten .jar Dateien zur Verfügung stehen!
    Hierfür verwende ich ja agent.RunOnServer und sowas gibt es ja nicht in der Formelsprache.

  • Du solltest dir vielleicht erst mal anschauen wie Web Applikationen funktionieren.
    Auf welchem Client soll der Agent denn laufen ? Der Browser unterstützt Agenten eh nicht.
    Wie auch in der Hilfe steht werden Web-Agenten (dazu gehören auch WebQuerySave und WebQueryOpen-Agenten) grundsätzlich auf dem Server ausgeführt, da ja kein Notes Client zur Verfügung steht.
    Daher brauchst du auch kein RunOnServer sondern kannst ihn normal mit Formelsprache aufrufen

  • OK, dann werde ich es mal im WebQuerySave probieren, aber die Applikation soll ja später auch unter Notes funktionieren. Kann ich dort dann nicht über den QuerySave gehen?
    Ich hatte dort ja schon eine Lösung, aber die war sehr unschön, weil ich ein Dokument schließen und gleich wieder öffnen musste.

  • Was wird es grundsätzlich nicht?


    Was du da geschrieben hast war mir schon bekannt. Ich wollte ja auch für die WebApplikation was ins WebQuerySave schreiben und für die Notesapplikation was ins QuerySave!