Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Keydins am 21.06.10 - 11:33:29

Titel: Fehlermeldung 'Error accessing product object method'
Beitrag von: Keydins am 21.06.10 - 11:33:29
Moin zusammen,

ich habe ein weiteres kleines Problem mit meiner aktuellen Workflow-Anwendung:

Seit ich eine Mailbenachrichtigung für den nächsten Bearbeiter integriert habe, tritt der im Thema erwähnte Fehler auf.

Ablauf

Der Fehler tritt nicht auf, wenn das Dokument direkt aus der Datenbank geöffnet und bearbeitet wird. Somit vermute ich meinen Fehler in dem Schalter für den Aufruf der Dialogbox.

[/list]
Code
Sub Click(Source As Button)
	
	On Error Resume Next
	
	Dim wksp As New NotesUIWorkspace
	Dim session As New NotesSession
	Dim db As notesdatabase
	Dim uidoc As notesuidocument
	Dim doc As notesdocument
	Dim docunid As String
	
	Call wksp.DialogBox ( "(Dialog: Eingabe Stellungnahme)", True, True, False, True, True, False, "Stellungnahme eingeben" )
	
	Set db = session.CurrentDatabase
	Set uidoc = wksp.CurrentDocument
	
	docunid = uidoc.Document.UniversalID
	
	Call uidoc.Close(True)
	Delete uidoc
	
	Set doc =	db.GetDocumentByUNID(docunid)
	
	Call wksp.EditDocument(False,doc,False)
	
End Sub

Hinweis
Das Schließen des zu bearbeitenden Dokuments ist notwendig, da über das QueryClose Event der Dialogmaske Werte in das Hauptdokument zurückgeschrieben werden müssen, die insbesondere bei Entscheidungen den Ablauf des Workflows ändern.

Ich vermute, dass der Fehler entsteht, weil ich db als CurrentDatabase deklariere und das dürfte vermutlich im Fehlerfall die Maildatenbank des Users sein, aus der er per DocLink zum Workflowdokument in einer anderen DB gelangt ist.

Jemand eine Idee, wie ich das Problem geschickt umgehen kann? Die Mailfunktionalität (inkl. DocLink) wird explizit gewünscht.


Gruß
Dirk
Titel: Re: Fehlermeldung 'Error accessing product object method'
Beitrag von: Peter Klett am 21.06.10 - 11:44:24
Probier mal Set db = doc.ParentDatabase
Titel: Re: Fehlermeldung 'Error accessing product object method'
Beitrag von: ascabg am 21.06.10 - 11:52:32
Hallo,

Zitat
Probier mal Set db = doc.ParentDatabase
Und wo ist doc gesetzt worden?

Auch frage ich mich, was passiert, wenn der Anwender auf Abbrechen klickt.

Hast Du es schon mal versucht, die beiden Zeilen
Zitat
Set db = ...
Set uidoc = ...
vor den Aufruf der Dialogbox zu setzen.


Andreas
Titel: Re: Fehlermeldung 'Error accessing product object method'
Beitrag von: ascabg am 21.06.10 - 11:56:57
Noch zwei Fragen.

Wie gelangen denn die Daten aus der Dialogbox in das betreffende Dokument?
Die Maske Deiner Dialogbox heisst wirklich

Zitat
(Dialog: Eingabe Stellungnahme)
?

Andreas
Titel: Re: Fehlermeldung 'Error accessing product object method'
Beitrag von: Keydins am 21.06.10 - 12:31:48
@Peter

Dank für den Tip, hab ich gleich mal umgesetzt

Code
Sub Click(Source As Button)
	
	On Error Resume Next
	
	Dim wksp		As New NotesUIWorkspace
	Dim db		As NotesDatabase
	Dim uidoc		As Notesuidocument
	Dim bdoc		As NotesDocument
	Dim doc		As NotesDocument
	Dim docunid	As String
	
	Call wksp.DialogBox ( "(Dialog: Eingabe Stellungnahme)", True, True, False, True, True, False, "Stellungnahme eingeben" )
	
	Set uidoc = wksp.CurrentDocument
	Set bdoc	= uidoc.Document
	
	Set db = bdoc.ParentDatabase
	
	docunid = uidoc.Document.UniversalID
	
	Call uidoc.Close(True)
	Delete uidoc
	
	Set doc =	db.GetDocumentByUNID(docunid)
	
	Call wksp.EditDocument(False,doc,False)
	
End Sub


@Andreas

Die Abbrechen-Option wird im QueryClose der Dialogmaske behandelt, es gibt dort auch noch einen zusätzlichen Schalter, mit dem der Benutzer seine Eingaben zur Übernahme bestätigt.

Code
	Dim tempKommentar As String
	
	tempKommentar = source.FieldGetText("temp_Eingabe")
	
	If Source.DialogBoxCanceled Then
		If Messagebox ("Wollen Sie den Vorgang wirklich abbrechen?", _
		MB_YESNO+MB_ICONQUESTION, "Cancel") = IDNO Then
			Continue = False
			Exit Sub
		Else
			Continue = True
			Exit Sub
		End If
	End If   
	
	If tempKommentar = "0" Then
		
		If Messagebox ("Sie haben Ihre Eingaben nicht gespeichert, der Workflow kann nicht fortgesetzt werden. " &_
		"Wollen Sie den Dialog wirklich schließen?", _
		MB_YESNO+MB_ICONQUESTION, "Cancel") = IDNO Then
			Continue = False
			Exit Sub
		Else
			continue = True
			Exit Sub
		End If
		
	End If	

Bezüglich der Übergabe von Daten von der Dialogmaske an das Haupdokument: http://atnotes.de/index.php/topic,48858.0.html

Und die Maske heißt tatsächlich so :)



Da ich das Problem ursprünglich in der Dialogmaske oder deren Aufruf vermutet hatte, habe ich den Debugger außen vor gelassen (geht ja innerhalb von Dialogmasken nicht). Nachdem der Fehler inzwischen auch beim Aufruf aus der Datenbak selber auftritt, habe ich mir das mal im Debugger angesehen und so wie es aussieht habe ich ein Problem im QueryClose Event des Hauptdokuments (bzw. in dem der dort verwendeten Steuerungsteilmaske).

Gehe ich mit dem Debugger alle Schritte einzeln durch, tritt der Fehler nicht auf. Lasse ich das Script jedoch per 'Fortfahren' Schalter durchlaufen setzt er mir an flogender Stelle auf:

Code
Sub Queryclose(Source As Notesuidocument, Continue As Variant)
	
	Dim sOption	As String
        Dim quest		As Integer
	Dim rc		As Variant
	
	--> sOption = source.FieldGetText("SaveOptions") 'Hier erfolgt der Abbruch mit der Fehlermeldung
	
	If sOption = "0" Then
		
		quest = Messagebox("Wenn Sie das Dokument schließen gehen alle Eingaben verlohren." & Chr(13) & Chr(13) &_
		"Wollen Sie das Dokument jetzt schließen?", 36, "Sicherheitsabfrage")
		
		If quest = 7 Then			
			rc = False
		Else
			rc = True			
		End If
		
	Else
		rc = True
		
	End If
	
	continue = rc
	
End Sub
[Edit] Code aktualisiert, da standen noch ein paar Relikte drin


Laut Ausgabe des Debuggers ist in diesem Fall das Objekt 'Source' leer.
Titel: Re: Fehlermeldung 'Error accessing product object method'
Beitrag von: Keydins am 21.06.10 - 13:44:15
Ich glaub ich hab die Lösung (zumindest funktioniert es bei den am Test beteiligten Kollegen jetzt)

Sobald ich im QueryClose des Hauptdokuments nicht mit Source arbeite, sondern das uidoc über CurrentDocument definiere klappt es sowohl direkt in der Datenbank als auch über den DocLink aus der Mail.

Code
	Dim wksp		As New NotesUIWorkspace
	Dim db		As NotesDatabase
	Dim uidoc		As Notesuidocument
	
	Dim sOption	As String
	Dim quest		As Integer
	Dim rc		As Variant
	
	Set uidoc = wksp.CurrentDocument
	
	sOption = uidoc.FieldGetText("SaveOptions")

Danke für die Hinweise, manchmal ist man selber einfach 'Betriebsblind'  8) und findet die offensichlichen Dinge nicht.