Autor Thema: agent.run in QuerySave  (Gelesen 8721 mal)

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
agent.run in QuerySave
« am: 16.01.12 - 18:21:35 »
Hallo,

ich möchte per LS im Querysave einer Maske einen Agenten aufrufen, aber der Agent startet scheinbar nicht.

Woran kann es liegen?

Es geht um einen FormesSprache-Agenten, der einige Felder des Dokuments ändert bzw. ändern soll.

Als QuerySave noch in FS geschrieben war, ging es einwandfrei...  :-:

Gruß
Leo

Code
Dim session As New NotesSession
	Dim db As NotesDatabase
	Set db = session.CurrentDatabase

		'Agent zur Bearbeitung und Übertragung aller Änderungen und Senden der Mails
		Dim agent As NotesAgent 
		Set agent = db.GetAgent("L_EnterChangesInHistory")	
		If agent.Run = 0 Then
			Print "Agent ran - Success"
		Else
			Print "Agent did not run - Failure"
		End If
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: agent.run in QuerySave
« Antwort #1 am: 16.01.12 - 18:28:14 »
Was sind die Einstellungen des Agents? Er zielt auf ...? Hantiert der Agent mit dem Frontend?  Findet sich in der Statuszeile / im lokalen Log ein Hinweis?

Bernhard

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: agent.run in QuerySave
« Antwort #2 am: 16.01.12 - 21:26:01 »
Der Agent hat kein Dokument wenn er nur mit run gestartet wird.
 Entweder du verwendest runwithdocumentcontext oder du gibst eine NoteId an.
(wobei letzeres hier wohl zu Speicherkonflikten führt)

Gruß Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: agent.run in QuerySave
« Antwort #3 am: 16.01.12 - 21:44:25 »
In die Richtung zielte auch meien Nachfrage, Roland. Mir stellt sich überhaupt die Frage: Wozu muss ich im QuerySave (oder PostSave oder QueryClose) einen Agent aufrufen? Ein RunOnServer vielleicht noch, aber dann müsste die Sache einerseits schon sehr komplex sein und zweitens sehr, sehr gut begründet.

Bernhard

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: agent.run in QuerySave
« Antwort #4 am: 16.01.12 - 22:51:55 »
Was sind die Einstellungen des Agents? Er zielt auf ...? Hantiert der Agent mit dem Frontend?  Findet sich in der Statuszeile / im lokalen Log ein Hinweis?


Hi Bernhard,

1. Auslösen "Durch Ereignis", Auswahl im Menü 'Aktionen", Ziel "Keines"

2. Der Agent protokolliert im Dokument beim Speichern im Feld "History" und einigen anderen alles, was im Dokument geändert wurde.

Beispiel bzw. Auszug:

Code
REM {Bearbeitung der Feldern falls Schalter zur CMDB Angaben changed};
newValue := @Text(cmdb)  ;
oldValue := @Text(oldcmdb)  ;
tmp1 := @If(oldcmdb =""; " setzte"; " änderte")  ;
tmp2 := " den CMDB-Relevanz-Schalter auf " ;
newEntry := WannWer + tmp1 + tmp2 + "'" + newValue + "'";
@If( oldValue != newValue ; @Do (
@StatusBar(tmp1 + " ... " + tmp2);
@SetField("oldcmdb"; newValue) ;
@SetField("History"; @NewLine + newEntry +  @Left(History; 30000 ) ) ;
@SetField("History_1"; @Left(History_1; 30000 )  + newEntry + @NewLine  )
);  @Success );

3. Beim Starten (aus FS QuerrySave) brachte der Agent den Hinweis in der Statusleiste.
Jetzt aber nicht mehr. Als ob er gar nicht startet.
Obwohl die Meldung "Agent ran - Success" aus LS QuerySave kommt. :(

Code
@StatusBar("Aktualisierung gestartet...");
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: agent.run in QuerySave
« Antwort #5 am: 16.01.12 - 22:57:38 »
Der Agent hat kein Dokument wenn er nur mit run gestartet wird.
Entweder du verwendest runwithdocumentcontext oder du gibst eine NoteId an.
(wobei letzeres hier wohl zu Speicherkonflikten führt)
Hi Roland,

Danke.
Könntest Du bitte hier ein Beispiel mit ein paar Zeilen Code schrieben?

Gruß
Leo
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: agent.run in QuerySave
« Antwort #6 am: 16.01.12 - 23:02:25 »
Achtung, Leo: Die Kern-Aussage bzw. Warnung liegt in den Speicherkonflikten! Du kannst nicht im QuerySave speichern und "gleichzeitig" selbiges im Backend via Agent tun. Das kann nicht gut gehen. Formelsprache war da etwas anderes (dafür ging ja eben auch nicht alles).

Ich würde dieses Konstrukt einfach in die Tonne klopfen und es zum Anlass nehmen, das jetzt ordentlich zu machen.

Bernhard

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: agent.run in QuerySave
« Antwort #7 am: 16.01.12 - 23:13:50 »
Achtung, Leo: Die Kern-Aussage bzw. Warnung liegt in den Speicherkonflikten! Du kannst nicht im QuerySave speichern und "gleichzeitig" selbiges im Backend via Agent tun. Das kann nicht gut gehen. Formelsprache war da etwas anderes (dafür ging ja eben auch nicht alles).

Ich würde dieses Konstrukt einfach in die Tonne klopfen und es zum Anlass nehmen, das jetzt ordentlich zu machen.

Danke, Bernhard.
Ich werde mal ordentlich machen. Versprochen! ;)
Aber nicht heute.

Ich will zwar mit LS in QuerySave etwas verbessern, aber habe keine Zeit für so ein Ding wie ein super großen, langen und komplizierten FS Agenten in LS umzuschreiben.

Vielleicht kann ich die Speicherkonflikte doch umgehen.
z.B. mit einem Timer o.ä.?

Mein momentanes Problem ist, wenn ich
Call agent.RunWithDocumentContext
statt
Call agent.Run
schreibe, will QuerySave nicht gespeichert werden.

Was soll ich wirklich eintragen?

Gruß
Leo
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: agent.run in QuerySave
« Antwort #8 am: 16.01.12 - 23:19:04 »
Zitat
Vielleicht kann ich die Speicherkonflikte doch umgehen.

Nein. Und wenn der Rest des Formelagents so aussieht wie der Ausschnitt: Herrjeh, das ist den Aufwand / den Ärger schlicht nicht wert.

Bernhard

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: agent.run in QuerySave
« Antwort #9 am: 16.01.12 - 23:23:06 »
wenn der Rest des Formelagents so aussieht wie der Ausschnitt: Herrjeh, das ist den Aufwand / den Ärger schlicht nicht wert.
1. Sorry, was genau meinst Du denn damit?
2. Kannst Du bitte meine vorherige Frage bzgl. Call agent.RunWithDocumentContext beantworten?
3. Wie würdest Du alle Änderungen der Dokument-Felder protokollieren außer aus dem QuerySave heraus?

Gruß
Leo
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: agent.run in QuerySave
« Antwort #10 am: 16.01.12 - 23:28:04 »
Zu 1) Das ist doch egal, ob Formel oder LS. Ich sehe da keine Herausforerungen.

Zu 2) Was soll die Frage? Wie fahre ich mein Auto am besten gegen die Wand? In XPages oder extND - okay. Im QuerySave: Denk an Dein Auto.

Zu 3) Genau im QuerySave. Das ist schon der passende Ort.

Bernhard

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: agent.run in QuerySave
« Antwort #11 am: 17.01.12 - 00:10:55 »
Na, ja, wie ein russisches Sprichwort buchstäblich übersetzt sagt:
"In den Händen von jemand anderem ist das männliche Glied immer dicker."
 ;D
« Letzte Änderung: 17.01.12 - 00:12:55 von Bruce Willis »
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: agent.run in QuerySave
« Antwort #12 am: 17.01.12 - 01:00:39 »
Also, ich hab gerade schnell probiert und stellte fest, dass ein LS Agent per Agent.Run einwandfrei aus QuerySave gestartet wird, seine Aufgabe richtig macht und keine Speicherkonflikte erzeugt.

z.B. dieser:

Code
Sub Initialize
  
	Dim item As NotesItem
	Dim ws As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Set uidoc = ws.currentdocument
	Dim doc As NotesDocument 
	Set doc = uidoc.Document 
	Set item = doc.ReplaceItemValue ( "History", doc.NewProcess(0) & Chr(13) & doc.History(0) )
	Set item = doc.ReplaceItemValue ( "NewProcess", "" )
	
End Sub

Die Frage ist also, ob bzw. wie ein FS Agent aufgerufen werden könnte, damit er auch läuft.
« Letzte Änderung: 17.01.12 - 01:02:22 von Bruce Willis »
nobody is perfect but i'm pretty close 

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: agent.run in QuerySave
« Antwort #13 am: 17.01.12 - 03:19:31 »
Agenten, die mit Agent.run gestartet werden, sind Backend-Agenten, auf UI-Funktionen sollte man da tunlichst verzichten. (also keinen UI-Workspace verwenden, auch wenn es in deinem Fall zu funktionieren scheint. DON'T DO IT  :-P )
Ausgaben mit Print/Megbox landen im lokalen Noteslog.

Man kann dem Agenten eine NoteID übergeben, das Dok. muss dann aber gespeichert sein was dir im Querysave höchstwahrscheinlich einen Konflikt erzeugt.
(erst seit 8.5.? gibt es runwithdocumentcontext)
Als Workaround kann man zwar mit Temp-Dokumenten arbeiten etc... darauf will ich jetzt aber nicht näher eingehen, da alles eine ziemliche Krücke ist.

Ist denn dein Historie-Agent ein LS-Agent? Wenn ja, dann pack den Code in eine Methode in einer Scriptlibrary, der du das zu protokollierende Dokument übergibst. Das ist m.E. die sauberste Lösung.

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: agent.run in QuerySave
« Antwort #14 am: 17.01.12 - 07:59:16 »
Wenn ich Dich richtig verstehe, hast Du das Problem, dass Du im QuerySave sowohl Script als auch Formel ausführen willst. Deshalb hast Du einen Agenten, der in Formelsprache das "alte" Querysave enthält, und den Du dann aus dem "neuen" Querysave, das in Script geschrieben ist, per agent.Run starten willst.

Wenn Dein Hauptproblem also ist, dass Du zwei Querysaves benötigst, eines in Formel und eines in Script, erstelle Dir eine Teilmaske und füge die in Deine Maske ein. Ins Querysave der Teilmaske schreibst Du Formelsprache, ins Querysave der Maske das Script (oder umgekehrt). Erst wird das Querysave der Maske, dann das der Teilmaske ausgeführt.

Hoffe, das bringt Dich weiter.

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: agent.run in QuerySave
« Antwort #15 am: 17.01.12 - 09:40:29 »
Hallo Roland,

Agenten, die mit Agent.run gestartet werden, sind Backend-Agenten, auf UI-Funktionen sollte man da tunlichst verzichten.
Oooooh!
Danke!

Ausgaben mit Print/Megbox landen im lokalen Noteslog.
Ach soooo.
Dann muss ich meinen FS Agenten wirklich anders realisieren, weil er dem Benutzer noch einige Statusleiste- und Popup-Meldungen auf dem Weg gibt...

Man kann dem Agenten eine NoteID übergeben, das Dok. muss dann aber gespeichert sein was dir im Querysave höchstwahrscheinlich einen Konflikt erzeugt.
(erst seit 8.5.? gibt es runwithdocumentcontext)
Aber wie genau rufe ich einen ForsmelSprache-Agent und/oder auch einen BackEnd LS-Agent mit NoteID und runwithdocumentcontext ?
Kannst Du bitte ein paar Zeilen mit den beiden Beispiele hier schreiben?
Ich finde in der Designer Hilfe leider keine Beispiele.
Und was schreibe ich in dem BackEnd LS-Agent, damit er weiß, welches Doc er abarbeiten soll?

Ist denn dein Historie-Agent ein LS-Agent? Wenn ja, dann pack den Code in eine Methode in einer Scriptlibrary, der du das zu protokollierende Dokument übergibst. Das ist m.E. die sauberste Lösung.
Ja, das werde ich wohl tun müssen.

Gruß
Leo
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: agent.run in QuerySave
« Antwort #16 am: 17.01.12 - 09:53:46 »
Hallo Peter,
Wenn ich Dich richtig verstehe, hast Du das Problem, dass Du im QuerySave sowohl Script als auch Formel ausführen willst. Deshalb hast Du einen Agenten, der in Formelsprache das "alte" Querysave enthält, und den Du dann aus dem "neuen" Querysave, das in Script geschrieben ist, per agent.Run starten willst.
Ja, im Prinzip so.
Ich hatte das super lange QuerySave voll mit FS Code.
Dann merkte ich, dass die Validierungen nicht immer ganz sauber funktionieren und wollte in LS umschreiben. Aber nicht sofort mangels der Zeit.
Daher habe ich einen größten Teil in den FS Agenten ausgelagert und einen kleineren im FS QuerySave gelassen.
So lief es ein Weile.
Gestern hab ich das QuerySave in LS umgeschrieben und ziemlich spät am Abend merkte, dass der FS Agent nicht gestartet wird... ::)
Schließlich nach der nachtlichen Diskussion hier habe ich QuerySave wieder auf FS umgestellt.  :'(
Das ist der letze Status.

Wenn Dein Hauptproblem also ist, dass Du zwei Querysaves benötigst, eines in Formel und eines in Script, erstelle Dir eine Teilmaske und füge die in Deine Maske ein. Ins Querysave der Teilmaske schreibst Du Formelsprache, ins Querysave der Maske das Script (oder umgekehrt). Erst wird das Querysave der Maske, dann das der Teilmaske ausgeführt.

Hoffe, das bringt Dich weiter.

Ja, vielen Dank!
Die Idee ist sehr interessant.

Gruß
Leo
« Letzte Änderung: 17.01.12 - 09:56:40 von Bruce Willis »
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: agent.run in QuerySave
« Antwort #17 am: 17.01.12 - 12:36:40 »
pack den Code in eine Methode in einer Scriptlibrary, der du das zu protokollierende Dokument übergibst. Das ist m.E. die sauberste Lösung.
Ich bin fast am Ende. :(

Ich hab in einer Scriptlibrary eine Funktion erstellt:
Code
Function fTest As String
fTest = "Test"
Messagebox "Test"
Print "Test"
End Function

Wenn ich sie aus QuerySave aufrufe, passiert gar nichts.

Wenn ich sie in QuerySave ausgebe, wird alles nur leer (also ohne "Test") angezeigt.
Messagebox fTest
Print fTest

Wenn ich diese Funktion aus einem LS Agenten aufrufe, läuft alles.
Was mache ich falsch?  :-:

nobody is perfect but i'm pretty close 

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: agent.run in QuerySave
« Antwort #18 am: 17.01.12 - 12:43:14 »
Wie rufst Du die Function auf?

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: agent.run in QuerySave
« Antwort #19 am: 17.01.12 - 13:19:24 »
Danke für den Denkanstoß, Peter!

Ich hatte die Library in die Maske nicht eingebunden.
Und das QuerySave hatte nicht gemeckert.  :-:

Jetzt läuft's.  :)
nobody is perfect but i'm pretty close 

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz