Autor Thema: Frage zu Java Agenten  (Gelesen 8584 mal)

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Frage zu Java Agenten
« am: 01.03.18 - 10:48:17 »
Hallo,

ich hätte eine Frage zu Java Spezialisten...

Nachdem ein Kollege den u.g. Java Agenten in einer Datenbank programmiert hat, entstehen dort fast täglich Replizier- und Speicherkonflikte... :(
Kommt evtl. was verdächtig vor?

Vielen Dank im Voraus.

Gruß
Leo

Code
import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.PutMethod;
import java.io.ByteArrayInputStream;

public class BestellAkte {

    private final String narsUrl;

    public BestellAkte(String narsUrl) {
        this.narsUrl = narsUrl;
    }
    
    public void syncAgorumWithNotes(EinkaufsTicket ekTicket) throws Exception {
        ekTicket.createLock();
        if (!isCommunicationWithAgorumNecessary(ekTicket.getBestellStatus())) {
            ekTicket.setAgorumStatus("Keine Bestellakte vorhanden.");
        } else {
            try {
                if (!exists(ekTicket.getBestellNummer())) {
                    createAgorumBestellAkte(ekTicket);
                } else {
                    updateAgorumBestellAkte(ekTicket);
                }
                ekTicket.setAgorumUrl(getAgorumUrl(ekTicket.getBestellNummer()));
                ekTicket.setAgorumStatus("OK");
            } catch (IOException e) {
                ekTicket.setAgorumStatus("Fehler bei der Kommunikation mit NARS! "+e.getMessage());
            }
        }
        ekTicket.saveAndReleaseLock();
        if (ekTicket.errorsOnSave()) {
            throw new Exception("Errors while saving document in notes! " + ekTicket.getBestellNummer());
        }
    }

    private ByteArrayInputStream generateRequestBody(EinkaufsTicket ekTicket) {
        return new ByteArrayInputStream(("{\"bestellNummer\": \"" + ekTicket.getBestellNummer() + "\", "
                + "\"bestellStatus\": \"" + ekTicket.getBestellStatus() + "\", "
                + "\"bestellGenehmiger\": \"" + ekTicket.getBestellGenehmiger() + "\", "
                + "\"bestellSumme\": \"" + ekTicket.getBestellSumme() + "\", "
                + "\"bestellGenehmigungsDatum\": \"" + ekTicket.getBestellGenehmigungsDatum() + "\", "
                + "\"bestellDatum\": \"" + ekTicket.getBestellDatum() + "\", "
                + "\"projektnummer\": \"" + ekTicket.getProjektnummer() + "\", "
                + "\"projektnummerJahr\": \"" + ekTicket.getProjektnummerJahr()+ "\", "
                + "\"kostenstelle\": \"" + ekTicket.getKostenstelle() + "\", "
                + "\"kostenstelleJahr\": \"" + ekTicket.getKostenstelleJahr()+ "\", "
                + "\"notesLink\": \"" + ekTicket.getNotesUrl() + "\" "
                + "}").getBytes(Charset.forName("UTF-8")));
    }

    private String createAgorumBestellAkte(EinkaufsTicket ekTicket) throws HttpException, IOException {
        PostMethod method = new PostMethod(narsUrl + "bestellakte/");
        HttpClient client = new HttpClient();
        method.setRequestBody(generateRequestBody(ekTicket));
        method.addRequestHeader("Accept", "text/plain;charset=UTF-8");
        method.addRequestHeader("Content-Type", "application/json");
        int statusCode = client.executeMethod(method);
        if (statusCode != 201) {
            throw new HttpException("Fehler beim Anlegen der Bestellakte: createAgorumBestellAkte gibt StatusCode ["+statusCode+"]");
        }
        byte[] responseBody = method.getResponseBody();
        return new String(responseBody);
    }

    private void updateAgorumBestellAkte(EinkaufsTicket ekTicket) throws HttpException, IOException {
        PutMethod method = new PutMethod(narsUrl + "bestellakte/"+ekTicket.getBestellNummer());
        HttpClient client = new HttpClient();
        method.setRequestBody(generateRequestBody(ekTicket));
        method.addRequestHeader("Accept", "text/plain;charset=UTF-8");
        method.addRequestHeader("Content-Type", "application/json");
        int statusCode = client.executeMethod(method);
        if (statusCode != 204) {
            throw new HttpException("Fehler beim Aktualisieren der Bestellakte: updateAgorumBestellAkte gibt StatusCode ["+statusCode+"]");
        }
    }

    private boolean exists(String bestellNummer) throws HttpException, IOException {
        GetMethod method = new GetMethod(narsUrl + "bestellakte/" + bestellNummer);
        HttpClient client = new HttpClient();
        int statusCode = client.executeMethod(method);
        return statusCode == 200;
    }

    private String getAgorumUrl(String bestellNummer) throws HttpException, IOException {
        GetMethod method = new GetMethod(narsUrl + "bestellakte/" + bestellNummer + "/link");
        HttpClient client = new HttpClient();
        int statusCode = client.executeMethod(method);
        if (statusCode != 200) {
            throw new HttpException("Fehler bei der Kommunikation mit NARS! getAgorumUrl gibt StatusCode ["+statusCode+"]");
        }
        byte[] responseBody = method.getResponseBody();
        return new String(responseBody);
    }

    private boolean isCommunicationWithAgorumNecessary(String bestellStatus) {
        return bestellStatus.equals("Bestellung")
                || bestellStatus.equals("Bestätigung") || bestellStatus.equals("Teillieferung")
                || bestellStatus.equals("Lieferung") || bestellStatus.equals("Rechnung") || bestellStatus.equals("obsolet");
    }
    
}

Code
public class NotesDateConverter {

    public static String convertNotesDateToJavaFormat(final String eingabeValue) {
        if (eingabeValue.length() == 0) {
            return eingabeValue;
        }
        try {
            String rueckgabeValue = eingabeValue;
            int pos = eingabeValue.indexOf(" "); 
            if (pos > 0) {
                rueckgabeValue = eingabeValue.substring(0, pos);
            }
            pos = rueckgabeValue.indexOf("/");
            if (pos > 0) {
                rueckgabeValue = rueckgabeValue.replace("/", ".");
            }
            pos = rueckgabeValue.indexOf(".");
            if (pos == 1) {
                rueckgabeValue = "0"+rueckgabeValue;
            }
            pos = rueckgabeValue.indexOf(".", 3); 
            if (pos == 4) {
                rueckgabeValue = rueckgabeValue.substring(0, 3) + "0" + rueckgabeValue.substring(3);
            }
            if (rueckgabeValue.substring(6).length() == 2) {
                rueckgabeValue = rueckgabeValue.substring(0, 6) + "20" + rueckgabeValue.substring(6);
            }
            return rueckgabeValue;
        } catch (StringIndexOutOfBoundsException e) {
            return "Error: "+e.toString();
        }
    }

    public static String entfernePunkt(String eingabeValue) {
            String rueckgabeValue = eingabeValue;
            int pos = eingabeValue.indexOf("."); 
            if (pos > 0) {
                    rueckgabeValue = eingabeValue.substring(0, pos);
            }
            return rueckgabeValue;
    }
}

Code
import lotus.domino.*;

public class BestellAkteInAgorumPflegen extends AgentBase {

    public void NotesMain() {
      try {
          Session session = getSession();
          AgentContext agentContext = session.getAgentContext();
          EinkaufsTicketNotesImpl ekTicket = new EinkaufsTicketNotesImpl(agentContext.getDocumentContext());
          new BestellAkte("http://nars-prod-1.osl.MyDomain.de:4380/").syncAgorumWithNotes(ekTicket);
      } catch(Exception e) {
          e.printStackTrace();
      }
   }
}



Code
public interface EinkaufsTicket {

	String getBestellNummer();
	String getBestellStatus();
        String getBestellGenehmiger();
        String getBestellSumme();
        String getBestellGenehmigungsDatum();
        String getNotesUrl();
        String getBestellDatum();
        String getKostenstelle();
        String getKostenstelleJahr();
        String getProjektnummer();
        String getProjektnummerJahr();
	void createLock();
	void saveAndReleaseLock();
	void setAgorumUrl(String agorumUrl);
	void setAgorumStatus(String agorumStatus);
	boolean errorsOnSave();
	
}


Code
import lotus.domino.*;

public class EinkaufsTicketNotesImpl implements EinkaufsTicket {

    private final Document notesDocument;
    private final String bestellNummer;
    private final String bestellStatus;
    private final String bestellGenehmiger;
    private final String bestellSumme;
    private final String bestellGenehmigungsDatum;
    private final String notesUrl;
    private final String bestellDatum;
    private boolean exceptionOnSave = false;
    private final String kostenstelle;
    private final String kostenstelleJahr;
    private final String projektnummer;
    private final String projektnummerJahr;

    public EinkaufsTicketNotesImpl(Document notesDocument) throws NotesException {        
            this.notesDocument = notesDocument;        
            this.bestellNummer = (String) notesDocument.getItemValue("RequestNumber").elementAt(0);        
            this.bestellStatus = (String) notesDocument.getItemValue("bStatus").elementAt(0);        
            this.bestellGenehmiger = (String) notesDocument.getItemValue("approval_control_authorized_name").elementAt(0);        
            this.bestellSumme = notesDocument.getItemValue("authorized_betrag").elementAt(0).toString();        
            this.bestellGenehmigungsDatum = NotesDateConverter.convertNotesDateToJavaFormat((String) notesDocument.getItemValue("approval_control_authorized_date").elementAt(0));        
            this.bestellDatum = NotesDateConverter.convertNotesDateToJavaFormat(notesDocument.getItemValueDateTimeArray("vDat_3").elementAt(0).toString());        
            this.kostenstelle = NotesDateConverter.entfernePunkt(notesDocument.getItemValue("numK").elementAt(0).toString());        
            this.kostenstelleJahr = NotesDateConverter.entfernePunkt(notesDocument.getItemValue("jahrK").elementAt(0).toString());        
            this.projektnummer = NotesDateConverter.entfernePunkt(notesDocument.getItemValue("numP").elementAt(0).toString());        
            this.projektnummerJahr = NotesDateConverter.entfernePunkt(notesDocument.getItemValue("jahrP").elementAt(0).toString());        
            this.notesUrl = notesDocument.getNotesURL();    
    }    

    public String getBestellNummer() {
        return bestellNummer;
    }

    public String getBestellStatus() {
        return bestellStatus;
    }

    public String getBestellGenehmiger() {
        return this.bestellGenehmiger;
    }

    public String getBestellSumme() {
        return this.bestellSumme.trim();
    }

    public String getBestellGenehmigungsDatum() {
        return this.bestellGenehmigungsDatum;
    }

    public String getNotesUrl() {
        return this.notesUrl;
    }
    
    public String getBestellDatum() {
        return this.bestellDatum;
    }

    public void createLock() {
        try {
            notesDocument.lock();
        } catch (NotesException e) {
            exceptionOnSave = true;
        }
    }

    public void saveAndReleaseLock() {
        try {
            notesDocument.computeWithForm(false, false);
            notesDocument.save();
            notesDocument.unlock();
        } catch (NotesException e) {
            exceptionOnSave = true;
        }
    }

    public void setAgorumUrl(String agorumUrl) {
        try {
            notesDocument.replaceItemValue("agorumBestellakteUrl", agorumUrl);
        } catch (Exception e) {
            exceptionOnSave = true;
        }
    }

    public void setAgorumStatus(String agorumStatus) {
        try {
            notesDocument.replaceItemValue("agorumStatus", agorumStatus);
        } catch (NotesException e) {
            exceptionOnSave = true;
        }
    }

    public boolean errorsOnSave() {
        return exceptionOnSave;
    }

    public String getKostenstelle() {
        return this.kostenstelle;
    }

    public String getKostenstelleJahr() {
        return this.kostenstelleJahr;
    }

    public String getProjektnummer() {
        return this.projektnummer;
    }

    public String getProjektnummerJahr() {
        return this.projektnummerJahr;
    }
}
« Letzte Änderung: 01.03.18 - 10:50:05 von Bruce Willis »
nobody is perfect but i'm pretty close 

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #1 am: 01.03.18 - 12:52:20 »
public void createLock() {
        try {
            notesDocument.lock();
        } catch (NotesException e) {
            exceptionOnSave = true;
        }
    }
/quote]

