Autor Thema: Function gibt Doc nicht zurück  (Gelesen 2836 mal)

Offline Alexander 28

  • Aktives Mitglied
  • ***
  • Beiträge: 190
  • Geschlecht: Männlich
  • Meistens gibt es eine Lösung!
Function gibt Doc nicht zurück
« am: 18.04.14 - 14:15:27 »
Hallo zusammen! Ich habe ein sehr seltsames Problem. Ich möchte über eine kleine Funktion das Personen Dokument aus dem öffentlichen Adressbuch abfragen. Ich rufe diese Funktion aus einer anderen Routine der gleichen Skriptbibliothek auf. Innerhalb der Funktion wird das Personendokument auch ordnungsgemäß gefunden und in 'UserDocInNames' gesetzt, allerdings wird es nicht an die Function übergeben, aus der heraus ich diese Funktion aufrufe; tdoc bleibt Nothing.

Irgendwo habe ich wahrscheinlich einen Denkfehler. Nachstehend des Skriptcode der gesamten Bibliothek.

Code
Option Public
Option Declare

Dim tdoc As NotesDocument  
Sub Initialize
	
End Sub

Sub Terminate
	
End Sub

Function test
	Dim session As New NotesSession
	Dim workspace As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument 
	Dim db As NotesDatabase 
	Dim doc As NotesDocument

	Set uidoc = workspace.CurrentDocument
	Set db = session.CurrentDatabase
	Set doc = uidoc.Document
	 
	
	Set tdoc = UserDocInNames("CN=Max Meier/O=STOKAS", Db)
	
End Function
Function UserDocInNames (searchkey As String,db) As NotesDocument
	Dim session As NotesSession
	Set session = db.Parent
	Dim namesview As NotesView
	Dim namesdb As NotesDatabase
	Dim confdoc As NotesDocument
	
	Set confdoc = db.GetProfileDocument("Konfiguration")
	Set namesdb = session.GetDatabase(confdoc.ServerNames(0),confdoc.PathNames(0))

	If ((namesdb.IsOpen) = False) Then
		MessageBox "Das öNab konnte nicht geöffnet werden. Kontrollieren Sie die Pfad- und Serverangaben in der Konfiguration im Abschnitt 'Schnittstellen' Einstellungen.", 16, "Hinweis"
	End If
	
	Set namesview = namesDb.GetView( "($Users)" ) 
	Set UserDocInNames = namesview.GetDocumentByKey( searchkey, True )
End Function

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Function gibt Doc nicht zurück
« Antwort #1 am: 18.04.14 - 16:45:04 »
Hallo Alexander, das liegt daran, dass die Datenbank beim Verlassen der Funktion von der Garbage Collection geschlossen wird und somit auch alle Dokumente, die daraus entstammen.

Gruß Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Alexander 28

  • Aktives Mitglied
  • ***
  • Beiträge: 190
  • Geschlecht: Männlich
  • Meistens gibt es eine Lösung!
Re: Function gibt Doc nicht zurück
« Antwort #2 am: 18.04.14 - 16:50:53 »
Hallo Roland. Vielen Dank für deine schnelle Antwort. Das ist ja total doof, ich war der Meinung, dass ich das irgendwo schon mal benutzt habe und da hat es funktioniert. Wahrscheinlich irre ich mich.

Ich habe es nun anders gelöst, indem ich die gewünschten Felder aus dem Personendokument direkt auslese. Diese Werte werden mir dann nämlich zurückgegeben. Ist zwar vom Quellcode her etwas länger, da ich das Doc für jedes Feld einmal abfragen muss, aber besser als gar nichts. Sind in meinem Fall auch nur zwei Felder!

Vielen Dank nochmal und schöne Ostern!

Offline dnotes

  • Aktives Mitglied
  • ***
  • Beiträge: 106
  • Geschlecht: Männlich
Re: Function gibt Doc nicht zurück
« Antwort #3 am: 19.04.14 - 11:05:23 »
Wenn es bei Dir nicht funktioniert, dann vielleicht weil irgendwelche Werte falsch gesetzt sind oder nicht vorhanden. Benutz mal den Debugger. Denn generell wird das Dokument an Deine test-Funktion schon zurück gegeben. Das Dok wird jedenfalls nicht verworfen; ist bei Dir ja der Rückgabewert der Funktion.

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Function gibt Doc nicht zurück
« Antwort #4 am: 19.04.14 - 13:05:23 »
Hallo dnotes,

nein der Code funktioniert vom Design her schon mal nicht. Siehe hier:
Code
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:
Code
Function getFirstAclEntry(db as NotesDatabase) as NotesACLEntry
    Set acl = db.getACL()
    set getFirstAclEntry = acl.getFirstEntry()
End function

Anwendungsbeispiel:
Code
...
   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)
« Letzte Änderung: 19.04.14 - 13:08:24 von pram »
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline dnotes

  • Aktives Mitglied
  • ***
  • Beiträge: 106
  • Geschlecht: Männlich
Re: Function gibt Doc nicht zurück
« Antwort #5 am: 20.04.14 - 12:06:48 »
Stimmt.
Ich hatte verpennt, daß die Zeile
- Dim namesdb As NotesDatabase -
nicht global gesetzt war.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz