Domino 9 und frühere Versionen > ND8: Entwicklung
Vorgehensweise Dokumente synchronisieren
schroederk:
--- Zitat von: Peter Klett am 10.12.10 - 09:59:23 ---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.
--- Ende Zitat ---
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
--- Code: ---Set dummydoc = dbZdoc
Call dummydoc.Remove( True )
--- Ende Code ---
?
Peter Klett:
Bist Du sicher, dass der Fehler an genau der Stelle auftritt?
Vermute mal, dass Du eine Ansicht durchgehst, dann ein Dokument löschst und mit set doc = view.GetNextDocument (doc) auf das nächste zugreifen willst, dabei kracht es dann.
Falls das stimmt, mach es z.B. so:
Set dummydoc = dbZdoc
Set dbZdoc = dbZview.GetNextDocument (dbZdoc)
Call dummydoc.Remove (true)
schroederk:
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:
--- Code: --- 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
--- Ende Code ---
ascabg:
Wirst Du nicht umhin kommen.
Andreas
Peter Klett:
Ich lösche immer erst ganz zum Schluss. Anstatt das Dokument zu löschen, merke ich es mir in einer Liste
Dim loeschdocs List As NotesDocument
dann in der Schleife statt löschen
Set loeschdocs (doc.UniversalID) = doc
und dann am Ende des Scripts
Forall loeschdoc in loeschdocs
Call loeschdoc.Remove (True)
End Forall
Wenn Du das so umbaust, brauchst Du Deine Struktur nicht zu verändern
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln