🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Datenbank SQL mit Python

Alles zur Programmierung im LibreOffice.
Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Datenbank SQL mit Python

Beitrag von karolus » Fr 4. Mär 2016, 01:13

Hallo

Das hat jetzt nichts mit der Fehlermeldung zu tun, aber gewöhne dir gar nicht erst an deine Scripte im Progammordner/share/Scripts/python/ zu speichern - ( da ist das nämlich futsch nach dem nächsten LibreUpdate deiner Distribution ) - deine Scripte gehören nach ~/.config/libreoffice/4/user/Scripts/python/...

Zur Fehlermeldung: die sagt doch recht deutlich das es zu `oResult` kein Attribut mit der Bezeichnung `Next` gibt.
mglw. gibts aber eine Methode `next()` - aber genau dafür hast du doch ?? MRI installiert -

Code: Alles auswählen

import uno
ctx = uno.getComponentContext()
createUnoService = ctx.ServiceManager.createInstance
mri = createUnoService("mytools.Mri")


.....


    mri.inspect(oResult) 
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Datenbank SQL mit Python

Beitrag von scientific » Fr 4. Mär 2016, 01:36

scientific hat geschrieben:

Code: Alles auswählen

doc = XSCRIPTCONTEXT.getDocument()
connection = doc.Parent.CurrentController.ActiveConnection
sQueryName = "Abfrage-irgendwas"
oPrepstatement = connection.prepareCommand(sQueryName,1)
oResult = oPrepstatement.executeQuery()

while oResult.Next:
    print(oResult.getString(oResult.findColumn("COL1")))
bringt folgende Fehlermeldung...

Code: Alles auswählen

com.sun.star.uno.RuntimeExceptionError during invoking function ImportGoogleEvents in module file:///usr/lib/libreoffice/share/Scripts/python/createOL365event.py (<class 'AttributeError'>: 'PyUNO_callable' object has no attribute 'Next'
  /usr/lib/libreoffice/share/Scripts/python/createOL365event.py:279 in function ImportGoogleEvents() [while oResult.Next:]
  /usr/lib/libreoffice/program/pythonscript.py:870 in function invoke() [ret = self.func( *args )]
)
Wo finde ich Infos zur pyUNO-Bridge, wie solche Aufrufe zu gestalten sind?

[EDIT]
Man muss offenbar noch einen Service/Interface importieren.

Code: Alles auswählen

import com.sun.star.sdbc.XResultSet
aber das wird nicht gefunden.
Obwohl hier die Funktion next() angeboten werden sollte... http://api.libreoffice.org/docs/idl/ref ... ltSet.html

Hab es auch mit

Code: Alles auswählen

    ctx = XSCRIPTCONTEXT.getComponentContext()
    smgr = ctx.getServiceManager()
    XRS = smgr.createInstanceWithContext("com.sun.star.sdbc.XResultSet", ctx)
...
...
...
    while XRS.next(oResult):  

ausprobiert... 'NoneType' object has no attribute 'next'

Es klappt hingegen
[code]from com.sun.star.sdbc import XResultSet
Aber wie ich damit etwas anfange, ist mir nicht klar...



[/code]

lg scientific

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Datenbank SQL mit Python

Beitrag von scientific » Fr 4. Mär 2016, 09:45

Guten Morgen!

Habs jetzt erst gesehen...
karolus hat geschrieben:Hallo

Das hat jetzt nichts mit der Fehlermeldung zu tun, aber gewöhne dir gar nicht erst an deine Scripte im Progammordner/share/Scripts/python/ zu speichern - ( da ist das nämlich futsch nach dem nächsten LibreUpdate deiner Distribution ) - deine Scripte gehören nach ~/.config/libreoffice/4/user/Scripts/python/...

Zur Fehlermeldung: die sagt doch recht deutlich das es zu `oResult` kein Attribut mit der Bezeichnung `Next` gibt.
mglw. gibts aber eine Methode `next()` - aber genau dafür hast du doch ?? MRI installiert -

Code: Alles auswählen

import uno
ctx = uno.getComponentContext()
createUnoService = ctx.ServiceManager.createInstance
mri = createUnoService("mytools.Mri")


.....


    mri.inspect(oResult)
Wenn ich die Extension mri installieren möchte, bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

(com.sun.star.uno.RuntimeException) { { Message = "<class 'SyntaxError'>: invalid syntax (MRI.py, line 21), traceback follows\X000a  C:\\Program Files (x86)\\LibreOffice 5\\program\\pythonloader.py:102 in function getModuleFromUrl() [codeobject = compile( src, encfile(filename), \"exec\" )]\X000a  C:\\Program Files (x86)\\LibreOffice 5\\program\\pythonloader.py:149 in function writeRegistryInfo() [mod = self.getModuleFromUrl( locationUrl )]\X000a\X000a", Context = (com.sun.star.uno.XInterface) @0 } }
sowohl auf Linux, als auch auf Win7

auf beiden Systemen hab ich LO5.1 installiert.

lg scientific

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Datenbank SQL mit Python

Beitrag von karolus » Fr 4. Mär 2016, 11:21

Hallo

Sehr merkwürdig.
Die Fehlermeldung ist von Win7, lieferst du die von Linux noch nach?
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Datenbank SQL mit Python

Beitrag von scientific » Fr 4. Mär 2016, 12:45

karolus hat geschrieben:Hallo

Sehr merkwürdig.
Die Fehlermeldung ist von Win7, lieferst du die von Linux noch nach?
Das hat jetzt funktioniert. Seltsam...

So wie von dir vorgeschlagen angewendet kommt dann bei der Ausführung diese Fehlermeldung...

Code: Alles auswählen

BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten 
Type: com.sun.star.uno.RuntimeException
Message: Couldn't convert <PyUNO_callable object at 0x31B48790> to a UNO type; caught exception: <class 'AttributeError'>: 'PyUNO_callable' object has no attribute 'getTypes', traceback follows
no traceback available
 (Error during invoking function ImportGoogleEvents in module file:///C:/Users/DKahl/AppData/Roaming/LibreOffice/4/user/Scripts/python/createOL365event.py (<class 'uno.com.sun.star.uno.RuntimeException'>: Couldn't convert <PyUNO_callable object at 0x31B48790> to a UNO type; caught exception: <class 'AttributeError'>: 'PyUNO_callable' object has no attribute 'getTypes', traceback follows
no traceback available

  C:\Users\DKahl\AppData\Roaming\LibreOffice\4\user\Scripts\python\createOL365event.py:301 in function ImportGoogleEvents() [mri.inspect(oResult)]
  C:\Program Files (x86)\LibreOffice 5\program\pythonscript.py:870 in function invoke() [ret = self.func( *args )]
)).
lg scientific

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Datenbank SQL mit Python

Beitrag von scientific » Fr 4. Mär 2016, 14:31

So ein Schritt weiter!

Ich habe folgende Funktion zusätzlich in meinem Python-File eingeführt

Code: Alles auswählen

def createUnoService(serviceName):
  sm = uno.getComponentContext().ServiceManager
  return sm.createInstanceWithContext(serviceName, uno.getComponentContext())
Dann erzeuge ich das Objekt des Resultsets:

Code: Alles auswählen

    oResult = createUnoService("com.sun.start.sdbc.ResultSet")
    
    sQueryName = "Kalender_Informationen"
    oPrepStatement = connection.prepareCommand(sQueryName,1)
    oResult = oPrepStatement.executeQuery()
    #mri.inspect(oResult)
    
    if oResult:
        while oResult.next():
            print(oResult.getString(oResult.FindColumn( "K_UID" )))
Jetzt liefert der print-Befehl eine Fehlermeldung, was aber auch (jetzt auch für mich verständlich) klar ist, da "com.sun.start.sdbc.ResultSet" keine Funktion "getString" aufweist...

Die letzte Zeile ersetzt durch

Code: Alles auswählen

print(oResult.FindColumn( "K_UID" ))
liefert mir zumindst schon die korrekte Spaltennummer!!! Heissa :idea:

Aber wie komm ich nun an den String? .getString ist es jedenfalls nicht...
[EDIT]
getString ist es offenbar schon... Hat gerade geklappt...

lg scientific

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Datenbank SQL mit Python

Beitrag von karolus » Fr 4. Mär 2016, 15:15

Hallo

Code: Alles auswählen

    oResult = createUnoService("com.sun.start.sdbc.ResultSet")
   
    sQueryName = "Kalender_Informationen"
    oPrepStatement = connection.prepareCommand(sQueryName,1)
    oResult = oPrepStatement.executeQuery()
Bist du sicher, das du die erste Zeile benötigst?
Ich frage, weil du drei Zeilen weiter komplett neu zuweist!
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Datenbank SQL mit Python

Beitrag von scientific » Fr 4. Mär 2016, 15:29

karolus hat geschrieben:Hallo

Code: Alles auswählen

    oResult = createUnoService("com.sun.start.sdbc.ResultSet")
   
    sQueryName = "Kalender_Informationen"
    oPrepStatement = connection.prepareCommand(sQueryName,1)
    oResult = oPrepStatement.executeQuery()
Bist du sicher, das du die erste Zeile benötigst?
Ich frage, weil du drei Zeilen weiter komplett neu zuweist!
Ich habs probiert. Ja, ich benötige diese.
Denn das erste Mal weise ich oResult den UnoService zu, der dann beim zweiten Mal befüllt wird.
Meine Fehlermeldung von oben resultierte daraus, dass ich die erste Zuweisung nicht gemacht gehabt hatte.

[EDIT]
Hab jetzt noch einmal getestet... du hast recht, die erste Zuweisung zu oResult benötige ich nicht.
Aber ich frage mich, warum ich zuvor eine Fehlermeldung bekommen habe, dass weder "next" noch "next()" verfügbar wäre...

lg scientific

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Datenbank SQL mit Python

Beitrag von scientific » Fr 4. Mär 2016, 20:23

Wie macht man das eigentlich am besten, dass die Abfrage einer LIste von Events vom Google-Kalender (das oResult von meinem Beispiel) in die hsqldb-Datenbank bekommt?
Zeile für Zeile mit Insert-Statements einzeln einfügen?

Ich nehm schon an, da ich einzelne Felder noch editieren/umformatieren muss, sodass sie auch in meine Datenbank können.

lg scientific


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten