🙏 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!🍀
>> 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
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Datenbank SQL mit Python
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
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
Re: Datenbank SQL mit Python
Du weisst doch wie du in Basic Api-methoden benutzt.
das geht in python genauso.
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)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Re: Datenbank SQL mit Python
Nun...
Ich hab in meinem Skript:
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:
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
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
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"))
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
Re: Datenbank SQL mit Python
Hallo
Ich fang mal hiermit an:
python verlangt überall die richtige Schreibweise bei allen Attributen und Methoden:
.DrawPage ist richtig, alles andere wie zb.:
.drawpage , .DRAWpage, .Drawpage, DrAwPage ist falsch.
(ohne Gewähr das ich alle Methoden richtig geschrieben habe)
und so siehts aufgeräumter aus.
Zum DatebankBeispiel oben: eventuell so in der Richtung....
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"))
.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"))
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)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Re: Datenbank SQL mit Python
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
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
Re: Datenbank SQL mit Python
Hallo
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.
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.
Du benutzt doch hoffentlich MRIWo finde ich Informationen, wie das Alles richtig geschrieben wird? Basic unterscheidet ja nicht zwischen Groß- und Kleinschreibung, Python offenbar schon...
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.
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.Kann ich Python-Skripte eigentlich auch aus LO heraus debuggen?
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)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Re: Datenbank SQL mit Python
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.karolus hat geschrieben:Hallo
Ich fang mal hiermit an:python verlangt überall die richtige Schreibweise bei allen Attributen und Methoden: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"))
.DrawPage ist richtig, alles andere wie zb.:
.drawpage , .DRAWpage, .Drawpage, DrAwPage ist falsch.
(ohne Gewähr das ich alle Methoden richtig geschrieben habe)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"))
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")))
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
Re: Datenbank SQL mit Python
Hallo
`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)
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)
Daher:
Jain!! Funktionen geben implizit den speziellen Wert `None` zurück, oder das was hinter einem explizitenFunktionen haben einen Rückgabewert, den ich mit "return" belegen kann.
`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)
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.Wo landen die "print()"-Ausgaben, wenn ich ein Python-Skript aus LO her aufrufe?
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")
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 nahm auch mal das Stichwort "Listener" im Zusammenhang auch mit Python wahr... Ist es das, wo ich weiterforschen muss?
Wie bereits weiter oben gesagt werden kann man lediglich Funktionen zuweisen, nicht das Script (die .py Datei) als ganzes...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.
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)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Re: Datenbank SQL mit Python
Vielen Dank karolus. Das waren jetzt die essentiellen Infos, mit denen ich gut weiterarbeiten kann. 
lg scientific

lg scientific
-
- Beiträge: 131
- Registriert: Do 25. Apr 2013, 17:27
Re: Datenbank SQL mit Python
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")))
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 )]
)
[EDIT]
Man muss offenbar noch einen Service/Interface importieren.
Code: Alles auswählen
import com.sun.star.sdbc.XResultSet
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'
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.