Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: m3 am 17.11.09 - 11:58:19

Titel: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: m3 am 17.11.09 - 11:58:19
Liebe Kolleginnen und Kollegen,

kann mir bitte jemand erklären, warum die von der Funktion zurückgelieferte NOtesDocument Collection immer leer ist?
Ich steh derzeit auf der Leitung.  ???


Code
Option Public
Option Declare



Sub Initialize()
	Dim dc As NotesDocumentCollection
	Set dc = getCol()
	If( dc Is Nothing) Then
		MsgBox "NotesDocumentCollection ist NOTHING"
	Else
		MsgBox CStr(dc.Count) & " Einträge gefunden"
	End If
	
End Sub


Private Function getCol () As NotesDocumentCollection
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim view As NotesView
	Dim dc2 As NotesDocumentCollection
	
	Set db = New NotesDatabase("", "names.nsf")
	If( Not db.IsOpen ) Then
		Call db.Open("","")
	End If
	Set view = db.GetView("($People)")
	Set dc2 = view.Getalldocumentsbykey("", False)
	Print "Found in Function getCol: " & CStr( dc2.Count ) & "<"
	Set getCol  = dc2
End Function
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: koehlerbv am 17.11.09 - 12:03:18
Deine NotesDocumentCollection basiert ja auf NotesDatabase - die ist aber private in Deiner Funktion. Du musst also die NotesDatabase für Deine NotesDocumentCollection bereits der Function übergeben.

Bernhard
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: Thomas Schulte am 17.11.09 - 12:12:13
Ja weil sonst schlägt der Garbage Collector von Lotus Script zu.
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: ascabg am 17.11.09 - 12:30:41
Hallo,

Und wenn er die Collection, die zurueckgegeben werden soll nicht als Rueckgabewert liefert, sondern die zu fuellende Collection als Parameter an die entsprechende Funktion/Prozedur uebergibt.

Parameter werden doch, wenn nichts anderes angegeben wird mittels "ByRef" uebergeben.

Code
Sub Main
  Dim col As NotesDocumentCollection

  Call GetDocuments(col)
End Sub

Sub GetDocuments(colGet As NotesDocumentCollection)
  Dim ses As New NotesSession
  Dim db As NotesDatabase
  Dim vw As NotesView
	
  Set db = ses.CurrentDatabase
  If db.IsOpen Then
    Set vw = db.GetView("Name")
    If Not vw Is Nothing Then
      Set colGet = vw.GetAllDocumentsByKey("Key", True)
    End If
  End If
End Sub

In dem Fall sollte bei Main die Collection nach erfolgreichem Aufruf der Prozedur GetDocuments doch noch vorhanden sein.


Andreas
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: koehlerbv am 17.11.09 - 12:34:24
Da ist aber auch die Garbage Collection davor, Andreas. Das Objekt NotesDatabase muss bereits in der aufrufenden Routine definiert werden.

Bernhard
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: ascabg am 17.11.09 - 12:44:41
@Bernhard

Also der oben abgebildete Code funktioniert bei mir auf einem 7er-Client immer noch ohne Probleme.
Mit einem 8er-Client kann ich es aktuell nicht testen, da ich keinen im Zugriff habe.

In der aufrufenden Prozedur habe ich immer noch (mein Beispielcode) col.Count = 6 stehen und kann die Collection auch mit einer For ... Next Schleife durchlaufen und die Dokumente verwenden.

Daher auch meine Frage, ob man es nicht doch so machen kann.


Andreas
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: pram am 17.11.09 - 12:53:44
obiger Code funktioniert deswegen, weil du auf  "set db = ses.CurrentDatabase" zugreifst und die aktuelle Datenbank von der GBC nicht entfernt wird.
Wenn du eine andere DB mit "set db = new NotesDatabase(server,file)" öffnest, so wird diese am Ende deiner Methode durch die GBC entfernt/geschlossen und alle Objekte (Dokumente/Views/...) welche aus dieser DB abgeleitet wurden, "sterben" mit

Gruß
Roland
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: ascabg am 17.11.09 - 12:56:33
Ok. Stimmt.


Andreas
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: m3 am 17.11.09 - 13:17:17
Deine NotesDocumentCollection basiert ja auf NotesDatabase - die ist aber private in Deiner Funktion. Du musst also die NotesDatabase für Deine NotesDocumentCollection bereits der Function übergeben.
Grandios. Danke Bernhard.
Titel: Re: NotesDocumentCollection as Rückgabewert nicht möglich?
Beitrag von: koehlerbv am 17.11.09 - 13:20:56
Immer gerne. Du kannst mir ja am Sonnabend-, Sonntag- oder Montagabend in Wien ein Krügerl ausgeben  ;)

Bernhard