Autor Thema: Methoden-Rückgabewert vom Typ NotesItem ist leer (ausserhalb der Klasse)  (Gelesen 3068 mal)

Offline Raymond

  • Aktives Mitglied
  • ***
  • Beiträge: 111
  • Geschlecht: Männlich
  • who notes?
    • Who Notes
Hallo Notes Community

Ich habe folgendes Problem. Eine Klasse besitzt die Methode "getfieldItemByObjectID" welche als NotesItem deklariert ist, also ein NotesItem als Rückgabewert zurückgeben soll.
Wenn ich im Debugger durchlaufe, dann sehe ich, dass das NotesItem gefunden und dem Rückgabewert der Function "getFieldItemByObjectID" zugewiesen wird.

Die Methode:
Code
Public Function getFieldItemByObjectID(strObjectID As String, strObjectName As String, strItemName As String) As NotesItem
	'-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	'returns item of an object by objectID
	'
	'arguments: 
	'-strObjectID: 		unique key of that object
	'-strObjectName: 	name of the object, i.e. "BusinessProcess", "SpecificRisk"
	'-strItemName: 		name of the item you want
	'-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
		
		Dim view As NotesView
		Dim doc As NotesDocument
		
		Set view = m_dbCurrent.GetView("lu" + Trim(strObjectName) + "ByID")
		Set doc = view.GetDocumentByKey(strObjectID, True)
		If Not(doc Is Nothing) Then
			Set getFieldItemByObjectID = doc.GetFirstItem(strItemName)
		End If	   
		
	End Function


Sobald der Debugger dann aus der Methode rausspringt und ich in der Sub bin (ausserhalb der Klasse), wo der Wert Rückgabewert der Methode meiner Variablen "itemBusinessCycleID" zugewiesen bzw. die Klasse wird gibt die Methode nichts mehr zurück, bzw. das NotesItem ist nicht instantiiert.
 
Das Codefragment, wo ich die Methode der Klasse ("GKeywords") aufrufe:
Code
'get related BusinessCycleID's	
	Set itemBusinessCycleID = GKeywords.getFieldItemByObjectID(docSpecificRisk.BusinessProcessID(0), "BusinessProcess", "BusinessCycleID")

Hat jemand von euch eine Idee, woran es liegen könnte? Die Methode is ja als "Public" deklariert und eine Function kann ja prinzipell ein NotesItem zurückgeben. Ich habe eine andere Methode in der gleichen Klasse, welche ein "NotesDocument" zurückgeben soll. Diese funktionieren einwandfrei.

Gruss und besten Dank für jede Unterstützung.

Ray
« Letzte Änderung: 19.04.06 - 12:57:02 von Raymond Weber »
aktuelle Versionen:
Lotus Notes/Domino 7
Lotus Notes/Domino 8.5

dabei seit Lotus Notes 4.x

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Das NotesDocument-Objekt, das das NotesItem enthält, wird innerhalb der Funktion deklariert und erzeugt. Sobald die Funktion zuende ist, wird es wieder zerstört und mit ihm alle Objekte, die davon abhängen. Also auch dein NotesItem, deswegen hast du es nicht mehr in der aufrufenden Funktion. Als Lösung könntest du zwei Funktionen machen, die du nacheinander aus deiner Hauptfunktion aufrufst. Eine, die das NotesDocument ermittelt und eine, die das Item des übergebenen NotesDocuments liefert.

*edit* ich sehe gerade, dass du eigentlich nur die Funktion brauchst, die dir das Dokument liefert. Ein Item anhand eines Namens zu ermitteln ist ja schon eine Funktionalität der NotesDocument-Klasse.
« Letzte Änderung: 19.04.06 - 11:50:43 von Thomas Völk »
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Raymond

  • Aktives Mitglied
  • ***
  • Beiträge: 111
  • Geschlecht: Männlich
  • who notes?
    • Who Notes
Das Problem ist gelöst! Ein NotesItem benötigt ein zugehöriges NotesDocument.
Da der Scope des Dokuments (doc) auf die Methode "getFieldItemByObjectID" limitiert war, war auch das NotesItem "ausserhalb" der Methode nicht mehr vorhanden. Die Lösung war, das NotesDocument zumindest als Private Membervariable der Klasse zu definieren.

Das heisst also, erstellt mein ein NotesItem neu und setzt das zugehörige NotesDocument auf "Nothing", dann ist auch das NotesItem "Nothing". Genau so verhält es sich, wie mit diesem Code getestet werden kann.

Code
Sub Initialize
	
	Dim session As NotesSession
	Dim db As notesDatabase
	Dim doc As NotesDocument
	Dim item As NotesItem
	
	Set session = New NotesSession
	Set db = session.CurrentDatabase
	Set doc = db.CreateDocument
	Set item = New NotesItem(doc, "Test", "TEST")
	Stop 
	Set doc = Nothing
	Print item.values(0) 'object variable not set because doc is not available anymore!	

End Sub

Gruss
Ray
aktuelle Versionen:
Lotus Notes/Domino 7
Lotus Notes/Domino 8.5

dabei seit Lotus Notes 4.x

Offline Raymond

  • Aktives Mitglied
  • ***
  • Beiträge: 111
  • Geschlecht: Männlich
  • who notes?
    • Who Notes
Danke Thomas,

genau das war das Problem.

Gruss
Ray
aktuelle Versionen:
Lotus Notes/Domino 7
Lotus Notes/Domino 8.5

dabei seit Lotus Notes 4.x

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Das gleiche gilt auch für andere Abhängigkeiten, z. B. NotesDatabase <-> NotesDocument
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Raymond

  • Aktives Mitglied
  • ***
  • Beiträge: 111
  • Geschlecht: Männlich
  • who notes?
    • Who Notes
Hallo Thomas

aber für die Abhängikeit DB -> NotesDocument kann ich ja folgendes tun. Ein NotesDocument in einer DB erstellen, dann setze ich db = Nothing, habe aber das Dokument immer noch. Wie im untenstehenden Code:

Code
Sub Initialize
	
	Dim session As NotesSession
	Dim db As notesDatabase
	Dim doc As NotesDocument
	Dim item As NotesItem
	
	Set session = New NotesSession
	Set db = session.CurrentDatabase
	Set doc = db.CreateDocument
	Set db = Nothing 'set db to nothing, but doc remains?
	If Not(doc Is Nothing) Then Print "doc is something"
End Sub


Mir scheint bei einem NotesItem eine stärkere Abhängigkeit zum NotesDocument zu bestehen. Ist ja eigentlich auch logisch, da ich beim Erstellen eines neuen Items ein gültiges NotesDocumetn angeben muss.

Wie auch immer, besten Dank nochmals.

Gruss
Ray
aktuelle Versionen:
Lotus Notes/Domino 7
Lotus Notes/Domino 8.5

dabei seit Lotus Notes 4.x

Glombi

  • Gast
Das NotesDocument "schleppt" seine Parent Database mit sich herum, daher macht das
set db = Nothing nichts aus.

Beim NotesItem gibt es nur ein "Parent", kein "ParentDocument", daher wird mit dem zerstören des NotesDocument das abhängige Item auch zerstört.

Andreas

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Ich hatte das anders in Erinnerung. Ich habe mich dann offensichtlich getäuscht. Ich kanns auch mangels Notes nicht mehr selber ausprobieren.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Ich habe den Thread gefunden, in dem das Problem mit NotesDatabase<->NotesDocument beschrieben wird: http://atnotes.de/index.php?topic=13288.0

Entscheidend dabei ist vielleicht, dass die Datenbank nicht die CurrentDatabase ist.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz