BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das OpenOffice Forum zu erhalten!

DANKE >><< DANKE

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des OpenOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als OO-SUPPORTER gekennzeichnet. 🤗

Zugriff auf this-Variablen

Alles zur Programmierung im OpenOffice.org
Antworten
Franky1112
Beiträge: 13
Registriert: Di 31. Mai 2011, 11:52

Zugriff auf this-Variablen

Beitrag von Franky1112 » Di 22. Dez 2015, 12:09

Hallo,

ich löse über eine Tabellenspalte eines Formular ein Event aus.
Versuch mich dabei mit Hilfe des Handbuchs "Base" S. 392ff durchzukämpfen.
Ich möchte nach dem Aktualisieren eines Wertes, den einer anderen Spalte berechnen und anschließend per Update eintragen.
(Umrechnung von verschiedenen Ausgangseinheiten aus Auswerteeinheiten ,z.B. MWh -> kWh, MWh(ho) -> kWh, t(Pellet) -> kWh usw. beliebig erweiterbar.)
Dazu muss aber noch ein zugehöriger Umrechnungsfaktor aus einer anderen Tabelle in der Datenbank herausgefiltert werden.
Die Beziehung zwischen Einheiten und meiner Tabelle ist 1:n, eine entsprechende Indexspalte ist vorhanden.

Die SQL-Anweisung lautet z.B.

Code: Alles auswählen

"SELECT Umrechnungsfaktor, ID FROM Einheiten WHERE ID = 3"
und funktioniert auch unter der normalen SQL-Abfragemöglichkeit

Löse ich Sie im Code aus, gibt's jedoch eine Fehlermeldung:

Code: Alles auswählen

SUB Energiebezug_berechnen(oEvent as object)
	' allg Formobjecte
	dim oFeld as Object
	dim oForm as Object
	dim oTabForm as Object

	' allg DB Objecte
	DIM oConnection as object
	DIM oDatasource as object
	
	' SQL - Teil
	DIM oSQL_Statement as object
	DIM stSQL as STRING
	DIM oResult as object

	DIM stSQL2 as STRING
	dim iREsult as INTEGER
	
	DIM stTabelle1 as string
	DIM stTabelle2 as string
	DIM nName as Integer
	DIM nSpalte as Integer
	DIM stSpalte as String
	DIM stIDSpalte as String
	DIM stErgSpalte as String

	'Datensatzinhalte
	DIM ID1 as Integer
	DIM ID2 as Integer
	DIM Einheit1 as String
	DIM Einheit2 as String
	DIM Bezugsmenge as double
	DIM Energie2 as double
	DIM Faktor as double

	oFeld = oEvent.Source
	oTabForm = oFeld.Parent
	oForm = oTabForm.Parent

	oConnection = oForm.activeConnection()
	oDatasource = thisComponent.Parent.dataSource
'	oDatasource = thisDatebaseDocument.CurrentController
'	IF NOT ( oDatasource.isConnected()) THEN oDatasource.connect()
	'oConnection = oDatasource.getConnection("","")
'	oConnection = oDatasource.ActiveConnection
	
	oSQL_Statement = oConnection.createStatement	

	stTabelle1 = "WEZEnergie"
	stSpalte = "Bezugsmenge"
	stErgSpalte = "Energiebezug"
	nName	= oForm.findColumn(stSpalte)
	
	Bezugsmenge = oForm.getDouble(nName)
	stErgSpalte = "Einheit"
	nName	= oForm.findColumn(stErgSpalte)
	Einheit1 = oForm.getString(nName)
	
	stIDSpalte = "EinheitID"
	nName	= oForm.findColumn(stIDSpalte)
	ID1 = oForm.getLong(nName)

	stSQL2 = "SELECT ""Umrechnungsfaktor"", ""ID"" FROM ""Einheiten"" WHERE ""ID"" = 3" ' & ID1
	oSQL_Statement = oConnection.prepareStatement(stSQL2)
	oResult = oSQL_Statement.executeQuery(stSQL2)
	
	
	stErgSpalte = "Umrechnungsfaktor"
	nName	= oResult.findColumn(stErgSpalte) 
und dann krachts
Faktor = oResult.getDouble(nName)

Code: Alles auswählen

	Energie2 = Bezugsmenge * Faktor
			
	stSQL = "UPDATE " & stTabelle1 _
				& " SET Energiebezug = " & 	Energie2
	
END SUB
Der Fehler lautet:
BASIC-Laufzeitfehler: Es ist eine Exception aufgetreten Type com.sun.star.sdbc.SQLException Message : No Data is available.
D.h. die Tabelle sei leer (warum auch immer)


Im oberen Teil habe ich auf verschiedene Wege Versucht (gem. Handbuch ) mich an die Datenbank anzukoppeln, das thisDatabase-Objekt kennt die Sub jedoch nicht, sodass ich mich im Moment an die Form gehängt habe.
Wir kann ich auf alle Tabellen der Datenbank zugreifen, auch solche die nicht auf dem Formular angezeigt werden?
Und wie funktioniert das mit den this... Objekten, wann kann ich auf die Zugreifen.

(Ich benutze OpenOffice 3.4.1)

Gruss Franky

F3K Total
Beiträge: 1006
Registriert: Mo 1. Aug 2011, 00:03

Re: Zugriff auf this-Variablen

Beitrag von F3K Total » Mi 23. Dez 2015, 06:46

Hi,
vermutlich fehlt nur ein .next

Code: Alles auswählen

...oResult = oSQL_Statement.executeQuery(stSQL2)
   if oResult.next then
       stErgSpalte = "Umrechnungsfaktor"
       nName   = oResult.findColumn(stErgSpalte)
       Faktor = oResult.getDouble(nName)
   endif
Denn der Datensatzzeiger steht nach dem Erzeugen des Resultsets zunächst vor der ersten Ergebniszeile.
Allerdings finde ich das Vorgehen sehr aufwendig.
Stelle die DB zur Verfügung, dann findet sich sicherlich eine einfachere Lösung.
Gruß R

EDIT: Ausserdem nehme ich an, dass deine Version nicht das gewünschte Ergebnis liefert.
Ich möchte nach dem Aktualisieren eines Wertes, den einer anderen Spalte berechnen und anschließend per Update eintragen.
"nach dem Aktualisieren", als auslösendes Ereignis einer Spalte im Tabellenkontrollfeld, so ist das Makro aufgebaut, funktionierte zumindest bei mir nicht, es wurde der "alte" Wert ausgegeben. Ich mußte die eingegebenen Daten erst per Makro in die Datenbank zwingen:
SUB Energiebezug_berechnen(oEvent as object)
oFeld = oEvent.Source
oTabForm = oFeld.Parent
oController = Thiscomponent.currentcontroller
oTabformControl = oController.getControl(oTabForm)
oTabformControl.commit

oForm = oTabForm.Parent
if oForm.isnew then oForm.insertrow else oForm.updaterow
blauen Code zugefügt
Windows 10: AOO, LO Linux Mint: AOO, LO

Franky1112
Beiträge: 13
Registriert: Di 31. Mai 2011, 11:52

Re: Zugriff auf this-Variablen

Beitrag von Franky1112 » Mi 23. Dez 2015, 08:59

Vielen Dank, ja es lag tatsächlich nur am .next, den Code dahinter hatte ich noch nicht getestet.

Der Vollständigkeit halbe die komplette Version...

Code: Alles auswählen

SUB Energiebezug_berechnen(oEvent as object)
	' allg Formobjecte
	dim oFeld as Object
	dim oForm as Object
	dim oTabForm as Object

	' allg DB Objecte
	DIM oConnection as object
	DIM oDatasource as object
	DIM	DatabaseContext as object
	
	' SQL - Teil
	DIM oSQL_Statement as object
	DIM stSQL as STRING
	DIM oResult as object

	DIM stSQL2 as STRING
	dim iREsult as INTEGER
	
	DIM stTabelle1 as string
	DIM stTabelle2 as string
	DIM nName as Integer
	DIM nName1 as Integer
	DIM nName2 as Integer
	DIM nName3 as Integer
	DIM nSpalte as Integer
	DIM stSpalte as String
	DIM stIDSpalte as String
	DIM stErgSpalte as String
	DIM stEhSpalte as String

	'Datensatzinhalte
	DIM ID1 as Integer
	DIM ID2 as Integer
	DIM Einheit1 as String
	DIM Einheit2 as String
	DIM Bezugsmenge as double
	DIM Energie2 as double
	DIM Faktor as double

	oFeld = oEvent.Source
	oTabForm = oFeld.Parent
	oForm = oTabForm.Parent

	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
    'Datenquelle = DatabaseContext.getByName("EDL-Datenerfassung-EHS")'Hier muss der Datenbankname eingesetzt werden

'	oConnection = oForm.activeConnection()
'	oDatasource = thisComponent.Parent.dataSource
	oDatasource =  DatabaseContext.getByName(("EDL-Datenerfassung-EHS")'Hier muss der Datenbankname eingesetzt werden
	'oDatasource=	thisDatebaseDocument.CurrentController
'	IF NOT ( oDatasource.isConnected()) THEN oDatasource.connect()
	oConnection = oDatasource.getConnection("","")
	'oConnection = oDatasource.ActiveConnection
	
	oSQL_Statement = oConnection.createStatement	

	stTabelle1 = "WEZEnergie"
	stSpalte = "Bezugsmenge"
	stErgSpalte = "Energiebezug"
	nName1	= oForm.findColumn(stSpalte)
	nName2	= oForm.findColumn(stErgSpalte)
	
	Bezugsmenge = oForm.getDouble(nName1)
	stEhSpalte = "Einheit"
	nName3	= oForm.findColumn(stEhSpalte)
	Einheit1 = oForm.getString(nName3)
	stIDSpalte = "EinheitID"
	nName	= oForm.findColumn(stIDSpalte)

	stIDSpalte = "EinheitID"
	nName	= oForm.findColumn(stIDSpalte)
	ID1 = oForm.getLong(nName)
	
	If ID1 ="" then 
		Einheit1="kWh"
		ID1 = 0
		stIDSpalte = "EinheitID"
	 	oForm.UpdateString(nName3, Einheit1)
	 	oForm.UpdateString(nName, ID1)
	else	
		stIDSpalte = "EinheitID"
		nName	= oForm.findColumn(stIDSpalte)
		ID1 = oForm.getLong(nName)
	end if
	
	stSQL2 = "SELECT ""Umrechnungsfaktor"", ""ID"" FROM ""Einheiten"" WHERE ""ID"" = "  & ID1
	oSQL_Statement = oConnection.prepareStatement(stSQL2)
	oResult = oSQL_Statement.executeQuery(stSQL2)
	oResult.next
	stErgSpalte = "Umrechnungsfaktor"
	nName	= oResult.findColumn(stErgSpalte) 
	Faktor  = oResult.getDouble(nName)
	
	Energie2 = Bezugsmenge * Faktor
	oForm.updateDouble(nName2 , Energie2)
	
	if oForm.isNew then
		oForm.insertRow
	else
		oForm.updateRow
	end if
		
	
END SUB

F3K Total
Beiträge: 1006
Registriert: Mo 1. Aug 2011, 00:03

Re: Zugriff auf this-Variablen

Beitrag von F3K Total » Mi 23. Dez 2015, 09:24

Oh,
das .commit ist nicht nötig, gut!
Kleiner Tipp, statt der dreizeiligen, indirekten Version über die Spaltennummer

Code: Alles auswählen

stSpalte = "Bezugsmenge"
nName1   = oForm.findColumn(stSpalte)
Bezugsmenge = oForm.getDouble(nName1)
geht es auch direkt über den Namen der Spalte

Code: Alles auswählen

Bezugsmenge = oForm.Columns.Bezugsmenge.getDouble
solange die Spaltenbezeichnung keine Leer- oder Sonderzeichen beinhaltet. Ist es doch so, geht

Code: Alles auswählen

Bezugsmenge = oForm.Columns.getbyName("Bezugsmenge").getDouble
Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

Antworten