"lock" gibt true oder false zurück, je nachdem ob das Sperren erfolgreich war oder nicht,
und das wird bei euch ignoriert - böse ;)
 
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #2 am: 01.03.18 - 13:44:37 »
public void createLock() {
        try {
            notesDocument.lock();
        } catch (NotesException e) {
            exceptionOnSave = true;
        }
    }

Hallo Erik,
Danke!
Muss man dies an einer bestimmten Stelle oder egal wo eintragen?
 
nobody is perfect but i'm pretty close 

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #3 am: 01.03.18 - 13:54:06 »
Noch eine Frage hinterher...

Der Kollege hatte den Agenten-Aufruf in PostSave eingetragen:

Code
@Command([ToolsRunMacro];"bestellAkteInAgorumPflegen");

Ich würde es gerne in QuerySave z.B. so verschieben

Code
			'01.03.2018 Agorum Agent wird hier statt POSTSAVE Event augerufen!!!
			Dim s As New NotesSession
			Dim db As NotesDatabase
			Dim agent2 As NotesAgent
			Set db = s.CurrentDatabase
			Set agent2 = db.GetAgent("bestellAkteInAgorumPflegen")
			If agent2.Run = 0 Then
				Print "Agorum-Agent erfolgreich gelaufen"
			Else
				MessageBox "Agorum-Agent konnte nicht gestartet werden",64, "Bitte Ihrem Notes Admin melden"
			End If

Aber bekomme die Fehlermeldung "Could not execute Macro".
Auch dann, wenn ich den Agenten per Button mit LS aufrufe.

Außerdem, wenn ich den Agenten per Button mit FS aufrufe, bekomme ich die Fehlermeldung "Dokument noch nicht gespeichert".

Was ist da noch faul?
nobody is perfect but i'm pretty close 

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #4 am: 01.03.18 - 15:02:28 »
eins nach dem anderen

zur 1. Frage, das ist ein Stück Code aus deinem 1. Beitrag.
Frage: Was soll denn passieren wenn ein Dokument gesperrt ist?
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #5 am: 01.03.18 - 15:43:17 »
Was soll denn passieren wenn ein Dokument gesperrt ist?
Der Agent muss trotzdem weiter laufen, d.h. die Daten aus dem Notes Dok nach Agorum übertragen und danach einiges zurück ins Notes Dok schreiben.
Das Ganze sollte beim Speichern des Dokuments passieren, nachdem der Bearbeiter seine Änderungen geschrieben und Strg-S o.ä. geklickt hat.

Im Moment es ist aber z.B. so:
- der Bearbeiter öffnet und editiert das Dok
- dann speichert er es, aber noch nicht schließt sondern arbeitet damit weiter
- dann will er nochmals speichern und bekommt die Meldung, dass dieses Dok schon mal gespeichert wurde und daher soll er entweder nix mehr speichern oder nur als Konflikt-Dok speichern...

 :-:
nobody is perfect but i'm pretty close 

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #6 am: 01.03.18 - 16:00:47 »
Dann ist die Beobachtung korrekt, denn das Dokument wird im Backend durch einen Agenten gespeichert. Dieses "Speichern" bekommt der Notes-Client, und damit das geöffnete Dokument, nicht mit.

Man müsste das Ui-Dokument, nach dem Agentenlauf, einmal schließen und neu öffnen ;)
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #7 am: 01.03.18 - 16:16:54 »
Man müsste das Ui-Dokument, nach dem Agentenlauf, einmal schließen und neu öffnen ;)
Ja, man müsste, die User wollen aber weiter so wie bis jetzt arbeiten... :(
Daher will ich probieren, den Agenten anders aufzurufen, kriege aber die o.g. Fehlermeldungen.
Hättest Du eine Idee?
Oder ein anderes Workaround?
nobody is perfect but i'm pretty close 

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #8 am: 01.03.18 - 16:31:07 »
Ihr könnt den Agenten-Aufruf umgehen, also mit LS2J arbeiten oder im PostSave das "Speichern" merken und im QueryClose erst den Aufruf durchführen.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #9 am: 01.03.18 - 16:35:10 »
...im PostSave das "Speichern" merken und im QueryClose erst den Aufruf durchführen.
Danke!
Ich probiere mit QueryClose.
Weißt Du noch, warum die o.g. Fehlermeldungen kommen?
Ich hab schon einiges an LS in QueryClose und kann dort daher keine FS verwenden...
nobody is perfect but i'm pretty close 

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #10 am: 01.03.18 - 17:06:39 »
dann schreib den Agentenaufruf in LotusScript  8)

Der Unterschied zu vorher (von PostSave zu QuerySave) besteht darin das dein Ui-Dokument noch nicht gespeichert wurde, der Agent benötigt aber genau das. Das ist so, weil es in Java keine NotesUi-Klassen gibt.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #11 am: 01.03.18 - 18:52:57 »
dann schreib den Agentenaufruf in LotusScript  8)

Der Unterschied zu vorher (von PostSave zu QuerySave) besteht darin das dein Ui-Dokument noch nicht gespeichert wurde, der Agent benötigt aber genau das. Das ist so, weil es in Java keine NotesUi-Klassen gibt.


Nochmals Danke.
Gerade getestet.
Aber auch in QueryClose bekomme ich die gleiche o.g. Fehlermeldung "Could not execute Macro". :(
Warum aber?  :-:
nobody is perfect but i'm pretty close 

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #12 am: 01.03.18 - 19:35:34 »
OK, da hat der Agent den Bezug zum Dokument verloren.
Dann die Note-ID des Dokumentes dem run-Befehl mitgeben und in Java das Dokument mittels getParameterDocID holen, dann noch das Ziel beim Agenten ändern, das sollte gehen ;)
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 248
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #13 am: 02.03.18 - 08:00:00 »
Das Ganze im QueryClose aufzurufen wird das ursprüngliche Problem zwar mildern (der Fehler wird immer noch auftreten, wenn z.B. Validierungsprüfungen im Dokument das Schließen verhindern), aber weitere Probleme mit sich bringen:
- Was passiert z.B., wenn jemand das Dokument lange geöffnet lässt? Dann bekommt "die andere Seite" ja lange nicht mit, dass gespeichert wurde.
- Wenn Notes oder Windows anschließend mal abstürzen erfolgt überhaupt kein Aufruf.
Auch wenn das nicht allzuoft vorkommen wird muss geklärt werden: Kann man damit leben?

Man sollte das Ganze wohl im PostSave belassen, aber z.B. so umschreiben, dass der Agent mit RunWithDocumentContext das aktuell geöffnete Dokument (aus dem Hauptspeicher) nutzt und das Durchrechnen sowie erneute Speichern nach dem Aufruf dann anschließend ebenfalls im PostSave-Event gemacht wird.

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #14 am: 02.03.18 - 09:42:43 »
OK, da hat der Agent den Bezug zum Dokument verloren.
Kann man also einen bzw. so einen Java Agenten nur über FS aber nicht über LS aufrufen, da beim Aufruf über LS (egal ob in einem Event oder Button) die gleiche o.g. Fehlermeldung kommt?

Dann die Note-ID des Dokumentes dem run-Befehl mitgeben und in Java das Dokument mittels getParameterDocID holen, dann noch das Ziel beim Agenten ändern, das sollte gehen ;)
Es hört sich einfach an. ;)
Kannst Du bitte den o.g. Java-Code um die ein paar benötigten Zeilen entsprechend erweitern?

Den LS Code könnte ich so erweitern, oder?
Code
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Dim agent2 As NotesAgent
	Dim doc As NotesDocument
	Set db = s.CurrentDatabase
	Set agent2 = db.GetAgent("bestellAkteInAgorumPflegen")
	Set doc = Source.Document

	If agent.Run(doc.NoteID) = 0 Then
		Print "Agorum-Agent erfolgreich gelaufen"
	Else
		Messagebox "Agorum-Agent konnte nicht gestartet werden",64, "Bitte Ihrem Notes Admin melden"
	End If
nobody is perfect but i'm pretty close 

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #15 am: 02.03.18 - 09:49:51 »
...Man sollte das Ganze wohl im PostSave belassen, aber z.B. so umschreiben, dass der Agent mit RunWithDocumentContext das aktuell geöffnete Dokument (aus dem Hauptspeicher) nutzt ...
Vielen Dank.
Kannst Du bitte diese ein paar Zeilen hier schreiben?
nobody is perfect but i'm pretty close 

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 248
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #16 am: 04.03.18 - 14:24:17 »
Ich habe das jetzt mal so runter geschrieben, also ohne Gewähr ...

Code
	Sub PostSave(Source As NotesUIDocument)
		Dim doc As NotesDocument
		Dim db As NotesDatabase
		Dim agent As NotesAgent
		Dim ret 
		
		Set doc = Source.Document
		Set db = doc.ParentDatabase
		Set agent = db.GetAgent("<agentname>")
		
		'// der Agent sollte im Feld _retValue einen Returncode zurückliefern ...
		doc.ReplaceItemValue("_retValue", "").SaveToDisk = False

		ret = agent.runWithDocumentContext(doc)
		
		If ret <> 0 Then Error 32000,  "Allgemeiner Fehler beim Aufruf des Agenten <agentname>"

		ret = doc.GetItemValue("_retValue")(0)
		
		Select Case ret
			Case ...
				...
				Call doc.Save(True, True)
			...
		End Select	
	End Sub

Im Java-Agenten muss man dann über AgentContext.getDocumentContext() auf das Dokument zugreifen.

Hoffe, das hilft weiter?
-Werner

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Frage zu Java Agenten
« Antwort #17 am: 12.03.18 - 10:34:00 »
Ich habe das jetzt mal so runter geschrieben, also ohne Gewähr ...
...
Hallo Werner,
vielen Dank!
Ich probiere es mal.
Gruß
Leo
nobody is perfect but i'm pretty close 

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #18 am: 12.03.18 - 11:18:15 »
Jetzt bist du wieder bei deinem Ursprung, mit dem Unterschied das dein Agent nicht über Formel sondern mittels Lotusscript aufgerufen wird, das wird dein Problem nicht lösen!
Gib den Java-Agenten an den Entwickler zurück, erkläre ihm die Probleme und gib ihm ggf. noch den Tipp mit LS2J.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 248
  • Geschlecht: Männlich
Re: Frage zu Java Agenten
« Antwort #19 am: 12.03.18 - 17:07:16 »
@jBubbleBoy:
Warum sind wir denn wieder am Ursprung?
Das ist nicht ein einfaches Verlagern des Aufrufs!
Ich denke, dass mit meinem Vorschlag das Problem gelöst werden kann.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz