Hallo dnotes,
nein der Code funktioniert vom Design her schon mal nicht. Siehe hier:
Function UserDocInNames (searchkey As String,db) As NotesDocument
....
Set namesdb = session.GetDatabase(confdoc.ServerNames(0),confdoc.PathNames(0))
Set namesview = namesDb.GetView( "($Users)" )
Set UserDocInNames = namesview.GetDocumentByKey( searchkey, True )
End Function
Beim Verlassen der Funktion räumt die GC alle nicht mehr benötigten Variablen aus dem Speicher. (Diese sind in dem Fall namesDB und namesView)
Wenn dann kein anderer Codeteil eine Referenz auf die DB hält (Die interne parent-Referenz im Dokument zählt dabei nicht) und sie dadurch noch offen hält, dann kann aus dieser DB kein Dokument zurückgegeben werden.
Selbes Problem tritt auch mit anderen Notesklassen auf. Beispiel folgende Funktion:
Function getFirstAclEntry(db as NotesDatabase) as NotesACLEntry
Set acl = db.getACL()
set getFirstAclEntry = acl.getFirstEntry()
End function
Anwendungsbeispiel:
...
set entry = getFirstAclEntry(currentDB)
' entry ist hier NOTHING, da die ACL stirbt, weil niemand eine Referenz darauf hält
...
set acl = currentDB.getACL
set entry = getFirstAclEntry(currentDB)
' entry hat nun einen Inhalt, da unser Code eine Referenz auf "acl" hat.
...
set acl = Nothing
' acl UND entry ist nun Nothing, da es keine Referenz mehr auf die ACL gibt und somit
' auch alle Kindelemente.
Auch "one liner" wie currentDB.getAcl().getFirstEntry() sind von diesem Problem betroffen.
Dies erfordert leider oft einen etwas unorthodoxen Programmierstil
Wenn du das dann versuchst zu debuggen ist das Verhalten oft komplett anders (und es funktioniert ggf. sogar), da durch den Debugger Referenzen gehalten werden (z.B. im Variableneigenschaften Fenster)
Es kommt dabei auch oft darauf an, ob man z.B. ein Doc aufgeklappt hat oder nicht (hier ist ja die Parent-Referenz drin)
Sowas nennt man dann einen "Heisenbug"
Hoffe das einigermaßen verständlich erklärt zu haben
Gruß
Roland
(Keywords für Suche: Funktion Rückgabewert plötzlich unerklärlich Nothing, verliert Wert, funktioniert im Debbugger ohne nicht)