[gelöst] Daten von Seite 1 auf angehängte Seite übernehmen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst] Daten von Seite 1 auf angehängte Seite übernehmen

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von opiWahn » Do, 07.04.2011 19:46

Hallo DPunch,
Ich schreib das doch nicht zum Spass da hin, sondern um Dir Deinen Fehler zu zeigen.
Nee, zum Spass ist das ganz sicher nicht und ich freue mich, daß ich mit deiner Hilfe jetzt auch die ersten Meilensteine geschafft habe.
Vieleicht sollte ich an dieser Sache eher zu Hause und oder "Nachts" arbeiten, da stelle ich mich nicht ganz so oft so dusselig an und es wäre gleich klar gewesen.
Wenn er nach der Änderung die gleiche Fehlermeldung eine Zeile tiefer ausspuckt, und die beiden Zeilen auch noch sehr ähnlich klingen, dann sollte man vieleicht an dieser Stelle genau das gleiche tun :)

Code: Alles auswählen

				
If oHauptform.hasByName(oText(i).Name) Then
   oText(i).Text = oHauptform.getByName(oText(i).name).Text
  else
  oText(i).Text = "keine Daten"
  End If	
Sorry, da konnte ich dann im nachhinein deiner Ärger verstehen - ich hatte den Code geändert bevor ich hier nochmal reingeschaut habe. Vielen Dank noch mal!

Obgleich die Zeit nicht mehr so drängt (bestenfalls hätte ich den heutigen Stand bereits am Dienstag erreicht) und jetzt fürs erste die MS-Lösung der Kollegin favorisiert wurde, dachte ich mir ich nehms sportlich und mach "nebenbei" weiter. Nur weil einer als erstes in Ziel kommt muß ich ja nicht stehen bleiben!

Auch so - das wichtigste hätt ich doch fast vergessen: ES FUNKTIONIERT :D

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von DPunch » Do, 07.04.2011 19:01

Aloha
opiWahn hat geschrieben:da weder (...) noch (...) funktioniert.
Was funktioniert nicht?
Mit "nicht funktionieren" meinst Du doch hoffentlich nicht
opiWahn hat geschrieben:daß er mit der gleichen Fehlermeldung schon eine Zeile weiter ist
oder?

Wenn es wirklich daran hängen sollte, dann lies Dir doch bitte nochmal durch, was ich geschrieben hatte:
oText(i) enthält ja auch keinen Namen, sondern ein Textfeld.
Ich schreib das doch nicht zum Spass da hin, sondern um Dir Deinen Fehler zu zeigen.

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von opiWahn » Do, 07.04.2011 16:24

Allerdings bist Du auf diesem Weg immer noch darauf angewiesen, dass alle Steuerelemente von vornherein bekannt sind und namentlich im Code verankert sind.
das scheine ich auf jeden Fall zu sein, da weder
If oHauptform.hasByName(oFeld(i)) Then

noch
If oHauptform.hasByName(oText(i).Name) Then
funktioniert.
Sieht man mal davon ab, daß er mit der gleichen Fehlermeldung schon eine Zeile weiter ist :)

Code: Alles auswählen

oText(i).Text = oHauptform.getByName(oText(i)).Text

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von DPunch » Do, 07.04.2011 15:23

Aloha
opiWahn hat geschrieben:Ihm passt aber jetzt diese Zeile nicht "If oHauptform.hasByName(oText(i)) Then" nicht <- Fehler: falscher Wert für die Eigenschaft
Natürlich, oText(i) enthält ja auch keinen Namen, sondern ein Textfeld.

Entweder machst Du das mit dem Array der Namen

Code: Alles auswählen

If oHauptform.hasByName(oFeld(i)) Then
oder über den Namen des Textfeldes

Code: Alles auswählen

If oHauptform.hasByName(oText(i).Name) Then
Allerdings bist Du auf diesem Weg immer noch darauf angewiesen, dass alle Steuerelemente von vornherein bekannt sind und namentlich im Code verankert sind.

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von opiWahn » Do, 07.04.2011 15:12

Hi DPunch,

noch nicht ganz, aber bestimmt auch nicht ganz weit weg :)
Aus deinem Hinweis folgerte ich diese Lösung:

Code: Alles auswählen

...
' FormObjects
Dim oForm As Object
Dim oFeld(10)
Dim oText(10)
Dim TempText$
Dim aOpt1(), aOpt2(), aOpt3(), aOpt4()
Dim s1_1$, s1_2$, s2_1$, s2_2$, s3_1$, s3_2$, s4_1$, s4_2$

' ErrorProof
Dim grpfail1, grpfail2, grpfail3, grpfail4 
Dim errormsg1$

' save odt/PDF 
Dim datname$, path$, extension$, odturl$, pdfurl$

' addForm
dim document As Object, dispatcher As Object

' fillUform
Dim oHauptform As Object, oUnterform As Object
...
'--------------------------------------------------------------------------------------------- funktioniert
Sub addPruefForm_TT

  oViewCursor = thisComponent.getCurrentController.getViewCursor
  oViewCursor.jumpToLastPage(true)
  oViewCursor.jumpToEndofPage(true)
  
  Dim args2(0) as New com.sun.star.beans.PropertyValue
  oText = thisComponent.getText()   
  oTextCursor = oText.createTextCursor
  oTextCursor.gotoEnd(False)
  oTextCursor.BreakType = com.sun.star.style.BreakType.PAGE_AFTER
  oText.insertControlCharacter(oTextCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
  sInhalt="file:///C:/xxx/xtFormulare/Pruefform_TT.odt"
  filetoinsert=converttourl(sInhalt)
  oTextCursor.InsertDocumentFromUrl(FileToInsert,args2())

'Daten übergeben
fillUform

End Sub


'--------------------------------------------------------------------------------------------- Baustelle!
Sub fillUform

	oHauptform = thisComponent.Drawpage.Forms.getByIndex(0)
	oUnterform = thisComponent.Drawpage.Forms.getByIndex(thisComponent.Drawpage.Forms.Count - 1)
	oFeld() = Array ("o_anrede", "o_name", "o_titel", "o_strasse", "o_ort")
	
		for i = 0 to 4
		
			oText(i) = oUnterform.getByName(oFeld(i))
			
				If oHauptform.hasByName(oText(i)) Then
  					oText(i).Text = oHauptform.getByName(oText(i)).Text
  				else
  					oText(i).Text = "keine Daten"
				End If	
			
		next i
		
End sub
Habs in eine eigene Sub gesetzt, da es noch andere Formulare zum Anfügen geben wird.
Ihm passt aber jetzt diese Zeile nicht "If oHauptform.hasByName(oText(i)) Then" nicht <- Fehler: falscher Wert für die Eigenschaft

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von DPunch » Do, 07.04.2011 13:32

Aloha
opiWahn hat geschrieben:(...)und diese Sub mit dem Event "beim Laden"(...)
Events im zweiten Formular bringen Dir rein gar nichts, da mit dem Dokument an sich nichts gemacht wird, es wird lediglich der Inhalt übernommen.
Das gleiche gilt für Makros, in dem einzufügenden Formular gespeicherte Makros werden *nicht* übernommen und können natürlich auch nicht ausgeführt werden.

Von daher gibt es ja nur noch eine Antwort auf die Frage
opiWahn hat geschrieben:...wie und wo schubbs ich die Schleife an?
;)

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von opiWahn » Mi, 06.04.2011 21:10

Hi DPunch,
Du musst die Schleife selbstverständlich laufen lassen *nachdem* Du das (Formular-)Dokument eingefügt hast. Vorher gibt es Dein zweites Formular aus Sicht von "thisComponent" nicht.
Tja, und wie und wo schubbs ich die Schleife an?
Daß die beiden, Haupt- und Unterformular, noch nichts von einander wissen, solange sie nicht zusammengeführt wurden ist soweit ja verständlich.
Deswegen habe ich den Code (fillForm) im Unterformular und diese Sub mit dem Event "beim Laden" (was sinnvolleres hab ich nicht gesehen) im gleichen (Unter)Formular verknüpft.
Ich ging von dem Prozedere aus, daß ich im ersten Schritt das Hauptformular öffne und dann zunächst die Felder fülle. Im zweiten Schritt hänge ich dann erst die Unterform an.
In diesem Moment muß dann die "fillForm" in Aktion treten.
Aber, und damit endet die Schleife :)
... wie und wo schubbs ich die Schleife an?

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von DPunch » Mi, 06.04.2011 17:44

Aloha
opiWahn hat geschrieben:(...)bleibt die im Anschluss angehängte Unterform trotzdem leer.
Im Anschluss angehängt?
Dann kann das natürlich nicht funktionieren.
Du musst die Schleife selbstverständlich laufen lassen *nachdem* Du das (Formular-)Dokument eingefügt hast. Vorher gibt es Dein zweites Formular aus Sicht von "thisComponent" nicht.

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von opiWahn » Mi, 06.04.2011 17:26

Hallo DPunch,

Danke erstmal für den Code, die Erklärungen und vorallem die Geduld, mit der du immer wieder zur Seite stehst.
Ich hab's mal wie folgt im Unterformular übernommen, das, wie du richtig vermutet hast, x-mal am Schluss angehängt werden kann:

Code: Alles auswählen

'  *****  Prüfformular  *****
'  *****  Mrz/Apr. 2011 *****

' FormObjects
Dim oHauptform As Object, oUnterform As Object
Dim oFeld(5)
Dim oText(5)

Sub fillForm

	oHauptform = thisComponent.Drawpage.Forms.getByIndex(0)
	oUnterform = thisComponent.Drawpage.Forms.getByIndex(thisComponent.Drawpage.Forms.Count - 1)
	oFeld() = Array ("o_anrede", "o_name", "o_titel", "o_strasse", "o_ort")
	
		for i = 0 to 4
		
			oText(i) = oUnterform.getByName(oFeld(i))
			
				If oHauptform.hasByName(oFeld(i)) Then
  					oText(i).Text = oHauptform.getByName(oFeld(i)).Text
  				else
  					oText(i).Text = "keine Daten"
				End If	
			
		next i
		
end sub
Die Sub fillForm rufe ich dann im selbigen Formular "beim laden".
Irgendwo scheint aber noch was zu fehlen. Wenn ich die Hauptform lade und die Daten einspiele, bleibt die im Anschluss angehängte Unterform trotzdem leer.

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von DPunch » Mi, 06.04.2011 13:41

Aloha
opiWahn hat geschrieben:Auf dieser Unterseite müßte ich zuvor die Textfelder dann mit .getbyindex(1) zuweisen.
Soweit zur Theorie ...
Ich glaube, Du hast da etwas nicht ganz bzw. falsch verstanden.
.getbyindex(n) hat erstmal rein gar nichts mit der Seite zu tun, sondern gibt aus allen Formularen auf der Drawpage das mit dem Index n zurück.

Code: Alles auswählen

oHauptformular = thisComponent.Drawpage.Forms.getByIndex(0)
Nach dem Anhängen des anderen Formulars wird dieses in die Forms-Collection eingegliedert (wobei ich fürs erste nur vermuten kann, dass das neue Formular immer ans Ende gesetzt wird, aber das lässt sich ja problemlos rausfinden).

Code: Alles auswählen

oAngehaengtesFormular = thisComponent.Drawpage.Forms.getByIndex(thisComponent.Drawpage.Forms.Count - 1)
Ist das zweite Formular erstmal eingehängt, hast Du also *zwei* Forms auf Deiner Drawpage und jedes Steuerelement ist genau *einer* dieser beiden zugeordnet.
Mit diesem Wissen holst Du Dir dann ganz einfach die Inhalte und überträgst sie

Code: Alles auswählen

oHauptformular = thisComponent.Drawpage.Forms.getByIndex(0)
oAngehaengtesFormular = thisComponent.Drawpage.Forms.getByIndex(thisComponent.Drawpage.Forms.Count - 1)
oText = oAngehaengtesFormular.getByName("o_anrede")
If oHauptformular.hasByName("o_anrede") Then
  oText.Text = oHauptformular.getByName("o_anrede").Text
End If
Das Ganze kannst Du dann noch z.B. in eine Schleife packen, die sich alle Steuerelemente des angehängten Formulars anschaut, überprüft, ob ein Steuerelement gleichen Typs und gleichen Namens im Hauptformular vorhanden ist, und wenn ja, die Werte überträgt. Dann ist dem Makrocode auch egal, welchen Namen die Steuerelemente haben bzw. welches Formular angehängt wurde, wichtig ist in dem Fall nur, dass die entsprechenden Steuerelemente in Haupt- und angehängtem Formular gleich heissen.
opiWahn hat geschrieben:Hole ich mir die Daten von oben nach unten
oder schicke ich das Zeug von oben nach unten?
Das ist für die Praxis vollkommen wurst, ausgehend davon, dass das Hauptformular immer mehr Steuerelemente besitzt als ein angehängtes Formular, ist der effizientere Weg allerdings der, sich die Daten ausgehend vom angehängten Formular zu holen.

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von opiWahn » Mi, 06.04.2011 09:59

Hallo DPunch,

sorry, aber ich versteh's nicht :(
Hole ich mir die Daten von oben nach unten
oder schicke ich das Zeug von oben nach unten?

Wie ich ja auch schon vermutete gibt mir ....getbyindex(n) die jeweilige Seite an. 0 wäre dann die erste - oder?
Demnach würde es Sinn machen, den Code in dem "Unterformular" unterzubringen und formal ausgedrückt zu sagen:
Gehe zu Seite 0 (.getbyindex(0)) und lese was in oText(i).text steht. Weise dann diesen Inhalt oUFText(i).text zu ( oUFText(i) = oText(i) ).
Auf dieser Unterseite müßte ich zuvor die Textfelder dann mit .getbyindex(1) zuweisen.
Soweit zur Theorie ...

Re: Daten von Seite 1 auf angehängte Seite übernehmen

von DPunch » Mo, 04.04.2011 15:16

Aloha
opiWahn hat geschrieben:Formal ausgedrückt soll das etwa so funktionieren:
Gehe auf Seite 1 und gib mir den Inhalt von Textfeld1, trage diesen im Textfeld1 der Seite n (eigene) ein.
Textfeld2, 3, ... analog

Wie komme ich aber ausgehend von Seite n an die "Daten" von Seite1?
Die Steuerelemente sind immer genau einer Form zugeordnet. Diese kannst Du einfach per Namen oder per Index ansprechen.

Code: Alles auswählen

oForm = thisComponent.drawpage.forms.getbyindex(0)
Damit erhältst Du das Hauptformular, angehängte Formulare sollten in der Regel bei Index 1, 2 etc liegen.

[gelöst] Daten von Seite 1 auf angehängte Seite übernehmen

von opiWahn » Mo, 04.04.2011 10:28

Hallo,

ich habe ein Hauptformular, dessen Textfelder über eine Datenbankabfrage gefüllt werden.
Nun gibt es weitere "unabhängige" Formulare die angehängt werden sollen. Beides funktioniert bis dahin.
Wie kann ich den jeweiligen Inhalt von den Textfelder des Hauptformular nach dem Anhängen des Unterformular in dessen Textfelder bringen?
Die Textfelder haben in Haupt- und Unterformular die gleichen Namen, nur Hauptform hat DB-Verbindung.

Formal ausgedrückt soll das etwa so funktionieren:
Gehe auf Seite 1 und gib mir den Inhalt von Textfeld1, trage diesen im Textfeld1 der Seite n (eigene) ein.
Textfeld2, 3, ... analog

Wie komme ich aber ausgehend von Seite n an die "Daten" von Seite1?

Bieher sieht das ganze (in Auszügen) so aus:
Hauptformular

Code: Alles auswählen

' Database
Dim Context As Object, DB As Object, Connection As Object, QueryErg As Object
Dim DBName As String, SQL As String
Dim Statement As Variant

' FormObjects
Dim oForm As Object
Dim oText(11) 

'--------------------------------------------------------------------------------------------- Baustelle!
'Sub clearForm

'end Sub

'--------------------------------------------------------------------------------------------- Teilbaustelle!
Sub Value_ANr

'clearForm  
  
	oANr = inputBox ("Auftragsnummer","Eingabe erforderlich","Bitte Auftragsnummer eingeben")
	oForm = thisComponent.drawpage.forms.getbyindex(0)
	oText(1) = oForm.getByName("o_anrede")
	oText(2) = oForm.getByName("o_name")
	oText(3) = oForm.getByName("o_titel")
	oText(4) = oForm.getByName("o_strasse")
	oText(5) = oForm.getByName("o_ort")
	oText(6) = oForm.getByName("r_anrede")
	oText(7) = oForm.getByName("r_name")
	oText(8) = oForm.getByName("r_titel")
	oText(9) = oForm.getByName("r_strasse")
	oText(10) = oForm.getByName("r_ort")
	oText(11) = oForm.getByName("langtext")
	oEdit = oForm.getByName("chk_edit")
	
   		DBName = "REPARATUR"
		Context = createUnoService("com.sun.star.sdb.DatabaseContext")
		DB = Context.GetByName (DBName)
		Connection = DB.GetConnection ("","")
		Sql = "SELECT `objekt_anrede`,`objekt_name`,`objekt_titel`,`objekt_strasse`,`objekt_ort`,`rechnung_anrede`,`rechnung_name`,`rechnung_titel`,`rechnung_strasse`,`rechnung_ort`,`langtext` FROM `REPARATUR` WHERE `key` = '"+oANr+"';"	
		
		Statement = Connection.CreateStatement
		QueryErg = Statement.ExecuteQuery(SQL)
		
		for i = 1 to 11
			oText(i).text = trim(QueryErg.GetString(i))
			if i = 11 then
				TempText = trim(QueryErg.GetString(i))
				oText(i).text = Replace(TempText, Chr(10)+ Chr(13), "")
			end if
		next i
				
		Connection.Close()
		
		if oEdit.state(1) then
			for i = 1 to 10
				oText(i).ReadOnly = false			
			next i
		end if
	
End Sub
Unterformular:

Code: Alles auswählen

' FormObjects
Dim oForm As Object
Dim oText(5) 

Sub fillForm

	oForm = thisComponent.drawpage.forms.getbyindex(0) <-- 0= Seitenzahl? also Seite1?
	oText(1) = oForm.getByName("o_anrede")
	oText(2) = oForm.getByName("o_name")
	oText(3) = oForm.getByName("o_titel")
	oText(4) = oForm.getByName("o_strasse")
	oText(5) = oForm.getByName("o_ort")
	
		for i = 1 to 5
			oText(i).text =... ???
		next i
Danke schon mal im Voraus

Nach oben