Domino 9 und frühere Versionen > ND7: Entwicklung
per runonserver gestartetem Agenten mitteilen, von wo er gestartet wurde
Demian:
Moin,
habe es gestern leider nicht mehr geschafft, da gibt wieder Sachen, die gibt es gar net :-:
Grundsätzlich sollten die Änderungen schon sofort erfolgen. Ansonsten wüsste ich jetzt nicht, wie ich es handhaben sollte, wenn zum Beispiel kurz nach einer Änderung, eine neue Änderung folgt.
Das mit der Mail ist mir aber nicht ganz klar muss ich gestehen. Also statt dass ich jetzt statt tmpDoc.NameOLD und tmpDoc.NameNEW in ein TempDoc schreibe, diese Werte in die Mail schreibe und Body halt einfach leer lasse und ab die Post an die DB('s) in denen die Änderungen aktualisiert werden müssen?
WildVirus:
N'abend,
--- Zitat von: Demian am 15.08.10 - 13:37:45 ---Und da stand ich an dem Punkt, dass ich nicht wusste wie ich dem Agenten mitteile wo er das tempDoc herkiegt. Ich habe das aber jetzt mehr oder weniger gelöst, indem ich alle forms der aktuellen db abfrage und wenn zum Beispiel die Form "Werkzeug" vorhanden ist (natürlich der Alias), dann soll er in der Mitgliederverwaltung suchen, wenn das fehlschlägt in der Kundenverwaltung. Das ist zwar nicht ganz so dolle/sauber
--- Ende Zitat ---
warum erstellst Du nicht einfach ein Profildokument, in dem wird definiert, wo er was findet bzw. auf was er reagieren soll ?
Das mit dem "Mailversand" läuft so, dass DB A eine Mail an DB B verschickt und das was zu ändern ist, in Feldern hinterlegt. Z.B.
Kundennummer = 47
Nachname = Meier
alle nicht gefüllten Felder sind einfach unverändert.
Du brauchst dann pro DB nur einen Agenten, der ausliest, was für Mails ankommen.
Viel Erfolg
Axel
Demian:
--- Zitat von: WildVirus am 16.08.10 - 20:07:03 ---warum erstellst Du nicht einfach ein Profildokument, in dem wird definiert, wo er was findet bzw. auf was er reagieren soll?
--- Ende Zitat ---
--- Zitat von: WildVirus am 16.08.10 - 20:07:03 ---Du brauchst dann pro DB nur einen Agenten, der ausliest, was für Mails ankommen.
--- Ende Zitat ---
An dem Punkt war ich ja, dass ich für jede DB nen eigenen Agenten hatte mit einem eigenen General_GetModificationDoc, indem die jeweilige DB im Quellcode angegeben ist. Ich will aber einen Agenten denn ich zentral pflegen kann. Ich hatte das _GetModificationDoc für den 2. Agenten folgendermaßen angepasst.
--- Code: ---Function General_GetModificationDoc() As Boolean
'**********************************************************************************************************************************************
'get the temporary doc
'**********************************************************************************************************************************************
On Error Goto ErrHandle
'**********************************************************************************************************************************************
Const EventName = "General_GetModificationDoc" 'for reports
'**********************************************************************************************************************************************
Dim frm As NotesForm
Dim i As Integer
'*********************************************************************************************************************************
'get tmpModification doc
Set agentThis = s.CurrentAgent
'identify from which db data must pulled
Call ReportWrite(Eventname & " - Anzahl Forms " & Ubound(db.Forms) + 1)
For i = 0 To Ubound(db.Forms)
Set frm = db.Forms(i)
Call ReportWrite(Eventname & " - aktuell zu prüfende Form " & frm.Aliases(0))
If frm.Aliases(0) = "Member" Then
'club function was edited
Call ReportWrite(Eventname & " - frm.Aliases(0) entspricht 'Member' ")
Set SourceDB = New NotesDatabase(Config_GetServer("Members"),Config_GetFilepath("Members"))
Set docMod = SourceDB.GetDocumentByID(AgentThis.ParameterDocID)
If Not (docMod Is Nothing) Then
Exit For
End If 'Not (docMod Is Nothing)
Call ReportWrite(Eventname & " - docMod für 'Member' kann nicht gefunden werden, teste nächste Form ")
End If 'frm.Aliases(0) = "Member" Then
If frm.Aliases(0) = "Seat" Then
'member or customer was edited
Call ReportWrite(Eventname & " - frm.Aliases(0) entspricht 'Seat' ")
Set SourceDB = New NotesDatabase(Config_GetServer("Members"),Config_GetFilepath("Members"))
Set docMod = SourceDB.GetDocumentByID(AgentThis.ParameterDocID)
if docMod is nothing then
Call ReportWrite(Eventname & " - docMod für 'Members' kann nicht gefunden werden, teste 'Customers'")
Set SourceDB = New NotesDatabase(Config_GetServer("Customers"),Config_GetFilepath("Customers"))
Set docMod = SourceDB.GetDocumentByID(AgentThis.ParameterDocID)
end if
If Not (docMod Is Nothing) Then
Exit For
End If 'Not (docMod Is Nothing)
End If 'frm.Aliases(0) = "Seat" Then
Set frm = Nothing
Call ReportWrite(Eventname & " - nächste Form wird gesucht")
Next 'db.Forms(i)
If docMod Is Nothing Then
Call ReportWriteError(Eventname & " - Replizierung im Script nicht vorgesehen")
'RETURN
General_GetModificationDoc = False
Exit Function
Else
'get username for logging
strMod_User = Cstr(docMod.EditingUser(0))
Call ReportWrite(Eventname & " - das temporäre Änderungsdokument wurde gefunden")
End If
'RETURN
General_GetModificationDoc = True
Leave:
Exit Function
ErrHandle:
Call ReportWriteError(EventName & " - Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
'RETURN
General_GetModificationDoc = False
Resume Leave
End Function
--- Ende Code ---
Dann fing es aber auch schon an, wenn ein Dokument an 2 DB's repliziert werden muss. Ich hatte mir hierfür nen flag eingabut, was ich im Agenten um 1 hochsetze und das tempDoc erst lösche, wenn der entsprechende Status erreicht ist. Das ging ja noch.
Gemein wurde es, als in einer Konstellation, wie folgender:
--- Code: ---....
If frm.Aliases(0) = "Seat" Then
'club function was edited
Call ReportWrite(Eventname & " - frm.Aliases(0) entspricht 'Seat' ")
Set SourceDB = New NotesDatabase(Config_GetServer("Members"),Config_GetFilepath("Members"))
Set docMod = SourceDB.GetDocumentByID(AgentThis.ParameterDocID)
if docMod is nothing then
Set SourceDB = New NotesDatabase(Config_GetServer("Customers"),Config_GetFilepath("Customers"))
Set docMod = SourceDB.GetDocumentByID(AgentThis.ParameterDocID)
end if
If Not (docMod Is Nothing) Then
Exit For
End If 'Not (docMod Is Nothing)
Call ReportWrite(Eventname & " - docMod für 'Member' kann nicht gefunden werden, teste nächste Form ")
End If 'frm.Aliases(0) = "Seat" Then
....
--- Ende Code ---
die Änderung in der Datenbank "Customers" erfolgte, er mir das tempDoc jedoch bei "Members" gefunden haben will, per Log konnte ich feststellen, dass docMod wirklich befüllt sein musste, weil mir die NoteID ausgegeben wurde und sourceDB war die DB "Members".
Alles Voodoo, klare Sache ::)
Glaub ich muss von der Thematik mal etwas Abstand nehmen. Verenne mich da jedes Mal aufs neue, ab einem gewissen Punkt.
WildVirus:
Moin,
Du kannst mit einem Agenten auskommen, er muss nur alles können. Was er zu tun hat, sagt ihm sein Profildokument. Darin kannst Du steuern, dass in DB A nur die Masken A, B und D zu ändern sind, in DB B nur die Masken B und C.
Bei der Änderung eines Namens -egal ob Kunde oder Mitglied- wird ein Dokument erstellt, das der Agent sich nimmt und -je nach Profildokument- verarbeitet.
D.h. ein Agent (der in n Datenbanken arbeitet) und eine Quell-DB.
Aber überleg Dir nochmal Dein ganzes Konstrukt, ob es wirklich so getrennt sein muss. Warum greift nicht die Ausleih-DB online auf die beiden anderen Datenbanken zu ? Und über eine Kunden-/Mitgliedsnummer speicherst Du beim Ausleihen weg, wer es hat. Dann kannst Du per dblookup die Felder zum Ausleiher belegen. Beim Öffnen des Dokumentes kann ein Update erfolgen, alternativ nur bei Änderungen per Agent nachts.
CU,
Axel
Demian:
Gude,
--- Zitat von: WildVirus am 17.08.10 - 06:55:32 ---Warum greift nicht die Ausleih-DB online auf die beiden anderen Datenbanken zu ?
--- Ende Zitat ---
bin mir jetzt nicht sicher was genau du damit meinst? Zur Auswahl von Kunden/Mitgliedern in der Ausleih-DB greife ich ja live auf die anderen DB's zu?
--- Zitat von: WildVirus am 17.08.10 - 06:55:32 ---Und über eine Kunden-/Mitgliedsnummer speicherst Du beim Ausleihen weg, wer es hat
--- Ende Zitat ---
das mach ich ja auch, nur kann die ja auch geändert werden ;D
--- Zitat von: WildVirus am 17.08.10 - 06:55:32 ---Du kannst mit einem Agenten auskommen, er muss nur alles können. Was er zu tun hat, sagt ihm sein Profildokument. Darin kannst Du steuern, dass in DB A nur die Masken A, B und D zu ändern sind, in DB B nur die Masken B und C
--- Ende Zitat ---
das entspricht ja vom Prinzip her meiner Lösung mit den Forms im Script. Weil die Maske A evtl. von 2 verschiedenen DB's aktualisiert werden kann, hätte ich auch bei einem Profildoc dieses try and catch mit set SourceDB. Allderings wäre der Agentencode dann übersichtlicher.
--- Zitat von: WildVirus am 17.08.10 - 06:55:32 ---Aber überleg Dir nochmal Dein ganzes Konstrukt
--- Ende Zitat ---
Deswegen meinte ich, ich sollte von der Thematik vielleicht mal etwas Abstand nehmen. Wobei mir grad kommt, ich könnte ja im 1. aufrufenden Agenten - da serverbasiert - das tempDoc aus der Quell-DB in den Ziel-DB'S neu erstellen. Dann habe ich 2 getrennte Note-ID's und das Problem mit dem Löschen entfällt auch. Im 2. Agenten ist SourceDB dann immer s.currentdb. Dass der Server keinen Zugriff auf eine DB hätte kann eigentlich nicht vorkommen.
Danke für den Stupser :)
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln