Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: haeppchen am 12.03.05 - 12:19:59
-
Hallo zusammen,
ich habe folgendes Problem:
ich habe einen Java-Agenten, der im aktuell geöffneten Dokument einige Berechnungen anstellen soll; dabei initialisiere ich das aktuelle Dokument wie folgt:
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database db = agentContext.getCurrentDatabase();
Document doc = agentContext.getDocumentContext();
Eigenschaften des Agenten:
Options: Shared
Trigger: Agent List Selection
Runtime: None
Diesen Agenten rufe ich aus Lotus Script auf, dieses Script führt ebenfalls zunächst einige Berechnungen im aktuellen Dokument aus und ruft dann den Java-Agenten auf (siehe folgenden Code)
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim agent As NotesAgent
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
Set db = session.CurrentDatabase
Set agent = db.GetAgent("Mein Agent")
… einige Abfragen und Berechnungen
Call agent.Run
…
Call uidoc.Save
Call uidoc.Close
Beim Ausführen dieses Scriptes geht der DocumentContext verloren, mit dem ich das aktuelle Dokument aus dem Java-Agenten heraus initialisiere (siehe oben), ich erhalte daher eine NullPointer-Exception, weil die Variable doc nicht mehr auf das aktuelle Dokument zeigt.
Wer kann mir helfen?
Wie kann ich das aktuelle Dokument aus dem Java-Agenten heraus initialisieren, so dass beim Ausführen des Agenten aus LS der DocumentContext nicht verloren geht?
Vielen Dank im Voraus,
Gruß Simon
-
du kannst einem Agent einen Parameter mitgeben (die ID eines Dokuments). Wenn du im Script das Dokument ermittelst könntest du seine ID dem Java Agent übergeben und dort mit GetDocumentById das Dokument holen
-
Hallo Thomas,
danke erstmal für deine Hilfe.
Ich habe jetzt versucht, deine Idee folgendermaßen umzusetzen:
In Lotus-Script übergebe ich die ID des aktuellen Dokumentes wie folgt:
Call agent.Run(doc.getNoteID())
Im Java-Agenten initialisiere ich das aktuelle Dokument momentan so:
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Agent agent = agentContext.getCurrentAgent();
Database db = agentContext.getCurrentDatabase();
Document doc = db.getDocumentByID(agent.getParameterDocID());
Leider erhalte ich nun folgende Fehlermeldung, nachdem ich den Agenten aus LS wie oben beschrieben starte:
"Wrong number of array subscripts"
Aus der Notes-Hilfe werde ich auch nicht schlauer.
Wo liegt das Problem bzw. wer kann mir da weiterhelfen?
Gruß, simon
-
Call agent.Run(doc.getNoteID())
Überprüfe mal die Objekte, also auf
- agent Is Nothing
- doc Is Nothing
Weiter bietet die Run-Methode einen Rückgabewert, da solltest Du auf <> 0 prüfen.
Weiter wäre wichtig, *wo genau* dieser Fehler auftritt. Debugger oder ein entsprechendes ErrorHandling sollte da weiterhelfen.
-
In Lotus-Script übergebe ich die ID des aktuellen Dokumentes wie folgt:
Call agent.Run(doc.getNoteID())
Keine Ahnung, obs daran liegt, aber in LS heißt das so:
Call agent.Run(doc.NoteID)
also micht getNoteID() wie in Java
-
Hast Recht, Thomas, daran wird es wohl liegen, zumindest kennt die LotusScript-NotesDocument-Klasse keine Property "getNoteID()".
Ich hatte diesen Fehler 1:1 zitiert, aber völlig übersehen, danke für den Hinweis.
Das würde dann auch sinnigerweise diese Array-Fehlermeldung erklären in genau der Zeile (wegen der Klammern).
-
Danke erstmal für eure Hilfe,
ich habe den Agenten jetzt ans laufen bekommen (lag wirklich an dem fehlerhaften Methoden-Namen).
Jetzt hat sich leider ein neues (und hoffentlich auch letztes) Problem aufgetan:
- ich starte den Java-Agenten wie erwähnt aus Lotus Script
- bevor ich den Agenten starte, initialisiere ich das aktuelle Dokument und speichere es
(eine Art Zwischenspeichern, um auf RichText-Felder zugreifen zu können) wie folgt:
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
Call uidoc.Save
...einige Berechnungen auf/mit RT-Feldern
- danach erst starte ich den Java-Agenten ( mit Call agent.run(doc.NoteID) )
- der Agent stellt ebenfalls einige Berechnungen an und schreibt diese Ergebnisse in
verschiedene Text-Felder des Dokumentes
- wenn ich noch im Java-Agenten nach dem Füllen der Text-Felder den Befehl doc.Save() aufrufe,
erhalte ich einen Replikations-Konflikt, weil ich das aktuelle Dokument bereits in Lotus Script
initialiert und gespeichert habe
- lasse ich im Java-Agent den Befehl doc.Save() weg, läuft der Agent ohne Probleme, aber
nach Schließen (und vorherigem Speichern mit Call uidoc.Save) und Neu-Öffnen des Dokumentes
sind die Felder, die der Agent gefüllt haben sollte, leer!!
Warum werden die Änderungen, die der Java-Agent im Dokument vornimmt, nicht gespeichert, obwohl ich vor dem Schließen des Dokuments in Lotus Script nochmal speichere (mit Call uidoc.Save)?
Ich hoffe, ich habe mein Problem deutlich genug ausgedrückt und ihr könnt mir helfen
Gruß, Simon
-
Simon, ich weiss nun nicht genau, was Du da treibst, aber Du hast auf jeden Fall ein Verständnisproblem mit Back- und FrontEnd.
Beispiel:
- Du hast ein NotesUIDocument.
- Daran änderst Du etwas und speicherst das via FrontEnd.
- Wenn Du gleichzeitig (und vor allem :VORHER !) ein Backend-Dokument instantiiert hast, bekommt as davon absolut gar nichts mit.
Wenn wir helfen sollen: Löse bitte für uns argumentativ Dein Backend-/FrontEnd-Handling auf.
Bernhard
PS: Warum ist Dein betreffender Agent eigentlich in Java geschrieben ?
-
Hallo Bernhard,
der Unterschied zwischen Back- und Frontend ist mir sehr wohl geläufig.
Das Problem ist, dass ich mit Java, also auch mit dem Java-Agenten nur Backend-Operationen in Notes ausführen kann.
Ich speichere zunächst das Dokument via Frontend, weil ich den Inhalt einiger RichText-Items überprüfen muss (die mir durch mein Zwischen-Speichern dann zur Verfügung stehen).
Anschließend mache ich ein paar Abfragen und gebe Fehlermeldungen, wenn die RichText-Felder bspw. leer sind.
Ist dies nicht der Fall (keine Fehlermeldung), dann lasse ich den Java-Agenten ausführen.
Der kann ja wie gesagt nur Backend-Operationen.
Wie soll ich also das aktuelle Dokument in Java anders initialisieren als ich es bisher tue??
P.S.: Ich nutze Java u.a. deshalb, weil ich einige Strings des Dokumentes mit einem Tokenizer durchlaufen muss, so was gibts ja in Notes leider nicht.
-
Hi Simon!
- bevor ich den Agenten starte, initialisiere ich das aktuelle Dokument und speichere es
(eine Art Zwischenspeichern, um auf RichText-Felder zugreifen zu können) wie folgt:
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
Call uidoc.Save
...einige Berechnungen auf/mit RT-Feldern
- danach erst starte ich den Java-Agenten ( mit Call agent.run(doc.NoteID) )
Diese Berechnungen auf/mit RT-Feldern im uidoc, also bevor du den Java-Agent startest, verändern doch das Dokument, oder? Somit müsste vor dem Aufruf des Agents nochmals ein uidoc.Save her....
Oder machst du das eh?
LG,
Max
-
und zusätzlich muss vielleicht noch ein uidoc.Refresh(true) her
das erzwingt - glaube ich - dass die Änderungen (auch die in RT-Feldern. das macht der Parameter) ins Backenddokument aktualisiert werden.
Bin aber nicht sicher...
-
Warum werden die Änderungen, die der Java-Agent im Dokument vornimmt, nicht gespeichert, obwohl ich vor dem Schließen des Dokuments in Lotus Script nochmal speichere (mit Call uidoc.Save)?
Wie gesagt, Du veränderst mit Java das Backend Dokument, aber speicherst im Script nochmals das Frontend Dokument (uidoc.save!)
Eigentlich sollte nach dem JavaAgent nur das Backend gespeichert werden.
gruss umi
-
P.S.: Ich nutze Java u.a. deshalb, weil ich einige Strings des Dokumentes mit einem Tokenizer durchlaufen muss, so was gibts ja in Notes leider nicht.
... Tokenizer ist ein bekannter Performance-Hammer, für den man auch in Java oft einen Workaround verwendet...
gute Seite für solche Infos: http://www.javaperformancetuning.com/sitemap.shtml
Das OReilley Buch von denen gehört imho selbst zur spartanistischen Grundausstattung jedes halbwegs ernstzunehmenden Java Bücherregals.
Zeige uns wie du StringTokenizer in Java verwendest und wir zeigen dir wie du es in LotusScript und in Java schneller machen kannst :)
-
Was kann der "StringTokenizer" was "Split" nicht kann?
-
imho: nein
-
Hallo zusammen,
erstmal vielen Dank für eure zahlreiche Hilfe.
Ich konnte mein letztes Problem (Speichern via Backend aus Java-Agent) jetzt lösen,
ich rufe den Java-Agenten aus Lotus-Script jetzt NACH dem Speichern des aktuellen Dokumentes (dass ich über uidoc initialisiert habe), auf.
Also in folgender Reihenfolge:
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
//Zwischenspeichern, um auf RT-Felder zugreifen zu können
Call uidoc.Save
...einige Berechnungen auf/mit RT-Feldern
Call uidoc.Save
Call agent.run(doc.NoteID)
Gruß, Simon