Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: nikon am 19.07.06 - 12:24:47

Titel: Datum Dokument hinzugefügt
Beitrag von: nikon am 19.07.06 - 12:24:47
Hallo zusammen,

ich habe ein Problem:
Einer unserer Vertriebler (wer auch sonst ;D) hat scheinbar seit Urzeiten mal wieder repliziert und uns knapp 16k Dokumente in einer unserer Datenbanken beschert, die eigentlich schon längst archiviert waren. Wie ich in den Dokumenteigenschaften sehe, wird ein Datum "Hinzugefügt" mitgeführt, worauf ich abfragen könnte. Allerdings weiß ich jetzt nicht, wie ich dadran komme. Ich habe weder eine Formel dafür gefunden, noch eine Script-Propertie, noch existiert ein Feld im Dokument, was im Stile von $UpdatedBy oder $Revisions protokolliert. :(
In der Notes-Hilfe habe ich nichts gefunden und meine Suche hier im Forum, hat mir nur einen Thread geliefert, wo angeblich mein gewünschtes Datum per @Created  oder doc.Created ausgegeben wird, was ich allerdings überhaupt nicht nachvollziehen konnte. Dabei wird nur das Datum, wann das Dokument wirklich erstellt wurde, ausgegeben. Hätte mich auch ehrlich gesagt sehr gewundert, wenn dem nicht so gewesen wäre...

Hat einer einen Tip für mich auf lager? Danke vorab!


Gruß Dirk
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: Glombi am 19.07.06 - 12:37:05
Das geht leider nicht - siehe
http://atnotes.de/index.php?topic=23825.0

Andreas
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: nikon am 19.07.06 - 12:43:53
Ouh verd****!  >:(

Das ist keine gute Nachricht! Trotzdem danke für Deine Bemühungen.


Gruß Dirk
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: Glombi am 19.07.06 - 12:49:41
In der Lotus Developer Domain habe ich was gefunden - wie es scheint geht es doch mit der API:

http://www.lotus.com/ldd/46dom.nsf/c21908baf7e06eb085256a39006eae9f/3184fa2e5a813af580256b61003b2e12?OpenDocument

Die begeisterten Kommentare lassen darauf schließen...

Hier dann die erforderliche Änderung für os/400:
http://www.lotus.com/ldd/46dom.nsf/c21908baf7e06eb085256a39006eae9f/fa1db9d5a88624fc8525703e0052b776?OpenDocument

und ein nützlicher Verweis auf
http://icuelab.com/index/3f888f2e562b4fbb85256c5300668b52

Andreas
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: nikon am 19.07.06 - 12:56:48
Ouh ouh ouh!
Das schaut wirklich vielversprechend aus. Sogar schon von 2002 der Beitrag?! Naja ich werde das gleich direkt mal ausprobieren. Ich bin gespannt! :) Danke für den Tip!

An dieser Stelle vielleicht noch gerade:
Besteht denn die Möglichkeit so etwas zu verhindern? Gibt es Einstellungen wie lange die DeletionStubs vorgehalten werden? Und/oder kann man ein maximales Replizierintervall vorgeben?
Ob ich dafür einen neuen Thread im Administrationsforum eröffnen solte? ;)


Gruß Dirk
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: ata am 19.07.06 - 13:35:47
... man kann mit Replizierformeln arbeiten, um die Replikation zu begrenzen...

Toni
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: nikon am 19.07.06 - 14:50:57
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
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: Glombi am 19.07.06 - 19:37:04
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
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: nikon am 20.07.06 - 11:16:18
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


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
Titel: Re: Datum Dokument hinzugefügt
Beitrag von: LN4ever am 21.07.06 - 12:41:47
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