Autor Thema: Zeitplan von Agenten per Aktion setzen  (Gelesen 6703 mal)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Zeitplan von Agenten per Aktion setzen
« 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
« Letzte Änderung: 04.02.11 - 12:12:22 von Peter Klett »

Offline 0xse

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 507
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #1 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #2 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #3 am: 03.02.11 - 16:58:46 »
Ein sehr guter Beitrag von Rod Whiteley findet sich hier.

HTH,
Bernhard

PS: Meine im Prinzip hierauf basierende Library "AgentTools" funktioniert seit R4 und mit R8.5 immer noch.

Offline eknori

  • @Notes Preisträger
  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #4 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
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #5 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.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #6 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

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #7 am: 03.02.11 - 17:11:35 »
Danke auch Dir, Ulrich

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #8 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

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #9 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 ...

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #10 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

Offline eknori

  • @Notes Preisträger
  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #11 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)
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #12 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.

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #13 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).

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #14 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.


Offline CarstenB

  • Aktives Mitglied
  • ***
  • Beiträge: 193
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #15 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?

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #16 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...
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline CarstenB

  • Aktives Mitglied
  • ***
  • Beiträge: 193
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #17 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

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #18 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).

Offline CarstenB

  • Aktives Mitglied
  • ***
  • Beiträge: 193
  • Geschlecht: Männlich
Re: Zeitplan von Agenten per Aktion setzen
« Antwort #19 am: 21.04.11 - 11:59:57 »
Hallo Peter,
ja periodisch, aber ich will nur Daten aus den Agenten auslesen. Über die Function GetAssistInfo

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz