Hallo zusammen,
ich habe nachfolgenden Agenten geschrieben der Daten zwischen zwei Datenbanken abgleichen soll.
Er schaut nach ob neue Tickets über die Datenbank A geschrieben wurden und gleicht die Daten dann mit Datenbank B ab.
Sollte vom Prinzip funktionieren, denke ich...
Tut es aber leider nicht.
Und ich erkenne den Fehler nicht.
Laut Agent-Log ist es ein unbekannter Fehler.
Es gibt auch keine Ausgabe auf der console.
Ich hoffe mir kann jemand von euch helfen?!?
Sub Initialize
Dim session As New NotesSession
Dim TicketDB As NotesDatabase
Dim SupportDB As NotesDatabase
Dim dbDirectory As NotesDirectory
Dim dateTime As New NotesDateTime( Datenumber(1995, 3, 14) )
Dim selection As String
Dim collection As NotesDocumentCollection
Dim ViewCollection As NotesViewEntryCollection
Dim ViewEntry As NotesViewEntry
Dim SupportView As NotesView
Dim TicketView As NotesView
Dim TicketDoc As NotesDocument
Dim SupportDoc As NotesDocument
Dim SupportID As String
Dim TicketID As String
Set SupportDB = session.CurrentDatabase
Set SupportView = SupportDB.GetView("(v_ReqNumber)")
Set SupportDoc = SupportView.GetFirstDocument
iCounter = SupportView.AllEntries.Count
Print iCounter + " Tickets zum abgleich mit der Ticket-DB in der Support-DB gefunden"
Set TicketDB = session.GetDatabase("Notes","troubticket.nsf",False)
Set TicketView = TicketDB.GetView("(v_ReqNumber)")
On Error Goto ErrHandler
iCounterX = 0
While Not (SupportDoc Is Nothing)
SupportID = SupportDoc.ReqNumber(0)
selection = |@Contains( ReqNumber; "| + SupportID+ |" )|
Print "Suche in der Ticket-DB nach dem Ticket " + SupportID
Set collection = TicketDB.Search( selection, dateTime, 0 )
Set TicketDoc = collection.GetFirstDocument()
If (TicketDoc Is Nothing) Then
Print "Ticket " + SupportID + " wurde nicht in der Ticket-DB gefunden! Nächstes Dokument (" + iCounterX + " / "+iCounter+")"
Goto EndeIf
End If
While Not TicketDoc Is Nothing
TicketID = TicketDoc.ReqNumber(0)
If (SupportID = TicketID) Then
tmpString=TicketDoc.GetItemValue("solution")
Call SupportDoc.ReplaceItemValue("solution", tmpString)
tmpString=TicketDoc.GetItemValue("tx_usercomment")
Call SupportDoc.ReplaceItemValue("tx_usercomment", tmpString)
tmpString=TicketDoc.GetItemValue("Status")
Call SupportDoc.ReplaceItemValue("Status", tmpString)
tmpString=TicketDoc.GetItemValue("supporter")
Call SupportDoc.ReplaceItemValue("supporter",tmpString)
Call SupportDoc.Save(True, True)
Goto EndeIf
End If
Wend
EndeIf:
Set SupportDoc = SupportView.GetNextDocument(SupportDoc)
iCounterX = iCounterX +1
Wend
Print "Alle Tickets (" + iCounterX +" / " + iCounter + ") bearbeitet. ENDE"
ErrHandler: ' Error-handling routine
Print "Error " & Err & " at line number " &Erl
Resume Next
Ende:
End Sub
Guten Morgen,
ich habe mal das Logging erweitert.
Nun erhalte ich folgenden Fehler: Unknown trigger and search type; agent may be corrupt.
Beide Datenbanken sind mit der Server-ID signiert.
Der Agent läuft "on behalf of" Notes.
Die Security habe ich schon von 0 auf 2 gestellt
Somit sind Zugriffsrechte ausgeschlossen, denke ich.
Zumal es einen anderen Agenten gibt, der läuft mit denselben Rechten, nur ohne behalf of mit Security 0.
Er kopiert Dokumente von A nach B.
Dieser scheduled Agent läuft ohne Probleme.
Im Agent-Log wird mir auch keine Fehlerzeile angezeigt.
Hier nochmals der komplette Code:
Sub Initialize
Dim session As New NotesSession
Dim agentLog As New NotesLog("Agent log")
Call agentLog.OpenAgentLog
Call agentLog.LogAction( "Variablendeklaration")
Dim TicketDB As NotesDatabase
Dim SupportDB As NotesDatabase
Dim dbDirectory As NotesDirectory
Dim dateTime As New NotesDateTime( Datenumber(1995, 3, 14) )
Dim selection As String
Dim collection As NotesDocumentCollection
Dim ViewCollection As NotesViewEntryCollection
Dim ViewEntry As NotesViewEntry
Dim SupportView As NotesView
Dim TicketView As NotesView
Dim TicketDoc As NotesDocument
Dim SupportDoc As NotesDocument
Dim SupportID As String
Dim TicketID As String
Call agentLog.LogAction( "SupportDB zuweisen")
Set SupportDB = session.CurrentDatabase
Call agentLog.LogAction( "View aus der Support DB holen")
Set SupportView = SupportDB.GetView("(v_ReqNumber)")
Call agentLog.LogAction( "Erstes Dok der View aus der Support DB holen")
Set SupportDoc = SupportView.GetFirstDocument
Call agentLog.LogAction( "Max Count der View")
iCounter = SupportView.AllEntries.Count
Print iCounter + " Tickets zum abgleich mit der Ticket-DB in der Support-DB gefunden"
Call agentLog.LogAction( "Ticket-DB holen")
Set TicketDB = session.GetDatabase("Maria_Notes","it-troubticket.nsf",False)
Call agentLog.LogAction( "View aus der Ticket-DB holen")
Set TicketView = TicketDB.GetView("(v_ReqNumber)")
On Error Goto ErrHandler
iCounterX = 0
Call agentLog.LogAction( "Solange SupportDocs vorhanden sind (WEND Eintritt)")
While Not (SupportDoc Is Nothing)
Call agentLog.LogAction( "Support-ID holen")
SupportID = SupportDoc.ReqNumber(0)
Call agentLog.LogAction( "Support-ID: " + SupoortID)
Call agentLog.LogAction( "Selektion zusammensetzen")
selection = |@Contains( ReqNumber; "| + SupportID+ |" )|
Print "Suche in der Ticket-DB nach dem Ticket " + SupportID
Call agentLog.LogAction( "Collection bilden indem Selection in der TicketDB gesucht wird")
Set collection = TicketDB.Search( selection, dateTime, 0 )
Call agentLog.LogAction( "Erstes (und einziges) Dokument aus der Collection holen")
Set TicketDoc = collection.GetFirstDocument()
Call agentLog.LogAction( "Prüfung ob Dokument in TicketDB vorhanden")
If (TicketDoc Is Nothing) Then
Call agentLog.LogAction( "Ticket mit der Support-ID " + SupportID + " in der TIcketDB nicht gefunden!")
Print "Ticket " + SupportID + " wurde nicht in der Ticket-DB gefunden! Nächstes Dokument (" + iCounterX + " / "+iCounter+")"
Call agentLog.LogAction( "Nächstes Dokument nehmen")
Goto EndeIf
End If
Call agentLog.LogAction( "While TicketDoc is not nothing")
While Not TicketDoc Is Nothing
Call agentLog.LogAction( "Ticket-ID holen")
TicketID = TicketDoc.ReqNumber(0)
Call agentLog.LogAction( "Ticket-ID mit Support-ID vergleichen")
If (SupportID = TicketID) Then
Call agentLog.LogAction( "Ticket-ID == Support-ID")
Call agentLog.LogAction( "Solution holen")
tmpString=TicketDoc.GetItemValue("solution")
Call agentLog.LogAction( "Solution in Dok schreiben")
Call SupportDoc.ReplaceItemValue("solution", tmpString)
Call agentLog.LogAction( "Kommentar für den Benutzer holen")
tmpString=TicketDoc.GetItemValue("tx_usercomment")
Call agentLog.LogAction( "Kommentar für den Benutzer schreiben")
Call SupportDoc.ReplaceItemValue("tx_usercomment", tmpString)
Call agentLog.LogAction( "Status holen")
tmpString=TicketDoc.GetItemValue("Status")
Call agentLog.LogAction( "Status schreiben")
Call SupportDoc.ReplaceItemValue("Status", tmpString)
Call agentLog.LogAction( "Supporter holen")
tmpString=TicketDoc.GetItemValue("supporter")
Call agentLog.LogAction( "Supporter schreiben")
Call SupportDoc.ReplaceItemValue("supporter",tmpString)
Call agentLog.LogAction( "Dok speichern")
Call SupportDoc.Save(True, True)
Goto EndeIf
End If
Wend
EndeIf:
Call agentLog.LogAction( "Nächstes SupportDoc")
Set SupportDoc = SupportView.GetNextDocument(SupportDoc)
iCounterX = iCounterX +1
Wend
Print "Alle Tickets (" + iCounterX +" / " + iCounter + ") bearbeitet. ENDE"
ErrHandler: ' Error-handling routine
Call agentLog.LogAction( "Fehler in Zeile " & Erl)
Print "Error " & Err & " at line number " &Erl
Resume Next
Ende:
Call agentLog.Close
End Sub
Der Agent läuft "on behalf of" Notes.
??? Wer ist "Notes" - wozu das - das macht man, wenn man die ID eines bestimmten Users für die Ausführung verwenden will. Ist das so?
Toni
wenn ich mir den nachfolgenden code anschaue, dann passt das doch:
Sub Initialize
Dim session As New NotesSession
Dim agentLog As New NotesLog("Agent log")
Call agentLog.OpenAgentLog
Call agentLog.LogAction( "Variablendeklaration")
Dim TicketDB As NotesDatabase
Dim SupportDB As NotesDatabase
Dim dbDirectory As NotesDirectory
Dim dateTime As New NotesDateTime( Datenumber(1995, 3, 14) )
Dim selection As String
Zuerst sage ich Ihm das er das Agent Log öffnen soll und dann das er dort reinschreiben soll...
Oder sehe ich das falsch?!?
Guten Morgen zusammen!
Nachdem ich nun den Agenten Schritt für Schritt neu geschrieben habe funktioniert er.
Nachfolgend nun der aktuelle (funktionstüchtige) Code:
Sub Initialize
On Error Goto ErrHandler
Dim session As New NotesSession
Dim TicketDB As NotesDatabase
Dim SupportDB As NotesDatabase
Dim TicketView As NotesView
Dim SupportView As NotesView
Dim MyAgent As NotesAgent
Dim dateTime As New NotesDateTime("")
Dim selection As String
Dim collection As NotesDocumentCollection
Dim TicketDoc As NotesDocument
Dim SupportDoc As NotesDocument
Dim SupportID As String
Dim TicketID As String
dateTime.LocalTime = Datenumber(2000, 1, 1)
Set SupportDB = session.CurrentDatabase
Set MyAgent = session.CurrentAgent
LogIt("Start des Agenten")
Set SupportView = SupportDB.GetView("(v_ReqNumber)")
iCounter = SupportView.AllEntries.Count
LogIt(iCounter + " Dokumente zum Bearbeiten gefunden")
LogIt("Hole erstes Dokument aus der SupportTracking Datenbank")
Set SupportDoc = SupportView.GetFirstDocument
LogIt( "Ticket-DB holen")
Set TicketDB = session.GetDatabase("Maria_Notes","it-troubticket.nsf",False)
LogIt( "View aus der Ticket-DB holen")
Set TicketView = TicketDB.GetView("(v_ReqNumber)")
While Not (SupportDoc Is Nothing)
LogIt( "Support-ID holen")
SupportID = SupportDoc.ReqNumber(0)
LogIt( "Support-ID: " + SupportID)
LogIt( "Selektion zusammensetzen")
selection = |@Contains( ReqNumber; "| + SupportID+ |" )|
Print "Suche in der TroubelTicket-Datenbank Ticket " + SupportID
LogIt( "Collection bilden indem Selection in der TroubleTicket-Datenbank gesucht wird")
Set collection = TicketDB.Search( selection, dateTime, 0 )
LogIt( "Erstes (und einziges) Dokument aus der Collection holen")
Set TicketDoc = collection.GetFirstDocument()
LogIt( "Prüfung ob Dokument in TicketDB vorhanden")
If (TicketDoc Is Nothing) Then
LogIt( "Ticket mit der Support-ID " + SupportID + " in der TIcketDB nicht gefunden!")
Print "Ticket " + SupportID + " wurde nicht in der Ticket-DB gefunden! Nächstes Dokument (" + iCounterX + " / "+iCounter+")"
LogIt( "Nächstes Dokument nehmen")
Goto EndeIf
End If
LogIt( "While TicketDoc is not nothing")
While Not TicketDoc Is Nothing
LogIt( "Ticket-ID holen")
TicketID = TicketDoc.ReqNumber(0)
LogIt( "Ticket-ID mit Support-ID vergleichen")
If (SupportID = TicketID) Then
LogIt( "Ticket-ID == Support-ID ("+ SupportID +")")
LogIt( "Solution holen ("+ SupportID +")")
tmpString=TicketDoc.GetItemValue("solution")
LogIt( "Solution in Dok schreiben ("+ SupportID +")")
Call SupportDoc.ReplaceItemValue("solution", tmpString)
LogIt( "Kommentar für den Benutzer holen ("+ SupportID +")")
tmpString=TicketDoc.GetItemValue("tx_usercomment")
LogIt( "Kommentar für den Benutzer schreiben ("+ SupportID +")")
Call SupportDoc.ReplaceItemValue("tx_usercomment", tmpString)
LogIt( "Status holen ("+ SupportID +")")
tmpString=TicketDoc.GetItemValue("Status")
LogIt( "Status schreiben ("+ SupportID +")")
Call SupportDoc.ReplaceItemValue("Status", tmpString)
LogIt( "Supporter holen ("+ SupportID +")")
tmpString=TicketDoc.GetItemValue("supporter")
LogIt( "Supporter schreiben ("+ SupportID +")")
Call SupportDoc.ReplaceItemValue("supporter",tmpString)
LogIt( "Dok speichern ("+ SupportID +")")
Call SupportDoc.Save(True, True)
Goto EndeIf
End If
Wend
EndeIf:
LogIt( "Nächstes SupportDoc holen")
Set SupportDoc = SupportView.GetNextDocument(SupportDoc)
iCounterX = iCounterX +1
Wend
LogIt("Beenden des Agenten")
ErrHandler: ' Error-handling routine
If (Err <> 0) Then
LogIt( "Fehler in Zeile " & Erl & " Fehler: " & Error$)
Print "Error " & Error$ & " at line number " &Erl
Exit Sub
End If
End Sub
Sub LogIt(strText)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim currentLog As NotesLog
Set db = session.CurrentDatabase
Set agent = session.CurrentAgent
Set currentLog = New NotesLog ( agent.Name + "-Agent in Datenbank " + db.Title + " auf " + db.Server )
Call currentLog.OpenNotesLog( "Maria_Notes/Maria-Hilf GmbH", "agentlog.nsf" )
currentLog.LogAction(strText)
Print agent.Name & " || " & strText
Call currentLog.Close
End Sub
Wie man dem Code entnehmen kann, habe ich gar nicht so viel geändert!
Ich habe nur die folgenden Klassen ausgelassen:
- NotesDirectory
- NotesViewEntryCollection
- NotesViewEntry
Ergo hat sich nicht so viel verändert; aber scheinbar genug um den Agenten am run zu hindern.
Trotz allem möchte ich mich an dieser Stelle für die tatkräftige Unterstützung der beteiligten Personen bedanken.
Gruß aus Krefeld =)