Autor Thema: per runonserver gestartetem Agenten mitteilen, von wo er gestartet wurde  (Gelesen 3110 mal)

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Moin,moin,

ich habe diverse Konstellationen, bei denen Änderungen von einer DB an die nächste übertragen werden sollen. Ich arbeite hier im Prinzip mit 2  vorsichtig ausgedrückt "Replizierungs"Agenten. Einem in der DB in der geändert wird und einer in der DB wo die Änderungen hin müssen. Ich starte aus der QuellDB den Agenten in der Ziel-DB per runonserver und übergebe die Note-ID meines temporär erstellten Docs mit den Änderungen und verarbeite diese in der Ziel-DB.

Eigentlich klappt das wunderbar. Aber auf diese Weise bräuchte ich für jede Art Änderung einen eigenen Agenten in jeder Ziel-DB. Das würde ich gerne auf einen Agenten beschränken. Allerdings bin ich mir jetzt nicht so schlüssig, wie ich dem Agenten mitteile in welcher DB er mir ParameterDocID suchen soll?

Hat da jemand nen Denkanstoß?
Gruß
Demian

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
PS: ich hatte schon überlegt das temporäre Dokument mit den Änderungen direkt in der Ziel-DB zu erstellen (wird in einer ScriptLib erstellt), nur hat der User der ändert, ggf. ja nicht das Recht dazu Dokumente in der Ziel-DB zu erstellen.  :-:

Außerdem müsste ich dann bei mehreren Ziel-DB's auch für jede DB ein Änderungsdokument erstellen.

Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Hallo Demian,

das ist eine Architekturfrage - hierzu müsste man viel mehr über die Details der Datenbanken wissen.
Was mich aber jetzt schon stört: Das temporäre Dokumente angelegt werden (die dann sicherlich wieder gelöscht werden?).
Vorschläge hätte ich eine Menge (u.a. könnte man in Betracht ziehen, dass DB 1 die erforderlichen Änderungen in DB 2 per Mail an diese schickt). Ich hätte auch Vorschläge, wie man das Erstellen von Dokumenten, die man dann eh nur wieder löschen muss, verhindern könnte. Aber dazu erfordert es einfach mehr Details zu Deiner Konstellation.

Bernhard

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Moin,moin,

also im Prinzip ist es ganz einfach. Nehmen wir als Beispiel mal Mitgliederverwaltung, eine Kundenverwaltung sowie eine Werkzeugverwaltung in der Werkzeuge an Mitglieder oder Kunden ausgegeben werden.

Beim Verleih eines Werkzeugs wird ein Mitglied oder Kunde ausgewählt und der Name wird im Werkzeug gespeichert, bis dieses zum Beispiel über eine Aktion freigegeben wird. Wenn das Mitglied oder Kunde aber beispielsweise heiratet und sich der Name ändert, muss diese Änderung an die Werkzeugverwaltung weitergegeben werden, damit der Name bei verliehenen Werkzeugen geändert wird.

Die Person die den Namen des Mitglieds ändert hat aber unter Umständen gar keinen Zugriff auf die Werkzeugverwaltung. Also läuft das über 2 Serverbasierte Agenten.

In der Maske Mitglied überprüfe ich Änderungen indem ich mir im Postopen die Feldwerte wegspeicher und im Querysave ebenfalls. Im Postsave vergleiche ich dann meine Variablen mit den alten und neuen Werten. Wenn dann Änderungen aufgetreten sind, speichere ich die alten und die neuen Feldwerte in einem neuen Dokument, starte den Agenten in der Mitgliederverwaltung und übergebe die Note-ID. Dieser Agent ruft wiederum in der Datenbank Werkzeugverwaltung einen Agenten auf und übergibt diesem ebenfalls die Note-ID.

In diesem Agent wird das tempDoc in der Mitgliederverwaltung über die ID geholt alle relevanten Dokumente (verliehene Werkzeuge) auf die alten Werte überprüft und bei Übereinstimmung mit den neuen Wertden aus dem tempDoc überschrieben. Danach wird das tempDoc in der Mitgliederverwaltung gelöscht.

Zu allem Übel kommt vielleicht noch hinzu, dass die Werkzeuge vielleicht noch verschiedenen Abteilungen zugeordnet sind, die aber auch in einer separaten DB gepflegt werden. So dass Abteilungsänderungen ebenfalls an die Werkzeuge weitergegeben werden müssen. Der Agent in der Werkzeugverwaltung muss ja wissen, ob er jetzt das tempDoc in der Mitgliederverwaltung, in der Kundenverwaltung oder in der Abteilungsverwaltung suchen soll.


Hier mal Teile des ursprünglichen Agenten in der DB in der eine Änderung erfolgt (der Code bezieht sich jetzt auf andere DB's hoffe das verwirrt nicht zu sehr):

Code
Sub Initialize
	'*********************************************************************************************************************************
	'This agent will allocate changes on any document which data are used in other databases.
	'*********************************************************************************************************************************
	On Error Goto ErrHandle	
	'*********************************************************************************************************************************	
	Dim strMod_Form As String 'to get form of changed doc
	'*********************************************************************************************************************************	
	Set s = New NotesSession
	Set db = s.CurrentDatabase
	Set AgentThis = s.CurrentAgent	
	
	'get tmp doc to continue logging with real user name
	If General_GetModificationDoc = False Then 
		Call CreateLogEntry(db.title,s.CommonUserName,"Agent: AllocateChanges","Initialize",_
		"General_GetModificationDoc = false - beende Agenten")		
		Exit Sub
	End If
	
	'get form of changed doc
	strMod_Form = Cstr(docMod.ChangedForm(0))		
	
	Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","Initialize",_
	"Starte Verteilung für Maske: " & strMod_Form) 		
	
	'start allocating for the changed doc
	If strMod_Form = "Zone" Then
		Call Zone_Allocate
	Elseif strMod_Form = "City" Then
		Call City_Allocate()
	Elseif strMod_Form = "TransportSystem" Then
		Call TransportSystem_Allocate()
	Elseif strMod_Form = "CostObject" Then
		Call CostObject_Allocate()
	Else
		Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","Initialize",_
		"Verteilung kann nicht gestartet werden, da für Maske: " & strMod_Form & " keine Verteilung festgelegt wurde")
		Exit Sub
	End If
	
	Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","Initialize",_
	"Verteilung für Maske: " & strMod_Form & " beendet") 	
	
Leave:
	Exit Sub
	
ErrHandle:
	Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","Initialize",_
	"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
	Resume Leave
End Sub


Function General_GetModificationDoc As Boolean
	'*********************************************************************************************************************************
	'get the temporary doc. Save the form of changed doc global and continue logging with the name of the user, which have
	'edited created the tmp doc. invoked from Initialize of this agent.
	'*********************************************************************************************************************************
	'used libraries:		logging
	'used functions:		CreateLogEntry(DBName As String, User As String, DesignElement As String, InvokingEvent As String, _
	'							Text As String)as Boolean	
	'*********************************************************************************************************************************
	On Error Goto ErrHandle	
	'*********************************************************************************************************************************	
	
	Set docMod = db.GetDocumentByID(AgentThis.ParameterDocID)
	
	If docMod Is Nothing Then
		'log with the name of the server on which this agent run
		Call CreateLogEntry(db.title,s.CommonUserName,"Agent: AllocateChanges","General_GetModificationDoc",_
		"Das temporäre Änderungsdokument konnte nicht gefunden werden")
		'RETURN
		General_GetModificationDoc = False
	Else
		'get username for logging
		strMod_User = Cstr(docMod.EditingUser(0))
		
		'log with the name of the user, which have edited the zone
		Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","General_GetModificationDoc",_
		"Agent: " & AgentThis.Name & " wurde gestartet")				
	End If
	
	'RETURN
	General_GetModificationDoc = True
	
Leave:
	Exit Function
	
ErrHandle:
	Call CreateLogEntry(db.title,s.CommonUserName,"Agent: AllocateChanges","General_GetModificationDoc",_
	"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
	'RETURN
	General_GetModificationDoc = False
	Resume Leave
End Function



Sub City_Allocate
	'*********************************************************************************************************************************
	'allocate changes on a city to any database which use city datain this database.
	'*********************************************************************************************************************************
	On Error Goto ErrHandle	
	Dim SourceDocDB As NotesDatabase
	Dim strMod_CityOLD As String 	'old City value of the changed City
	'*********************************************************************************************************************************	
	Set SourceDocDB = s.CurrentDatabase
	strMod_CityOLD = Cstr(docMod.CityOLD(0))
	
	Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","City_Allocate",_
	"City_Allocate wird für Ort: " & strMod_CityOLD & " durchgeführt")
	
	'refresh in all db's where zone data is used
	Call City_RefreshThisDB(SourceDocDB, strMod_CityOLD)
	Call City_RefreshCarDB()
	
	Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","City_Allocate",_
	"City_Allocate wird für Ort: " & strMod_CityOLD & " beendet")
	
Leave:
	Exit Sub
	
ErrHandle:
	Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","City_Allocate",_
	"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
	Resume Leave
End Sub



Sub City_RefreshCarDB()
	'*********************************************************************************************************************************
	'allocate changes on a CostObject to any database which work with the CostObject values
	'*********************************************************************************************************************************
	On Error Goto ErrHandle	
	'*********************************************************************************************************************************	
	Dim agent As NotesAgent	'agent in CarDB to edit reservations
	'*********************************************************************************************************************************	
	Set RefreshDB = s.GetDatabase("Baghira","Abteilungen\public\Firmenfahrzeugverwaltung.nsf")
	
	Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","CostObject_RefreshCarDB",_
	"starte Agent ReservationsEdit in db: " & RefreshDB.Title)		
	
	Set agent = RefreshDB.GetAgent("ReservationsEdit")
	Call agent.RunOnServer(docMod.NoteID)
	
Leave:
	Exit Sub
	
ErrHandle:
	Call CreateLogEntry(db.title,strMod_User,"Agent: AllocateChanges","CostObject_RefreshCarDB",_
	"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
	Resume Leave
End Sub




und hier Teile des Agents in der DB in der Änderungen erfolgen müssen



Code
Sub Initialize
	'*********************************************************************************************************************************
	'This agent edit the reservations if an cost object or a city  in db "Kostenträgerverwaltung" was changed.
	'*********************************************************************************************************************************
	On Error Goto ErrHandle	
	'*********************************************************************************************************************************	
	Set s = New NotesSession
	Set db = s.CurrentDatabase	
	
	'get tmp doc to continue logging with real user name
	If General_GetModificationDoc = False Then 
		Call CreateLogEntry(db.title,s.CommonUserName,"Agent: AllocateChanges","Initialize",_
		"General_GetModificationDoc = false - beende Agenten")		
		Exit Sub
	End If
	
	'verify form of changed doc 
	strForm = Cstr(docMod.ChangedForm(0))		
	'get ID 
	strCostObject = Cstr(docMod.ID(0))
	
	'start allocating for the changed doc
	If strForm = "CostObject" Then
		Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","Initialize",_
		"geänderte Maske: " & strForm)
		
		Call CostObject_EditAll
		
	Elseif strForm = "City" Then
		Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","Initialize",_
		"geänderte Maske: " & strForm)
		
		Call City_EditAll()
		
	Else
		Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","Initialize",_
		"geänderte Maske nicht gültig - Maske: " & strForm)
	End If
	
Leave:
	Exit Sub
	
ErrHandle:
	Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","Initialize",_
	"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
	Resume Leave
End Sub



Function General_GetModificationDoc As Boolean
	'*********************************************************************************************************************************
	'get the temporary doc in  db . Save the form of changed doc global and continue logging with the name of the user, which have
	'created the tmp doc.
	'*********************************************************************************************************************************
	On Error Goto ErrHandle	
	'*********************************************************************************************************************************	
	'get tmpModification doc
	Set agent = s.CurrentAgent
	Set SourceDocDB = s.GetDatabase("Baghira","Zeiterfassung\Kostenträgerverwaltung.nsf")	
	Set docMod = SourceDocDB.GetDocumentByID(agent.ParameterDocID)
	
	If docMod Is Nothing Then
		'log with the name of the server on which this agent run
		Call CreateLogEntry(db.title,s.CommonUserName,"Agent: ReservationsEdit","General_GetModificationDoc",_
		"Das temporäre Änderungsdokument konnte nicht gefunden werden")
		'RETURN
		General_GetModificationDoc = False
	Else
		'get username for logging
		strUser = Cstr(docMod.EditingUser(0))
		
		'log with the name of the user, which have edited the doc
		Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","General_GetModificationDoc",_
		"Agent: " & agent.Name & " wurde gestartet")				
	End If
	
	'RETURN
	General_GetModificationDoc = True
	
Leave:
	Exit Function
	
ErrHandle:
	Call CreateLogEntry(db.title,s.CommonUserName,"Agent: ReservationsEdit","General_GetModificationDoc",_
	"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
	'RETURN
	General_GetModificationDoc = False
	Resume Leave
End Function





Function City_EditAll()
	'**********************************************************************************************************************************************
	'This function gets the changed city in the DB Stammdatenverwaltung, search for all reservations with this city 
	'edit them an send an info mail to the author of the reservation. 
	'**********************************************************************************************************************************************
	On Error Goto ErrHandle
	'**********************************************************************************************************************************************	
	Dim doccol As NotesDocumentCollection 'all reservations which must be edited
	Dim resdoc As NotesDocument 'Reservation doc
	'**********************************************************************************************************************************************	
	'search for all reservations with the city
	If Not (docMod Is Nothing) Then
		Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","City_EditAll",_
		"geänderter Ort gefunden: - " & docMod.CityOLD(0))			
		
		Dim view As NotesView
		Set view = db.GetView("lkpCities")
		
		Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","City_EditAll",_
		"suche nach Reservierungen mit Ort: " & docMod.CityOLD(0))			
		
		Set doccol = view.GetAllDocumentsByKey(docMod.CityOLD(0),True)
		
		If doccol.Count = 0 Then
			Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","City_EditAll",_
			"Es wurden keine zu ändernden Reservierungen mit Ort: " & docMod.CityOLD(0) & " gefunden")
			Exit Function
		End If
		
		'get first reservation
		Set resdoc = doccol.GetFirstDocument
		
		'run over all reservations
		While Not (resdoc Is Nothing)
			Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","City_EditAll",_
			"es wurden " & doccol.Count & " Reservierungen gefunden")	
			
			'read out old data
			strCostObject = resdoc.ReservationOrderNumber(0)
			strCityOLD = resdoc.ReservationCity(0)
			strDistanceOLD = Cstr(resdoc.ReservationKilometer(0))
			
			Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","City_EditAll",_
			"Alter Ort: " & strCityOLD)	
			
			'change the data
			resdoc.ReservationCity = docMod.CityNEW(0)
			Call resdoc.Save(True,False)
			
			Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","City_EditAll",_
			"Ort bei Reservierung " & resdoc.NoteID & " wurde geändert")	
			
			'Informate the author of the reservation
			Call Memo_Variables(resdoc)
			Call Memo_Initialize(resdoc)			
			
			'get next reservation
			Set resdoc = doccol.GetNextDocument(resdoc)
		Wend				
		
	End If	
	
	'delete modification doc after allocating
	Call General_DeleteModificationDoc
	
Leave:
	Exit Function
	
ErrHandle:
	Call CreateLogEntry(db.title,strUser,"Agent: ReservationsEdit","City_EditAll",_
	"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
	'delete modification doc after error
	Call General_DeleteModificationDoc
	Resume Leave	
End Function




Mein Problem ist im 2. Agenten das General_GetModificationDoc weil hier das tempDoc gesucht wird und die DB angegeben wird. So bräuchte ich für jede DB die Änderungen empfängt einen eigenen Agenten. Um das ganze übersichtlich zu halten will ich aber hier nur mit einem Agenten arbeiten, in dem ich für alle DB's die Änderungen verwalte.
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, aber es löst das Problem vorerst. Bin grad noch dabei das für alle DB's umzusetzen, Code dann später.




 
« Letzte Änderung: 15.08.10 - 13:39:20 von Demian »
Gruß
Demian

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
Moin Moin,

muss die Änderung sofort erfolgen ?

Wenn nein, dann speicher in der "Ausleih-DB" die Kunden- oder Mitgliedernummer als Schlüsselwort ab und hol stündlich, täglich oder wie oft auch immer aus der QuellDB die aktuellen Daten.

Alternative ist, dass beim Ändern des Namens in Kunden- oder Mitgliederverwaltung eine Mail an die Ausleih-DB geschickt wird, die dort ein Agent verarbeitet.

Das wäre beides einfach, sauber und nachvollziehbar.

CU,
Axel

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
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?


Gruß
Demian

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
N'abend,

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

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

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
warum erstellst Du nicht einfach ein Profildokument, in dem wird definiert, wo er was findet bzw. auf was er reagieren soll?

Du brauchst dann pro DB nur einen Agenten, der ausliest, was für Mails ankommen.

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


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
....


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.

Gruß
Demian

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
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

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Gude,


Warum greift nicht die Ausleih-DB online auf die beiden anderen Datenbanken zu ?

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? 

Und über eine Kunden-/Mitgliedsnummer speicherst Du beim Ausleihen weg, wer es hat
das mach ich ja auch, nur kann die ja auch geändert werden  ;D


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


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.


Aber überleg Dir nochmal Dein ganzes Konstrukt

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 :)


Gruß
Demian

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz