Makroproblem für SQL-Abfrage aus Calc-Zelle

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: Makroproblem für SQL-Abfrage aus Calc-Zelle

Re: Makroproblem für SQL-Abfrage aus Calc-Zelle

von Toxitom » Di, 09.10.2007 19:48

Hey Werner,

klar läuft das Makro - bei mir ;-)
Du musst es natürlich auf deine Bedürfnisse anpassen.
Das Makro verbindet direkt zur Datenbank MySQL - ohne Base. Das ist nicht nötig, da im Grunde dort ja auch nix anderes drinsteht.
Und ja, du musst den Code natürlich in deinem Makro "ersetzen". Die Funktion liefert dir das "Connection"-Object , wäre also in deinem Code so einzubinen:

Code: Alles auswählen

...
REM  DatenQuelle bereits ausgewählt?
REM  If IsNull( DataSource ) then
REM  registrierte Datenquelle holen
REM  DataSource = DatabaseContext.getByName( database )
REM  End If

REM  ' DB-VErbindung bereit erstellt?
If IsNull ( Connection ) then
' Verbindung zur Datenbank holen
Connection = getConnection
End If
...
Wobei ich mal rausgenommen habe, was du nicht mehr brauchst (REM).

Aber: WEnn du bereits Probleme beim Aufruf hast (Scripting Framework Fehler "wrong number of parameters".) vermute ich, dass du es falsch abgeschrieben hast. Der Unterstrich nach der öffnenden Klammer bedeutet, dass die Zeile in der nächsten Zeile fortgesetzt wird. Schreib die beiden hintereinander und lösche den Unterstrich - dann sollte der Fehler nicht mehr passieren.
Das Makro steht zwar in der Standard-Bibliothek, aber in Meine-Makros und nicht in OpenOffice-Makros.
Das ist ja auch korrekt. Da gehört es hin :-)
Tia, und zum Rest: Die Verbindung basiert auf JDBC - nicht ODBC. Wie gesagt, evt. musst du die Treiber entsprechend anpassen - ich weiss nicht, welchen du benutzt??
Aber: Wenn du die Datenbank bereits in Base erfolgteich verbunden hast, dann kannst du die WErte dort auslesen (Verbindungsdaten). Das sollte dann funktionieren.
Ich hätte auch ein Beispiel für ODBC - das lief aber nie so stabil wie die JDBC Treiber - habe ich also wieder rausgeschmissen. Aber wenn du das haben willst - suche ich dann mal wieder raus ;-)

Gruss
Thomas

Re: Makroproblem für SQL-Abfrage aus Calc-Zelle

von heinz_ketchup » Di, 09.10.2007 17:49

Hi Thomas,

sorry, aber ich bin ein blutiger Anfänger mit Basic. Bei mir klappt garnichts. Hast Du bei Dir das Makro SQLAbfrage schon mal ausprobiert? Bekommst Du es zum Laufen?

1. Wenn ich das Makro ausführe, bekomme ich die Fehlermeldung Scripting Framework Fehler "wrong number of parameters".
2. Ich habe eine, in Base angemeldete, MySQL-DB "oootest_db" mit der tabelle "test_db.t_werte". Da sind 5 Datensätze drin mit 3 Feldern. Die würde ich gerne erst mal abfragen können.
3. Das Makro steht zwar in der Standard-Bibliothek, aber in Meine-Makros und nicht in OpenOffice-Makros. Ich weiß leider auch nicht wie ich mein Makro dort hin bekomme. Wenn ich es in das Verzeichnis user/basic/standard kopiere, dann bekomme ich nichts im Makro-Auswahl-Dialog.
4. Das Prinzip der Ansprache einer MySQL ist mir bekannt. In OOCalc habe ich auch schon meine Test-DB über ODBC abgefragt. Das funktioniert. Muss ich nun Deine Connect-Function in meinem Makro irgendwo unterbringen? Dort gibt es ja bereits eine Connect-Anweisung.

Es tut mir leid, dass ich da noch so ein Laie bin. Aber ich brauche diese SQL-Abfrage aus Calc heraus sehr dringend. Darum muss ich mich nun so durchwursteln.

Es wäre toll, wenn Du mir nochmal helfen könntest.

Viele Grüße
Werner

Re: Makroproblem für SQL-Abfrage aus Calc-Zelle

von heinz_ketchup » Di, 09.10.2007 09:36

Hallo Thomas,

vielen Dank für Deine Hilfe und die Infos! Ich werde das mal ausprobieren und melde mich dann wieder.
Das wird ein bischen dauern, man muß ja zwischendurch auch was arbeiten.

Viele Grüße!
Werner

Re: Makroproblem für SQL-Abfrage aus Calc-Zelle

von Toxitom » Mo, 08.10.2007 18:25

Hey Werner,

Ja, klar jetzt.
Also: Die Funktion muss in der sTandard-Bibliothek untergebracht werden - aber das hast du ja schon rausbekommen.

Eine MySQL - Datenbank lässt sich nie ohne Passwort ansprechen - also konnte die Verbindung nicht geöffnet werden!
Hier mal eine Beispiel-Code zum Öffnen einer MySQL Datenbank:

Code: Alles auswählen

function getConnection

	dim mDBProperties(2) as New com.sun.star.beans.PropertyValue
	
	mDBProperties(0).name = "user"
	mDBProperties(0).value = "<Benutzername>"
	mDBProperties(1).Name = "password"
	mDBProperties(1).value = "<meinPasswort>"
	mDBProperties(2).Name = "JavaDriverClass"
	mDBProperties(2).value = "org.gjt.mm.mysql.Driver"
	
	oDriverManager = createUnoService("com.sun.star.sdbc.DriverManager")
	oConnection = oDriverManager.getConnectionWithInfo( _
	              "jdbc:mysql://localhost:3306/<DatenbankName>", mDBProperties())

	getConnection = oConnection	
	
End function
Hier wird eine JDBC Verbindung hergestellt - mit dem entsprechenden Javatreiber. Den musst du natürlich vorher auch geladen haben - und OOo mitgeteilt haben, wo dieser liegt.
Aber: Wenn du über Base an die Datenbank rankommst, dann passen die WErte schon.

Hoffe, es hilft.

Viele Grüße
Thomas

Re: Makroproblem für SQL-Abfrage aus Calc-Zelle

von heinz_ketchup » So, 07.10.2007 18:11

Hallo Thomas,

vielen Dank für Deine schnelle Antwort. Sorry, ich habe mich vielleicht etwas unklar ausgedrückt.
Ich möchte tatsächlich, mit einer integrierten Funktion, in einer OpenCalc-Zelle eine SQL-Abfrage auf eine MySQL-Datenbank ausführen und erwarte als Resultat der Funktion einen Wert. Die Abfrage möchte ich allerdings dynamisch beeinflussen können, in dem ich z.B. Variablen unter OpenCalc definiere und diese in meinem Query einbinde, damit ich nicht bei jeder Änderung alle Zellen editieren muss.

Beispiel: SQLABFRAGE (MySQL_DB;SELECT SUM(feld) FROM tabelle WHERE bedingung=monat)

monat ist dabei die dynamische Variable, die ich in einem Tabellenblatt beliebig definiere.

Ich hoffe ich konnte meine Problemstellung nun etwas klarer formulieren.

Viele Grüße
Werner

Re: Makroproblem für SQL-Abfrage aus Calc-Zelle

von Toxitom » So, 07.10.2007 17:27

Hallo Heinz,

Hmm, also das Makro ist an sich OK, soweit ich das sehen kann.
Ich bin mir aber gar nicht so sicher, was du eigentlich genau machen möchtest?
Auch dieses Makro kann keine SQL Befehle auf die aktuelle Tabelle oder das Tabellendokument ausführen - sondern holt sich einen Wert aus einer in OOo angemeldeten Datenquelle (also zum Beispiel einer MySQL Datenbank - bzw hier eher einer reinen Base-datenbank).
Beschreibe doch bitte erst einmal etwas genauer, was genau du erreichen möchtest.

Viele Grüße
Thomas

Makroproblem für SQL-Abfrage aus Calc-Zelle

von heinz_ketchup » So, 07.10.2007 16:33

Hallo,
ich habe von openmind (leider ist er nicht mehr aktiv) ein Makro gefunden, dass die Ausführung von SQL-Befehlen aus einer Calc-Zelle heraus ermöglichen soll.
Leider funktioniert das Makro nicht. Und ich kenne mich noch nicht wirklich in OO Basic aus. Ich bekomme einen Laufzeitfehler bei:
DataSource = DatabaseContext.getByName( database ) und ResultSet = Statement.executeQuery( query )

Hier meine Frage:
Wie bekomme ich das Makro als reguläre Funktion in OO Calc zum laufen, so dass ich, wie bei jeder anderen Funktion, meinen SQL-Befehl "SELECT irgendwas FROM tabelle WHERE blablabla" eingeben kann.

Vielen Dank für eure Hilfe!!!


Hier das Makro:

Global DatabaseContext as Object
Global DataSource as Object
Global Connection as Object

''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Funktion zur Abfrage einer Datenbank
' Diese Funktion kann in einer Calc-Zelle benutzt werden,
' um einen SQL-Abfrage auf einer Datenbank (registrierte
' Datenquelle) abzusetzen und ein Datenfeld als Wert
' in die Calc-Zelle zu schreiben.
'
' Die Calc-Funktion hat folgende Syntax:
' =SQLABRAGE( datenbank; query; feldindex )
'
' datenbank = Name der registirierten Datenquelle
' query = SELECT-Statement als String
' field = Feldindex für Rückgabewert (default: 1)
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function SQLABFRAGE ( database as String, query as String, Optional field as Integer )

Dim Statement as Object
Dim ResultSet as Object
Dim retVal as String
retVal = ""

' optionales Argument testen
If IsMissing( field ) then
' default 1, wenn kein Index deklariert
field = 1
End If

' Datenbank-Kontext initialisiert?
If IsNull( DatabaseContext ) then
' Datenbank-Kontext holen
DatabaseContext = createUnoService_
("com.sun.star.sdb.DatabaseContext")
End If

' DatenQuelle bereits ausgewählt?
If IsNull( DataSource ) then
' registrierte Datenquelle holen
DataSource = DatabaseContext.getByName( database )
End If

' DB-VErbindung bereit erstellt?
If IsNull ( Connection ) then
' Verbindung zur Datenbank holen
Connection = DataSource.GetConnection("","")
End If

' Datenbank-Statement holen
Statement = Connection.createStatement()
' query absetzen ergibt ein ResultSet
ResultSet = Statement.executeQuery( query )
If Not IsNull( ResultSet ) then
' wir wollen nur die erste Zeile
If ResultSet.next then
retVal = ResultSet.getString( field )
End If
End If

ResultSet.close()
Statement.close()

SQLABFRAGE = retVal
End Function

Nach oben