BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice 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 LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Datenbankzugriff mit Python-Makro

Alles zur Programmierung im LibreOffice.
Antworten
preklov
Beiträge: 9
Registriert: Fr 19. Jan 2018, 14:39

Datenbankzugriff mit Python-Makro

Beitrag von preklov » Mo 11. Mär 2019, 13:48

Was mit Basic so einfach ist, so schwer tue ich mich mit Python:

Ich habe eine odb-Datei mit eingebetteter HSQLBD-Datenbank und möchte einen Bericht per Makro erstellen, denn mit dem eingebauten Berichte-Editor bin ich nicht zufrieden. Das in Basic geschriebene Makro läuft wie geschmiert. Ich öffne die odb-Datei, starte das Makro, das eine Verbindung aufbaut, falls sie noch nicht existiert, und ich kann eine Ansicht abfragen:

Code: Alles auswählen

  oDatasource = ThisDatabaseDocument.CurrentController
  If Not (oDatasource.isConnected()) Then oDatasource.connect()
  oConnection = oDatasource.ActiveConnection()
  ...
  oSqlStatement = oConnection.createStatement()
  'usw.
Ich möchte dies nun mit Python realisieren. Ich schaffe es nicht. Um den Aufbau zu verstehen, habe ich es mit biblioaccess.py (https://www.openoffice.org/udk/python/s ... oaccess.py) versucht, womit eine Verbindung zur internen Bibliography-DB erstellt werden soll. Schon der Start geht schief, Fehlermeldung:
com.sun.star.connection.NoConnectException: Connector : couldn't connect to socket (Connection refused)
Dann habe ich ExtractHSQL.py von https://forum.openoffice.org/en/forum/v ... 21&t=86071 installiert. Alles lief ordentlich durch. Als ich aber im Dateifenster auf die Tabellen zugreifen wollte, kam der Fehler:
Die Verbindung zur Datenquelle "Lesebibliografie" konnte nicht hergestellt werden.
Die Treiberklasse 'org.hsqldb.jdbcDriver' konnte nicht geladen werden.Der Pfad für zusätzliche Treiberklassen ist 'file:///Applications/LibreOffice.app/Contents/Resources/../MacOS/classes/hsqldb.jar'.
Der Fehler verschwindet, wenn ich den korrekten Pfad verwende: 'file:///Applications/LibreOffice.app/Contents/Resources/java/hsqldb.jar'.

Aber ich komme nicht weiter. Beim Inspizieren der im Code verwendeten Variablen "src" finde ich, dass der Service com.sun.star.sdb.DocumentDataSource unterstützt wird, aber src.dbg_properties, src.dbg_supportedInterfaces und src.dbg_methods laufen allesamt auf einen AttributeError.

iMac Mojave, LO 6.1.3.2

Leider habe ich darüber hinaus im Netz nichts gefunden, das mir weiterhelfen könnte. Wie muss ich vorgehen?

Schöne Grüße
Volker
Schöne Grüße
Volker

Wanderer
Beiträge: 895
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: Datenbankzugriff mit Python-Makro

Beitrag von Wanderer » Mo 11. Mär 2019, 23:39

Hallo,

beim eigentlichen Problem kann ich Dir erstmal nicht hefen,
aber wenn Du die mitgelieferte Beispiel-Datenbank Bibliography meinst,,
sehe ich das erste Problem darin, daß das eine dBase-Datei ist.
Dann kann mit einem JDBC-Treiber für die interne HSQL-DB nicht viel
funktionieren.

Du müsstest dann eher eine simple Datenbank mit der internen HSQL-Datenbank
erstellen, diese registrieren und dann weiterforschen...

mfg, Jörn
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

preklov
Beiträge: 9
Registriert: Fr 19. Jan 2018, 14:39

Re: Datenbankzugriff mit Python-Makro

Beitrag von preklov » Di 12. Mär 2019, 13:49

Danke Jörn dafür, dass ich erkannt habe, den falschen Weg zur Erkenntnis beschritten zu haben.

Dann also mein Problem ganz simpel: Ich öffne meine odb-Datei mit der eingebetteten HSQLDB in LO und starte das Python-Makro:

Code: Alles auswählen

def test_database():
    doc = XSCRIPTCONTEXT.getDocument()
    src = doc.CurrentController   
    if not src.isConnected():
        src.connect()
    if src.isConnected():
        conn = src.ActiveConnection
        sqlStatement = conn.createStatement()
        sql = 'SELECT * FROM "Ort"'
        result = sqlStatement.executeQuery(sql)
        result.next
        found = result.getString(1)
        msg_box(doc, found)
Der Befehl result.getString(1) wirft folgenden Fehler:
com.sun.star.sdbc.SQLException: No data is available
Warum?
Schöne Grüße
Volker

preklov
Beiträge: 9
Registriert: Fr 19. Jan 2018, 14:39

Re: Datenbankzugriff mit Python-Makro

Beitrag von preklov » Di 12. Mär 2019, 18:02

Oh, oh, sieht man meine roten Backen? So ein dummer Fehler:
Es muss natürlich

Code: Alles auswählen

result.next()
sein. Dann klappt auch alles. Du meine Güte.
Schöne Grüße
Volker

Wanderer
Beiträge: 895
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: Datenbankzugriff mit Python-Makro

Beitrag von Wanderer » Fr 15. Mär 2019, 07:34

Hallo,

schön wenn es jetzt funktioniert und es sieht nicht
besonders kompliziert aus.
Vielleicht probiere ich es Mal mit meinen Dateien, aber bisher habe ich immer direkt von Python auf die Datenbanken zugegriffen, da ich die interne HSQL-Datenbank seltener verwende.

Mfg, Jörn
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

preklov
Beiträge: 9
Registriert: Fr 19. Jan 2018, 14:39

Re: Datenbankzugriff mit Python-Makro

Beitrag von preklov » So 17. Mär 2019, 16:01

Es ist so einfach. Kommt natürlich auf die Komplexität der Datenbank an, ob die interne HSQLDB ausreicht.

Übrigens soll es mir wieder einmal eine Warnung sein, von Basic kopierten Code sorgfältigst zu überprüfen ;)
Schöne Grüße
Volker

Wanderer
Beiträge: 895
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: Datenbankzugriff mit Python-Makro

Beitrag von Wanderer » Fr 22. Mär 2019, 09:01

Hallo,
preklov hat geschrieben:
So 17. Mär 2019, 16:01
ob die interne HSQLDB ausreicht.
mich störten meist nicht fehlende Funktionen, sondern der Punkt, daß wohl nur bei einer gesplitteten Datenbank
gesichert ist, wann Base/HSQL speichert und daher die Datensicherheit bei einer externen Datenbank besser ist.

Und wenn ich nicht die interne File-Datenbank nehme, entscheide ich mich eher zwischen SQLITE und MariaDB
als zusätzlich die HSQLDB extern zu betreiben. Wobei im Hinterkopf natürlich ist, daß ich mit
Python beide Datenbanken direkt ansprechen kann, wenn ich mal von LibreOffice weg will oder muss...

Der Mittelweg Python an LibreOffice an Datenbank ist dann nur eine schöne Ergänzung.

mfg, Jörn
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten