Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: ewald am 15.03.07 - 18:16:18
-
Hallo zusammen,
bei dem folgend Script krieg ich immer den Fehler "Object variable not set", und zwar denke ich bei der Zeile Call uidoc.FieldSetText..........
Der Fehler ist wahrscheinlich recht enifach aaber ich bin nicht so der Script-Experte :-(
Das Script steht in einem Button einer View. Dort werden Dokumente selektiert. Und bei diesen wird dann ein Wert in ein Feld geschrieben, den ich aus einem anderen Dokument hole.
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim uiview As NotesUIView
Dim collection As NotesDocumentCollection
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim j As Integer
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set uidoc = ws.currentdocument
Set doc = ws.currentdocument.document
Set uiview = ws.CurrentView
Dim tmpSEAStartDate As String
' The profile document
Dim profDoc As NotesDocument
Set profDoc = db.GetProfileDocument("MainProfile")
tmpSEAStartDate = profDoc.dlgSEAStartDate(0)
Msgbox tmpSEAStartDate
For j = 1 To collection.Count
Set doc = collection.GetNthDocument( j )
Call uidoc.FieldSetText("SEAStartDate", tmpSEAStartDate)
Call doc.Save( False, True )
Next
' Remove all the selections
Call uiview.DeselectAll
End Sub
Vielen Dank.
Grüsse Ewald
-
Button einer View
uidoc ist doch das gerade geöffnete Dokument !!
Du wendest Frontendmethoden im Backend an.
-
Ulrich, danke für die schnelle Antwort, aber was muss ich denn nun eigentlich tun?
-
du willst doch sichr im DOC ein feld neu besetzen, oder ? Dann ist die Methode ReplaceItemValue dein Freund
also entweder
Dim item As NotesItem
'
Set item = doc.ReplaceItemValue( "SEAStartDate", tmpSEAStartDate )
oder
doc.SEAStartDate = tmpSEAStartDate
-
Habs geändert in
Call doc.ReplaceItemValue("SEAStartDate", tmpSEAStartDate)
der Fehler kommt aber immer noch :-(
-
ja, gucke noch einmal in meinen vorherigen Post ...
-
Tschuldigung Ulrich, hab ich vorhin gar nicht gesehen.
Fehler kommt aber leider immer noch
-
Bleibt im debugger hier hängen:
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim uiview As NotesUIView
Dim collection As NotesDocumentCollection
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim j As Integer
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set uidoc = ws.currentdocument
--> Set doc = ws.currentdocument.document
Set uiview = ws.CurrentView
-
Wird das uidoc denn belegt?
Wenn du die Dokumente in einer Ansicht anhakst, sollte das doch nicht der Fall sein, oder stehe ich auf dem Schlauch?
Oder hast du den Button jetzt in der Maske eingebaut?
-
ich denke doch, oder nicht?
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim uiview As NotesUIView
Dim collection As NotesDocumentCollection
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim j As Integer
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set uidoc = ws.currentdocument
Set doc = ws.currentdocument
Set uiview = ws.CurrentView
Dim tmpSEAStartDate As String
' The profile document
Dim profDoc As NotesDocument
Set profDoc = db.GetProfileDocument("MainProfile")
tmpSEAStartDate = profDoc.dlgSEAStartDate(0)
Msgbox tmpSEAStartDate
For j = 1 To collection.Count
Set doc = collection.GetNthDocument( j )
Dim item As NotesItem
Set item = doc.ReplaceItemValue( "SEAStartDate", tmpSEAStartDate )
'Call doc.ReplaceItemValue("SEAStartDate", tmpSEAStartDate)
Call doc.Save( False, True )
Next
' Remove all the selections
Call uiview.DeselectAll
-
sorry, ich hatte mein Posting oben eben editiert.
*ich denke doch, oder nicht?*
was sagt denn der Debugger?
wenn ich das richtig verstehe, hakst du die Doks in einer Ansicht an, ohne sie einzeln zu öffnen, richtig?
Dann sollte uidoc nicht belegt sein, wie Eknori oben geschrieben hat.
-
muss ich dann die beiden uidoc Einträge Dim und Set einfach nur rausnehmen?
Sorry wegen der blöden Frage ;-)
-
hab die uidocs grade rausgenommen. geht aber trotzdem nicht...
trotzdem danke
-
wenn du den Designer hast, dann kannst du dir doch im Debugger ansehen, wie die Variablen belegt sind (oder auch nicht).
Und wenn ich es richtig verstanden habe, dann soll der Button in einer Ansicht auf die selektierten Dokumente gehen.
ws.currentdocument bezieht sich auf das am Bildschirm geöffnete Dokument.
Wenn du also den Code in einer Ansicht aufrufst, sollte uidoc jetzt nicht belegt sein .... (siehe eknoris 1. Posting)
Also sieh doch einfach im debugger nach uidoc, und wenn das nicht belegt ist, kannst du folglich auch nicht anschliessend doc über ws.currentdocument.document belegen
-
das ist korrekt es gibt kein uidoc mehr im code. aber was muss ich denn dann mit dem doc machen. wie muss ich das da reinschreiben. kannst du mir das so sagen, dass ich als script-newbe auch verstehe?
-
ich glaub, jetzt hab ich es verstanden. jetzt gehts.
das set doc= hab ich oben rausgenommen, weil ich unten ja
Set doc = collection.GetNthDocument( j ) eh schon stehen habe.
-
Es gibt Frontend- und Backendmethoden.
ws.currentdocument liefert dir das Dokument, das gerade am Bildschirm geöffnet ist, als Frontenddokument.
ws.currentDocument.document liefert dir das Backenddokument, das zu diesem Frontenddokument gehört.
Wenn du kein Dokument am Bildschirm geöffnet hast, bekommst du
Set uidoc = ws.currentdocument
als leer zurück (siehe Debugger)
und da du anschliessend das Backenddokument mit Hilfe des Frontenddokumentes (indirekt über ws.currentdocument ) belegen willst
Set doc = ws.currentdocument.document
kommt dann die Meldung 'Object variable not set', da eben das Frontenddokument nicht da ist, an dem sich dein Skript gerade langhangeln will.
und das hier
Dim doc As NotesDocument
Set doc = ws.currentdocument
kann schon gar nicht funktionieren, weil ws.currentdocument ein NotesUIDocument zurückgibt, und kein Notesdokument.
-
schmeisse das
Set uidoc = ws.currentdocument
Set doc = ws.currentdocument
raus, dann sollte es funktionieren
-
Ich habe das Script mal ein bisschen angepasst und eine minimale Fehlerbehandlung eingebaut. Eine Fehlerbehandlung ist das A und O einer Programmierung. Zu kannst z.B. nicht davon ausgehen, dass immer ein Profildokument vorhanden ist.
So sollte es eigentlich funktionieren.
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim uiview As NotesUIView
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim profDoc As NotesDocument
Dim tmpSEAStartDate As String
On Error Goto ErrorHandler
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
If collection.Count = 0 Then
Messagebox "Keine Dokumente markiert"
Exit Sub
End If
Set uiview = ws.CurrentView
' The profile document
Set profDoc = db.GetProfileDocument("MainProfile")
If profDoc Is Nothing Then
Messagebox "Kein Profildokument vorhanden"
'Hier kommt die weitere Fehlerbehandlung
'Wenn Fehler dann Ausstieg
Exit Sub
End If
tmpSEAStartDate = profDoc.dlgSEAStartDate(0)
Msgbox tmpSEAStartDate
Set doc = collection.GetFirstDocument 'Erstes Dokument
While Not (doc Is Nothing) 'Schleife solange ausführen wie Doks in collection
doc.SEAStartDate = tmpSEAStartDate 'Wert in Feld schreiben
'Alternativ wäre auch das möglich, dann sind die zwei Zeilen oben hinfällig
doc.SEAStartDate = profDoc.dlgSEAStartDate 'Wert in Feld schreiben
Call doc.Save( False, True )
Set doc = collection.GetNextDocument(doc) 'Zugriff auf nächsten Dokument
Wend
' Remove all the selections
Call uiview.DeselectAll
Ende:
Exit Sub
ErrorHandler
Messagebox "Es ist ein Fehler aufgetreten." & Chr$(13) & "Fehler: " & Str$(Err) + " -> '" & Error$ & _
"' in Zeile " & Str$(Erl) , 16, "Fehler"
Resume Ende
Axel