Domino 9 und frühere Versionen > ND6: Entwicklung
Datum Dokument hinzugefügt
ata:
... man kann mit Replizierformeln arbeiten, um die Replikation zu begrenzen...
Toni
nikon:
Zum einen: Ich melde Erfolg! 8)
Der C-API Aufruf war zielführend. Ich werde mir nun einen Agenten stricken, der alle Dokumente durchackert und die "unnötigen" entfernt. Da es wahrscheinlich zuviel verlangt wäre, den "Hinzufüger" noch auslesen zu können, werde ich die Zeit als Anhaltspunkt nehmen. Dabei kommt es mir wenigstens gelegen, dass es nicht in der Hauptarbeitszeit passiert ist!
Nochmal danke Andreas!!
@ata
Ist das meine einzige Chance? Ich bin bisher nicht so der Fan von Replizierformeln gewesen, da wir damals schon viel Ärger mit sowas hatten...
Aber ich werde mal schauen, was sich damit machen lässt.
Gruß Dirk
Glombi:
Das ist ja super, endlich eine Lösung für das Problem - obwohl es ja schon seit Jahren in der LDD schlummert :o
Was den "Hinzufüger" betrifft: Nun, da sehe ich absolut keine Chance. Denn das ist ja nicht zwingend der letzte Änderer eines Dokuments sondern nur der nette User aus dem Vertrieb, der nach einigen Monaten mal wieder repliziert hat ;D
Wenn Du den Agenten fertig hast, kannst Du ja mal den Code hier posten. Ich denke dafür machen wir hier auch einen Best Practices Artikel ;)
Andreas
nikon:
Guten Morgen!
Kein Problem - hier ist der Code meines Agenten:
--- Code: ---Option Public
Option Declare
Const wAPIModule = "nnotes.dll" ' Windows/32 (Intel)
'Liste der API-Module anderer Systeme:
'Const wAPIModule = "anotes.dll" ' Windows/32 (Alpha)
'Const wAPIModule = "Inotes.dll" ' OS/2v1, OS/2v2
'Const wAPIModule = "libnotes_r.a" ' UNIX (AIX)
'Const wAPIModule = "libnotes" ' OS/390
'Const wAPIModule = "libnotes.so" ' UNIX (Solaris, Linux)
'Const wAPIModule = "libnotes.sl" ' UNIX (HP-UX)
'Const wAPIModule = "NotesLib" ' Macintosh
'Const wAPIModule = "/qsys.lib/qnotes.lib/libnotes.svrpgm" ' OS/400
Const NOTE_ADDED_TO_FILE = 13
Declare Private Function ConvertTIMEDATEToText Lib wAPIModule Alias "ConvertTIMEDATEToText" _
( Byval zI As Long, Byval zT As Long, T As Long, Byval S As String, Byval nS As Integer, nT As Integer) As Integer
Declare Private Function NSFDbOpen Lib wAPIModule Alias "NSFDbOpen" _
( Byval P As String, hDB As Long) As Integer
Declare Private Function NSFDbClose Lib wAPIModule Alias "NSFDbClose" _
( Byval hDB As Long) As Integer
Declare Private Function NSFNoteOpen Lib wAPIModule Alias "NSFNoteOpen" _
( Byval hDB As Long, Byval NoteID As Long, Byval F As Integer, hNT As Long) As Integer
Declare Private Function NSFNoteClose Lib wAPIModule Alias "NSFNoteClose" _
( Byval hNT As Long) As Integer
Declare Private Function NSFNoteGetInfo Lib wAPIModule Alias "NSFNoteGetInfo" _
( Byval hNT As Long, Byval M As Integer, V As Any) As Integer
Declare Private Function OSPathNetConstruct Lib wAPIModule Alias "OSPathNetConstruct" _
( Byval zP As Long, Byval S As String, Byval F As String, Byval N As String) As Integer
Function AddedToFile(doc As NotesDocument) As String
Dim db As String
With doc.ParentDatabase
db$ = String$(1024, " ")
OSPathNetConstruct 0, .Server, .FilePath, db$
End With
Dim hDB As Long
NSFDbOpen db$, hDB
If hDB = 0 Then Exit Function
Dim hNT As Long
Dim T(1) As Long
NSFNoteOpen hDB, Clng("&H" & doc.NoteID), 0, hNT
If Not hNT = 0 Then
NSFNoteGetInfo hNT, NOTE_ADDED_TO_FILE, T(0)
NSFNoteClose hNT
Dim s As String
s$ = Space(80)
Dim ns As Integer
ConvertTIMEDATEToText 0, 0, T(0), s$, 80, ns%
AddedToFile = Left$(s$, ns%)
End If
NSFDbClose hDB
End Function
Sub Initialize
Dim s As New NotesSession
Dim cdb As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim rmcol As NotesDocumentCollection
Dim deadline As NotesDateTime
Dim docadded As NotesDateTime
Dim difference As Long
Dim retval As Integer
Set cdb = s.CurrentDatabase
Set view = cdb.GetView( "<Ansicht mit gewünschten Dokumenten>" )
Set doc = view.GetFirstDocument
Set rmcol = cdb.GetProfileDocCollection( "" )
Set deadline = New NotesDateTime( "<Zeitpunkt der Replizierung aus Log>" )
While Not doc Is Nothing
Set docadded = New NotesDateTime( AddedToFile(doc) )
difference = deadline.TimeDifference( docadded ) / 60 ' Timediefference in minutes
If difference >= 0 And difference <= 60 Then ' Add doc to col if added within an hour before deadline
Call rmcol.AddDocument(doc)
End If
Set doc = view.GetNextDocument(doc)
Wend
retval = Msgbox( "Möchten Sie wirklich " + Cstr(rmcol.Count) + " Dokumente löschen?", 36 , cdb.Title )
If retval = 6 Then Call rmcol.RemoveAll(True)
End Sub
--- Ende Code ---
Es gibt sicher noch andere Ansätze bzw. Verbesserungsmöglichkeiten, wie z.B. das Datum des Einfügens, auch noch mit dem Erstelldatum zu vergleichen, um nicht wirklich an diesem Tag erstellte Dokumente zufällig noch mit zu löschen. Aber für mich war das nicht nötig, da während des Repliziervorgangs unseres Vertrieblers, kein anderer in dieser DB zugange war.
Ich hoffe, ich konnte hiermit auch anderen weiterhelfen.
Gruß Dirk
LN4ever:
Das von dir eingesetzte Verfahren hat einige erhebliche Vorzüge (du packst kein neues Feld in jedes Dokument), aber auch ein paar ganz erhebliche Nachteile:
- du mußt ziemlich blind entscheiden, ob du x Dokumente löschen willst (das kann man verbessern, indem man die Dokumente in einen Ordner verschiebt).
- du mußt dein INITIALIZE jedes Mal auf ein Datum neu festlegen
- es funktioniert nur gut, wenn zum Unglückszeitpunkt keine anderen Aktivitäten in der DB stattfanden
Insofern finde ich deine Lösung eine ganz hervorragende zweitbeste Lösung. Die beste Lösung ist von geradezu unschlagbarer Einfachheit.
Notes vergibt beim Einfügen eines neuen Dokuments in eine Replik eine Note-ID, und diese Note-ID ist immer um genau 4 Zähler höher als die zuletzt vergebene Note-ID.
Wenn man sich eine Ansicht baut, die die Note-ID und das @Created nebeneinanderstellt, kann man mit einem Agenten periodisch daran entlang laufen und sehen, ob die neuen Note-IDs und das CREATED-Datum zusammenpassen. Wenn nicht, handelt es sich höchstwahrscheinlich um Replizierschrott. In manchen Fällen können Dokumente, die per Cut&Paste eingefügt wurden, diese Ordnung stören (dann ist deine Lösung doch wieder die Beste, das muß man von Fall zu Fall entscheiden)
Auf diese Idee brachte mich ein Kollege, der über einem solchen Problem schon einmal schwer gebrütet hat und dem ich (da ich von seinem ehemaligen Problem gewußt habe) den Code des API-PGMs zugesendet hatte.
Gruß
Norbert aus Hanau
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln