Jump to content

Bestand an Tabellenblättern

From The Document Foundation Wiki
This page is a translated version of the page Macros/Calc/017 and the translation is 100% complete.

Tutorial unter Verwendung der beschriebenen Möglichkeiten von LibreOffice mit Daten in einer SQL Datenbank

Das folgende Makro wurde entwickelt, um die beschriebenen Möglichkeiten von LibreOffice mit Daten in einer SQL Datenbank zu nutzen.

Um die Funktion zu nutzen

Nachdem die Populate-spreadsheet-from-db.ods LibreOffice Datei heruntergeladen wurde:

  1. das Dokument wird geöffnet und die Informationen zur Verbindung zur SQL Datenbank eingegeben
  2. Der Daten laden Button wird gedrückt
  3. Wenn die Daten erfrolgreich geladen wurden, wird Erzeuge Diagramm gedrückt.

Die Makros verbinden sich zu einer Datenbank und machen nichts, falls diese Datenbank nicht erreichbar ist. Daher können Sie nicht einfach so erwarten, dass sie so ohne weiteres nach dem Herunterladen der Datei funktionieren.

Downloads

File:Populate-spreadsheet-from-db by-lanedoCOM.ods

Funktionsweise

Das Makro verbindet sich zu einer SQL Datenbank und füllt das Tabellenblatt. Diese Daten werden zur Erstellung eines Diagramms genutzt.

REM  *****  BASIC  *****

Function db_escape (str As String, connection) As String
 Dim delim As String
 meta = connection.getMetaData ()
 delim = meta.getIdentifierQuoteString ()
 db_escape = delim & str & delim
End Function

Sub LoadDataFromDB

Dim dm
Dim driver
Dim params(1) As New com.sun.star.beans.PropertyValue

REM Get Current Spreadsheet
REM http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/module-ix.html
REM  http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/SpreadsheetDocument.html (getSheets -> XSpreadsheets)
REM http://api.openoffice.org/docs/common/ref/com/sun/star/table/module-ix.html
doc = ThisComponent
addr = doc.getCurrentSelection().getCellAddress()
sheet = doc.getSheets().getByIndex(addr.Sheet)

REM rSheets->insertNewByName(OUString::createFromAscii("MySheet"), (short)0)

draw_page = sheet.DrawPage
db_form = draw_page.Forms.GetByIndex(0)
hst_ctl = db_form.getByName ("txtHost")
usr_ctl = db_form.getByName ("txtUser")
pwd_ctl = db_form.getByName ("txtPwd")
dbm_ctl = db_form.getByName ("txtDBM")
sts_ctl = db_form.getByName ("lblStatus")

host = hst_ctl.Text
usr = usr_ctl.Text
pwd = pwd_ctl.Text
dbm = dbm_ctl.Text

url = "jdbc:mysql://" & host & "/" & dbm & "?user=" & usr & "&password=" & pwd
Print "Connecting to " & dbm & " on " & host
sts_ctl.Label =  "Connecting to " & dbm & " on " & host

REM Database Setup
dm = CreateUnoService ("com.sun.star.sdbc.DriverManager")

params(0).Name = "JavaDriverClass"
params(0).Value = "com.mysql.jdbc.Driver"

con = dm.getConnectionWithInfo (url, params())

if IsNull (con) Then
	MsgBox "Could not connect to DB"
	Exit Sub
End if

sts_ctl.Label = "Fetching data from DB ..."
stmt = con.CreateStatement()
sqltxt = "SELECT * FROM " & db_escape("key_value", con)
res = stmt.executeQuery (sqltxt)

If IsNull (res) OR IsEmpty (res) Then
	MsgBox "Nothing in tables"
	Exit Sub
End If

Do While res.next ()
	meta = res.getMetaData()
	REM c = meta.getColumnCount ()
	REM http://api.openoffice.org/docs/common/ref/com/sun/star/sdbc/XRow.html
	REM Print res.getInt (1) & res.getString (2) & res.getFloat (3)
	cur_row = res.getRow ()
	cell = sheet.getCellByPosition (0, cur_row)
	cell.Value = res.getInt (1)
	cell.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER
	cell = sheet.getCellByPosition (1, cur_row)
	cell.String = res.getString (2)
	cell = sheet.getCellByPosition (2, cur_row)
	cell.Value = res.getFloat (3)
Loop

sts_ctl.Label = "Data loaded!"

End Sub

Sub CreateChart

Dim rect As New com.sun.star.awt.Rectangle
Dim ra(0) As New com.sun.star.table.CellRangeAddress

rect.X = 1000
rect.Y = 9000
rect.Width = 10000
rect.Height = 7000

ra(0).Sheet = 0
ra(0).StartColumn = 1
ra(0).StartRow = 0
ra(0).EndColumn = 2
ra(0).EndRow = 9

doc = ThisComponent
sheet = Doc.Sheets(0)
charts = sheet.Charts
charts.addNewByName("Bar Chart", Rect, ra(), True, True)
chart = charts.getByName("Bar Chart").EmbeddedObject

End Sub

Macros