Domino 9 und frühere Versionen > ND8: Entwicklung
Feldänderungen im Hauptdokument automatisch auf Antwortdokumente übertragen
Peter Klett:
Scriptseminar hört sich gut an.
Trotzdem solltest Du das Script vom Querysave ins Postsave verschieben, damit ist Problem 1 beseitigt.
In Declaration nimmst Du auf:
Dim aufgabe As String
Ins Postopen schreibst Du:
Dim workspace As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
aufgabe = doc.Aufgabe (0)
Dein Script (im POSTSave) passt Du so an (das rote ist neu)
If aufgabe <> doc.Aufgabe (0) Then
'alle Antwortdocs des Backend-Docs werden in die Collection aufgenommen
Set dc = doc.Responses
'Setze alle Felder der Collection, gespeichert wird automatisch
Call dc.StampAll( "Re_Aufgabe" , doc.Aufgabe(0) )
aufgabe = doc.Aufgabe (0)
End If
Mehr ist es nicht ...
SaSaWu:
Danke, Peter!
Jetzt fangen aber leider die "Problemchen" schon an:
Im Postsave habe ich die erste Zeile abgeändert in:
Sub Postsave(Source As Notesuidocument, Continue As Variant)
Sonst wäre es ja ein Querysave, richtig? So bekomme ich aber die Meldung "wrong number of arguments". Ohne Kenntnisse kann ich das nicht anpassen!
Außerdem habe ich im Originalscript noch ein weiteres Feld (Mitarbeiter) aufgenommen, das bei Aktualisierungen berücksichtigt wird (siehe Code) und wohl in die If-Schleife integriert werden müsste.
--- Code: ---Sub Querysave(Source As Notesuidocument, Continue As Variant)
'------------------------------------------------------------------------------------------------------------------
'Zweck: Feldwerte werden beim Speichern in alle Antwort-Dokumente übernommen
'------------------------------------------------------------------------------------------------------------------
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Set db = session.CurrentDatabase
If Source.IsNewDoc Then Exit Sub 'Wenn UIDoc neu ist dann verlasse Script
Set doc = Source.Document 'UIDoc zu Backend-doc
'alle Antwortdocs des Backend-Docs werden in die Collection aufgenommen
Set dc = doc.Responses
'Setze alle Felder der Collection, gespeichert wird automatisch
Call dc.StampAll( "Aufgabe" , doc.Aufgabe(0) )
Call dc.StampAll( "Mitarbeiter" , doc.Mitarbeiter )
End Sub
--- Ende Code ---
Peter Klett:
Ok, soweit zu der Aussage von weiter oben, dass Du nur ein StampAll hast ...
Zum PostSave:
Du änderst auf keinen Fall die erste Zeile des QuerySave in PostSave, die Sub PostSave gibt es schon (schau mal links ...), da muss das Script, das zwischen "Sub QuerySave (...)" und "End Sub" steht, rein.
Mitarbeiter ist vermutlich ein Mehrfachwert. Also
(Declarations)
Dim aufgabe As String
Dim mitarbeiter As Variant
Postopen
Dim workspace As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
aufgabe = doc.Aufgabe (0)
mitarbeiter = doc.Mitarbeiter '-> hier ohne (0), da Mehrfachwert möglich
PostSave
...
If aufgabe <> doc.Aufgabe (0) Or Join (mitarbeiter) <> Join (doc.Mitarbeiter) Then
'alle Antwortdocs des Backend-Docs werden in die Collection aufgenommen
Set dc = doc.Responses
'Setze alle Felder der Collection, gespeichert wird automatisch
If aufgabe <> doc.Aufgabe (0) Then
Call dc.StampAll( "Aufgabe" , doc.Aufgabe(0) )
aufgabe = doc.Aufgabe (0)
End If
If Join (mitarbeiter) <> Join (doc.Mitarbeiter) Then
Call dc.StampAll( "Mitarbeiter" , doc.Mitarbeiter )
mitarbeiter = doc.Mitarbeiter
End If
End If
Das ist jetzt nur mal "so schnell eben", damit es funktioniert. Die Ergebnisse des Join würde ich mir natürlich in einer separaten Variablen merken, um das nicht zweimal rechnen zu müssen, und auf ein mehrfaches Verwenden von StampAll würde ich immer verzichten und stattdessen durch die Dokumente gehen, die einzeln anpassen und nur EINMAL speichern. Aber um es verständlicher zu lassen und nicht alles umreißen zu müssen, geht das so natürlich auch.
SaSaWu:
Hallo Peter,
nett, dass Du Dich "kümmerst"!
Ich bekomme nun die Meldung "object cariable not set" bei Aufruf des Hauptdokuments. Hier meine aktuellen Einstellungen:
(Declarations)
--- Code: ---Dim aufgabe As String
Dim mitarbeiter As Variant
--- Ende Code ---
Postopen
--- Code: ---Sub Postopen(Source As Notesuidocument)
Dim workspace As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
aufgabe = doc.Aufgabe (0)
mitarbeiter = doc.Mitarbeiter
End Sub
--- Ende Code ---
Postsave
--- Code: ---Sub Postsave(Source As Notesuidocument)
'------------------------------------------------------------------------------------------------------------------
'Zweck: Feldwerte werden beim Speichern in alle Antwort-Dokumente übernommen
'------------------------------------------------------------------------------------------------------------------
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Set db = session.CurrentDatabase
If Source.IsNewDoc Then Exit Sub 'Wenn UIDoc neu ist dann verlasse Script
Set doc = Source.Document 'UIDoc zu Backend-doc
'alle Antwortdocs des Backend-Docs werden in die Collection aufgenommen
Set dc = doc.Responses
If aufgabe <> doc.Aufgabe (0) Or Join (mitarbeiter) <> Join (doc.Mitarbeiter) Then
'alle Antwortdocs des Backend-Docs werden in die Collection aufgenommen
Set dc = doc.Responses
'Setze alle Felder der Collection, gespeichert wird automatisch
If aufgabe <> doc.Aufgabe (0) Then
Call dc.StampAll( "Aufgabe" , doc.Aufgabe(0) )
aufgabe = doc.Aufgabe (0)
End If
If Join (mitarbeiter) <> Join (doc.Mitarbeiter) Then
Call dc.StampAll( "Mitarbeiter" , doc.Mitarbeiter )
mitarbeiter = doc.Mitarbeiter
End If
End If
End Sub
--- Ende Code ---
Peter Klett:
Sorry, habe Deinen Beitrag übersehen.
Im Postopen ist ein Fehler, da fehlt ein New
Sub Postopen(Source As Notesuidocument)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
aufgabe = doc.Aufgabe (0)
mitarbeiter = doc.Mitarbeiter
End Sub
Besser (und kürzer) wäre allerdings folgendes PostOpen (da Source übergeben wird, hatte ich nicht dran gedacht)
Sub Postopen(Source As Notesuidocument)
Dim doc As NotesDocument
Set doc = Source.Document
aufgabe = doc.Aufgabe (0)
mitarbeiter = doc.Mitarbeiter
End Sub
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln