Ich habs jetzt erstmal so gelöst, dass dann das Dokument in der Quelle auch geändert wird.
dbQdoc.form=dbQdoc.form(0)
Call dbQdoc.Save (True, True)
So richtig glücklich bin ich nicht damit. :-\
Falls jemand eine bessere Idee hat, immer her damit ;)
Eine Idee hätte ich noch:
Wenn Dein Abgleich-Agent von einem technischen User unterzeichnet wird, brauchst Du nur das Zieldokument zu speichern. Dann gleichst Du nur die Dokumente ab, die zuletzt von einem anderen als dem technischen User geändert wurden (also LastModified in db1 ist jünger als in db2 und letzter Bearbeiter ist nicht der technische User. Den letzten Bearbeiter findest Du in $UpdatedBy, dort der letzte Eintrag (nur 99% sicher, bitte überprüfen)).
Das ist allerdings etwas wackelig, da Du wirklich sicherstellen musst, dass der Agent nur von diesem einen User gestartet wird (Stichwort Rezertifizierung, neue Certifier usw.). Du könntest aber in den Agenten eine Überprüfung einbauen, ob der richtige User den Agenten startet und im Fehlerfall mit einer Fehlermeldung im Log abbrechen. Wenn dann irgendwann einmal nicht mehr synchronisiert wird, muss nur noch die Fehlermeldung gefunden und verstanden werden.
An die Idee hatte ich auch schon gedacht und auch an die von Dir genannten Probleme.
Daher hab ich mich doch zur Zeit für die jetzige Lösung entschieden.
Momentan haperts bei mir nur noch an der Problematik, wie ich darauf reagiere, wenn ich durch die Ziel-DB durchgehe und ein Dokument in der Ziel-DB lösche, nicht den "Error 4207: Function requires a valid ADT argument " zu erhalten.
Funktioniert ein
Set dummydoc = dbZdoc
Call dummydoc.Remove( True )
?
Du hast völlig recht, der Fehler tritt dort auf, wo ich in der Ansicht ein Dokument lösche und dann das nächste Dokument holen möchte.
Muss ich denn das nächte Dokument zwingend VOR dem Löschen holen? Denn dann muss ich die Struktur des Scripts überarbeiten, das momentan noch so aussieht:
While Not(dbZdoc Is Nothing) ' Alle Dokumente in Ziel-DB-Ansicht abarbeiten
' UniversalID in Quell-DB suchen
strUNID = dbZdoc.Universalid
On Error 4091 Resume Next ' Fehler abfangen, sollte ID nicht gefunden werden
Set dbQdoc = dbQuelle.GetDocumentByUNID( strUNID )
If dbQdoc Is Nothing Then ' nicht gefunden, also kann in Ziel-DB gelöscht werden.
Set dummydoc = dbZdoc
Call dummydoc.Remove (True)
Else
If dbQdoc.size = 0 Then
' ghost document gefunden also aus Ziel entfernen
Set dummydoc = dbZdoc
Call dummydoc.Remove (True)
Else
' Last Modified von Quelle und Ziel vergleichen
If dbQdoc.Lastmodified <> dbZdoc.Lastmodified Then ' Änderungsdatum unterschiedlich
Call dbQdoc.CopyAllItems (dbZdoc, True) ' Daten von Quelle nach Ziel übertragen.
Call dbZdoc.Save (True, True)
dbQdoc.form=dbQdoc.form(0) ' damit Quelle "geändert" ist und Speichern funktioniert
Call dbQdoc.Save (True, True) ' Quelle auch speichern, damit Änderungsdatum gesetzt ist
End If
End If
End If
Set dbQdoc = Nothing ' dbQdoc wieder löschen
Set dbZdoc = Zview.GetNextDocument(dbZdoc)
Wend
Vielen Dank für Deinen Tip Peter.
Ich habs jetzt aber doch schon umgebaut, war nicht soviel Aufwand und die Struktur ist quasi noch dieselbe. Nur die Lesbarkeit hat imho darunter gelitten ;)
Falls es jemanden interessiert:
While Not(dbZdoc Is Nothing) ' Alle Dokumente in Ziel-DB-Ansicht abarbeiten
' UniversalID in Quell-DB suchen
strUNID = dbZdoc.Universalid
On Error 4091 Resume Next ' Fehler abfangen, sollte ID nicht gefunden werden
Set dbQdoc = dbQuelle.GetDocumentByUNID( strUNID )
If dbQdoc Is Nothing Then ' nicht gefunden, also kann in Ziel-DB gelöscht werden.
Print "** Sync Tool ** Step 1 ** " & dbZdoc.Getitemvalue("FirstName")(0) & " " & dbZdoc.Getitemvalue("LastName")(0) & " -> deleted"
Set dummydoc = dbZdoc
Set dbZdoc = Zview.GetNextDocument(dbZdoc)
Call dummydoc.Remove (True)
Else
If dbQdoc.size = 0 Then
' ghost document gefunden also aus Ziel entfernen
Print "** Sync Tool ** Step 1 ** " & dbZdoc.Getitemvalue("FirstName")(0) & " " & dbZdoc.Getitemvalue("LastName")(0) & " -> deleted"
Set dummydoc = dbZdoc
Set dbZdoc = Zview.GetNextDocument(dbZdoc)
Call dummydoc.Remove (True)
Else
' Last Modified von Quelle und Ziel vergleichen
If dbQdoc.Lastmodified <> dbZdoc.Lastmodified Then ' Änderungsdatum unterschiedlich
Print "** Sync Tool ** Step 1 ** " & dbQdoc.Getitemvalue("FirstName")(0) & " " & dbQdoc.Getitemvalue("LastName")(0) & " -> updated"
Call dbQdoc.CopyAllItems (dbZdoc, True) ' Daten von Quelle nach Ziel übertragen.
Call dbZdoc.Save (True, True)
dbQdoc.form = dbQdoc.form(0) ' damit Quelle "geändert" ist und Speichern funktioniert
Call dbQdoc.Save (True, True) ' Quelle auch speichern, damit Änderungsdatum gesetzt ist
Else
Print "** Sync Tool ** Step 1 ** " & dbQdoc.Getitemvalue("FirstName")(0) & " " & dbQdoc.Getitemvalue("LastName")(0) & " -> skipped"
End If
Set dbZdoc = Zview.GetNextDocument(dbZdoc)
End If
End If
Set dbQdoc = Nothing ' dbQdoc wieder löschen
Wend