Autor Thema: Zeit-Agenten ohne Laufzeitziel  (Gelesen 5391 mal)

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Zeit-Agenten ohne Laufzeitziel
« am: 04.01.06 - 13:18:57 »
Hallo zusammen im neuen Jahr!

ich habe folgendes Problem:

Ich habe 3 Agenten die in bestimmten (in Notes nicht festlegbaren) Intervallen laufen müssen. Dazu habe ich einen "Master-Agenten" erstellt der täglich laufen soll und prüft ob einer oder mehrere der 3 Agenten wieder mal dran sind zu laufen. Wenn dann ruft er die Agenten der Reihe nach auf.

Der Master-Agent darf kein Laufzeitziel haben sonst kommt die Fehlermeldung:
@Befehle und andere UI-Funktionen sind in diesem Suchtyp nicht zulässig; bitte wählen Sie 'Keines' als Laufzeitziel.

Die Einstellung "Keines" gibt es aber nur wenn der Agent Ereignis-gesteuert ist. Da er auf dem Server liegen und täglich laufen soll müsste ich ihn aber auf "durch Zeitplan" umstellen wo es diese Einstellung eben nicht gibt.

Habt ihr einen Tipp für mich wie ich das hinbekommen kann?


Viele Grüße,

Andreas

Driri

  • Gast
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #1 am: 04.01.06 - 13:28:58 »
Nutzt der Master-Agent denn UI oder @Formeln ?

Das wäre IMO der Ansatzpunkt.

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #2 am: 04.01.06 - 13:32:54 »
Hallo Ingo,

der Master-Agent hat folgenden Code hinterlegt.
Kurze Beschreibung: Erst werden die Daten geladen wann welcher Agent zuletzt lief, dann wird geschaut wie lang das von heute aus gesehen her ist und ob er schon wieder dran ist zu laufen. Wenn ja wird der Agent gestartet.



CoAgentIntervall := @DbLookup("":"NoCache"; ""; "AnsKonfiguration";"1";"ZahlCoAgentIntervall");
CoAgentDat := @DbLookup("":"NoCache"; ""; "AnsKonfiguration";"1";"datCoAgentDat");
FreigAgentIntervall := @DbLookup("":"NoCache"; ""; "AnsKonfiguration";"1";"ZahlFreigAgentIntervall");
FreigAgentDat := @DbLookup("":"NoCache"; ""; "AnsKonfiguration";"1";"datFreigAgentDat");
LieferAgentIntervall := @DbLookup("":"NoCache"; ""; "AnsKonfiguration";"1";"ZahlLieferAgentIntervall");
LieferAgentDat := @DbLookup("":"NoCache"; ""; "AnsKonfiguration";"1";"datLieferAgentDat");
NowDat := @Now;


@If(
@IsTime(NowDat) & @IsTime(CoAgentDat) ;
@If(@ToNumber( (@Date (NowDat) - @Date (CoAgentDat)) / 86400) >= CoAgentIntervall;       @Command([RunAgent];"CoordAgent") ;"") ;
0
);

@If(
@IsTime(NowDat) & @IsTime(FreigAgentDat) ;
@If(@ToNumber( (@Date (NowDat) - @Date (FreigAgentDat)) / 86400) >= FreigAgentIntervall;       @Command([RunAgent];"FreigAgent") ;"") ;
0
);SELECT

@If(
@IsTime(NowDat) & @IsTime(LieferAgentDat) ;
@If(@ToNumber( (@Date (NowDat) - @Date (LieferAgentDat)) / 86400) >= LieferAgentIntervall;       @Command([RunAgent];"LieferAgent") ;"") ;
0
)



Wie gesagt... funktioniert ja auch prächtig wenn ich von Hand starte, aber es soll halt täglich vom Server angestossen werden.


Gruß,

Andreas

Driri

  • Gast
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #3 am: 04.01.06 - 13:36:47 »
Dann stell den Master-Agent doch auf Script um.

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #4 am: 04.01.06 - 13:39:44 »
Hui.. mal schaun was ich kann...

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #5 am: 04.01.06 - 14:08:33 »
Ich hab den ganzen Code unter Sub_Initialize gepackt und das zusammengecoded und es scheint tatsächlich auf Anhieb zu funktionieren... ich bin begeistert. Hab jetzt auf "durch Zeitplan" und "täglich" umgestellt und damit müsste er auf dem Server nun lauffähig sein, oder?


Hier der LS-Code:


Sub Initialize
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim configdoc As NotesDocument
   Dim agent As NotesAgent
   
   Dim CoAgentIntervall As Integer
   Dim CoAgentDat As Variant
   Dim FreigAgentIntervall As Integer
   Dim FreigAgentDat As Variant
   Dim LieferAgentIntervall As Integer
   Dim LieferAgentDat As Variant
   Dim NowDat As Variant
   
   
   Set db= session.CurrentDatabase
   
   Set view = db.getview("AnsKonfiguration")
   Set configdoc = view.getdocumentbyKey("1")
   
   CoAgentIntervall = configdoc.ZahlCoAgentIntervall(0)
   CoAgentDat = configdoc.datCoAgentDat(0)
   FreigAgentIntervall = configdoc.ZahlFreigAgentIntervall(0)
   FreigAgentDat = configdoc.datFreigAgentDat(0)
   LieferAgentIntervall = configdoc.ZahlLieferAgentIntervall(0)
   LieferAgentDat = configdoc.datLieferAgentDat(0)
   NowDat = Now()
   
   
   If Typename(NowDat) = "DATE" And Typename(CoAgentDat) = "DATE" Then
      If Val( (NowDat - CoAgentDat) / 86400) >= CoAgentIntervall Then
         Set agent = db.GetAgent("CoordAgent")
         agent.Run
      End If
   End If
   
   If Typename(NowDat) = "DATE" And Typename(FreigAgentDat) = "DATE" Then
      If Val( (NowDat - FreigAgentDat) / 86400) >= FreigAgentIntervall Then
         Set agent = db.GetAgent("FreigAgent")
         agent.Run
      End If
   End If
   
   If Typename(NowDat) = "DATE" And Typename(LieferAgentDat) = "DATE" Then
      If Val( (NowDat - LieferAgentDat) / 86400) >= LieferAgentIntervall Then
         Set agent = db.GetAgent("LieferAgent")
         agent.Run
      End If
   End If
   
End Sub

Driri

  • Gast
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #6 am: 04.01.06 - 14:32:22 »
Ja, das sollte so auch auf dem Server laufen. Allerdings ist kein Errorhandling dabei, das wäre noch eine sinnvolle Verbesserung.

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #7 am: 04.01.06 - 15:55:21 »
Mit Error-Handlich hab ich noch nie was gemacht.

Wie würd denn das aussehen?  ::)


Daß Datumswerte als Variant und die Intervalle (als Vergleichswert) als Integer definiert sind passt, oder?

Denn jetzt hab ich gar keine Typkonvertierungen mehr, wenn du dir mal den Formelcode anschaust da waren eine Menge und ohne die is es auch nicht gegangen. Drum bin ich grad noch ein wenig skeptisch.

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #8 am: 04.01.06 - 15:57:47 »
Schau mal hier: Best Practices: Error Handling in Lotus Script

Da gibt's jede Menge Infos zu dem Thema.


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #9 am: 05.01.06 - 07:02:25 »
Danke Axel! Werd ich mich mal durchwühlen..

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #10 am: 05.01.06 - 09:21:11 »
Hab ich gestern nicht gespeichert?
Hab heut morgen an einer anderen Baustelle angefangen und als ich jetzt den Agenten geöffnet hab war der alte Formel-Code drin.

Jetzt spukt mit der LS Code einen Object variable not set aus, und zwar in der fetten Zeile.


Sub Initialize
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim configdoc As NotesDocument
   Dim agent As NotesAgent
   
   Dim CoAgentIntervall As Integer
   Dim CoAgentDat As Variant
   Dim FreigAgentIntervall As Integer
   Dim FreigAgentDat As Variant
   Dim LieferAgentIntervall As Integer
   Dim LieferAgentDat As Variant
   Dim NowDat As Variant
   
   
   Set db= session.CurrentDatabase
   
   Set view = db.getview("AnsKonfiguration")
   Set configdoc = view.getdocumentbyKey("1")
   
   CoAgentIntervall = configdoc.ZahlCoAgentIntervall(0)
   CoAgentDat = configdoc.datCoAgentDat(0)
   FreigAgentIntervall = configdoc.ZahlFreigAgentIntervall(0)
   FreigAgentDat = configdoc.datFreigAgentDat(0)
   LieferAgentIntervall = configdoc.ZahlLieferAgentIntervall(0)
   LieferAgentDat = configdoc.datLieferAgentDat(0)
   NowDat = Now()
   
   
   If Typename(NowDat) = "DATE" And Typename(CoAgentDat) = "DATE" Then
      If Val( (NowDat - CoAgentDat) / 86400) >= CoAgentIntervall Then
         Set agent = db.GetAgent("CoordAgent")
         agent.Run
      End If
   End If
   
   If Typename(NowDat) = "DATE" And Typename(FreigAgentDat) = "DATE" Then
      If Val( (NowDat - FreigAgentDat) / 86400) >= FreigAgentIntervall Then
         Set agent = db.GetAgent("FreigAgent")
         agent.Run
      End If
   End If
   
   If Typename(NowDat) = "DATE" And Typename(LieferAgentDat) = "DATE" Then
      If Val( (NowDat - LieferAgentDat) / 86400) >= LieferAgentIntervall Then
         Set agent = db.GetAgent("LieferAgent")
         agent.Run
      End If
   End If
   
End Sub


Stimmt an der Zuweisung etwas nicht?

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #11 am: 05.01.06 - 09:52:02 »
Ist da evtl. noch ein Design Template mit im Spiel?
Als kleiner Tip
nach einem view.getdocumentbykey immer auf isnothing prüfen
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #12 am: 05.01.06 - 10:03:57 »
In der Designerhelp findet er unter isnothing nichts.

Wie lautet die Syntax?

if isnothing view then msgbox "view is nothing"

geht irgendwie nicht.


Du meinst Design Template weil der Code zurückgesetzt war? Weiß nicht. War bisher noch nie der Fall daß etwas zurückgesetzt wurde. Mal schaun wies morgen is. Aber das dürfte mit meiner Fehlermeldung ja erstmal nichts zu tun haben, oder?

Die Ansicht heißt (AnsKonfiguration)

Hab es sowohl mit Set view = db.getview("(AnsKonfiguration)") als auch mit Set view = db.getview("AnsKonfiguration") versucht.

Außerdem müsste laut Fehlermeldung view noch korrekt befüllt sein, oder? configdoc macht den Ärger.

Fällt dir noch was ein umi?

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #13 am: 05.01.06 - 10:11:26 »
Code
 Set configdoc = view.getdocumentbyKey("1")
  if not configdoc is nothing then
   CoAgentIntervall = configdoc.ZahlCoAgentIntervall(0)
.
.
.
else
Messagebox "Cofigdoc nicht gefunden"
end if
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #14 am: 05.01.06 - 10:20:25 »
Sicherheitshalber solltest du noch Klammern setzen

...
if not (configdoc is nothing) then
...

Ich hab's schon erlebt, dass er ohne aus der Kurve geflogen ist.


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #15 am: 05.01.06 - 10:23:20 »
Okay, folgende Zeilen spuken mir die Messagebox aus!


   Set configdoc = view.getdocumentbyKey("1")
   If configdoc Is Nothing Then Msgbox "test"



Wie kann das sein?


Die Formelzeile:

CoAgentIntervall := @DbLookup("":"NoCache"; ""; "AnsKonfiguration";"1";"ZahlCoAgentIntervall");


funktioniert auch einwandfrei.

Driri

  • Gast
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #16 am: 05.01.06 - 10:36:11 »
Aus der Designer-Hilfe :

Zitat
For the GetDocumentByKey method to work, you must categorize the first column to have a single-value field.

Schau Dir auch mal die Beispiele dort an.

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #17 am: 05.01.06 - 10:36:37 »
Er findet das Configdoc nicht.
Ist das Dok vorhanden
ist die 1. Spalte der Ansicht sortiert?
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline baumi78

  • Aktives Mitglied
  • ***
  • Beiträge: 124
  • Ich liebe dieses Forum!
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #18 am: 05.01.06 - 10:45:20 »
Hi Andreas,


ja wie schon Umi sagt, er scheint das Configdok nicht zu finden. Guck dir in der Designerhilfe mal die getdocumentbykey Methode an, die ist etwas tricky (sortierte Spalten, Datentyp etc.). Ansonsten kann du die Sachen ja auch im Debugger testen, dann siehst du besser an welchen Stellen die Objekte "gesetzt" sind und wann sie noch nothing sind!

Baumi

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Zeit-Agenten ohne Laufzeitziel
« Antwort #19 am: 05.01.06 - 10:51:54 »
Okay..

Die Ansicht besteht nur aus einer Spalte. Die zeigt den Wert "Nummer in Ansicht (z.B. 2.1.2)" an.

Die Spalte hat die Einstellungen:
Sortierung: Aufsteigend
Typ: Standard

Wenn ich mal auf Typ: Kategorisiert umstelle dann gehts trotzdem nicht.


Das Doc (es kann auch nur eines gefunden werden!) müsste schon da sein denn sonst könnten doch die ganzen anderen Formeln es auch nicht finden und mit den ausgelesenen Werten arbeiten.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz