Domino 9 und frühere Versionen > ND8: Entwicklung

Feldänderungen im Hauptdokument automatisch auf Antwortdokumente übertragen

<< < (3/4) > >>

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