Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: outerspace am 13.02.07 - 14:10:07

Titel: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: outerspace am 13.02.07 - 14:10:07
Hallo zusammen,
hat jemand von Euch folgendes Phänomen schon einmal erlebt und wenn Ja wie lautet die Lösung:

Ich mache einen db.Search auf der Anwendung die Abfrage von coll.Count ergibt 1860 Treffer in der NotesDocumentCollection. Wenn ich per For...Next Schleife und coll.GetNthDocument die docs holen will habe ich 1860 mal Nothig in der doc Variable. 2. Versuch war eine While Schleife mit getFirst und GetNextDocument, die Schleife wird nict ausgeführt da GetFirstDocument ebenfalls Nothig retourniert.
Irgendwelche Ideen.

Dank und Gruss
Andreas
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: klaussal am 13.02.07 - 14:22:34
Nö.










Was sagt der Debugger ?
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: outerspace am 13.02.07 - 14:31:20
Das sind die Ergebnisse diverser Debuggerläufe:
die collection hat laut Count Property 1860 Treffer aber ich kriege keine Dokumente.
Wenn ich den search verändere sind es dementsprechend auch andere Count Werte.
Gruss
Andreas
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: Axel am 13.02.07 - 14:31:44
Den Fall hatte ich auch noch nicht.

Wie sieht denn der Code aus?

Was sagt denn der Debugger zum ersten eintrag in der Collection?

Axel
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: outerspace am 13.02.07 - 14:47:59
Das ist der vollständige Quellcode.
Per Dialogbox werden Suchkriterien abgefragt, der Search wird ausgeführt, count ist <> 0, ein Pfad und ein Name für ein xls-File wird abgefragt und erstellt, die Titelzeile wird eingetragen, ich kriege Nothing zurück und schaue auf ein bis auf die Titelzeile leeres Excel File.
 
Code
Sub Initialize
	Dim ws As New NotesUIWorkspace
	'Dim s As New NotesSession
	Dim db As NotesDatabase
	Dim dlgdoc As NotesDocument
	Dim searchstring As String
	Dim dt As New NotesDateTime("21.01.1971")
	Dim dc As NotesDocumentCollection
	Dim dtfrom As NotesDateTime
	Dim dtto As NotesDateTime
	Dim filename
	Dim xlsapp As Variant
	Dim xlsdoc As Variant
	Dim cr As String
	Dim i As Integer
	Dim doc As NotesDocument
	Dim ndoc As NotesDocument
	
	cr = |
|
	
	Set db = ws.CurrentDatabase.Database
	Set dlgdoc = db.CreateDocument
nochmal:
	If ws.DialogBox("DlgSearch", True, True, False, False, False, False, "Please define search dates", dlgdoc, False, False, False) Then
		If "" = dlgdoc.From(0) Then
			Messagebox |From Date must be defined.|, 0, "Mandatory Field"
			Goto nochmal
		End If
		If "" = dlgdoc.To(0) Then
			Messagebox |To Date must be defined.|, 0, "Mandatory Field"
			Goto nochmal
		End If
		Set dtfrom = New NotesDateTime(dlgdoc.From(0))
		Set dtto = New NotesDateTime(dlgdoc.To(0))
		If "" = dlgdoc.ProblemTheme(0) Or " " = dlgdoc.ProblemTheme(0) Then
			If "" = dlgdoc.ProblemStatus(0) Or " " = dlgdoc.ProblemStatus(0) Then
				searchstring = |Form = "HelpDeskAssign"|+_
				| & @TextToNumber(@Left(ProblemID; 8)) >= |+_
				Cstr(Year(dtfrom.LSLocalTime))+Right$("00" + Cstr(Month(dtfrom.LSLocalTime)), 2)+Right$("00" + Cstr(Day(dtfrom.LSLocalTime)), 2) +_
				| & @TextToNumber(@Left(ProblemID; 8)) <= | +_
				Cstr(Year(dtto.LSLocalTime))+Right$("00" + Cstr(Month(dtto.LSLocalTime)), 2)+Right$("00" + Cstr(Day(dtto.LSLocalTime)), 2)
			Else
				searchstring = |Form = "HelpDeskAssign"|+_
				| & @UpperCase(ProblemStatus) = "|+dlgdoc.ProblemStatus(0)+_
				|" & @TextToNumber(@Left(ProblemID; 8)) >= |+_
				Cstr(Year(dtfrom.LSLocalTime))+Right$("00" + Cstr(Month(dtfrom.LSLocalTime)), 2)+Right$("00" + Cstr(Day(dtfrom.LSLocalTime)), 2) +_
				| & @TextToNumber(@Left(ProblemID; 8)) <= | +_
				Cstr(Year(dtto.LSLocalTime))+Right$("00" + Cstr(Month(dtto.LSLocalTime)), 2)+Right$("00" + Cstr(Day(dtto.LSLocalTime)), 2)
			End If
		Else
			If "" = dlgdoc.ProblemStatus(0) Or " " = dlgdoc.ProblemStatus(0) Then
				searchstring = |Form = "HelpDeskAssign" & ProblemTheme = "|+dlgdoc.ProblemTheme(0)+_
				|" & @TextToNumber(@Left(ProblemID; 8)) >= |+_
				Cstr(Year(dtfrom.LSLocalTime))+Right$("00" + Cstr(Month(dtfrom.LSLocalTime)), 2)+Right$("00" + Cstr(Day(dtfrom.LSLocalTime)), 2) +_
				| & @TextToNumber(@Left(ProblemID; 8)) <= | +_
				Cstr(Year(dtto.LSLocalTime))+Right$("00" + Cstr(Month(dtto.LSLocalTime)), 2)+Right$("00" + Cstr(Day(dtto.LSLocalTime)), 2)
			Else
				searchstring = |Form = "HelpDeskAssign" & ProblemTheme = "|+dlgdoc.ProblemTheme(0)+_
				|" & @UpperCase(ProblemStatus) = "|+dlgdoc.ProblemStatus(0)+_
				|" & @TextToNumber(@Left(ProblemID; 8)) >= |+_
				Cstr(Year(dtfrom.LSLocalTime))+Right$("00" + Cstr(Month(dtfrom.LSLocalTime)), 2)+Right$("00" + Cstr(Day(dtfrom.LSLocalTime)), 2) +_
				| & @TextToNumber(@Left(ProblemID; 8)) <= | +_
				Cstr(Year(dtto.LSLocalTime))+Right$("00" + Cstr(Month(dtto.LSLocalTime)), 2)+Right$("00" + Cstr(Day(dtto.LSLocalTime)), 2)
			End If
		End If
		Set dc = db.Search(searchstring, dt, 0)
		If 0 <> dc.Count Then
			filename = ws.OpenFileDialog( False , "please select file" , "Microsoft Excel-files|*.xls" , "" , "" )
			If Not(Isempty(filename)) Then
				On Error Resume Next
				Set xlsapp = GetObject("", "Excel.Application")
				If xlsapp Is Nothing Then
					Set xlsapp = CreateObject("Excel.Application")
					On Error Goto iserror
					If Not xlsapp Is Nothing Then
						Set xlsdoc = xlsapp.Workbooks.Add
						xlsapp.Visible = False
						Call xlsdoc.Activate
					End If
				Else
					On Error Goto iserror
					Set xlsdoc = xlsapp.Workbooks.Add
					xlsapp.Visible = False
					Call xlsdoc.Activate
				End If
				If Not xlsdoc Is Nothing Then
					xlsapp.Sheets(1).Select
					xlsapp.Range("A1").Select
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column) = "Link"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 1) = "Year"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 2) = "Month"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 3) = "Day"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 4) = "ID"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 5) = "Contributor"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 6) = "Contributor Cost Center"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 7) = "Theme"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 8) = "Application"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 9) = "Responsible"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 10) = "LBR"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 11) = "Subject"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 12) = "Location"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 13) = "Status"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 14) = "Effort spent for Analysis"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 15) = "Effort spent for Realization"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 16) = "Effort spent for Test"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 17) = "Total spent"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 18) = "Total costs"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 19) = "Charge CC"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 20) = "Category"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 21) = "Error Type"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 22) = "Error Origin Group"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 23) = "Error Origin Dept"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 24) = "Requester Group"
					xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 25) = "Requester Dept"
					If dc.Count <> 0 Then
						Set doc = dc.GetFirstDocument
						While Not doc Is Nothing
							Set ndoc = dc.GetNextDocument(doc)
							xlsapp.Range("A"+Cstr(i+1)).Select
							Call xlsdoc.Worksheets(1).Hyperlinks.Add(xlsapp.Range("A"+Cstr(i+1)), _
							"http://svmosel.lux.swissbank.com/LUX/luxsmart.nsf/HelpDeskAssign/"+Cstr(doc.UniversalID)+"?OpenDocument", _
							, , _
							doc.ProblemID(0))
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 1) = Left$(doc.ProblemID(0), 4)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 2) = Right$(Left$(doc.ProblemID(0), 6), 2)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 3) = Right$(Left$(doc.ProblemID(0), 8), 2)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 4) = doc.ProblemID(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 5) = doc.ProblemContributorName(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 6) = doc.ProblemContributorCostCenter(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 7) = doc.ProblemTheme(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 8) = doc.ProblemThemeCategory(0)
							If "CLO" = Ucase$(doc.ProblemStatus(0)) Then
								xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 9) = doc.ProblemLastResponsible(0)
							Else	
								xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 9) = doc.ProblemResponsible(0)
							End If
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 10) = doc.ProblemLBR(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 11) = doc.ProblemSubject(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 12) = Join(doc.LocSel, ", ")
							If "ASS" = Ucase$(doc.ProblemStatus(0)) Then
								xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 13) = "Assigned"
							Else	
								If "ACC" = Ucase$(doc.ProblemStatus(0)) Then
									xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 13) = "Accepted"
								Else	
									If "CLO" = Ucase$(doc.ProblemStatus(0)) Then
										xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 13) = "Closed"
									Else	
										xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 13) = doc.ProblemStatus(0)
									End If
								End If
							End If
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 14) = Cstr(doc.AnalyseEffortDone(0))
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 15) = Cstr(doc.ProblemEffortDone(0))
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 16) = Cstr(doc.TestEffortDone(0))
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 17) = Cstr(doc.TotalEffortSpent(0))
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 18) = Cstr(doc.ProblemCosts(0))
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 19) = doc.ProblemChargeNumber(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 20) = doc.ClaimCat(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 21) = doc.FehlerArt(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 22) = doc.ErrorOriginGroup(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 23) = doc.ErrorOriginDept(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 24) = doc.RequesterList(0)
							xlsdoc.Worksheets(1).cells(xlsapp.activecell.row, xlsapp.activecell.column + 25) = doc.RequesterDept(0)
							Set doc = ndoc
						Wend
					End If
					Call xlsdoc.SaveAs(filename(0))
					xlsapp.Visible = True
				End If
			End If
		End If
	End If
	Exit Sub
iserror:
	Messagebox "Error" & Str(Err) & ": " & Error$ & cr & "Please contact Administrator.", 48, "Error"
	Resume Next
End Sub
Gruss
Andreas
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: Axel am 13.02.07 - 15:00:29
Auf den ersten Blick sieht das eiogentlich ganz ok aus.

Beim zweiten Blick sind mit zwei Sachen aufgefallen.


1.  Mir fehlen hier zwei Klammern.

Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
      Set ndoc = dc.GetNextDocument(doc)
      ...   
      Set doc = ndoc
Wend


2.  Warum der Stund mit dem ndoc? Ist eigentlich überflüssig

Set doc = dc.GetFirstDocument
While Not doc Is Nothing
      Set ndoc = dc.GetNextDocument(doc)
      ...   
      Set doc = ndoc
Wend


Was sagt denn der Debugger zum ersten Dokument in der Collection?


Axel
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: outerspace am 13.02.07 - 15:18:08
Hallo
zu 1. mit Klammern tut es auch nicht.
zu 2. ist eine alte Gewohnheit von mir wenn ich per while schleife docs aus einer ansicht hole und innerhalb der schleife felder verändere die bewirken, dass das current doc nicht mehr in der Ansicht angezeigt wird. Dann würde set doc = view.GetNextDocument(doc) nichts zurückliefern weil doc nicht mehr in Ansicht. Bei einer collection kann man das natürlich weglassen, da hast Du recht.
Der Debugger sagt zum ersten Dokument garnichts, die Variable sieht aus wie frisch deklariert.

Gruss
Andreas
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: Axel am 13.02.07 - 15:24:25
Der Debugger sagt zum ersten Dokument garnichts, die Variable sieht aus wie frisch deklariert.

Das meinte ich nicht unbedingt. Schau die mal im Debugger den Inhalt der Collection an. Wie sieht da denn der erste Eintrag aus?


Hast du auch mal den Notes-Client nuegestartet, die Cache.ndk gelöscht, neue Kopie der Datenbank erstellt?


Axel
 
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: Otto am 13.02.07 - 16:53:24
@outerspace:

interessant wäre doch was der debugger zu 'ndoc' sagt, alse nach
'set ndoc = doc' am Schleifenanfang.
Ich tippe mal drauf, dass er da gar nicht reinspringt weil bereits 'doc = nothiong' zutrifft?
Wenn ja, schau mal in den DB-Eigenschaften, ob da 'Wiederherstellbare Löschungen gesetzt sind'

Gruss
Otto
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: outerspace am 14.02.07 - 10:35:33
Hallo zusammen,
Nach viel probieren, cache löschen und kopieren habe ich es gefunden.
DB-Eigenschaften war schon der richtige Weg, nur nicht die "Wiederherstellbaren Löschungen" waren es nicht, sondern der Datenbank Typ, der war nämlich nicht mehr "Standard" sondern "Multi DB Search".
Nach Umstellung auf "Standard" in meiner lokalen Kopie hat es sofort wieder funktioniert.
Bleibt nur noch die Kleinigkeit es auf der Server DB zu ändern, was im Moment nicht funktioniert, ich nehme an ich muss einen Augenblick abpassen wenn kein User auf der DB arbeitet.
Hat irgendjemand weitergehende Informationen über die Datenbank Typen und deren Auswirkungen oder weiss wo man nachlesen kann. Die Hilfe war ziemlich spärlich.

@Axel
Auch auf die Gefahr hin dämlich zu wirken, wie kann man sich im Debugger den Inhalt der Collection ansehen?

Gruss
Andreas
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: Axel am 14.02.07 - 10:56:14
@Axel
Auch auf die Gefahr hin dämlich zu wirken, wie kann man sich im Debugger den Inhalt der Collection ansehen?

Das wirkt nicht dämlich. Den Inhalt einer Collection siehst du im Debugger nicht, nur die Anzahl. Ich hab's mit den Listen und Arrays verwechselt. Sorry.

Axel
 
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: outerspace am 14.02.07 - 11:06:26
Puh,
grosse Erleichterung.........
Wenn es so eine schicke Möglichkeit gegeben hätte, die ich die ganzen Jahre übersehen hätte, wäre das für mich sehr ärgerlich gewesen.

Danke und Gruss
Andreas
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: xyungel am 14.02.07 - 11:30:15
mach doch mal nen errorhandler rein und gib dir die Zeile des Fehlers und den Fehler selbst aus
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: xyungel am 14.02.07 - 11:31:21
achso hatte sich schon erledigt...
Titel: Re: coll.GetFirstDocument gibt Nothing zurück trotz coll.Count = 1860
Beitrag von: LN4ever am 14.02.07 - 22:26:45
Wie sieht es denn mit Softdeletions aus ?

Schau dir jedes Dokument in der While-Schleife mit

If doc.IsValid Then
...
End If

an.

Gruß

Norbert