TextTabelle in anderem Formular füllen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

petzy
Beiträge: 7
Registriert: So, 10.05.2009 17:27

TextTabelle in anderem Formular füllen

Beitrag von petzy »

Ich habe ineiner Funktion eine SQL-Abfrage formuliert und führe die in einem RowSet aus. Das Ergebnis soll eine Texttabelle in einem anderen Formular ("DruckForm") füllen.

Das Formular Druckform enthält lediglich (2) Texttabellen und Schaltflächen

Wenn ich die Funktion (s. unten) von dem Formular "Druckform" aufrufe, läuft das.
Wenn ich das in die Funktion einbinde, die das Formular Druckform aufruft oder eine eigene Funktion daraus mache (die nicht aus dem Formular "Druckform" aufgerufen wird), wird die Texttabelle nicht gefunden.
Bei dem Aufruf aus der anderen Funktion muss logischerweise dann noch die Adresse der Zelle und der Inhalt mitgegeben werden.

Ich Arbeite mit OO 3.2 unter Windowx XP.

Die Funktion lautet

Code: Alles auswählen

Sub TestTable
		REM Variablen
	Dim oDoc as object, oTxt as object
	DIM oEnum as Object, oTxtElement as Object, n as integer
	DIM oTab as Object
	
	REM TextObjekte nach Tabelle durchsuchen
	oDoc = ThisComponent
	oTxt = odoc.text
	
	oEnum = oTxt.createEnumeration

	Do While oEnum.hasMoreElements 
	  oTxtElement = oEnum.nextElement
	  ' Suchelement => Texttabelle
	  if oTxtElement.supportsService("com.sun.star.text.TextTable")	 Then
	  	' aus dem Objekt oTxtElement lassen sich die Eigenschaften (der Tabelle) auslesen.
	    msgbox oTxtElement.name
	    if oTxtElement.name = "TabRezept" then
	    	oTab = otxtElement
	    end if
	    oZelle = oTab.getCellByPosition(0	,0)		'= Zelle A1
	    oZelle.SetString("Eingabe")
	  end if
	loop

end sub

Ich habe schon verzweifelt nach dem Grund gesucht, warum das nur läuft, wenn die Funktion aus dem Formular heraus aufgerufen wird und nicht, wenn der Aufruf aus einen anderen Formular heraus erfolgt.
Ich habe auch versucht, die lösung aus meiner letzten (ähnlichen?) Frage (Formular mit Filter oder SQL Öffnen) entsprechend abzuwandeln, aber leider ohne Erfolg. :(
Ich habe nur eine nebulöse Vorstellung davon, warum das nicht funktioniert, und hoffe auf Hilfe (und einer Erklärung).

Vielen Dank schon mal.
Petzy

Ich kenne keinen sicheren Weg zum Erfolg, nur einen zum sicheren Misserfolg
es jedem recht machen zu wollen.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: TextTabelle in anderem Formular füllen

Beitrag von DPunch »

Aloha

Auf welche Art referenzierst Du denn das aufgerufene Formular?

Das Makro in dieser Form kann natürlich nur die Tabellen im aufrufenden Formular finden.
petzy
Beiträge: 7
Registriert: So, 10.05.2009 17:27

Re: TextTabelle in anderem Formular füllen

Beitrag von petzy »

Hi,

der Aufruf erfolgt aud dem Formular "Rezept" heraus. Aus einem Textfeld davon lese ich den Suchbegriff für die SQL-Abfrage aus.
Über eine Schaltfläche wird das Formular "Druckform" geöffnet. (Ich denke, das geht auch kürzer, ohne alle Formulare auszulesen und dann das richtige zu öffnen: Das ist aber weniger mein Problem).
Dieser Code lautet:

Code: Alles auswählen

Sub DruckForm_aufr
REM Ausfruf durch Button  aus Formular Rezept
' Textfeld RezeptID auslesen und mitgeben
	DIM sFormularName as string, oContext as Object, oDatenbank as Object
        ...
	sFormularName = "DruckFormRez"
	REM Textfeld auskesen
	oDoc=ThisComponent 									' Zugriff auf ListBox
	oForm = oDoc.DrawPage.Forms.getByName("MainForm")
	oTextf = oForm.GetByName("TFrezid")					' Name TextFeld
	iRezeptID  = otextf.text
        REM ALLE Formulare und Berichte
	aFormulare = StarDesktop.CurrentComponent.getParent.getFormDocuments().getElementNames()
	REM das richtige suchen
	for i = lBound(aFormulare) to uBound(aFormulare)
		if aFormulare(i) = sFormularName then
			oContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
			oDatenbank = oContext.getByName(StarDesktop.CurrentComponent.getParent.getLocation())
			oVerb = oDatenbank.getConnection("","")
			arg(0).Name = "OpenMode"
			arg(0).Value = "open"
			arg(1).Name = "ActiveConnection"
			arg(1).Value = oVerb
			oForm = StarDesktop.CurrentComponent.getParent.getFormDocuments().loadComponentFromURL(aFormulare(i), "", 0, Arg())
                       Rem Tabelle Füllen
			DruckFormFuell(iRezeptID)
			Exit Sub
		end if
	next
End Sub
Damit wird dann die nachstehende Funktion aufgerufen. Wobei ich darauf hinweisen muss, dass die noch nicht vollständig ist.
Es fehlt noch die Übergabe der weiteren Felder des Ergebnissatzes und das Einfügen von Zeilen in der 2. Tabelle. (Das kriege ich dann hoffentlich hin, wenn ich den Zugriff auf die Tabelle bekomme)

Code: Alles auswählen

Sub DruckFormFuell(RezID as Integer)
	REM Formular Druckform ist geöffnet
	' Füllen der Tabellenfelder über SQL ... WHERE RezeptID = RezID
	DIM DataBaseContext as Object, oDQ as Object, oHandler as Object 
        ....
	REM SQL:
	sSQL = "SELECT ""Rezept"".""RezeptID"", ""Rezept"".""RezeptName"", ""Rezept"".""Bemerkungen"", ""Rezept"".""Speisefolge"", "
        ...
	sSQL = sSQL & "WHERE ""VerwendetZutaten"".""RezeptID"" = ""Rezept"".""RezeptID"" AND ""ZutatenListe"".""ID"" = "
	sSQL = sSQL & """VerwendetZutaten"".""LebensmittelID"" AND ""Rezept"".""RezeptID"" = "
	sSQL = sSQL & RezID
	REM RowSet
	DataBaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	oDQ = DataBaseContext.getByName("RezeptDB")
	if not oDQ.isPasswordRequired then
		oDatVerb = oDQ.getConnection("","")
	else
		oHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
		oDatVerb = oDQ.connectWithCompletion(oHandler)
	end if
	oStatement = oDatVerb.createStatement()
	oErgSet = oStatement.executeQuery(sSQL)
	
     Hier habe ich vergeblich versucht, den ZUgriff auf die Tabelle direkt einzubauen	
'	oTab1 = oDoc.getTextTables().getByName("TabRezept")
'	oZelle = oTab.getCellByPosition(1	,1)		'Zelle A1

	REM SQLauswertung
	i = 1
	if not IsNull(oErgSet) then
		Do While oErgSet.Next
			redim preserve aErgeb(i)		'Array neu dekl. INHALT BLEIBT erhalten (preserve)
			REM RezeptDaten (im Gegensatz zu Zutaten) nur EINMAL auslesen
			if i = 1 then
				aErgeb(i) = oErgSet.getString(2)	'Rezeptname
			end if
			Redim Mngneinh(i)
			Mngneinh(i) = oErgSet.getString(15)		'Index 15 zu groß??
			Redim Mnge(i)	
			Mnge(i) = oErgSet.getFloat(16)			' get .. DezimalZahl!!!
			Redim Lebensm(i) 
			Lebensm(i) = oErgSet.getString(19)
			i= i+1
		loop
	end if
End Sub
Meine Versuche gingen über die Drawpage, aber die gibts nicht, oder da kam ich nicht weiter.

Für Hilfe bin ich weiterhin dankbar.
Petzy

Ich kenne keinen sicheren Weg zum Erfolg, nur einen zum sicheren Misserfolg
es jedem recht machen zu wollen.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: TextTabelle in anderem Formular füllen

Beitrag von DPunch »

Aloha

Auf den ersten Blick ist das Problem ganz einfach gelagert (und war es anscheinend auch schon bei Deinem letzten Problem dieser Art):

Die Verwendung von "oDoc" bzw "thisComponent".

Stell es Dir so vor (vereinfacht und unter der Annahme, dass oDoc ausserhalb einer Prozedur definiert wurde und somit mindestens Modulweit bekannt ist)
Du hast ein Formular A.
Mit >>oDoc = thisComponent<< weist Du der Variable "oDoc" eine Referenzierung auf das OOo-Dokument zu, aus dem das Makro ausgeführt wurde - in diesem Fall Formular A.
Wenn Du dem Programm von nun also irgeneine Anweisung gibst, die im Zusammenhang mit "oDoc" steht, erkennt das Programm, dass das ja eine Referenzierung von Formular A ist.
oDoc ist also gleich Formular A.
Nun machst Du dies und jenes und öffnest dann ein neues Formular - nennen wir es Formular B.

In diesem neuen Formular versuchst Du dann, über z.B. "oDoc.getTextTables().getByName("TabRezept")" auf eine Tabelle zuzugreifen.
Das Programm kennt die Variable oDoc - das ist schliesslich Formular A.
Dementsprechend sucht es in Formular A nach der Tabelle "TabRezept". Dort gibt es diese Tabelle aber nicht, sondern nur in Formular B.

Ich hoffe, das war einigermassen verständlich.

Im Endeffekt musst Du dem Programm nur sagen, dass die Tabelle nicht in Formular A (oDoc) ist, sondern in Formular B.

Code: Alles auswählen

oForm = StarDesktop.CurrentComponent.getParent.getFormDocuments().loadComponentFromURL(aFormulare(i), "", 0, Arg())
                       Rem Tabelle Füllen
         DruckFormFuell(iRezeptID)
Der Code beinhaltet schon alles notwendige - die Variable "oForm" beinhaltet von diesem Zeitpunkt an eine Referenzierung auf das neu geöffnete Formular.
Wenn Du der Prozedur "DruckFormFuell" noch diese Referenzierung mitgibst, also

Code: Alles auswählen

oForm = StarDesktop.CurrentComponent.getParent.getFormDocuments().loadComponentFromURL(aFormulare(i), "", 0, Arg())
                       Rem Tabelle Füllen
         DruckFormFuell(iRezeptID, oForm)
(Dementsprechend muss die Prozedur natürlich anders deklariert werden, z.B.)

Code: Alles auswählen

Sub DruckFormFuell(RezID as Integer, newDoc as Object)
kannst Du in der Prozedur nun mit "newDoc.getTextTables().getByName("TabRezept")" auf die Tabelle zugreifen.
Das übergebene Object "newDoc" ist schliesslich eine Referenzierung auf das Formular B. Dort gibt es die Tabelle.

In diesem Zusammenhang ist es kein Wunder, dass Dein Makro soweit funktioniert, wenn Du es vom "Zielformular" aus ausführst - denn dort ist oDoc entsprechend der obigen Ausführung Formular B.
petzy
Beiträge: 7
Registriert: So, 10.05.2009 17:27

Re: TextTabelle in anderem Formular füllen

Beitrag von petzy »

Hi,

einfach nur genial! :D :D

Mir war soweit klar, warum das nicht funktioniert hat, aber der Weg dahin, auf das andere Formular zuzugreifen, den habe ich nicht gefunden!

Also: Vielen Dank für die Hilfe!
Petzy

Ich kenne keinen sicheren Weg zum Erfolg, nur einen zum sicheren Misserfolg
es jedem recht machen zu wollen.
Antworten