Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Andreas Huhn am 04.01.06 - 13:18:57

Titel: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn 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
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Driri am 04.01.06 - 13:28:58
Nutzt der Master-Agent denn UI oder @Formeln ?

Das wäre IMO der Ansatzpunkt.
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn 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
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Driri am 04.01.06 - 13:36:47
Dann stell den Master-Agent doch auf Script um.
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn am 04.01.06 - 13:39:44
Hui.. mal schaun was ich kann...
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn 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
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Driri 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.
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn 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.
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Axel am 04.01.06 - 15:57:47
Schau mal hier: Best Practices: Error Handling in Lotus Script (http://www.atnotes.de/index.php?board=3;action=display;threadid=11980;start=0)

Da gibt's jede Menge Infos zu dem Thema.


Axel
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn am 05.01.06 - 07:02:25
Danke Axel! Werd ich mich mal durchwühlen..
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn 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?
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: umi 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
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn 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?
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: umi 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
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Axel 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
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn 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.
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Driri 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.
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: umi am 05.01.06 - 10:36:37
Er findet das Configdoc nicht.
Ist das Dok vorhanden
ist die 1. Spalte der Ansicht sortiert?
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: baumi78 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
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn 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.
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Axel am 05.01.06 - 11:04:57
Ich bin mir nicht sicher ob GetDocumentByKey mit einer @DocNumber - Spalte was anfangen kann. Versuch doch mal in deinem Dokument ein zusätzliches Text-Feld einzufügen und den jeweiligen Dokumenten darin eindeutige Werte einzugeben.

Dieses Feld zeigst du dann in der Ansicht in der ersten Spalte an und suchst mit GetDocumentBy... anhand dieser Werte das entsprechende Dokument.


Axel
 
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: koehlerbv am 05.01.06 - 11:19:49
GetDocumentByKey kann mit @DocNumber nichts anfangen - definitiv nicht. @DocNumber gibt einen speziellen Datentyp zurück, die nur dargestellt, aber unter keinen Umständen ausgewertet werden kann.
Mich wundert, dass das mit @dbLookup funktionieren sollte, wie Andreas schrieb.

Bernhard
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn am 05.01.06 - 11:25:00
Es passieren merkwürdige Dinge...

Folgendes in einer Testmaske:


_Email := @DbLookup("":"NoCache"; ""; "AnsKonfiguration";"1";"txtCoordinatorErinnerung");

@MailSend(_Email;"";"";_Subject;"Dokumenten-Verknüpfung: ";"";[IncludeDoclink])


sagt mir:
"Eintrag im Index nicht gefunden oder der Index ist für die Ansicht nicht aufgebaut"


Aber es muß funktioniert haben. Über diese Art werden viele Emails verschickt und Werte ausgelesen und verwendet. Wenn das nicht funktioniert dann weiß ich nicht wie das alles überhaupt geht.

Wenn ich mir jetzt die Ansicht in eine Maske einbette dann wird da kein einziges Dokument angezeigt! Vor wenigen Wochen noch gabs eine Zeile und in der einen vorhandenen Spalte war eine "1" eingetragen.

Wie kann das jetzt auf einmal sein?

Meine Notes-Welt kriegt gerade einen Knacks...
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: koehlerbv am 05.01.06 - 11:30:13
Zitat
"Eintrag im Index nicht gefunden oder der Index ist für die Ansicht nicht aufgebaut"

Das ist genau das, was ich für @dbLookup erwartet habe: Gesucht wird ein Textwert. In der Ansicht gibt es aber keine Textwerte.

Und das kann auch früher nicht funktioniert haben. Verwende in den ConfigDocs ein Textfeld, welches dann in der 1. sortierten Spalte der Lookup-Ansicht sortiert dargestellt wird.

Bernhard
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn am 05.01.06 - 11:40:30
... jetzt muß ich erstmal ein paar Mal tief Luft holen und mich wieder beruhigen...



Hallo Bernhard,

schau dir bitte mal den Formel-Code im dritten Posting auf Seite 1 an. Der hat DEFINITIV funktioniert und da sind einige dieer @dblookup Aufrufe drin. Es war ein Agent zu starten, der mußte ein Doc finden was er getan hat und es wurde entsprechend eine Email versandt.

Wenn ich jetzt den gleichen Formelcode nochmal in meinen Master-Agenten kopiere dann gehts nicht mehr! Ohne Fehlermeldung! Auch wenn ich ihn auf Zeitplan und als Ziel "alle Dokumente der Datenbank" einstelle läuft er durch ohne Fehlermeldung und ohne etwas zu tun! Gestern noch hat er die Meldung gebracht daß @-Formeln unzulässig sind wenn er ein Laufzeitziel hat!


Noch was merkwürdiges:
In einer anderen Maske hab ich im QuerySave Event unter anderem folgendes:


   If Not source.IsNewDoc Then Exit Sub

   Set view = db.getview("AnsKonfiguration")
   Set configdoc = view.getdocumentbyKey("1")
   
   subject = "ERINNERUNG:    Kunde:   " + source.fieldgettext("Customer") + "  / Neuer Entwicklungsauftrag"

.....
                Call maildoc.send(False)


Und die Email kommt bei mir an! Wie kann das sein? Der LS Debugger zeigt mir Schritt für Schritt wie er durch die Zeilen springt, eine nach der andern und es kommt keine Meldung und die Email geht raus. Wo ist denn da der Unterschied zu dem was ich jetzt versuche?

Und nochwas:
wenn ich zu Testzwecken die Betreffzeile in diese abwandle:

   subject = "ERINNERUNG:    Kunde:   " + source.fieldgettext("Customer") + "  / Neuer Entwicklungsauftrag !!!!!!!!!!!!!!!!!!!!!!!!"

Dann zeigt mir der LS Debugger immer noch die alte subject Zeile wie ein paar Zeilen drüber! Und ja, ich habe gespeichert und ja ich hab die db neu aufgemacht.....


Ich versteh die Welt grad nicht mehr. Das gibt doch alles keinen Sinn mehr. Was ist denn da jetzt auf einmal los!?
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: umi am 05.01.06 - 12:39:39
Nur Ruhig

Verwendet das Query Save noch an einer anderen Stell das configdoc?
oder nur beim view.getdocumentbykey?
So wie es aussieht werden keine Daten aus dem ConfigDoc verwendet, daher kann es funktionieren.
Dein Vorgänger scheint da nicht gerade der experte gewesen zu sein.....

Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn am 05.01.06 - 13:41:44
Ich komm mir gerade vor wie der Coyote in Roadrunner... solang er es nicht weiß passiert nichts aber kaum sagt man ihm daß er schon lang keinen festen Boden mehr unter den Füßen hat und da gar nicht stehn kann stürzt er ab.

Jetzt geht auch an der anderen von mir beschriebenen Stelle der Zugriff auf das configdoc nicht mehr. Vorm Mittag gings da noch. Es ist fast so als ginge es jetzt nicht mehr weil ihr es gesagt habt.

Okay.. bitte helft mir Schadensbegrenzung zu betreiben..

Ich hab jetzt in dem doc das über AnsKonfiguration gefunden werden soll ein Feld namens "Number" angelegt und den Vorgabewert "1" reingeschrieben. Die eine Spalte in der Ansicht laß ich nun das Feld "Number" anzeigen.

Nun findet die QuerySave Prozedur das Doc wieder und kann den Wert des Textfeldes auslesen und die Mail verschicken.

Seht ihr jetzt noch irgendwelche Probleme?



[Ich bin eigentlich gerade dabei das Projekt abzuschließen und die Dokumentation zu schreiben. Und jetzt ergeben sich diese Probleme die ich davor nicht hatte. Mir läuft auch die Zeit davon wenn das so weiter geht. Nur damit ihr versteht wieso ich grad etwas aufgebracht und beunruhigt reagiere]


Danke für eure Hilfe!
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Axel am 05.01.06 - 14:12:41
Mir läuft auch die Zeit davon wenn das so weiter geht. Nur damit ihr versteht wieso ich grad etwas aufgebracht und beunruhigt reagiere]

Verstehen wir. Uns geht's von Zeit zu Zeit genauso. Aber aufregen bringt nichts. Das ist eben Notes - live und in Farbe.   ;D

Axel
Titel: Re: Zeit-Agenten ohne Laufzeitziel
Beitrag von: Andreas Huhn am 05.01.06 - 14:36:05
@ Umi:

Du meinst den der das Projekt angefangen hat das ich weiterführe? Nein, er war auch Praktikant der in seinem ganzen Leben noch nie was von Notes gehört hatte und ins kalte Wasser geworfen wurde. Mir gings auch so.


@ Axel:

Ja, ich geb mir wieder Mühe ruhig zu bleiben. Du hast recht, aufregen bringt nichts. Überstunden wahrscheinlich schon eher...  :-\


Das auslesen des Feldes über die getdocumentbyKey Methode scheint jetzt zu funktionieren. Er stösst wenns ist auch die anderen Agenten an.
Muß aber noch ein bischen testen