Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: HarryB am 19.08.08 - 11:04:45

Titel: Inbox bereinigen
Beitrag von: HarryB am 19.08.08 - 11:04:45
Hallo zusammen,

ich schreibe gerade einen Agenten, der einmal die Woche über die Mailbox laufen soll und alle Mails, die älter sind als 30 Tage, in einen anderen Ordner verschieben. Zusätzlich soll das ganze nur laufen, wenn mehr als 200 Dokumente in der Mailbox sind.

Nun ist es so, dass mein Code nicht alle Mails verschiebt, die den Kriterien entsprechen. Lasse ich den Agenten noch mal laufen, verschiebt er wieder ein paar Mails, aber wieder nicht alle. Die Frage ist: wo liegt mein Denkfehler?

Anbei mein Code.

Code
Sub Initialize
	
	'Inbox Maintenance
	'Periodisches Aufräumen des Meileingangs zur Performanceverbesserung
	
	Const archiveFolder = "Maileingang - Archiv"
	Const inboxLimit = 200 'Anzahl Dokumente
	Const maxAge = 30 'in Tagen
	
	Dim ses As New NotesSession
	Dim currentDb As NotesDatabase
	Dim inbox As NotesView
	Dim mailDoc As NotesDocument
	Dim moveDoc As NotesDocument
	Dim movedDocs As Integer
	Dim mailCreated As NotesDateTime
	Dim cutoffDate As NotesDateTime
	
	Set currentDb = ses.CurrentDatabase
	
	'Eingangsordner heranziehen
	Set inbox = currentDb.GetView("($Inbox)")
	
	'Prüfen, wie viele Dokumente im Eingang liegen; wenn Limit überschritten, aktiv werden
	If (inbox.EntryCount > inboxLimit) Then
		
		'Wenn Schwellwert überschritten, alls Mails die älter sind als x Tage in Archiv verschieben
		Set cutoffDate = New NotesDateTime(Cstr(Today))
		Call cutoffDate.AdjustDay(-1 * maxAge)
		Set mailCreated = New NotesDateTime("")
		
		Set mailDoc = inbox.GetFirstDocument
		
		While Not (mailDoc Is Nothing)
			
			mailCreated.LSLocalTime = mailDoc.Created
			
			If (cutoffDate.TimeDifference(mailCreated) > 0) Then
				
				Set moveDoc = mailDoc
				
			End If '(cutoffDate.TimeDifference(mailCreated) > 0)
			
			Set mailDoc = inbox.GetNextDocument(mailDoc)
			
			If Not (moveDoc Is Nothing) Then
				
				movedDocs = movedDocs + 1
				
				Call moveDoc.PutInFolder(archiveFolder, True)
				Call moveDoc.RemoveFromFolder("($Inbox)")
				
				Set moveDoc = Nothing
				
			End If 'Not (moveDoc Is Nothing)
			
		Wend 'Not (mailDoc Is Nothing)
		
	End If '(inbox.EntryCount > inboxLimit)
	
	Print Cstr(movedDocs) + " Dokumente verschoben"
	
End Sub

Vielen Dank
Harry
Titel: Re: Inbox bereinigen
Beitrag von: m3 am 19.08.08 - 11:19:46
1) "ich schreibe gerade einen Agenten, der einmal die Woche über die Mailbox Inbox laufen soll und alle Mails, die älter sind als 30 Tage, in einen anderen Ordner verschieben. Zusätzlich soll das ganze nur laufen, wenn mehr als 200 Dokumente in der Mailbox Inbox sind." - dann versteht man auch, was Du meinst.

2) Ich würde eher über NotesView.AllEntries iterieren. Mit Löschen/Verschieben und GetNextDocument bin ich schon mal eingefahren.

3) Oder gleich mit NotesView.FTSearch nur die Dokumente bearbeiten, die den Kriterien entsprechen.

Titel: Re: Inbox bereinigen
Beitrag von: Driri am 19.08.08 - 11:25:18
Ist sichergestellt, daß der Archivordner existiert ? Sonst müßtest Du das auf jeden Fall noch abfangen.

So auf den ersten Blick fällt mir sonst nichts ins Auge. Alternativ zur Verwendung von 2 NotesDocuments (maildoc, movedoc) könntest Du auch für die Inbox das AutoUpdate deaktivieren und nach der Verarbeitung wieder aktivieren. Damit sparst Du dir das temporäre Zuweisen des zu verarbeitenden Dokumentes in ein zweites NotesDocument.
Titel: Re: Inbox bereinigen
Beitrag von: m3 am 19.08.08 - 11:32:04
Nun ist es so, dass mein Code nicht alle Mails verschiebt, die den Kriterien entsprechen. Lasse ich den Agenten noch mal laufen, verschiebt er wieder ein paar Mails, aber wieder nicht alle. Die Frage ist: wo liegt mein Denkfehler?
In solchen Fällen schreibe ich bei jeder if-Abfrage einen Log-Eintrag. Damit sollte sich herausstellen, warum manche Dokumente nicht gleich genommen werden.
Titel: Re: Inbox bereinigen
Beitrag von: HarryB am 19.08.08 - 11:41:45
Ist sichergestellt, daß der Archivordner existiert ? Sonst müßtest Du das auf jeden Fall noch abfangen.
Ja, das ist mit 'Call moveDoc.PutInFolder(archiveFolder, True)' bereits sichergestellt (das 'True' bezieht sich auf 'CreateOnFail'). Der Ordner wurd auch im ersten Durchlauf korrekt erstellt.
Titel: Re: Inbox bereinigen
Beitrag von: HarryB am 19.08.08 - 11:43:39
1) "ich schreibe gerade einen Agenten, der einmal die Woche über die Mailbox Inbox laufen soll und alle Mails, die älter sind als 30 Tage, in einen anderen Ordner verschieben. Zusätzlich soll das ganze nur laufen, wenn mehr als 200 Dokumente in der Mailbox Inbox sind." - dann versteht man auch, was Du meinst.
Wir korrigiert.  :-[

2) Ich würde eher über NotesView.AllEntries iterieren. Mit Löschen/Verschieben und GetNextDocument bin ich schon mal eingefahren.
Über AllEntries bin ich auch gestolpert. Ich probiere das mal.

3) Oder gleich mit NotesView.FTSearch nur die Dokumente bearbeiten, die den Kriterien entsprechen.
Es sind nicht alle Datenbanken volltextindiziert. Das ist dann auch kein Spaß.

Viele Grüße
Harry
Titel: Re: Inbox bereinigen
Beitrag von: HarryB am 19.08.08 - 13:26:48
2) Ich würde eher über NotesView.AllEntries iterieren. Mit Löschen/Verschieben und GetNextDocument bin ich schon mal eingefahren.
Damit klappt es. :D

Anbei das funktionierende Script.

Code
Sub Initialize
	
	'Inbox Maintenance
	'Periodisches Aufräumen des Meileingangs zur Performanceverbesserung
	
	Const archiveFolder = "Maileingang - Archiv" 'Name des anzulegenden Ordners
	Const inboxLimit = 200 'Anzahl Dokumente
	Const maxAge = 30 'in Tagen
	
	Dim ses As New NotesSession
	Dim currentDb As NotesDatabase
	Dim inbox As NotesView
	Dim allEntries As NotesViewEntryCollection
	Dim mailEntry As NotesViewEntry
	Dim mailDoc As NotesDocument
	Dim moveDoc As NotesDocument
	Dim movedDocs As Integer
	Dim mailCreated As NotesDateTime
	Dim cutoffDate As NotesDateTime
	
	Set currentDb = ses.CurrentDatabase
	
	'Eingangsordner heranziehen
	Set inbox = currentDb.GetView("($Inbox)")
	
	'Prüfen, wie viele Dokumente im Eingang liegen; wenn Limit überschritten, aktiv werden
	If (inbox.EntryCount > inboxLimit) Then
		
		'Wenn Schwellwert überschritten, alls Mails die älter sind als x Tage in Archiv verschieben
		Set cutoffDate = New NotesDateTime(Cstr(Today))
		Call cutoffDate.AdjustDay(-1 * maxAge)
		Set mailCreated = New NotesDateTime("")
		
		Set allEntries = inbox.AllEntries
		Set mailEntry = allEntries.GetFirstEntry
		
		While Not (mailEntry Is Nothing)
			
			Set mailDoc = mailEntry.Document
			mailCreated.LSLocalTime = mailDoc.Created
			
			If (cutoffDate.TimeDifference(mailCreated) > 0) Then
				
				Set moveDoc = mailDoc
				
			End If '(cutoffDate.TimeDifference(mailCreated) > 0)
			
			Set mailEntry = allEntries.GetNextEntry(mailEntry)
			
			If Not (moveDoc Is Nothing) Then
				
				movedDocs = movedDocs + 1
				
				Call moveDoc.PutInFolder(archiveFolder, True)
				Call moveDoc.RemoveFromFolder("($Inbox)")
				
				Set moveDoc = Nothing
				
			End If 'Not (moveDoc Is Nothing)
			
		Wend 'Not (mailDoc Is Nothing)
		
	End If '(inbox.EntryCount > inboxLimit)
	
End Sub
Titel: Re: Inbox bereinigen
Beitrag von: Hirnbeisz am 19.08.08 - 19:23:18
Im Ausgangsscript hätte aus meiner Sicht auch ein
         
If Not (moveDoc Is Nothing) Then
    Set mailDoc = inbox.GetfirstDocument
else
   Set mailDoc = inbox.GetNextDocument(mailDoc)

gereicht!



Gruß Aloisius! ;)
Titel: Re: Inbox bereinigen
Beitrag von: koehlerbv am 19.08.08 - 20:28:04
Das ist richtig.

Probleme treten sonst allein schon bei ResponseDocs auf, da mit RemoveFromFolder diese automatisch mitgenommen werden. An sich ist das lieb und nett von Notes, aber mit solchen Konstrukten fällt man dann eben auf die Nase.

Bernhard

@"Hirnbeisz": Hast Du auch einen richtigen Namen? Das wird hier sehr gern gesehen.
Auf jeden Fall aber Danke einen Deinen helfenden Einstieg hier.
Titel: Re: Inbox bereinigen
Beitrag von: HarryB am 26.08.08 - 09:43:24
Probleme treten sonst allein schon bei ResponseDocs auf, da mit RemoveFromFolder diese automatisch mitgenommen werden. An sich ist das lieb und nett von Notes, aber mit solchen Konstrukten fällt man dann eben auf die Nase.
Ist das auch bei Ansichten/Ordnern so, in denen die Antworten nicht hierarchisch angezeigt werden?

Viele Grüße
Harry
Titel: Re: Inbox bereinigen
Beitrag von: koehlerbv am 27.08.08 - 23:17:29
Da dort ebenso mit der Responses-Property gearbeitet wird: Ja.

Bernhard