Java Agent und LS-Agent hintereinander ausführen

  • Hallo!


    Mein Problem:


    Habe eine Maske mit einem Feld output_document_id und einem Button, der beim Klicken 2 Agenten ausführt:


    @Command([ToolsRunMacro];"(JCoAgent)");
    @Command([ToolsRunMacro];"(openURL)")


    Der erste ("JCoAgent") ist ein Java Agent der, auf das wesentliche gekürzt, folgendes tut:


    public void NotesMain() {


    try {
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();
    Document docContext = agentContext.getDocumentContext();
    docContext.replaceItemValue("output_document_id", "eineDokumentID");
    docContext.save(true,true);
    }
    catch(Exception e) {
    System.out.println("Fehler in NotesMain");
    e.printStackTrace();
    }


    Er schreibt also ins Backend Dokument aus dem er gestartet wird eine Id eines Dokuments.


    Der zweite Agent ("openURL") ist ein LS-Agent und soll vorerstmal das im Java Agent geänderte Feld in einer Messagebox ausgeben. Problem hierbei ist, wie komme ich an das geänderte Backend-Dokument.
    Habe folgenden ansatz:


    Sub Initialize
    Dim uiws As New notesuiworkspace
    Dim uidoc As notesuidocument
    Dim doc As notesdocument
    Set uidoc = uiws.currentdocument
    Set doc = uidoc.Document
    Messagebox(doc.GetItemValue("output_document_id")(0))

    End Sub


    ABER: Ich bekomme den alten Wert des Feldes zurück und nicht den geänderten.


    Kann mir da jemand weiterhelfen?
    In LS gibt es die Funktion NotesUIDocument.Reload, um Änderungen im Backend ins Frontend zu übernehemen. Bräuchte so etwas für Java!
    Eine sehr umständliche Lösung, auf die ich eigentlich nicht zurückgreifen will, wäre im 2. Agent das Dokument zu schließen und erneut zu öffnen (funktioniert zumindest manuell).


    Vielen Dank für eure Hilfe!!!


    MfG
    Inskin

  • In deinem Java Agenten schreibst du ins Backend Dokument. Da diese Änderungen aber nicht im Frontend aktualisiert sind erhältst du natürlich im Script Agenten den alten Wert.
    Aktualisiere doch am Anfang erst mal das Frontend Dokument im Script

  • Das habe ich schon versucht mit der Reload-Funktion, aber dann wird da einfach wieder der alte Wert reingeschrieben.
    Oder kann ich das Dokument anders aktualisieren, dass es funktioniert?

    • Offizieller Beitrag

    Du könntest Dir die UniversalID des Dokumentes in eine Variable schreiben, das Dokument schließen ohne es zu speichern und mit der UniversalID das Dokument im UI öffnen.


    Warum nutzt Du nicht nur LS, dann kommst Du problemlos ans Front-End und ans Back-End ran?


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Weil ich in meinem Java Agenten den SAP Java Connector verwende, um eine Verbindung zu SAP herzustellen und mir dort eine URL hole, die ich in ein Output-Dokument schreibe. Und genau die ID des Output-Dokuments schreibe ich in das Feld output_document_id.


    Danke für die Hilfe!

  • So hab jetzt ein weiteres Problem! Hab den LS-Agent jetzt umgeschrieben:


    Sub Initialize
    Dim uiws As New notesuiworkspace
    Dim db As notesdatabase
    Dim uidoc As notesuidocument
    Dim doc As notesdocument
    Dim var As String
    Dim unid As String
    Set db = uiws.CurrentDatabase.Database
    Set uidoc = uiws.currentdocument
    Set doc = uidoc.Document
    Call uidoc.Close
    unid = doc.UniversalID
    Set doc = db.GetDocumentByUNID( unid )
    Call uiws.EditDocument(False,doc)
    var = doc.GetItemValue("output_document_id")(0)
    Messagebox(doc.GetItemValue("output_document_id")(0))
    End Sub


    Aber das funzt auch nicht. Ich bekomme immernoch den alten Wert. Scheint so zu sein, dass erst alle Befehle abgearbeitet werden, bevor der Close Befehl ausgeführt wird. Es erscheint nämlich erst die Massagebox (zu der Zeit sind 2 Dokumente offen) und dann wird das alte Dokument erst geschlossen.


    Wär schön, wenn mir jemand weiterhelfen könnte!!! Danke!

    • Offizieller Beitrag

    Du kannst probieren mit @PostedCommand zu arbeiten oder den Java-Agent vom Script aus starten.


    so in der Art

    Code
    Set JavaAgent = db.GetAgent("JavaAgent")
    JavaAgent.Run


    Gruß
    Dirk

  • Den Java Agent aus dem Script zu starten habe ich auch schon probiert, dann gibt es aber Schwierigkeiten, weil die Zeile


    Document docContext = agentContext.getDocumentContext();


    null zurück liefert, weil der Agent nicht mehr aus dem Kontext des Dokuments gestartet wird.
    Kann man sowas evtl. über ein Profildokument regeln?


    Gruß
    Magnus

  • Ich weiß nicht, ob das wirklich was bringt aber ich werds mal versuchen und mich nochmal melden.
    Glaubst du das macht wirklich ein unterschied ob ich per Formelsprache starte oder per Skript?

  • So habe den Agenten jetzt aus dem LS-Agent gestartet, aber jetzt bin ich immernoch genauso weit wie vorher!


    Bei Klick auf den Button wird jetzt folgendes ausgeführt:


    Sub Click(Source As Button)
    Dim uiws As New notesuiworkspace
    Dim db As notesdatabase
    Dim uidoc As notesuidocument
    Dim doc As notesdocument
    Dim var As String
    Dim unid As String
    Dim id As String
    Dim agent As notesAgent
    Set db = uiws.CurrentDatabase.Database
    Set uidoc = uiws.currentdocument
    Set doc = uidoc.Document
    Set agent = db.GetAgent("(JCoAgent)")
    unid = doc.UniversalID
    id = doc.NoteID
    Call agent.Run(id)
    Call uidoc.Close
    Set doc = db.GetDocumentByUNID( unid )
    Call uiws.EditDocument(False,doc)
    var = doc.GetItemValue("output_document_id")(0)
    Messagebox(doc.GetItemValue("output_document_id")(0))
    End Sub


    Der Java Agent macht immernoch das gleiche!

    • Offizieller Beitrag

    Probleme glaube ich nicht, aber ich suche lieber nur nach Fehlern in einer Sprache.


    Was Du noch probieren könntest ist das "uidoc.Clos" vor dem "Call agent.Run(id)" auszuführen. Eventuell kannst Du das uidoc und das doc noch definiert auf Nothing setzen und dann ert den JavaAgent starten.


    Schau mal im debuger vor dem Call agent.Run und danach das Item im doc an.


    Gruß
    Dirk

  • Hab mal alles ausprobiert, hat aber leider nichts gebracht.


    Das Item bleibt vor und nach dem Call im Debugger gleich, sonst wäre mein Problem ja gelöst.


    Trotzdem Danke für die Hilfe!!!


    Werde wohl den Umweg gehen müssen, die ID in ein extra Profildokument zu schreiben und sie mir von dort zu holen. Hoffe das klappt dann wenigstens!

  • Das ganze soll doch beim Speichern des Dokuments passieren ?
    Dann verwende doch einfach den PostSave Event der Maske.
    Wenn du dort einen Agenten aufrufst kann der problemlos am Backend Dokument arbeiten

  • Nein, das ganze soll passieren, wenn der User einen Button klickt!


    Das Dokument wird im Java Agenten im Backend gespeichert und ich benötige die vorgenommenen Änderungen im Frontend!

    • Offizieller Beitrag

    beginnen wir mal von vorn.


    Lass mal nur den Java-Agent laufen, schließe danach das uidoc ohne zu speichern per Hand und schau mal in den Dokumenteigenschaften nach dem Feld. Hat es den richtigen Wert - sprich den, den der Java-Agent reinschreiben sollte?


    Wenn dem so ist, probierst Du das uidoc per Script ohne zu speichern zu schließen. Was steht jetzt in den Dokumenteigenschaften bei diesem Feld?


    Ales i.O.? Dann geht es weiter mit doc und uidoc auf Nothing setzen und per GetDocumentByUNID neu öffnen. Was steht jetzt im Feld?


    Gruß
    Dirk