Hallo!
Unter http://atnotes.de/index.php?topic=13984.0 ist ein Script abgebildet (s.u.), mit dem Änderungen von Feldwerten im Hauptdokument automatisch auf die Antwortdokumente übertragen werden. Ich bin kein "Script'ler", es funktioniert dennoch halbwegs. Allerdings werden die Werte erst bei Aufruf der Antwortdokumente (Bearbeitungsmodus) geändert und diese müssen dann noch gespeichert werden. Welche Einstellungen muss ich vornehmen, um auch dies automatisiert hinzubekommen? Oder muss/kann ich einen Agenten laufen lassen, der dies vollzieht?
3.4 Felder in allen Antwortdokumenten aktualisieren, sobald sich diese im Hauptdokument ändern
Wenn Änderungen im Hauptdokument auf alle Antwortdokumente übertragen werden sollen, kann man dies über den Query Save – Event in der Hauptdokument-Maske steuern.
Hilfreich sind hierbei „Responses property“ und „StampAll method“ in der „NotesDocumentCollection“.
Beispiel:
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( "Re_Feld1" , doc.Feld1(0) )
Call dc.StampAll( "Re_Feld2" , doc.Feld2(0) )
Call dc.StampAll( "Re_Feld3" , doc.Feld3(0) )
End Sub
Dieses Script kann man - etwas angepasst - auch in einem Agenten verwenden, der beispielsweise täglich alle Antwortdokumente aktualisiert.
Danke für die Antwort!
Ok, die Felder im Antwortdokument sind "berechnet" @If (@IsNewDoc ; Aufgabe ; @GetDocField( $Ref; "Aufgabe") )
und haben denselben Feldnamen wie im Hauptdokument. "Mein" Script sieht an dieser Stelle so aus:
Call dc.StampAll( "Re_Aufgabe" , doc.Aufgabe(0) )
Eine "Berücksichtigung" der Felder im Script oder auch ein "Umbauen" bekomme ich nicht hin. Wie gesagt: "bin kein Sript'ler"!
Du schreibst sowohl bei neuen als auch bei alten Dokumenten den Inhalt des Feldes Aufgabe rein?
Ja!
Wenn du den Wert setzt über Stampall, sollte der Wert enthalten sein.
Sind die Feldwerte alle korrekt geschrieben?
Denke schon!
Hast du in deinem Script mehrere Stampalls nacheinander?
Nein!
Ich hatte einmal den Fall, dass mehrere Aufrufe von Stampall nacheinander nicht durchgelaufen sind bei einer grösseren Collection, das war aber unter 6.5.4.
Wie sieht dein Script denn aus?
s.u.
Hast du das die Dokumente geöffnet im Frontend?
Nein
Danke schonmal für die Unterstützung!
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( "Re_Aufgabe" , doc.Aufgabe(0) )
End Sub
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.
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
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) Dim aufgabe As String
Dim mitarbeiter As Variant
Postopen 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
Postsave 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