Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Andreas Huhn am 13.10.05 - 10:35:24

Titel: Datenübertragung zwischen Dokumenten
Beitrag von: Andreas Huhn am 13.10.05 - 10:35:24
Moin,

beim öffnen einer Maske (Child) aus einer anderen Maske (Parent) heraus werden zur Zeit ein paar der Daten im Kopf automatisch übertragen und in die Maske übernommen. Beispielsweise Projektnummer.

Bezüglich der Funktionsweise habe ich nur eine leichte Ahnung. Die Felder scheinen die gleichen Namen zu haben und tragen als Vorgabewert ebenfalls ihren Feldnamen.

Nach dem kopieren und einfügen eines solchen Dokuments unter einen anderen Parent stimmen diese Kopfdaten natürlich nicht mehr und müssten neu aus dem übergeordneten Dokument bezogen werden.

Aber wie kann ich darauf zugreifen?
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Alexis am 13.10.05 - 11:48:39
Such doch mal unter:

"Haupt- und Antwort-Dokumente auf Basis einer Maske"

Alexis
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: koehlerbv am 13.10.05 - 11:51:55
... oder schau hier nach:
Das Arbeiten mit Haupt- und Antwort-Dokumenten (http://www.atnotes.de/index.php?topic=13984.0)

Bernhard
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Andreas Huhn am 13.10.05 - 13:32:11
Hab mich jetzt da durch gelesen und folgende Funktion sieht interessant aus:


3.4 Felder in allen Antwortdokumenten aktualisieren, sobald sich diese im Hauptdokument ändern


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



Gehört das (0) zum Feldnamen oder hat es syntaktische Bewandnis?

Wenn ich das in einer Ansicht unter PostPaste einfügen will funktioniert es nicht mehr, weil er die Objekte nicht erkennt, bzw. es nicht

Source As Notesuidocument

... sondern ...

Source As Notesuiview

heißt.

Werd jetzt mal ein bischen die DOM durschauen, aber vielleicht kann mir jemand auch noch auf die Sprünge helfen wie ich den Code anpassen muß.


Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Axel am 13.10.05 - 13:49:40
Gehört das (0) zum Feldnamen oder hat es syntaktische Bewandnis?

Die 0 hat eine syntaktische Bewandnis. Wenn du mit der Backendklasse NotesDocument auf ein Feld zugreifst, bekommst du immer einen Variantwert mit 1 bis x Einträgen (kann ja auch ein Mehrfachfeld sein). Mit (0) sprichst du den ersten Eintrag des Rückgabewerte an.

Schau dir mal in der Designer-Hilfe GetItemValue in der Klasse NotesDocument an.


Wenn du das in einen Ansichten-Event einfügst kann das so auch nicht funktionieren.

Ich habe den Code mal auf die Schnelle umgesetzt. Ich hoffe das funktioniert so. Ich bin mir nämlich ganz sicher, ob du mit Source.Documents die eingefügten Dokumente bekommst.


Code
Sub Postpaste(Source As Notesuiview)

Dim docCol As NotesDocumentCollection
Dim responseCol  As NotesDocumentCollection
Dim doc As NotesDocument

'eingefügtes Dokument(0) in Collection aufnehmen
Set docCol = Source.Documents 

Set doc = docCol.GetFirstDocument  'Auf erstes Dokument in der Collection zugreifen
While Not (doc Is Nothing)

  '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) )

  Set doc = docCol.GetNextDocument(doc)  'auf nächstes Dokument zugreifen

Wend

	
End Sub



Axel
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Andreas Huhn am 13.10.05 - 14:08:00
Hab erst gemerkt daß das gewünschte Feld nicht angepasst wird. Allerdings wird die eingebaute messagebox auch nicht ausgeworfen.

Vorgehen ist folgendes:

Markiere in der Ansicht eine Child-Zeile
STRG+C
Markiere eine andere Parent-Zeile
STRG+V

Das müsste doch das PostPaste-Event auslösen, oder?




Code
Sub Postpaste(Source As Notesuiview)
	
	Dim docCol As NotesDocumentCollection
	Dim responseCol  As NotesDocumentCollection
	Dim doc As NotesDocument
	
'eingefügtes Dokument(0) in Collection aufnehmen
	Set docCol = Source.Documents 
	
	Set doc = docCol.GetFirstDocument  'Auf erstes Dokument in der Collection zugreifen
	While Not (doc Is Nothing)
		
  '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( "ProjectNo" , doc.ProjectNo(0) )

		Messagebox "test"
		
		Set doc = docCol.GetNextDocument(doc)  'auf nächstes Dokument zugreifen
		
	Wend
	
	
End Sub
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Axel am 13.10.05 - 14:29:27
Hi,

ich hab's mal getestet. Bei mir wird der PostEvent ausgelöst. Warum's bei dir nicht geht kann ich im moment nicht nachvollziehen.

Aber..., trotzdem kannst du den Code so nicht nutzen. Denn die Collection mit Source.Documents enthält die eingefügten Dokument, d.h. die Antwortdokumente und da wirst du mit der Abfrage mit Responses Pech haben.

Eine mögliche Lösung wäre das Abfrage der ParentDocumentUNID des eingefügten Dokumentes. Damit kannst du auf das Hauptdokument zugreifen und die Felder entsprechend abgleichen.

Axel
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Andreas Huhn am 13.10.05 - 14:38:52
Jetzt werd ich erstmal testen warum der Event nicht anspringt.

Danke aber schonmal!
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Andreas Huhn am 17.10.05 - 10:08:19
Hab jetzt noch mal rumprobiert und obwohl ich weder was an den Einstellungen noch am Code geändert hab springt der Event jetzt plötzlich an.

Zitat
Eine mögliche Lösung wäre das Abfrage der ParentDocumentUNID des eingefügten Dokumentes. Damit kannst du auf das Hauptdokument zugreifen und die Felder entsprechend abgleichen.

Also mit der ParentDocumentUNID property und der GetDocumentByUNID Mehtode oder?


Set docCol = Source.Documents
   
Set doc = docCol.GetFirstDocument


Set docUnid = doc.ParentDocumentUNID

Aber wie kann ich dann den Abgleich machen?
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Axel am 17.10.05 - 10:16:17
Hi,

in dem Fall musst du alle in Frage kommenden Felder einzeln angeben.

Set docUnid = doc.ParentDocumentUNID
...

docUnid.Feldname = doc.Feldname
...
Call docUnid.Save(True, False)
...


Axel

Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: umi am 17.10.05 - 10:17:42
Da war Axel schneller :--)
ja genau

z.b. mit

...
on error 4091 resume next

set parentDoc = db.getDocumentByUnid(docunid)
if not parentDoc is nothing then
doc.Feld = parentdoc.getitemvalue("Feld")(0)
.
.
.

end if
Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Andreas Huhn am 17.10.05 - 10:33:43
Hallo Umi, hallo Axel,

kriegs noch nicht ganz hin:

Code

Sub Postpaste(Source As Notesuiview)
	
	Dim docUnid As NotesDocument
	Dim docCol As NotesDocumentCollection
	Dim doc As NotesDocument
	
	
	
	Set docCol = Source.Documents 
	
	Set doc = docCol.GetFirstDocument
	
	Set docUnid = doc.ParentDocumentUNID
	
	docUnid.ProjectNo = doc.ProjectNo
	
	Call docUnid.Save(True, False)
	
	
	Messagebox "test"
	
	
End Sub

Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: umi am 17.10.05 - 10:42:28
Code

Sub Postpaste(Source As Notesuiview)
	
	Dim docUnid As NotesDocument
	Dim docCol As NotesDocumentCollection
	Dim doc As NotesDocument
	dim db as notesdatabase
		
	Set docCol = Source.Documents 

	Set doc = docCol.GetFirstDocument
	set db = doc.parentDatabase
	
               on error 4091 resume next
	Set docUnid = db.getDocumentByUnid(doc.parentDocumentUNID)
	if not docUnid is nothing then
	docUnid.ProjectNo = doc.ProjectNo
	
	Call docUnid.Save(True, False)
	end if
	
	Messagebox "test"
	
	
End Sub

Titel: Re: Datenübertragung zwischen Dokumenten
Beitrag von: Andreas Huhn am 17.10.05 - 10:59:21
Klasse, nun klappts! Danke!

Lese grad noch ein wenig in der Hilfe über die Save-Methode und allgemein das Error-Handlich nach.

Vielen Dank euch beiden!