Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: redspawn am 23.05.05 - 16:15:07

Titel: Manipulation über DocID
Beitrag von: redspawn am 23.05.05 - 16:15:07
Hallo zusammen,

ich hab folgendes Szenario.

Ich hab eine Maske in der ich allgemeine Firmendaten speichere und eine zweite Maske in der dann Kontaktdaten stehen. Zu einer Firma kann es mehrere Kontakte geben. Bei den Kontakten speichere ich die DocID der Firmenmaske, damit ich später die entsprechenden Kontakte ausfindig machen kann, wenn sich z. B. die Firmenanschrift ändert. Die Firmenanschrift wird in den Kontaktdaten auch noch gespeichert.

Jetzt versuche ich mich gerade dabei einen Agenten zu schreiben, der mir die Firmendaten in der Kontaktmaske ändert sobald ich in der Firmenmaske etwas ändere. Den Agenten rufe ich im QuerySave der Firmenmaske auf!

Jetzt bin ich gerade am rätseln wie ich die entsprechende DocId an den Agenten als Parameter übergeben kann?

Hoffe ihr könnt mir da weiterhelfen...

Gruß
Titel: Re: Manipulation über DocID
Beitrag von: Axel am 23.05.05 - 16:28:35
Hi,

schau dir mal die Klasse NotesAgent und dort insbesondere die Methode Run an. Dort steht alles beschrieben.

Du brauchst allerdings nicht unbedingt einen Agenten.

Du kannst das auch mit einer rekursiven Funktion im QuerySave-Event machen.

Code
Sub UpdateAllResponseDocs( docToCheck As NotesDocument)

On Error Resume Next
Dim responseDocuments As NotesDocumentCollection
Dim responseDoc As NotesDocument
Dim m As Integer

  Print "Updating Response Docs for " & docToCheck.Form(0)

  Set responseDocuments = docToCheck.Responses '...get all immediate responses of this document

  If responseDocuments.Count > 0 Then
    For m = 1 To responseDocuments.Count '..could use your while loop here instead
      Set responseDoc = responseDocuments.GetNthDocument(m)

      '..update your items here

      Call responseDoc.Save (True, True)

      '...this sub gets recursively called until all response docs are updated
      Call UpdateAllResponseDocs( responseDoc )

    Next
End If

End Sub

Beispielaufruf:

Sub Querysave(Source As Notesuidocument, Continue As Variant)

Set curDoc = Source.Document
 
'..code to create the empItems record array has been deleted from here

  Call UpdateAllResponseDocs (curDoc)

End Sub


Axel
Titel: Re: Manipulation über DocID
Beitrag von: umi am 24.05.05 - 08:05:45
Da brauchst Du den Parameter nicht zu übergeben, sondern kannst die DocID des aktuellen Dokuments über die NotesUI Klassen holen.
bsp:
Code
dim uiws as new notesuiworkspace
dim uidoc as notesuidocument
dim doc as notesdocument
dim docid as string
set uidoc = uiws.currentdocument
set doc = uidoc.document
docid=doc.universalid
'so oder so ähnlich
Titel: Re: Manipulation über DocID
Beitrag von: redspawn am 24.05.05 - 13:39:05
gut ich hab das jetzt mal reingebastelt. Jetzt taucht aber das Problem auf, dass er gar keine Responses findet?!?
d. h. er ändert mir auch nix!

Woran könnte das liegen?

Die Kontaktmaske rufe ich mit folgendem Formelbefehl aus der Firmenmaske per Aktionsleiste auf:

@If(@IsDocBeingEdited=0;@Command([Compose]; "Kontakt");@Prompt([YesNo]; "Lotus Notes"; "Möchten Sie dieses neue Dokument Speichern?")=1;@Do(@Command([FileSave]);@Command([EditDocument];0);@Command([Compose]; "Kontakt"));@Return(""))

Könnte es sein, dass er so gar keine Beziehung herstellt?

Dim org As String
org = docToCheck.AdrOrganization

das hab ich mal noch eingebaut um die Daten aus der Firmenmaske auszulesen! In der Variablen steht aber auch nichts drin...

Könnte es da sein, dass ich da mit dem Klassenmodell ein wenig durcheinander komme? Kurz der Weg den ich gehe:

im QuerySave:

Code
Dim curDoc As NotesDocument
Set curDoc = Source.Document
	
Call UpdateAllResponseDocs (curDoc)

und weiter in der Sub Update...:
Code
Sub UpdateAllResponseDocs( docToCheck As NotesDocument)
	
On Error Resume Next
Dim responseDocuments As NotesDocumentCollection
Dim responseDoc As NotesDocument

Dim org As String
...
org = docToCheck.AdrOrganization
...
Set responseDocuments = docToCheck.Responses

Kann es sein, dass ich da mit Vererbung oder Beziehung ein wenig durcheinander komme? oder ist das schon der richtige Weg?

Danke schonmal an alle...!
Titel: Re: Manipulation über DocID
Beitrag von: redspawn am 24.05.05 - 15:40:00
so jetzt ist mir nochmal was aufgefallen...

brauch ich überhaupt den rekursiven Aufruf? Ich hab in meinem Fall an den Antwortdoks keine Anworten mehr dran hängen und in der For-Schleife geht er ja normal alle Responses durch??

Oder bin ich da auf dem Holzweg?

Gruß
Titel: Re: Manipulation über DocID
Beitrag von: Axel am 24.05.05 - 19:42:41
Hi,

was ist den bei der Kontaktmaske für ein Typ eingestellt, Dokument oder Antwort?

Dim org As String
org = docToCheck.AdrOrganization

So kannst du auch keinen Feldwert auslesen.
Damit funtioniert das Auslesen

Dim org As String
org = docToCheck.AdrOrganization(0)

Wenn du keine Antworten auf die Antwortdokumente hast, brauchst du auch keine Rekursion. Aber sie stört auch nicht. Im Hinblick auf eine universelle Verwendbarkeit von Funktionen würde ich das auch so lassen. So kannst du die Funktionen problemlos in andere DBs übernehmen und brauchst nur den Teil anpassen, der für das Aktualisieren der Felder zuständig ist.

Axel
 
Titel: Re: Manipulation über DocID
Beitrag von: redspawn am 25.05.05 - 08:33:28
@Axel: Vielen Vielen Dank!!!

jetzt funzt es. Umgestellt auf Antwort und die (0) angefügt und das ganze geht!!! DANKE nochmal!

Gruß