Autor Thema: NotesDocument wird sporadisch nicht gefüllt  (Gelesen 3160 mal)

Offline two7

  • Aktives Mitglied
  • ***
  • Beiträge: 116
NotesDocument wird sporadisch nicht gefüllt
« am: 05.09.07 - 23:36:24 »
Hallo,

ich habe ein Agenten geschrieben (der Code ist eventuell nicht optimal, versuch mich allerdings auch mit LS erst), der aus einem Mitarbeiterverzeichnis (eigene Entwicklung) aus gestartet wird. Das Dokument des Mitarbeiters wird geöffnet und anschließend der Agent gestartet.

Funktionsweise:
- Öffnen der Maildatenbank (momentan nur testdaten, später wird die datenbank anhand des notesnamen des userers aus dem mitarbeiterverzeichnis geladen)
- laden der ansicht ($All)
- öffnen der einzelnen dokumente (jedoch nur jene, die als memo gekennzeichnet sind und einen anhang besitzen)
- abrufen der anhänge (daten)
- ablegen der informationen in einer seperaten datenbank.

Mein Problem nun ist, dass der agent irgenwann abbricht mit der Meldung, dass die userdoc nicht gefüllt ist. Für mich ist das allerdings nicht verständlich, da ich ja mittels einem is Nothing abfrage ob die userdoc gefüllt ist oder nicht?

Habe auch versucht anhand der Dokumente, die geöffnet werden das Verhalten zu analysieren. Aber da ist nichts ungewöhnlich.


Eine Anmerkung hätte ich noch:
Wie zu sehen ist, sind weiter unten 3 Arrays fest dimensioniert. Die würde ich gerne über dynamische Arrays laufen lassen, hab es aber bis dato nicht hinbekommen. Vielleicht könnt ihr mir da den einen oder anderen Tipp geben.

Thx.

Code

	
	' Allgemein
	Dim session As New NotesSession
	Dim notesUsername As New NotesName(session.UserName)
	
	' Mitarbeiterverzeichnis ++++++++++++++++++++++++++++++++++++++++++++++
	Dim mvrzdb As NotesDatabase	
	Dim mvrzws As New NotesUIWorkspace
	Dim mvrzuidoc As NotesUIDocument	
	Dim mvrzdoc As NotesDocument
	Dim mvrzview As notesview
	
	Set mvrzdb 		= session.CurrentDatabase
	Set mvrzview	= mvrzdb.GetView("Mitarbeiter nach Name")
	Set mvrzuidoc 	= mvrzws.CurrentDocument
	Set mvrzdoc	= mvrzuidoc.Document 
	
	' Mitarbeiterdatenbank ++++++++++++++++++++++++++++++++++++++++++++++
	Dim userws As New NotesUIWorkspace
	Dim useruidoc As NotesUIDocument
	Dim userview As NotesView	
	Dim userdoc As NotesDocument	
	Dim userdb As NotesDatabase	
	Dim userdbName As String
	
	userdbName 	= "mail\testmaildb.nsf"	
	Set userdb		= session.GetDatabase( "", userdbName )
	Set userview	= userdb.GetView("($All)")
	Set userdoc 	= userview.GetFirstDocument
	
	Dim rtitem As Variant
	Dim sizeInBytes As Long
	Dim sizeInMB As Long
	Dim count As Integer
	Dim sizeAll As Double	
	Dim aMailobjectTyp(10) As String
	Dim aMailobjectName(10) As String
	Dim aMailobjectSize(10) As String
	
	' Neues LogDokument ++++++++++++++++++++++++++++++++++++++++++++++++	
	Dim newdb As  NotesDatabase	
	Dim newws As New NotesUIWorkspace
	Dim newuidoc As NotesUIDocument
	Dim newdoc As NotesDocument
	
	Set newdb 	= session.GetDatabase( "", "log_maildb.nsf")	
	
	While Not (userdoc Is Nothing)
		If (userdoc.form(0) = "Memo") Then	
			count 	= 0 
			sizeAll 	= 0
			I 			= 0		
			Set rtitem = userdoc.GetFirstItem( "Body" )
			If ( rtitem.Type = RICHTEXT ) Then
				If Not (Isempty(rtitem.EmbeddedObjects)) Then
					Forall mailobject In rtitem.EmbeddedObjects
						
						i = i+1			
						count 			= count + 1
						sizeInBytes		= mailobject.FileSize
						sizeInMB		= sizeInBytes / ( 1024 )
						sizeAll 			= sizeInBytes + sizeAll		
						
						aMailobjectTyp(i)		= (Right(mailobject.Source,3))
						aMailobjectName(i) 	= mailobject.Name
						aMailobjectSize(i) 		= sizeInBytes		
					End Forall	
				End If
			End If
		End If
		
		Set userdoc	= userview.GetNextDocument(userdoc)	
		
		If (count > "0") Then 		
			Set newdoc	= newdb.CreateDocument
			
			newdoc.nachname 						= mvrzdoc.nachname(0)
			newdoc.vorname 							= mvrzdoc.vorname(0)
			newdoc.mailbetreff 						= userdoc.Subject(0)
			newdoc.anhaengeAnzahl 				= count
			newdoc.anhaengeGroesseGesamt 	= sizeAll
			newdoc.anhangTyp						= aMailobjectTyp
			newdoc.anhangName					= aMailobjectName
			newdoc.anhangGroesse					= aMailobjectSize
			
			Call newdoc.Save(True,True)
		End If	
	Wend
	
End Sub

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #1 am: 05.09.07 - 23:49:11 »
Hallo 27,

mit hoher Wahrscheinlichkeit hat die Ansicht in der Mail-Db einen "Schuss" und verzeichnet ein Dokument, welches in Wirklichkeit ein deletion stub, also eine gelöschte Note, darstellt. Mir ist sowas bisher nur in Mail-Dbs begegnet und dort immer im Zusammenhang mit Appointment-Dokumenten. Und nur in R5 - aber das würde hier ja gerade passen.

Der Programmierer kann schlechterdings Code schreiben und darauf vertrauen, dass eine Ansicht nicht korrupt ist. Er muss von vornherein auf sowas vorbereitet sein.

In Deinem Fall und wenn meine These Dein Problem trifft, dann solltest Du ein Dokument nicht nur auf "Isnothing" abfragen, sondern den "Härtetest" machen, ob Du es mit einem echten Dokument oder einem "Zombie" zu tun hast:
Ein gelöschtes Dokument enthält keine Items mehr, NotesDocument.Items gibt also EMPTY zurück.
Also: Erst prüfen, ob NotesDocument NOTHING ist, dann das Dokument auf enthaltene Items checken.

HTH,
Bernhard

klaussal

  • Gast
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #2 am: 06.09.07 - 12:10:46 »
Zitat
Wie zu sehen ist, sind weiter unten 3 Arrays fest dimensioniert. Die würde ich gerne über dynamische Arrays laufen lassen, hab es aber bis dato nicht hinbekommen. Vielleicht könnt ihr mir da den einen oder anderen Tipp geben.

Du möchtest unter den Stichworten "Redim" , "Preserve", usw in der Designer-Hilfe lesen.

Offline two7

  • Aktives Mitglied
  • ***
  • Beiträge: 116
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #3 am: 06.09.07 - 13:47:34 »
mit hoher Wahrscheinlichkeit hat die Ansicht in der Mail-Db einen "Schuss" und verzeichnet ein Dokument, welches in Wirklichkeit ein deletion stub, also eine gelöschte Note, darstellt.

nun habe ich mal die mails in eine neu erstellte maildatenbank kopiert, aber daran lag es wohl nicht.

Zitat
Also: Erst prüfen, ob NotesDocument NOTHING ist, dann das Dokument auf enthaltene Items checken.

ich hab mal nun noch die abfrage
Code
 If (Not(Isempty(userdoc.items)))  .... 
miteingebaut, aber gebracht hat es leider nicht. Wenn ich den Debugger mitlaufen lasse, so läuft er über die Abfrage und bricht dann wieder ab, da userdoc nicht gefüllt ist. :-(
« Letzte Änderung: 06.09.07 - 13:51:57 von two7 »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #4 am: 06.09.07 - 13:50:28 »
Wenn "userdoc" nicht "gefüllt" ist, dann wäre es EMPTY.

Was ergibt eine Abfrage auf IsValid?

Bernhard

Offline two7

  • Aktives Mitglied
  • ***
  • Beiträge: 116
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #5 am: 06.09.07 - 13:54:32 »
Auch nichts. Gleiches Problem.

Aber eines ist mir aufgefallen Das Verhalten des Abbruchs ähnelt einem EOF. Die Abfrage bricht immer bei der letzten Mail der Ansicht ab!!

Könnte das Problem daran liegen, dass ich mit einer While-Schleife drüber gehen?
« Letzte Änderung: 06.09.07 - 13:56:40 von two7 »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #6 am: 06.09.07 - 13:58:00 »
Lt. Code muss es auch knallen:

Erst
Set userdoc   = userview.GetNextDocument(userdoc)   
Wenn das das letzte Dokumente der Ansicht war ...
Und dann kommt ja noch
newdoc.mailbetreff = userdoc.Subject(0)

Bernhard

Offline two7

  • Aktives Mitglied
  • ***
  • Beiträge: 116
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #7 am: 06.09.07 - 14:02:30 »
Hört sich logisch an, aber ist mir nicht ganz verständlich. Dann müsste doch noch das letzte Dokument angelegt werden und wenn dann der Agent auf GetNextDocument springen möchte, ist dieses nicht vorhanden und der Fehler dürfte nicht auftauchen, oder habe ich hier die falsche Denkweise.

Wie müsste ich dann den Code ändern? Steh grad ein bisschen - um ehrlich zu sein - auf der Leitung.

two7

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #8 am: 06.09.07 - 14:06:55 »
So, wie der Code aufgebaut ist, müsste das
Set userdoc = userview.GetNextDocument(userdoc)
genau vor dem
Wend
stehen.

Bernhard

Offline two7

  • Aktives Mitglied
  • ***
  • Beiträge: 116
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #9 am: 06.09.07 - 14:12:08 »
SUPER!!! Vielen Dank.
Habs jetzt verstanden. Klar ich spring auf das nächste Dokument, das nicht mehr existiert und erstell anschließend das neue Dokument mit Daten die nicht existieren.

Und wieder was dazu gelernt.

Muss euch hier echt mal loben. Selten ein so guten Forum gefunden, bei dem einem auch in solch einem Tempo geholfen wird.

two7

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDocument wird sporadisch nicht gefüllt
« Antwort #10 am: 06.09.07 - 14:16:39 »
Und so macht das Helfen auch richtig Spass  :)

Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz