Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Peter Klett am 03.02.11 - 16:42:46

Titel: Zeitplan von Agenten per Aktion setzen
Beitrag von: Peter Klett am 03.02.11 - 16:42:46
Hallo,

folgende Problemstellung:

Wir haben einen Script-Agenten in einer Datenbank, die an Kunden verteilt wird. Die Gestaltung des Agenten ist verborgen, Gestaltungselemente sind aber sichtbar (Gestaltung verborgen und per Flag wieder geöffnet).

Damit nicht bei jedem Kunden der Agent zur gleichen Uhrzeit laufen muss, haben wir bisher den Agent öffnen lassen und im Zeitplan eine Uhrzeit eintragen lassen. Die Aktualisierung des Agenten per Designtask war ausgeschaltet, so dass dieser Agent immer zu der eingestellten Uhrzeit periodisch startete.

Seit Notes 8 (oder 8.5) gab es den Fehler, dass in einen geschlossenen Agenten beim Öffnen ein Kommentar eingetragen wurde. Nach dem Speichern (wegen der geänderten Startzeit) war der Agent dann tot, weil das Script durch den Kommentar geändert wurde. In einer späteren Version ist der Fehler anscheinend dadurch gefixt worden, dass in Agenten mit verborgenem Design die Zeitplanung nicht mehr verstellbar ist.

Da ich vermeiden möchte, 30 gleiche Agenten, die um 1:00, 1:10, 1:20 usw. gestartet werden, zu bauen und darüber die Auswahl zu treffen, suche ich nach einer betriebssystemunabhängigen Lösung, beim Aktivieren eines Agenten per Schaltfläche (ideal wäre per Script) die Startzeit mitzugeben.

Hat jemand eine Idee?

Vielen Dank schonmal
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: 0xse am 03.02.11 - 16:49:05
Gestaltungselemente in einer Notes DB sind ja auch nur Dokumente. Schon mal mit Notes Peek geschaut in welchen Feldern da der Zeitplan steht und in welchem Format? Denn dann könntest du ihn via LS setzen ohne das der kompilierte Code verloren geht.

Edit:
Bei dieser Herangehensweise solltest du dein Script ausgiebig mit jeder neuen Notes Version testen =)

Viele Grüße,
0xse
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: koehlerbv am 03.02.11 - 16:52:57
Die Informationen sind im Item $AssistInfo gespeichert. Um dieses zu lesen oder zu schreiben, muss man die NotesAPI bemühen.

Bernhard
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: koehlerbv am 03.02.11 - 16:58:46
Ein sehr guter Beitrag von Rod Whiteley findet sich hier (http://www-10.lotus.com/ldd/46dom.nsf/0/65389424caefa06980256b260051da56?OpenDocument).

HTH,
Bernhard

PS: Meine im Prinzip hierauf basierende Library "AgentTools" funktioniert seit R4 und mit R8.5 immer noch.
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: eknori am 03.02.11 - 17:01:10
Wusste doch, daß wir das schon mal hatten

http://atnotes.de/index.php/topic,9523.msg50829.html#msg50829 (http://atnotes.de/index.php/topic,9523.msg50829.html#msg50829)
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: Peter Klett am 03.02.11 - 17:09:37
@Oxse: In die Felder des Agenten hatte ich schon mal geschaut, aber nichts Verwertbares gefunden

@Bernhard: ok, $AssistInfo ist kein Feld in das man einfach per Script was reinschiebt. API wollte ich eigentlich vermeiden, denn dann fliegt mir das u.U. bei unterschiedlichen Betriebssystemen um die Ohren.

Mir fällt gerade ein, dass ich mir die $AssistInfo-Items mit den unterschiedlichen Startzeiten irgendwohin kopieren könnte und dann per Copy-Item in das Agenten-Dokument kopieren könnte (ok, Fleißarbeit). Wenn das klappt, bräuchte ich keine API. Bisher wusste ich nicht einmal, wo die Info abgelegt ist, der Tipp war auf jedenfall hilfreich. Mh, mal sehen, probiere ich vielleicht morgen mal aus. Gebe dann Bescheid was draus geworden ist.

Vielen Dank erstmal soweit.
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: koehlerbv am 03.02.11 - 17:11:09
Wusste doch, daß wir das schon mal hatten

Jo, das war damals *der* Beitrag, über den ich AtNotes gefunden und mich hier angemeldet habe  ;)

Bernhard
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: Peter Klett am 03.02.11 - 17:11:35
Danke auch Dir, Ulrich
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: koehlerbv am 03.02.11 - 17:15:32
Peter, auch diesen API-Code kann man so schreiben, dass er mit unterschiedlichen OS läuft. Aber wieviel OS-Versionen erwartest Du denn auf den Clients?

Ich sehe mit dem simplen Copy ein Problem - ich halte es nicht für ausgeschlossen, dass das Agent-Dokument damit ungültig wird. Es wäre auch ein, naja, sagen wir mal ... ärmliches Verfahren.

Bernhard
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: Peter Klett am 03.02.11 - 17:46:51
Hallo Bernhard,

das mit der Erwartung, ist so eine Sache.

Erwarte ich, dass alle schön brav Windows einsetzen und setze auf die API (von der ich bisher generell die Finger gelassen habe), kommt morgen einer auf die Idee, nur noch irgendwelche Exoten-BS einzusetzen.

Baue ich eine "ärmliche" Lösung ohne API, nutzen alle in den nächsten 20 Jahren nur Windows.

Da ist mir dann die zweite Wahl lieber.

Werde also ausprobieren, vor dem Aktivieren das Item auszutauschen. Wenn es klappt, ist es mir egal, ob das als ärmlich angesehen wird, wenn es nicht klappt, probiere ich wohl die API (auf dass bald alle Clients unter Obuntnix 34,5 Bit laufen). Oder ich nehme doch die 30 Agenten? Ist auch ärmlich. Muss aber nur funktionieren. Habe dann wohl die Wahl, zwischen wissenschaftlich sauber, aber geht vielleicht morgen nicht, oder klappt ärmlich, aber immer (wobei das auch keiner sagen kann).

Ich werde berichten ...
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: koehlerbv am 03.02.11 - 21:00:32
Hallo Peter,

ich verstehe Deine "Angst" vor der API (wer hatte die nicht beim ersten Mal?). Aber wenn man sich allgemein mit Programmierung auskennt und mal den Anfang gemacht hat und systematisch an die Sache heran geht, wundert sich dann bald, warum man vorher so einen Bammel hatte ...

Die für das Anpassen von $AssistInfo brauchst Du genau eine Lib der Notes-API. Und die Deklarationen kann man mit einer einzigen Abfrage OS-genau machen: nnotes.dll oder (aus dem Bauch) libnotes oder NotesLib. Also eine SELECT CASE-Abfrage (die jederzeit ergänzt werden kann).

Wenn ich mich jetzt recht erinnere, gibt es derzeit Clients für Windows, Linux und MacOS. Exotischer isses nich.

Weiterer Vorteil: Du kannst Deinen Kunden dann auch die Wahl überlassen, wann genau sie den Agent starten wollen. Allein für den Tag ergeben sich ja schon 1.440 Möglichkeiten. Wenn die aber nur am Wochenende wollen? Oder am Wochenende gerade nicht? And so on ...

Ich denke, passende Hilfestellung können wir (wenn auch stark ausgedünnt, was die "Mannschaftsstärke" angeht) hier bei AtNotes leisten  :)

Bernhard
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: eknori am 04.02.11 - 06:02:57
@Bernhard: Vorsicht, diese Funktionen sind reine WINDOOF Funktionen. Das muss man dann schon ein wenig umstricken.

Code
Declare Private Sub Peek Lib "MSVCRT" Alias "memcpy" _
(  D As Any, Byval P As Long, Byval N As Long)

Declare Private Sub Poke Lib "MSVCRT" Alias "memcpy" _
(  Byval D As Long, D As Any, Byval N As Long)

Declare Private Sub PokeString Lib "MSVCRT" Alias "memcpy" _
(  Byval D As Long, Byval S As String, Byval N As Long)
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: Peter Klett am 04.02.11 - 07:43:47
Danke Euch allen!

Habe es nun doch mit der API gemacht (auch wenn ich es hasse, Code nur zu kopieren). Um das Windows-Client-Problem zu umgehen, habe ich etwas umorganisiert. Geplant hatte ich, während des Aktivierens der Agenten (es werden dabei mehrere Agenten unterzeichnet, deshalb eine eigene Schaltfläche) die Uhrzeit mit abzufragen und zu setzen. Bei Nicht-Windows-Clients oder anderen Fehlern, die ich mangels Erfahrung mit der API nicht absehen kann, würde der Aktivierungsprozess nicht funktionieren.

Also habe ich nun eine separate Aktion gebaut, die die Uhrzeit abfragt, aus einer Liste zwischen 1:00 und 4:55 eine neue Startzeit auswählen lässt und die neue Zeit in den Agenten schreibt. Funktioniert einwandfrei. Vorteil ist nun, dass ich sogar vorgeben kann, welche Startzeit verwendet werden darf (ein Agentenlauf z.B. um 12:00 Uhr wäre in dem System unsinnig).

Funktioniert die Zeitauswahl nicht (Client- oder API-Problem o.ä.), stört das nicht so sehr, da das Aktivieren davon nicht betroffen ist. Dann bleibt es halt bei 1:00 Uhr. Ist zwar ein Klick mehr (ich bin da schon pingelig), aber sicherer.

Sinngemäß läuft es so:

GetAssistInfo db, "MeinAgent", info
info.Time1 = Cdat (neuerWert)
SetAssistInfo db, "MeinAgent", info
Msgbox "Bitte aktivieren Sie die Agenten erneut ...

Das Ermitteln des neuerWert hier zu posten wäre sinnfrei, da dort eigene Routinen verwendet werden, die niemand sonst hat.

Also vielen Dank noch einmal.
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: Peter Klett am 04.02.11 - 11:48:09
Bin doch noch nicht fertig.

Mit der beschriebenen Aktion kann ich die Uhrzeit setzen. Beim nächsten Aufruf der Aktion wird mir auch die zuletzt eingetragene Uhrzeit angezeigt, ebenso im Zeitplan des geöffneten Agenten.

Jetzt aktiviere oder deaktiviere ich mit der nächsten Aktion den Agenten. Bei

agent.IsEnabled = True (oder False)

Kommt unter Notes 7.03 und 8.51 die Fehlermeldung:

Dokument wurde seit der Signierung geändert oder beschädigt! (Daten)

5.10 hat damit keine Probleme, das hilft mir aber nicht weiter. Öffne ich den Agenten und speichere ihn, ist der Fehler behoben. Damit bin ich genau so weit, wie vorher, dass der Agent geöffnet und gespeichert werden muss (und damit ab 8 bei geschlossenem Design zerstört wird).
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: Peter Klett am 04.02.11 - 12:05:27
So, nun läufts doch. Habe das Setzen der Zeit wie folgt geändert:

GetAssistInfo db, "MeinAgent", info
info.Time1 = Cdat (neuerWert)
SetAssistInfo db, "MeinAgent", info
Call db.Sign
Msgbox "Die Startzeit wurde festgelegt und die Datenbank signiert ...

Jetzt wird die Datenbank danach noch signiert.
Ist so sogar noch besser, da dann ein aktivierter Agent nicht nochmal aktiviert werden muss.

Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: CarstenB am 21.04.11 - 09:21:57
Moin zusammen,
ich wollte die Funktionen auch nutzt, um verschiedenen Agenten zu monitoren. Auf den Client läuft es auch perfekt.
Allerdings nicht auf dem 8.5.2 Server 64bit. Hat jemand das in dieser Konstellation ans Laufen gebracht?
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: marschul am 21.04.11 - 10:28:23
Ich hatte vor langer Zeit mal eine ähnliche Aufgabenstellung, diese jedoch ganz anders gelöst:
Agent ist so eingestellt, dass er rund um die Uhr im Halbstundentakt anläuft. In einem Profildokument konnte die Zeit eingestellt werden. Der Agent hat dann jedes Mal geschaut, ob er schon dran ist, wenn nicht, beendet er sich, wenn ja, läuft er durch und packt einen Zeitstempel der letzten Ausführung in das Profil, so dass er beim nächsten Start erkennt, dass er an dem Tag schon gelaufen ist.
Irgendwann wurde das Profil dann auch so erweitert, dass sich darüber auch steuern ließ, ob der Agent z.B. nur an einem bestimmten Wochen- oder Monatstag ausgeführt werden soll.
OK - durch den halbstündigen Start läuft er zwar ziemlich oft an, aber die Prüfung gegen das Profil geht so fix, dass das nie störte. Weiterer Nachteil ist natürlich, dass sich die Ausführungszeit nicht auf die Minute genau festlegen lässt.
Diese Lösung wäre auf jeden Fall BS-unabhängig und es lassen sich mit weiteren Ergänzungen auch schön Reihenfolgen für die Ausführung mehrerer Agents definieren...
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: CarstenB am 21.04.11 - 10:35:36
Hallo Marco,
ja, kann man auch so machen. Allerdings muss man dann Einstellungen wie Uhrzeit, Wochenende, etc. im Agenten eintragen und zusätzlich im Profil pflegen. Darin sehe ich die Gefahr, daß schnell mal was vergessen wird.
Die Lösung über das Auslesen von $AssistInfo finde ich dann eleganter
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: Peter Klett am 21.04.11 - 11:31:34
Moin zusammen,
ich wollte die Funktionen auch nutzt, um verschiedenen Agenten zu monitoren. Auf den Client läuft es auch perfekt.
Allerdings nicht auf dem 8.5.2 Server 64bit. Hat jemand das in dieser Konstellation ans Laufen gebracht?
Was meinst Du mit "auf dem Server", periodisch? Du kannst keine Datenbanken periodisch signieren (hätte ich auch gut gebrauchen können, halte ich aber sicherheitstechnisch für fatal, deshalb ist es gut so).
Titel: Re: Zeitplan von Agenten per Aktion setzen
Beitrag von: CarstenB am 21.04.11 - 11:59:57
Hallo Peter,
ja periodisch, aber ich will nur Daten aus den Agenten auslesen. Über die Function GetAssistInfo