Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: KSKGG am 24.05.04 - 15:35:48
-
Hallo,
in einer Datenbank werden im Haupdokument bestimmte informationen wie Name, Vorname, Telefon USw vorgehalten.
In einem Antwortdokumnet werden Name, Vorname und Telefonnummer übernommen und in einem Richtext-Feld die Unterschrift als Bild eingefügt.
Wie kann man die Felder Name Vorname und Telefon im Antwortdokument automatisiert ändern, wenn sie sich im Hauptdokument ändern?
Im voraus vielen Dank
Gruß
Holger
-
Im Query- oder PostSave könntest Du Dir eine NotesDocumentCollection alles unmittelbaren Responses erzeugen mit
NotesDocumentCollection = NotesDocument.Responses.
Dann sollte es ein leichtes sein, ein Update der ResponseDocs durchzuführen.
HTH,
Bernhard
PS: Geschickt wäre es sicherlich, wenn man sich bereits im PostOpen die originalen Feldwerte merkt und im QuerySave / PostSave nur ein Update der Responses vornimmt, wenn tatsächlich Änderungen durchgeführt wurden.
-
Hi,
ich hab mal so was gemacht. Ich begeb mich mal auf die Suche nach dem Code.
Axel
-
Hi,
ich bin fündig geworden.
Ich habe damals folgende Vorgehensweise gewählt:
1. In die Hauptmaske habe ich ein berechnetes Textfeld (Mehrfachwerte zugelassen) mit Namen xFieldList eingefügt. Als Werteformel habe ich den Feldnamen selbst eingetragen.
2. Im globalen Declarations-Abschnitt der Hauptmaske habe ich folgende Variablen deklariert:
'Variablen für Abgleich
Dim tmpAnrede As String
Dim tmpTitel As String
Dim tmpVorname As String
Dim tmpName As String
3. Im Postopen-Event habe ich die globalen Variablen mit den Feldinhalten gefüllt.
If (Not doc.IsNewNote) Then
tmpAnrede = doc.Anrede(0)
tmpTitel = doc.Titel(0)
tmpVorname = doc.Vorname(0)
tmpName = doc.Name(0)
End If
4. Im querySave-Event der Hauptmaske habe ich dann geprüft, ob sich einer oder mehrere Werte geändert haben. Wenn ja wird die funktion für den Abgleich aufgerufen.
Dim ichange As Integer
' Prüfung ob sich die, für den Abgleich relevanten, Felder geändert haben.
If Not doc.IsNewNote Then
If tmpAnrede <> doc.Anrede(0) Then
doc.GetFirstItem("xFieldList").AppendToTextList("Anrede")
ichange = True
End If 'If tmpAnrede <>...
If tmpTitel <> doc.Titel(0) Then
doc.GetFirstItem("xFieldList").AppendToTextList("Titel")
ichange = True
End If 'If tmpAnrede <>...
If tmpVorname <> doc.Vorname(0) Then
doc.GetFirstItem("xFieldList").AppendToTextList("Vorname")
ichange = True
End If 'If tmpAnrede <>...
If tmpName <> doc.Name(0) Then
doc.GetFirstItem("xFieldList").AppendToTextList("Name")
ichange = True
End If 'If tmpAnrede <>...
End If
If ichange Then
Call UpdateResponseDocs(doc)
Call doc.RemoveItem("xFieldList")
End If
Die Funktion zum Abgleich sieht so aus:
Sub UpdateResponseDocs(pdoc As NotesDocument)
On Error Resume Next
Dim collection As NotesDocumentCollection
Dim rdoc As NotesDocument
Dim objProgress As CProgressBar
Dim i As Integer
Set collection = pdoc.Responses
If collection.Count > 0 Then
For i = 1 To collection.Count
Set rdoc = collection.GetNthDocument(i)
' Abgleich von Name und Zusatzinformation
Forall s In pdoc.xFieldList
Call rdoc.ReplaceItemValue(s, pdoc.GetItemValue(s))
End Forall 'Forall s In pdoc.xFieldList
Call rdoc.ComputeWithForm(False, False)
Call rdoc.Save(True, True)
Next 'For i = 1 To collection.Count
End If 'If collection.Count > 0
End Sub
Axel
-
Kann da noch folgendes anbieten :-)
Sub Querysave(Source As Notesuidocument, Continue As Variant)
'---
'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
Set doc = Source.Document
Set dc = doc.Responses
'1. Wert(rot)=Feld in Hauptdokument, 2. Wert(blau)=Neues Feld in Antwortdokument
Call dc.StampAll( "Name" , doc.Name(0) )
Call dc.StampAll( "Vorname" , doc.Vorname(0) )
Call dc.StampAll( "Telefon" , doc.Telefon(0) )
End Sub
-
...
'1. Wert(rot)=Feld in Hauptdokument, 2. Wert(blau)=Neues Feld in Antwortdokument
Call dc.StampAll( "Name" , doc.Name(0) )
Call dc.StampAll( "Vorname" , doc.Vorname(0) )
Call dc.StampAll( "Telefon" , doc.Telefon(0) )
...
Auch eine Möglichkeit, wobei der Kommentar allerdings etwas verwirrent ist. Eigentlich müsste es heissen:
1. Wert(rot)= Feld im Antwortdokument, 2.Wert(blau)=Neuer Wert aus Feld im Hauptdokument.
Axel
-
Hallo,
danke an alle hat mit dem letzten Hinweis von Axel funktioniert.
Gruß
Holger :) :)
-
Uuuuups :-) Sorry, das passiert, wenn man so auf die Schnelle mal was zwischenkommentiert ohne groß darüber nachzudenken :-)
/Edit:
DoppelUps... sorry... thx for correction :-)
/EditEnd
...
'1. Wert(rot)=Feld in Hauptdokument, 2. Wert(blau)=Neues Feld in Antwortdokument
Call dc.StampAll( "Name" , doc.Name(0) )
Call dc.StampAll( "Vorname" , doc.Vorname(0) )
Call dc.StampAll( "Telefon" , doc.Telefon(0) )
...
Auch eine Möglichkeit, wobei der Kommentar allerdings etwas verwirrent ist. Eigentlich müsste es heissen:
1. Wert(rot)= Feld im Antwortdokument, 2.Wert(blau)=Neuer Wert aus Feld im Hauptdokument.
Axel
-
Hallo zusammen,
ja, der Code ist super! Habe ihn auch schon im Einsatz!
Jetzt habe ich dazu noch eine Frage:
Bei diesem Code werden ja bei jedem Speichern des Hauptdokumentes die Antwortdokumente aktualisiert.
Ich möchte aber, daß die Antwortdokus nur dann aktualisiert werden, wenn vor dem Speichern zumindest eines der relevanten Felder geändert wurde.
Leider weiß ich nicht, wie ich das in LS vormulieren muss ...
???
-
Hi,
das ist relativ einfach. Ich hab's weiter oben schon mal gepostet.
Hier nochmal in entwas einfacherer Form.
1. Im globalen Declarations-Abschnitt der Hauptmaske habe ich folgende Variablen deklariert:
'Variablen für Abgleich
Dim tmpVorname As String
Dim tmpName As String
Dim tmpTelefon As String
2. Im Postopen-Event habe ich die globalen Variablen mit den Feldinhalten gefüllt.
If (Not doc.IsNewNote) Then
tmpVorname = doc.Vorname(0)
tmpName = doc.Name(0)
tmpTelefon = doc.Telefon(0)
End If
3. Im querySave-Event der Hauptmaske habe ich dann geprüft, ob sich einer oder mehrere Werte geändert haben. Wenn ja wird die funktion für den Abgleich aufgerufen.
Dim ichange As Integer
' Prüfung ob sich die, für den Abgleich relevanten, Felder geändert haben.
If Not doc.IsNewNote Then
If tmpVorname <> doc.Vorname(0) Then
ichange = True
End If 'If tmpVorname <>...
If tmpName <> doc.Name(0) Then
ichange = True
End If 'If tmpName <>...
If tmpTelefon <> doc.Telefon(0) Then
ichange = True
End If 'If tmpTelefon <>...
End If
If ichange Then
Set doc = Source.Document
Set dc = doc.Responses
'1. Wert(rot)= Feld im Antwortdokument, 2.Wert(blau)=Neuer Wert aus Feld im Hauptdokument.
Call dc.StampAll( "Name" , doc.Name(0) )
Call dc.StampAll( "Vorname" , doc.Vorname(0) )
Call dc.StampAll( "Telefon" , doc.Telefon(0) )
End If
Axel
-
Sorry! :-X
Wer lesen kann, ist klar im Vorteil!!!! :-\
Vielen Dank, werde es gleich ausprobieren!
-
Hi,
kein Problem. Das passiert jedem von uns. ;)
Axel
-
Hallo Axel,
hm, jetzt habe ich doch ein kleines Problem:
habe in die Declarations:
Dim tmpChamp As String
Dim tmpPLeiter As String
Dim tmpStatus As Integer
..und in den Post-Open-Event folgendes eingetragen:
Sub Postopen(Source As Notesuidocument)
If (Not doc.IsNewNote) Then
tmpChamp = doc.Champ(0)
tmpPLeiter = doc.PLeiter(0)
tmpStatus = doc.Status(0)
End If
End Sub
Beim Neuerstellen erscheint dann aber die Fehlermeldung:
"Variant does not contain an object!"
Hab ich schon wieder etwas überlesen???
-
Überlesen hast Du nix, aber Code verwendet und diesen nicht verstanden ... Das sollte man nicht machen.
Source im PostOpen ist ein NotesUIDocument. Du verwendest dann doc, was in diesem Kontext ein NotesDocument (also Backend) wäre - aber von Dir nicht deklariert wird.
Sub Postopen(Source As Notesuidocument)
dim doc as NotesDocument
If (Not Source.IsNewNote) Then
Set doc = Source.Document
tmpChamp = doc.Champ(0)
tmpPLeiter = doc.PLeiter(0)
tmpStatus = doc.Status(0)
End If
End Sub
Bevor Du das jetzt einsetzt, schau Dir bitte vorher die Klassen NotesDocument und NotesUIDocument an - Du kannst es dadurch eher vermeiden, dass Du im QuerySave die nächsten Fehler einbaust.
HTH,
Bernhard
-
Überlesen hast Du nix, aber Code verwendet und diesen nicht verstanden ... Das sollte man nicht machen.
Da hast Du allerdings Recht! :-\
Meine LS-Kenntnisse beschränken sich leider noch auf copy+paste und anpassung von Feld und Maskennamen etc.
Habe einen LS-Kurs beantragt, hoffe, daß er genehmigt wird, damit ich Euch nicht mehr mit solchen Basics nerve. Sorry.
Trotzdem Danke!