Autor Thema: Datenübertragung zwischen Dokumenten  (Gelesen 3777 mal)

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Datenübertragung zwischen Dokumenten
« 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?

Offline Alexis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 534
  • Geschlecht: Männlich
  • LotusNotes macht süchtig!
Re: Datenübertragung zwischen Dokumenten
« Antwort #1 am: 13.10.05 - 11:48:39 »
Such doch mal unter:

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

Alexis
wenn ich kein Problem hätte, wär' ich nicht hier ---
wenn ich im Forum eine Lösung gefunden hätte, wär' ich nicht hier ---
wenn ich nicht wüsste, dass mir hier fast immer geholfen wird, wär' ich AUCH nicht hier ---

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Datenübertragung zwischen Dokumenten
« Antwort #2 am: 13.10.05 - 11:51:55 »
... oder schau hier nach:
Das Arbeiten mit Haupt- und Antwort-Dokumenten

Bernhard

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Datenübertragung zwischen Dokumenten
« Antwort #3 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ß.



Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Datenübertragung zwischen Dokumenten
« Antwort #4 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Datenübertragung zwischen Dokumenten
« Antwort #5 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Datenübertragung zwischen Dokumenten
« Antwort #6 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
« Letzte Änderung: 13.10.05 - 14:57:07 von Axel »
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Datenübertragung zwischen Dokumenten
« Antwort #7 am: 13.10.05 - 14:38:52 »
Jetzt werd ich erstmal testen warum der Event nicht anspringt.

Danke aber schonmal!

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Datenübertragung zwischen Dokumenten
« Antwort #8 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?

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Datenübertragung zwischen Dokumenten
« Antwort #9 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

Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: Datenübertragung zwischen Dokumenten
« Antwort #10 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
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Datenübertragung zwischen Dokumenten
« Antwort #11 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


Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: Datenübertragung zwischen Dokumenten
« Antwort #12 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

Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Andreas Huhn

  • Senior Mitglied
  • ****
  • Beiträge: 251
  • Geschlecht: Männlich
    • Private Homepage + eigene Software-Tools
Re: Datenübertragung zwischen Dokumenten
« Antwort #13 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!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz