Domino 9 und frühere Versionen > Entwicklung
Bug bei NotesDocumentCollection
Reiner2005:
Hallo,
ich glaube, ich habe einen Fehler bei NotesDocumentCollection gefunden.
Ich habe eine Funktion geschrieben, welche mir eine NotesDocumentCollection zurückgibt. Wenn ich diese Funktion auf der aktuellen Datenbank (CurrenDatabase) laufen lasse, funktioniert alles prima. Wenn ich allerdings eine andere Datenbank (z.B. demo77) angebe so klappt zwar der Ablauf innerhalb der Funktion, aber ich bekomme 'nothing' zurück.
Das heist im untigen Bespiel gibt die Funktion ordnungsgemäß "result.count=77" in der Message-Box aus - liefert aber 'Nothing' als Rückgabewert. (Wie gesagt, auf der aktuellen Datenbank, bekomme kein Nothing).
Hat jemand schon mal mit diesem Bug zu tun gehabt und weiß vieleicht sogar eine Möglichkeit das Problem zu umgehen?
Gruß,
Reiner
Function getCollection() As NotesDocumentCollection
Dim result As notesDocumentCollection
Dim db As notesdatabase
Dim server As String
Dim file As String
Dim searchstring As String
Dim session As New notessession
server = "notes1/org"
file = "demo\demo77.nsf"
Set db = session.GetDatabase( server, file, False )
If db Is Nothing Then
Msgbox( "db is nothing" )
End If
searchstring = "form=""KUNDENDDATEN"""
Set result = db.search( searchstring, Nothing, 0 )
If result Is Nothing Then
Msgbox( "result is nothing " )
Else
Msgbox( "result.count=" & result.count )
End If
Set getCollection = result
End Function
koehlerbv:
Das ist wahrlich kein Bug. Wenn Du auf (Tochter-)Objekte in anderen Objekten zugreifst, musst Du auch zwischen den jeweils übergeordneten Objekten eine Beziehung herstellen.
Funktionieren würde also:
Function getCollection (dbTarget as NotesDatabase) As NotesDocumentCollection
dbTarget muss dann auch als Objekt im aufrufenden Modul bekannt sein. Gleiches gilt für views, documents etc., wenn diese über eine NotesDatabase in einem untergeordneten Modul instantiiert werden.
HTH,
Bernhard
Marinero Atlántico:
Bernhard. Das verstehe ich nicht.
db ist eine lokale Variable.
Es steht für einen Pointer auf die Datenbank auf den entfernten Server.
Diese lokale Variable wird korrekt instantiiert.
Von diesem Objekt wird ein db.Search() abgesetzt und zwar korrekt.
Ob diese Variable an die Methode per Parameter übergeben wird oder in der Methode instantiiert wird, ist aus meinem Verständnis völlig egal.
Ich hab sowieso das "extrem effiziente" dbsearch nie gemocht.
Axel
Semeaphoros:
Das ist tatsächlich noch nicht vollständig erklärt, auch wenn Bernhard den Grund angegeben hat ....
db ist lokale Variable der Subroutine, das ist richtig. Da es lokale Variable wird, wird sie beim Return aus der Subroutine dereferenziert und damit wird die DB auf dem Server automatisch geschlossen. Dabei werden aber auch alle von der DB abhängigen Objekte - in diesem Falle die DocCollection - dereferenziert. Das ist absolut korrekt.
Dass das bei der CurrentDB nicht passiert, unabhängig davon, ob sie lokal oder auf dem Server sitzt, ist auch klar, denn solange der Code läuft, ist die CurrentDB zwangsweise offen und wird nicht dereferenziert, selbst wenn die Variable im Code dereferenziert wird. Wird quasi vom System offen gehalten. Aehnliche Erscheinungen kann man haben, wenn man solchen Code im Debugger verfolgt und die fragliche DB dort geöffnet hat.
Marinero Atlántico:
8) jetzt hab ich was gelernt.
Hab das aber auch erst nicht richtig gelesen:
Und zwar den entscheidenden Satz:
--- Zitat ---Das heist im untigen Bespiel gibt die Funktion ordnungsgemäß "result.count=77" in der Message-Box aus - liefert aber 'Nothing' als Rückgabewert.
--- Ende Zitat ---
Ein möglicher Workaround - ohne es probiert zu haben - besteht vermutlich darin, dass man db in den Declarations als global deklariert. Wie Bernhard schon angedeutet hat.
--- Zitat ---Das heist im untigen Bespiel gibt die Funktion ordnungsgemäß "result.count=77" in der Message-Box aus - liefert aber 'Nothing' als Rückgabewert.
--- Ende Zitat ---
Sehr interessant. Mir noch nicht aufgefallen. Diese Objekte auf anderen Datenbanken sind ja remote connections, die wohl logischerweise geschlossen werden müssen, sobald das Objekt, dass diese hält, dereferenziert wird. Ausserdem dürfte die Anzahl dieser Remote Connections insgesamt begrenzt sein, so dass es gut ist, dass die nur für einen begrenzten Zeitraum gehalten werden.
Ähnliche Logik wie in EJB btw.
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln