Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: botschi am 15.02.05 - 10:57:37
-
Hallo,
wir haben ein Problem mit einem periodischem Agenten, vielleicht könnt ihr uns helfen.
Der Agent soll nachts laufen, Dokumente nach gewissen kriterien durchsuchen und Mails verschicken. Also nix besonders grosses mit komplizierten Methoden oder so. Leider läuft der Agent im Hintergrund nicht (manuell einwandfrei). In dem Agent-Log kann man sehen, dass der Agent abbricht mit dem Eintrag "You must specify a parent database".
In der Hilfe habe ich dazu nicht viel gefunden. Kann mir jemand die Meldung übersetzen? Oder hatte jemand schon einmal den selben Fehler?
Danke für Hilfe!
-
Hallo
Ohne Code lässt sich da nicht viel erraten....
Wie erstelltst Du das Mail?
Errorlogging wäre hier wohl auch ein Thema...
gruss
umi
-
Ich würde ja gerne Errorlogging machen, aber ich kenne ja nicht mal die Zeile, die den Fehler verursacht. Mit dem Code kann es zwar zu tun haben, aber das ist nicht der erste und einzige periodische Agent, der ne Mail verschicken soll.
Ich kann nur mit dem Satz "You must specify a parent database" nix anfangen und hab mir eine kleine Starthilfe erhofft.
Wofür brauche ich eine "parent database"? Und wer braucht das?
-
Ich würde ja gerne Errorlogging machen, aber ich kenne ja nicht mal die Zeile, die den Fehler verursacht.
Genau dafür ist ErrorLogging ja da ... Wie schon gesagt wurde: Ohne Code können wir nicht helfen.
Bernhard
-
Ich würde ja gerne Errorlogging machen, aber ich kenne ja nicht mal die Zeile,
Eben, dazu ist ja das Errorlogging da...
Frage: LS oder Formel?
-
Der Code ist hier:
Sub Initialize
%REM
Dieser Agent schickt eine Mail an die Leute (und ihren direkten Vorgesetzten), dass in der vorletzten Woche nicht alle Stunden
verteilt wurden.
Das soll nachts und periodisch erfolgen, nicht auf Knopfdruck.
%END REM
On Error Goto fehler
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim nextdoc As NotesDocument
Dim memo As NotesDocument
Dim rtitem As NotesRichTextItem
Dim text As String
Dim text1 As String
Dim text2 As String
Dim endesatz As String
Dim anrede As String
Dim view As NotesView
Dim datum As New NotesDateTime("")
Set db = S.CurrentDatabase
'Set memo = New NotesDocument( db )
Set view = db.GetView("viwAnMAGestern")
Set doc = view.GetFirstDocument
' NAB
Set adressdb = s.GetDatabase(db.Server, "names.nsf")
Set adressview = adressdb.GetView("People")
' diese gruppe wird nicht über fehlende stunden benachrichtigt
Call bearbeiter_aus_gruppe_auslesen(s, "int_zeit_db_Nutzer_optional", keine_mail)
'Stop
' diese gruppe wird über fehlende stunden benachrichtigt
Call bearbeiter_aus_gruppe_auslesen(s, "int_zeit_db_Nutzer", send_mail)
' adressbuchvariablen, um den direkten vorgesetzten zu ermitteln
'Set adressview = adressdb.GetView("People")
'######## variablen für suche nach arbeitszeit und aktivitäten #############
Dim arbeitcoll As NotesDocumentCollection
Dim aktcoll As NotesDocumentCollection
Dim arbeitformel As String
Dim aktformel As String
'##################################################
' schreibt die leute ohne mail in ein array
Dim anzahl_keine_mail As Integer
anzahl_keine_mail = 0
Dim anzahl_keine_mail2 As Integer
anzahl_keine_mail2 = 0
Forall x In keine_mail
anzahl_keine_mail = anzahl_keine_mail+1
End Forall
Redim array_ohne_mail(anzahl_keine_mail-1)
' array_ohne_mail beinhaltet die leute ohne mail in einem array
Dim name_ohne_mail As NotesName
Forall x In keine_mail
Set name_ohne_mail = New NotesName (Listtag(x))
array_ohne_mail(anzahl_keine_mail2)= name_ohne_mail.Common'Listtag(x)
anzahl_keine_mail2 = anzahl_keine_mail2+1
End Forall
'###################################################
' schreibt die leute mit mail in ein array
Dim anzahl_mail As Integer
anzahl_mail = 0
Dim anzahl_mail2 As Integer
anzahl_mail2 = 0
Forall x In send_mail
anzahl_mail = anzahl_mail+1
End Forall
anzahl_mail = anzahl_mail-1
Redim array_mit_mail(anzahl_mail)
' array_mit_mail beinhaltet die leute mit mail in einem array
Dim name_mail As NotesName
Forall x In send_mail
Set name_mail = New NotesName (Listtag(x))
array_mit_mail(anzahl_mail2)= name_mail.Common'Listtag(x)
anzahl_mail2 = anzahl_mail2+1
End Forall
'###################################################
' löscht alle leute ohne mail aus dem array mit mail
Dim i As Long
i = 0
Redim array_mit_mail_gesamt(anzahl_mail-anzahl_keine_mail)
Forall leute In array_mit_mail
prüfmail = Arraygetindex(array_ohne_mail, leute)
If Isnull(prüfmail) Then
array_mit_mail_gesamt(i) = leute
i = i+1
End If
End Forall
Stop
'###################################################
Dim monat As Integer
monat = Month(Today)
Dim arbeitdoc As NotesDocument
Dim nextarbeitdoc As NotesDocument
Dim aktdoc As NotesDocument
Dim nextaktdoc As NotesDocument
'######## variablen für die stunden #############
Dim a_stunden As Double
Dim v_stunden As Double
Dim tmp_verteilt As Double
'################################################
Dim startdate As NotesDateTime
Dim enddate As NotesDateTime
Dim strdate As String
Dim tag As String
Dim jahr As String
'######## views für arbcoll und aktcoll #########
Dim arbeitview As NotesView
Dim aktview As NotesView
Set arbeitview = db.GetView("viwAZMADatum")
Set aktview = db.GetView("viwAktNameNotNull")
'################################################
Dim formel As String
Forall leut In array_mit_mail_gesamt
Dim ma As String
ma = leut
Print leut
tag = "1."
jahr = Cstr(Year(Today))
'Stop
' hier wird in zeit_db nach einem teamleiter gesucht
' wenn keiner gefunden wird, wird das Personendoc im NAB von unten nach oben durchsucht,
'damit möglichst der nächste direkte vorgesetzte ermittelt wird
formel = "@DbLookup("""":""NoCache"";"""";""viw_Teamliste"";"""+ma+""";""teamer"")"
tmp_vorgesetzter = Evaluate(formel)
If Not Isempty (tmp_vorgesetzter) Then
vorgesetzter = tmp_vorgesetzter(0)
End If
If vorgesetzter = "" Then
Set adressdoc = adressview.getfirstdocument
Do
Set notes_name = New NotesName(adressdoc.Fullname(0))
Set nextadressdoc = adressview.GetNextDocument(adressdoc)
If ma <> notes_name.Common Then
Set adressdoc = nextadressdoc
End If
Loop Until ma = notes_name.Common 'adressdoc.Fullname(1)
If adressdoc.HasItem( "Level6" ) Then
vorgesetzter = adressdoc.Level6(0)
Goto weiter
End If
If adressdoc.HasItem( "Level5" ) Then
vorgesetzter = adressdoc.Level5 (0)
Goto weiter
End If
If adressdoc.HasItem( "Level4" ) Then
vorgesetzter = adressdoc.Level4(0)
Goto weiter
End If
If adressdoc.HasItem( "Level3" ) Then
vorgesetzter = adressdoc.Level3(0)
Goto weiter
End If
If adressdoc.HasItem( "Level2" ) Then
vorgesetzter = adressdoc.Level2(0)
Goto weiter
End If
If adressdoc.HasItem( "Level1" ) Then
vorgesetzter = adressdoc.Level1(0)
Goto weiter
End If
If adressdoc.HasItem( "Level0" ) Then
vorgesetzter = adressdoc.Level0(0)
Goto weiter
End If
End If
weiter:
'collections sammeln
Set startdate = New NotesDateTime(Today)
Call startdate.AdjustDay(-14) ' 14 tage, da der agent immer montags läuft
' und der agent so immer auf den montag der vorvorwoche kommt
Set enddate = New NotesDateTime(startdate.DateOnly)
'Call enddate.AdjustDay(6)
Dim counter As Integer
counter = 0
Do
' kw berechnen für key
Stop
Dim kw As String
Dim strdatum As String
strdatum = Cstr(enddate.DateOnly)
Dim wtag As String
wtag = Wochentag(FormatDatum(strdatum))
kw = Cstr(KW_bib(FormatDatum(strdatum) , 0))
Dim kwlen As Integer
kwlen = Len(kw)
If kwlen < 2 Then
kw = "0"+kw
End If
'arbeitformel = {Form = "frmAnwesenheit" & @date(Kalender) = @today}
arbeitformel = leut + enddate.DateOnly
Set arbeitcoll = arbeitview.GetAllDocumentsByKey(arbeitformel, True)
aktformel = leut + kw 'Cstr(monat)
Set aktcoll = aktview.GetAllDocumentsByKey(aktformel, True)
If arbeitcoll.Count > 0 Then
Set arbeitdoc = arbeitcoll.GetFirstDocument()
Do
a_stunden = a_stunden + arbeitdoc.Stunden(0)
Set nextarbeitdoc = arbeitcoll.GetNextDocument(arbeitdoc)
Set arbeitdoc = nextarbeitdoc
Loop Until arbeitdoc Is Nothing
If aktcoll.Count > 0 Then
Set aktdoc = aktcoll.GetFirstDocument()
Do
If aktdoc.Flag_montag(0) = enddate.DateOnly And aktdoc.f_Montag(0) > 0 Then
v_stunden = v_stunden + aktdoc.f_Montag(0)
End If
If aktdoc.Flag_dienstag(0) = enddate.DateOnly And aktdoc.f_Dienstag(0) > 0 Then
v_stunden = v_stunden + aktdoc.f_Dienstag(0)
End If
If aktdoc.Flag_mittwoch(0) = enddate.DateOnly And aktdoc.f_Mittwoch(0) > 0 Then
v_stunden = v_stunden + aktdoc.f_Mittwoch(0)
End If
If aktdoc.Flag_donnerstag(0) = enddate.DateOnly And aktdoc.f_Donnerstag(0) > 0 Then
v_stunden = v_stunden + aktdoc.f_Donnerstag(0)
End If
If aktdoc.Flag_freitag(0) = enddate.DateOnly And aktdoc.f_Freitag(0) > 0 Then
v_stunden = v_stunden + aktdoc.f_Freitag(0)
End If
If aktdoc.Flag_samstag(0) = enddate.DateOnly And aktdoc.f_Samstag(0) > 0 Then
v_stunden = v_stunden + aktdoc.f_Samstag(0)
End If
If aktdoc.Flag_sonntag(0) = enddate.DateOnly And aktdoc.f_Sonntag(0) > 0 Then
v_stunden = v_stunden + aktdoc.f_Sonntag(0)
End If
Set nextaktdoc = aktcoll.GetNextDocument(aktdoc)
Set aktdoc = nextaktdoc
Loop Until aktdoc Is Nothing
End If
End If
'%ENDREM
'%REM
'Stop
If a_stunden <> v_stunden Then
'############# Mail an Nichtabmelder
If memo Is Nothing Then
Set memo = New NotesDocument( db )
memo.form ="Memo"
memo.Subject = "Sie haben in zeit_db nicht alle Stunden innerhalb der Frist verteilt."' ("+vorgesetzter+ma+")"
Set rtitem = New NotesRichTextitem(memo, "Body")
anrede = "Hallo,"
text = "bitte melden Sie der Verwaltung die offenen Stunden für die Tage:"
Call rtitem.appendText(anrede)
Call rtitem.AddNewLine( 2 )
Call rtitem.appendText(text)
Call rtitem.AddNewLine( 1 )
End If
text2 = "Am " & enddate.DateOnly & " fehlen noch "& a_stunden - v_stunden & " Stunden."
Call rtitem.appendText(text2)
Call rtitem.AddNewLine( 1 )
'Call rtitem.AppendDocLink( doc, db.Title )
End If
'%ENDREM
Call enddate.AdjustDay( 1 )
a_stunden = 0
v_stunden = 0
'Loop Until Month(enddate.DateOnly) <> Month(startdate.DateOnly)
counter = counter+1
Loop Until counter = 7
If Not memo Is Nothing Then
endesatz = "Diese Mail wurde automatisch von zeit_db erzeugt."
Call rtitem.AddNewLine( 2 )
Call rtitem.appendText(endesatz)
Call rtitem.AddNewLine( 1 )
memo.SendTo = ma
memo.CopyTo = vorgesetzter
memo.BlindCopyTo = "AdminMeldungen"
Call memo.Send(False)
End If
Set memo = Nothing
vorgesetzter = ""
'Stop
End Forall
TheEnd:
Exit Sub
fehler:
' bei Fehler Mail an mich
Set memo = New NotesDocument( db )
memo.form ="Memo"
memo.subject = "zeit_db: Offene Stunden vorige Woche"& Str(Erl) & Chr(10) & Error
memo.SendTo = "AdminMeldungen"
Call memo.send(False)
' Kontrollierter Abbruch:
Goto TheEnd
Exit Sub
End Sub
-
Du hast ja schon ein Errorlogging da drin ( mit dem Mail )
da wäre folgendes noch sinnvoll:
memo.subject = "zeit_db: Offene Stunden vorige Woche"& Str(Erl) & Chr(10) & Error & chr(10) & { In Zeile: } & str(erl)
Damit hättest Du schon mal die Zeile. evtl. könntest du diesen Text auch via messagebox ausgeben, dann erscheint er im Log des Servers, falls das Mail nicht geschickt wird.
-
... oder schau einfach im NAB nach, ob es da eine Gruppe AdminMeldungen gibt. Lass dich da eintragen.
... oder sende die Mail im Errorhandler zusätzlich an dich.
@botschi: Ich würd sagen, dass in keiner halbwegs komplexen Plattform die Fehlermeldungen immer verständlich sind. Das gilt auch für Experten derselben Plattform.
Oft hängt die Bedeutung mehr vom Kontext des Fehlers ab als was gerade zufällig im Fehlertext steht.
Mir lesen auch des öfteren Leute die Fehlermeldungen, die sie sehen, vor und denken, mir würde das irgendwie extrem viel sagen. Das ist oft nicht der Fall.
Ich könnte mal zur allgemeinen Unterhaltung stacktraces des hochgelobten JBoss J2EE Servers posten ;D
-
Nur zur Sicherheit: Hat Deine DB eine Vorgabeansicht und -maske ?
Bernhard
-
Nein, keine Vorgabemaske und keine Vorgabeansicht
-
Dann dürfte das NotesDocument.Send in die Hose gehen.
Bernhard
-
Ist das denn nur ein "hin und wieder Problem"? Es ist nicht der einizge periodische Agent, der eine Mail verschicken soll. Ich hab das jetzt mal geändert, das Ergebnis muss ich abwarten- werde es aber posten!
Danke erstmal!