🙏 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.
scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Datenbank SQL mit Python

Beitrag von scientific » Do 3. Mär 2016, 10:55

Hi Leute!

Und weiter gehts. Bisher hab ich gelernt, wie ich von einer Base-Datei Werte an ein Python-Skript weitergebe, welches dann z.B. Kalender-Events in Online-Kalendern (Outlook.com, Google...) erzeugt/verändert/löscht.
Ich habe gelernt wie ich mit Python Timezones verwende, damit die Events auch zur korrekten Uhrzeit erstellt werden.

Jetzt steh ich aber vor dem Problem, dass ich gerne die Online-Kalender abfragen möchte und ausgewählte Events in meine Datenbank schreiben will.
Wie ich die Abfrage des Kalenders in Python zu gestalten habe, weiß ich. Aber ich weiß nicht, wie ich mit Python in meine Datenbank schreiben kann.
Ich vermute einmal, das geht über die Python-UNO-Bridge...
Die Informationen die ich bisher dazu fand sind eher dürftig... mehr so "Ja, diese Bridge gibt es".

Aber ich habe bisher noch keine Infos gefunden (mit guten Beispielen hinterlegt), wie das wirklich in der Praxis anzuwenden ist.

Oder gibts noch einen anderen Weg?

lg scientific

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

Re: Datenbank SQL mit Python

Beitrag von karolus » Do 3. Mär 2016, 11:44

Du weisst doch wie du in Basic Api-methoden benutzt.

das geht in python genauso.
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 » Do 3. Mär 2016, 12:32

Nun...

Ich hab in meinem Skript:

Code: Alles auswählen

oCon = thiscomponent.Parent.CurrentController.ActiveConnection
sQueryName = "Abfrage-irgendwas"
oPrepstatement = oCon.prepareCommand(sQueryName,1)
oResult = oPrepstatement.executeQuery

Do While oResult.Next
	msgbox oResult.getString(oResult.FindColumn("COL1"))
Loop
Ich hab die Vermutung, dass das "genau so" in Python nicht klappt.
Und der Zugriff auf eine Spalte in einem Grid in einem Unterformular bringt auch nur eine Fehlermeldung.

In Starbasic:

Code: Alles auswählen

oform = ThisComponent.drawpage.Forms.getbyname("Filter_Alle").getbyname("MainForm").getbyname("Filter_Termine").getbyname("Termine")
nID = oform.getint(oform.FindColumn("T_ID"))
XSCRIPTCONTEXT hab ich schon kennengelernt. Aber beim Zugriff auf "drawpage" bin ich schon gescheitert...
Im Beispiel sind das 4 Formulare die jeweils Unterformular des oberen sind. Also Termine ist ein Unterformular von Filter_Termine, das ein Unterformular von MainForm ist, das ein Unterformular von Filter_Alle ist.

Beispiele, wie sowas gelöst wird in Python, hab ich leider bis jetzt noch nicht finden können.
Bei Programmiersprachen lernen bin ich ähnlich gelagert wie mit "normalen" Sprachen... Ich kann mit einem Wörterbuch und Grammatikregeln am Anfang nix anfangen. Das wird erst interessant, wenn ich schon ein wenig die Sprache spreche. Und die lerne ich am besten mit Beispielen die ich immer und immer wiederhole und erweitere.
Also der Hinweis auf eine "Spec" oder ähnliches bringt mir zum derzeitigen Zeitpunkt nicht viel... ;-)

lg scientific

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

Re: Datenbank SQL mit Python

Beitrag von karolus » Do 3. Mär 2016, 13:49

Hallo

Ich fang mal hiermit an:

Code: Alles auswählen

oform = ThisComponent.drawpage.Forms.getbyname("Filter_Alle").getbyname("MainForm").getbyname("Filter_Termine").getbyname("Termine")
nID = oform.getint(oform.FindColumn("T_ID"))
python verlangt überall die richtige Schreibweise bei allen Attributen und Methoden:
.DrawPage ist richtig, alles andere wie zb.:
.drawpage , .DRAWpage, .Drawpage, DrAwPage ist falsch.

Code: Alles auswählen

doc = XSCRIPTCONTEXT.getDocument()
formulare =doc.DrawPage.Forms
termine = (formulare.getByName("Filter_Alle")
                    .getByName("MainForm")
                    .getByName("Filter_Termine")
                    .getByName("Termine")
                    )

nID = termine.getInt( termine.findColumn("T_ID"))
(ohne Gewähr das ich alle Methoden richtig geschrieben habe)
und so siehts aufgeräumter aus.

Zum DatebankBeispiel oben: eventuell so in der Richtung....

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")))
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 » Do 3. Mär 2016, 14:05

Danke!

Wo finde ich Informationen, wie das Alles richtig geschrieben wird? Basic unterscheidet ja nicht zwischen Groß- und Kleinschreibung, Python offenbar schon...

In der Basic-IDE kann ich die Objekte "anschauen", da sehe ich die Schreibweisen. Aber Python wird nicht über die IDE bearbeitet...
Kann ich Python-Skripte eigentlich auch aus LO heraus debuggen? Konrekt eine schrittweise Ausführung, Zeile für Zeile und dabei die Inhalte der Variablen checken...

lg scientific

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

Re: Datenbank SQL mit Python

Beitrag von karolus » Do 3. Mär 2016, 15:31

Hallo
Wo finde ich Informationen, wie das Alles richtig geschrieben wird? Basic unterscheidet ja nicht zwischen Groß- und Kleinschreibung, Python offenbar schon...
Du benutzt doch hoffentlich MRI
Das kann über →Extras→Addons... aus der grafischen Oberfläche als auch aus dem Code heraus aufgerufen werden.

Und wenn du Code-autvervollständigung hast, musst du noch nichtmal selbst wissen wie was geschrieben wird, den Hinweis auf Ipython notebook hatte ich ja gerade schon gegeben.
Kann ich Python-Skripte eigentlich auch aus LO heraus debuggen?
Nein, nicht in der Form aus LO heraus- ansonsten gleiche Antwort wie oben `ipython notebook` ist in der Hinsicht besser als die Basic-IDE und MRI kann ich auch von dort aus benutzen.

Soweit ich weiss soll sowas ähnliches mit den "grossen" IDE's Netbeans|Eclipse in Verbindung mit PyDev und irgndenwelchen soffice-plugins funktionieren, da kann ich mangels eigener Erfahrung nichts konkretes sagen.
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 » Do 3. Mär 2016, 16:00

karolus hat geschrieben:Hallo

Ich fang mal hiermit an:

Code: Alles auswählen

oform = ThisComponent.drawpage.Forms.getbyname("Filter_Alle").getbyname("MainForm").getbyname("Filter_Termine").getbyname("Termine")
nID = oform.getint(oform.FindColumn("T_ID"))
python verlangt überall die richtige Schreibweise bei allen Attributen und Methoden:
.DrawPage ist richtig, alles andere wie zb.:
.drawpage , .DRAWpage, .Drawpage, DrAwPage ist falsch.

Code: Alles auswählen

doc = XSCRIPTCONTEXT.getDocument()
formulare =doc.DrawPage.Forms
termine = (formulare.getByName("Filter_Alle")
                    .getByName("MainForm")
                    .getByName("Filter_Termine")
                    .getByName("Termine")
                    )

nID = termine.getInt( termine.findColumn("T_ID")) 
(ohne Gewähr das ich alle Methoden richtig geschrieben habe)
und so siehts aufgeräumter aus.

Zum DatebankBeispiel oben: eventuell so in der Richtung....

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")))
 
Ich hab jetzt einmal probiert, einem Button ein Python-Skript zur Ausführung zuzuweisen. Das funktioniert aber nicht. Mir werden zwar die *.py-Files angezeigt, aber keine Funktion zur Auswahl angeboten.

Muss ich das doch über ein Basic-Makro machen?
Ich nahm auch mal das Stichwort "Listener" im Zusammenhang auch mit Python wahr... Ist es das, wo ich weiterforschen muss?

Funktionen haben einen Rückgabewert, den ich mit "return" belegen kann.
Wo landen die "print()"-Ausgaben, wenn ich ein Python-Skript aus LO her aufrufe?

lg scientific

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

Re: Datenbank SQL mit Python

Beitrag von karolus » Do 3. Mär 2016, 21:00

Hallo
Funktionen haben einen Rückgabewert, den ich mit "return" belegen kann.
Jain!! Funktionen geben implizit den speziellen Wert `None` zurück, oder das was hinter einem expliziten
`return ...` steht, bei einem nackten `return` ist der Rückgabewert ebenfalls `None`
Falls ein `return` -Statement irgendwo innerhalb der Funktion erreicht wird. wird die Funktion an der Stelle sofort verlassen ( ==beendet)

Wo landen die "print()"-Ausgaben, wenn ich ein Python-Skript aus LO her aufrufe?
Du kannst aus LO nicht das Script als ganzes aufrufen sondern nur einzelne Funktionen aus dem Script, der Code auf Modulebene wird bei Ausführung einer Funktion ebenfalls ausgeführt.
Die `print`-Ausgaben landen im Terminal*** aus dem der soffice-process gestartet wurde, aus dem Grunde ist es auch zum Entwickeln angebracht soffice aus einem Terminal zu starten und nicht per Doppelklick auf irgendwelche Desktop-icons.
***Weil die Terminalgeschichte unter Windows ein Problemkind ist gibts da auch noch optionale Ausgabeumleitungen in eine Log-Datei.
Und wenn du zwingend auch in python eine `msgbox` brauchst um glücklich zu werden (für LO, bei AOO nicht dabei)

Code: Alles auswählen

from msgbox import MsgBox
myBox = MsgBox(XSCRIPTCONTEXT.getComponentContext())
myBox.addButton("Yes")
myBox.addButton("No")
myBox.addButton("May be")
msgbox = myBox.show

def example_with_msgbox():
    msgbox("hallo Welt", 1, "das ist der Titel") 

Ich nahm auch mal das Stichwort "Listener" im Zusammenhang auch mit Python wahr... Ist es das, wo ich weiterforschen muss?
Dann behalt das Stichwort mal im Hinterkopf für irgendwann später, bei der Grundlagenforschung die du momentan betreibst brauchst du darüber noch nicht nachzudenken.





Ich hab jetzt einmal probiert, einem Button ein Python-Skript zur Ausführung zuzuweisen. Das funktioniert aber nicht. Mir werden zwar die *.py-Files angezeigt, aber keine Funktion zur Auswahl angeboten.
Wie bereits weiter oben gesagt werden kann man lediglich Funktionen zuweisen, nicht das Script (die .py Datei) als ganzes...
Daher:
  • Der Code muss in Funktionen strukturiert werden
  • Der Code muss kompilieren - d.h. jeder Syntaxfehler**, Einrückungsfehler*** führt dazu das die Funktionen unsichtbar werden
    **immer wieder gerne genommen werden da ( öffnende Klammern ohne korrespondierende schliessende ..
    ***achte einfach darauf immer exakt 4 Leerzeichen pro Einrückungsebene zu verwenden, und stell deinen Texteditor entspechend ein (zb. das die <tab>-taste durch 4 Leerzeichen ersetzt wird
  • wichtig bei der Zuweisung über Buttons, Ereignisse, etc:
    LO reicht bei der Ausführung den "Aufrufer" als Argument an die Funktion durch, eine derart aufgerufene Funktion braucht in python zwingend auch eine entsprechende Signatur, dh. siehe Code

Code: Alles auswählen

from msgbox import MsgBox
myBox = MsgBox(XSCRIPTCONTEXT.getComponentContext())
myBox.addButton("Yes")
myBox.addButton("No")
myBox.addButton("May be")
msgbox = myBox.show

def example_with_msgbox1():
    #leere Signatur
    #geht nicht per button oder anderes Ereigniss
    msgbox("hallo Welt", 1, "das ist der Titel")
    
def example_with_msgbox2( event ):
    #das geht per Aufruf über Button.
    name = event.Source.Model.Name
    msg = "mein Aufrufer heisst: %s" %name
    msgbox(msg, 1, "ich kann per Ereigniss "
                      "aufgerufen werden")
    
def example_variabel(*event):
    # der vorangetellte * signalisiert
    # eine optionale Argumentliste incl. null Argumente
    m = event or 'nix'
    msgbox( m, 1,"ich kann mit und ohne ..." )
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 » Do 3. Mär 2016, 22:48

Vielen Dank karolus. Das waren jetzt die essentiellen Infos, mit denen ich gut weiterarbeiten kann. :)

lg scientific

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

Re: Datenbank SQL mit Python

Beitrag von scientific » Do 3. Mär 2016, 23:59

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'


        
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