Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: KSKGG am 24.05.04 - 15:35:48

Titel: Antwortdokumente aktualisieren
Beitrag 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
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: koehlerbv am 24.05.04 - 15:42:37
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.
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Axel am 25.05.04 - 10:46:45
Hi,

ich hab mal so was gemacht. Ich begeb mich mal auf die Suche nach dem Code.

Axel
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Axel am 25.05.04 - 11:57:32
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
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Heiggo am 26.05.04 - 00:57:39
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
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Axel am 26.05.04 - 11:45:02
...
'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
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: KSKGG am 26.05.04 - 12:32:07
Hallo,

danke an alle hat mit dem letzten Hinweis von Axel funktioniert.

Gruß

Holger :) :)
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Heiggo am 26.05.04 - 18:47:15
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

Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Schnulli am 29.06.04 - 16:02:12
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 ...
 ???
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Axel am 29.06.04 - 16:15:07
Hi,

das ist relativ einfach. Ich hab's weiter oben schon mal gepostet.

Hier nochmal in entwas einfacherer Form.

Zitat
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
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Schnulli am 29.06.04 - 16:27:24
Sorry!  :-X

Wer lesen kann, ist klar im Vorteil!!!!  :-\

Vielen Dank, werde es gleich ausprobieren!
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Axel am 29.06.04 - 16:32:52
Hi,

kein Problem. Das passiert jedem von uns.  ;)


Axel
 
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Schnulli am 29.06.04 - 17:32:57
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???
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: koehlerbv am 29.06.04 - 17:42:25
Ü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
Titel: Re:Antwortdokumente aktualisieren
Beitrag von: Schnulli am 30.06.04 - 09:40:23
Ü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!