Autor Thema: Object variable not set bei DetDocumentByKey  (Gelesen 6484 mal)

Offline cococo69

  • @Notes Preisträger
  • Senior Mitglied
  • ****
  • Beiträge: 286
  • Geschlecht: Männlich
  • Super dieses Forum!!!
    • Mein Hobby...
Object variable not set bei DetDocumentByKey
« am: 20.01.14 - 11:58:40 »
Hallo zusammen,

ich habe ein für mich nicht nachvollziehbares Problem mit der Funktion GetDocumentByKey...

- Ansicht wird gefunden
- Spalte ist  sortiert
- Es gibt eine Ansicht "Vorgabe beim ersten Öffnen..."

Alle Infos in der angehängten PDF.

Viele Grüße
Armin

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Object variable not set bei DetDocumentByKey
« Antwort #1 am: 20.01.14 - 12:05:28 »
Hallo,

Und wo genau kommt jetzt die Fehlermeldung?


Andreas

Offline udo187

  • Junior Mitglied
  • **
  • Beiträge: 98
Re: Object variable not set bei DetDocumentByKey
« Antwort #2 am: 20.01.14 - 12:15:07 »
Hallo !

Wo wird das docThis gesetzt ?

Gruss
Udo

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Object variable not set bei DetDocumentByKey
« Antwort #3 am: 20.01.14 - 12:22:11 »
Probier mal @Text (@NotesID) in der Ansicht

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Object variable not set bei DetDocumentByKey
« Antwort #4 am: 20.01.14 - 12:51:02 »
Hab mir das ganze nochmal genauer angesehen:

Was willst Du eigentlich erreichen? Du hast ein Dokument (docThis), von diesem Dokument holst Du Dir über Evaluate @Text (@NoteID), also die NoteID des Dokuments.

Dann gehst Du in eine nach @NoteID sortierte Ansicht und holst Dir das Dokument (docAnsicht) mit der soeben ermittelten NoteID.

Unter welchen Bedingungen sollten diese beiden Dokumente nicht gleich sein? Also wozu holst Du dasselbe Dokument noch einmal über die Ansicht? Einziger Sinn könnte darin bestehen, dass Du prüfen willst, ob das Dokument schon gespeichert wurde, aber wenn es nicht gespeichert wurde, ist es nicht in der Ansicht. Dann ist es korrekt, dass "Object variable not set" ausgegeben wird. Da müsstest Du auf "Is Nothing" prüfen.

EDIT: Falls das das Ziel ist, ließe sich das natürlich viel einfacher machen, indem z.B. beim Speichern ein Feld gesetzt wird, das Du überprüfen kannst.
« Letzte Änderung: 20.01.14 - 12:52:36 von Peter Klett »

Offline cococo69

  • @Notes Preisträger
  • Senior Mitglied
  • ****
  • Beiträge: 286
  • Geschlecht: Männlich
  • Super dieses Forum!!!
    • Mein Hobby...
Re: Object variable not set bei DetDocumentByKey
« Antwort #5 am: 20.01.14 - 14:12:17 »
Hallo zusammen,

danke für die Antworten!

@Andreas
Die Fehlermeldung kommt in der Zeile, welche in der Debugger-Hardcopy markiert ist (If docThis....) da docAnsicht nicht existiert.

@Udo
Das docThis wird an die Funktion übergeben, sorry sieht man in der Hardcopy nicht

@Peter
@Text... habe ich schon probiert
Was ich mit der Funktion erreichen will: Das Dokument soll erneut zugeordnet werden um zu prüfen, ob es zwischenzeitlich von einem anderen Benutzer gespeichert worden ist...

Was es noch zu erwähnen gibt:
Genau die gleiche Funktionalität habe ich in mehreren anderen Anwendungen erfolgreichg im Einsatz. Alles nur kopiert , nur hier klappt dieser GetDocumentByKey nicht.......!!!????

Gruß Armin

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Object variable not set bei DetDocumentByKey
« Antwort #6 am: 20.01.14 - 14:39:34 »
Ok, Anliegen verstanden ...

Schaust Du in die Ansicht auf dem gleichen Server, auf dem auch das Dokument geöffnet wurde? M.W. ist die NoteID im Gegensatz zur UniversalID von Replik zu Replik unterschiedlich.

Ansonsten würde ich die Ansicht einmal komplett löschen und völlig neu erstellen, vielleicht hat die einen Schlag weg.

Offline cococo69

  • @Notes Preisträger
  • Senior Mitglied
  • ****
  • Beiträge: 286
  • Geschlecht: Männlich
  • Super dieses Forum!!!
    • Mein Hobby...
Re: Object variable not set bei DetDocumentByKey
« Antwort #7 am: 20.01.14 - 14:42:03 »
Hallo Peter,

ja, ich schaue auf dem gleichen Server.
Habe die Ansicht auch schon gelöscht und neu angelegt...
... Erfolg = 0

Andere Ideen?

Gruß Armin

Driri

  • Gast
Re: Object variable not set bei DetDocumentByKey
« Antwort #8 am: 20.01.14 - 15:16:55 »
Ich habe leider keine Idee dazu, sondern lediglich eine Anmerkung/Frage/Verbesserungsvorschlag :

Warum holst Du die NoteID mit Evaluate ? Wenn Du das Dokument hast, kannst Du doch auch direkt mit docThis.NoteID darauf zugreifen.

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Re: Object variable not set bei DetDocumentByKey
« Antwort #9 am: 20.01.14 - 15:20:55 »
@cococo69
Ja... die alte Schritt-für-Schritt-Methode:

if docThis is nothing then
  print "docThis nothing"
  exit function
end if

set view = db.GetView("irgendwas")
if view is nothing then
  print "kein Zugriff auf view"
  exit function
end if

call view.Refresh

id = ...
id_cstr = Cstr(id(0))
print "id_cstr=" & id_cstr

Usw. usf.

Versuch' erstmal rauszubekommen, was Notes da quer steht. Und zwar aus Sicht Deines Notes-Scripts. Die Praxis kann da manchmal überraschend sein ;) Bsp: docThis wird übergeben... schön und gut. Weißt Du genau, daß in diesem Fall ein sinnvoller Wert drinsteht?

Wenn alles "gut" sein sollte:
- leere DB erstellen
- nur die benötigten Gestaltungselemente für den Test Deiner Funktion reinkopieren bzw. schlimmstenfalls NEU 1:1 erstellen
- Daten kopieren oder schlimmstenfalls neu erstellen
- testen
Erklärung: Manchmal (selten) sind Notes Gestalungselemente einfach kaputt.

Viel Erfolg.

P.S: Mal abgesehen davon... ich würde der Empfehlung von Driri folgen und den Code vereinfachen. Wenn Du die NoteID hast, warum dann kein db.GetDocumentByID?
« Letzte Änderung: 20.01.14 - 15:31:44 von thkn777 »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Object variable not set bei DetDocumentByKey
« Antwort #10 am: 20.01.14 - 16:02:17 »
Ich hab das jetzt mal nachgebaut:

Bei mir funktioniert folgendes (in der Ansicht habe ich @Text (@NoteID) als erste sortierte Spalte):

Code
Sub Initialize
	Dim workspace As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Set uidoc = workspace.CurrentDocument
	Dim doc As NotesDocument
	Set doc = uidoc.Document
	doc.Feldx = "irgendwas"
	
	Dim db As NotesDatabase
	Set db = doc.ParentDatabase
	Dim view As NotesView
	Set view = db.GetView ("noteid")
	Dim iddoc As NotesDocument
	Dim id As String
	id = "NT" & Right ("00000000" & doc.NoteID, 8)
	Set iddoc = view.GetDocumentByKey (id)
	Msgbox iddoc.Feldx (0)
End Sub

Msgbox gibt korrekterweise nichts aus.

Dagegen

Code
Sub Initialize
	Dim workspace As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Set uidoc = workspace.CurrentDocument
	Dim doc As NotesDocument
	Set doc = uidoc.Document
	doc.Feldx = "irgendwas"
	
	Dim db As NotesDatabase
	Set db = doc.ParentDatabase
	Dim iddoc As NotesDocument
	Set iddoc = db.GetDocumentByID (doc.NoteID)
	msgbox iddoc.Feldx (0)
End Sub

geht es nicht mit db.GetDocumentByID, da dann das Dokument im Speicher verwendet wird (hatte mir das gedacht, musste ich aber erst überprüfen). Hier wird also "irgendwas" ausgegeben.

Beim Evaluate bekommst Du die NoteID so zurück, wie sie in der Ansicht steht. Bei doc.NoteID musst Du ein "NT" und den Rest 8-stellig mit führenden Nullen aufbauen. Da wäre mir das Evaluate lieber, falls sich da mal was ändert, ist aber sicher Geschmacksache.

db.GetDocumentByID bringt Dich aber auf keinen Fall weiter.
« Letzte Änderung: 20.01.14 - 16:06:44 von Peter Klett »

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Re: Object variable not set bei DetDocumentByKey
« Antwort #11 am: 20.01.14 - 17:38:34 »
@Peter Klett
Wenn man auf das NotesSession Objekt verzichtet und die db einfach über db.Open(Server, Pfad) öffnet, dann kann man auch GetDocumentById verwenden.

Code
Private Sub showEingabe(Byval db3name As String, Byval db3server As String, Byval NoteId3 As String)
	Dim session3 As New NotesSession
	Dim doc3 As NotesDocument
	Dim db3 As New NotesDatabase( "", "" )
	
	' Set db3 = session3.GetDatabase(db3server, db3name)
	Call db3.Open( db3server, db3name )
	
	Set doc3 = db3.GetDocumentByID(noteId3)
	If doc3 Is Nothing Then
		Print "doc3 is nothing"
	Else
		Print Str$(Now()) & " doc3.eingabe = " & doc3.eingabe(0)
	End If
End Sub

- Ich habe diese Sub in einer Maske eingebunden.
- ich gebe in das Feld "eingabe" etwas ein (z.B. "1") und speichere, danach rufe ich die Sub auf --> "1"
- das Dokument verbleibt weiter im Edit-Mode
- ich gebe in das Feld "eingabe" etwas anderes ein (z.B. "2") ohne zu speichern und rufe die Sub auf --> immer noch "1"

Benutze ich stattdessen "Set db3 = session3.GetDatabase(db3server, db3name)" (oben auskommentiert), dann tritt der von Dir beschriebene Effekt ein, daß über das im Client nur einmal verwendete NotesSession Objekt das in-memory Dokument verwendet wird. Folgerichtig wird dann der nicht gespeicherte Wert "2" angezeigt.

Ich bin immer noch der Meinung, daß es auch ohne Ansicht geht und direkt die DocumentId verwendet werden kann. Wie sich das ganze performancetechnisch verhält, müßte man noch gucken. Mir fehlt im Moment auch die Zeit auszutesten, wie weit man db3 in die Globals schieben kann. Wenn das geht, dann sollte die Sub sehr schnell sein.

Gruß,
Th.

P.S. @cococo69 Entschuldige, Deine Frage in dem Thread war eine andere und es geht Dir eigentlich um die GetDocumentByKey Fehler - vielleicht kommt aber trotz des "Hijacking" etwas Gutes für Dich bei dieser Diskussion heraus.  ;)
« Letzte Änderung: 20.01.14 - 17:47:26 von thkn777 »

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Re: Object variable not set bei DetDocumentByKey
« Antwort #12 am: 20.01.14 - 18:13:02 »
Mit einem Evaluate geht auch so etwas in der Maske (gleiches Scenario wie oben):

Code
Sub Click(Source As Button)
	Dim ws As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Dim unid As String
	Dim res As Variant
	
	Set uidoc = ws.CurrentDocument
	unid = uidoc.Document.UniversalID
	
	res = Evaluate (|@GetDocField("| & unid & |"; "eingabe")|)
	Print Str$(Now()) & " eingabe = " & res(0)
End Sub

D.h. mit @GetDocField kann man sich - sofern man in der gleichen DB arbeitet - das DB.Open sparen. Es wird auch hier der Inhalt des NotesItems aus dem Backend angezeigt.

Schönen Feierabend wünsch' ich.

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Object variable not set bei DetDocumentByKey
« Antwort #13 am: 20.01.14 - 21:38:28 »
Eine (evtl übertriebene) Anmerkung meinerseits:

Bei Codestücken wie diesen läuten bei mir immer die Alarmglocken:
Code
res = Evaluate (|@GetDocField("| & unid & |"; "eingabe")|)

Durch sowas baut man sich nämlich sehr oft (hier zwar nicht) eine Sicherheitslücke.
Wenn UNID aus einem Feld kommen würde, kann Code injiziert werden.
Deshalb sollte man, wenn möglich, immer eine konstante Formel verwenden und für die Parameterübergabe ein Dokument verwenden.

Besser wäre:
Code
res = Evaluate (|@GetDocField(@DocumentUniqueID; "eingabe")|, uidoc.document)
(evtl muss um @DocumentUniqueID noch ein @Text() rum)

Hat weiterhin den Vorteil, dass die Formel schon bei der Compilezeit überprüft wird.

Gruß
Roland
Roland Praml

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

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Object variable not set bei DetDocumentByKey
« Antwort #14 am: 20.01.14 - 22:01:07 »
@Peter Klett
Wenn man auf das NotesSession Objekt verzichtet und die db einfach über db.Open(Server, Pfad) öffnet, dann kann man auch GetDocumentById verwenden.
...
Cool, dann würde ich das an Armins Stelle genau so machen und auf die Ansicht verzichten. Da die Ansicht jedesmal refresht wird, kann GetDocumentByID nur schneller sein.

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Re: Object variable not set bei DetDocumentByKey
« Antwort #15 am: 21.01.14 - 10:52:06 »
Update:
Das Öffnen der DB darf nicht im Initialize erfolgen.

Maximal geht's bis:
Code
Public db_global As NotesDatabase
Public isOpen_db_global As Integer
Public session_global As NotesSession
Public doc_global As NotesDocument
Sub Initialize
	Set session_global = New NotesSession
	Set db_global = New NotesDatabase( "", "" )
	isOpen_db_global = False
	' *** hier NICHT!!!!! Call openDb_global (session_global.CurrentDatabase.Server, session_global.CurrentDatabase.FilePath)
End Sub

mit

Code
Private Sub openDb_global (Byval server As String, Byval filepath As String)
	If Not isOpen_db_global Then
		isOpen_db_global = db_global.Open( server, filePath )
	End If
End Sub

und

Code
Private Sub showEingabe_global(Byval myNoteId As String)
	Set doc_global = db_global.GetDocumentByID(myNoteId)
	If doc_global Is Nothing Then
		Print "doc_global is nothing"
	Else
		Print Str$(Now()) & " doc_global.eingabe = " & doc_global.eingabe(0)
	End If
End Sub

Der Aufruf erfolgt dann jeweils über:

Code
Call openDb_global (session_global.CurrentDatabase.Server, session_global.CurrentDatabase.FilePath)
Call showEingabe_global(NoteId)

Wenn Performance keine Rolle spielt, braucht man diese Handstände nicht zu machen.
Wenn doch: das eine "If Not isOpen_db_global" wird zu verschmerzen sein bzw. muß man wohl in Kauf nehmen.

Schönen (rutschfreien) Dienstag wünsch' ich.
« Letzte Änderung: 21.01.14 - 11:06:13 von thkn777 »

Offline cococo69

  • @Notes Preisträger
  • Senior Mitglied
  • ****
  • Beiträge: 286
  • Geschlecht: Männlich
  • Super dieses Forum!!!
    • Mein Hobby...
Re: Object variable not set bei DetDocumentByKey
« Antwort #16 am: 21.01.14 - 11:17:57 »
Hallo zusammen,

zuerst möchte ich euch allen herzlich danken für die unglaubliche Mühe, die ihr euch in diesem Thread gegeben habt!!

Ich bin nun tatsächlich den Weg von "thkn777" über db.Open(Server, Pfad)  gegeangen und es funktioniert einwandfrei!! Guter Ansatz - DANKE!

Viele herzliche Grüße
Armin

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Re: Object variable not set bei DetDocumentByKey
« Antwort #17 am: 21.01.14 - 11:46:18 »
@pram
Naja, ich war mehr darauf aus, daß man sich eine LS function bauen könnte

Code
Function getDocField(Byval unid As String, Byval itemname As String) As Variant
	getDocField = Evaluate (|@GetDocField("| & unid & |"; "| & itemname & |")|)
End Function

und diese benutzt, um den "Backend"-Wert eines Items zu ermitteln aus einem beliebigen Dokument der aktuellen DB, von dem man die UNID kennt. Diese liefert jedoch nicht ein NotesDocument Objekt zurück wie GetDocumentById oder GetDocumentByUnid. Vielleicht trotzdem ganz nützlich. ;)


@cococo69
Freut mich, daß wir Dir beim Lösen Deines Problems helfen konnten.

Th.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz