[Résolu][Python] Envoyer une requète SQL avec Calc

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Artazis
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 18 janv. 2023 14:44

[Résolu][Python] Envoyer une requète SQL avec Calc

Message par Artazis »

Bonjour

Je souhaite envoyer des valeurs calculer dans des feuilles avec Calc vers une base de données MySQL.

Je me suis installé à mon compte récemment. Je calcule mes tarifs à l'aide de calc en prenant plusieurs paramètres en compte. Je souhaite que ces prix soient mis à jour de manière assez automatique dans une base MySQL. C'est une tâche assez laborieuse à faire à la main car beaucoup de références. La BDD est stockée sur une raspberry sur mon réseau. C'est une BDD créée par Dolibarr (logiciel de facturation et bien plus). Les accès à la BDD sont ouverts pour y accéder avec mon PC et également depuis l'extérieur. J'y accède bien et je la modifie avec base à l'aide d'un connecteur JDBC.

Pour le moment, j'ai 2 pistes :
-la bibliothèque calcSQL à modifier
-script python

Je commence vers la 2eme piste.
J'ai installé l'extension APSO comme expliquée dans cette vidéo
https://www.youtube.com/watch?v=3Ef_ordyWQs

Pour ceux que sont sous linux, installer le paquet libreoffice-script-provider-python avec la commande suivante :

Code : Tout sélectionner

sudo apt install libreoffice-script-provider-python
Pour le moment, j'en suis là. Les scripts s’exécutent bien. Plus qu'a faire le mien. Ça risque de ne pas être dans les règles de l'art vu que ce sera mon 2eme script python après celui de l'exemple de la vidéo :P . Soyez indulgents et j’accepte toutes les remarques constructives.
Dernière modification par Artazis le 14 févr. 2023 03:44, modifié 3 fois.
Linux mint 20.3
Libre office 6.4.7.2 (Version stable des dépôts de mint)
Artazis
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 18 janv. 2023 14:44

Re: [Python] Envoyer une requète SQL avec Calc

Message par Artazis »

Ca fonctionne :D . Mon script n'est pas encore au point, mais les premières briques sont posées.

Code : Tout sélectionner

# coding: utf-8
from __future__ import unicode_literals

#1- Connection à la base dolibarr  distante sur la raspberry
import pyodbc

#affichage des différents drivers installés
for driver in pyodbc.drivers():
    print(driver)

connexion = pyodbc.connect("DRIVER=MySQL ODBC 8.0 Unicode Driver; \
                        SERVER=192.168.0.24; \
                        PORT=3306;\
                        DATABASE=dolibarr;\
                        UID=xxxx;\
                        PWD=xxxx;\
                        charset=utf8mb4")
cursor = connexion.cursor()

#2- Tester la récupération du prix (price) d'une reférence  (ref) dans la table llx_product
requete = "SELECT price FROM llx_product WHERE ref = '100_CONSUEL_NEUF'"

cursor.execute(requete)

#Affiche le résultat dans la console
resultat = cursor.fetchone()[0]
print("La valeur récupérée avant modification est :", resultat)

#3- Mettre cette valeur dans une cellule du tableau (J10) de la feuille ouverte
desktop = XSCRIPTCONTEXT.getDesktop()
model = desktop.getCurrentComponent()
sheet = model.CurrentController.ActiveSheet
cell= sheet.getCellRangeByName("J10")
cell.setValue(resultat)

# 4- Mise à jour du prix et du prix TTC dans la table llx_product de la référence 
requete = "UPDATE llx_product SET price = 113.11 WHERE ref = '100_CONSUEL_NEUF'"
cursor.execute(requete)
requete = "UPDATE llx_product SET price_ttc = 113.11 WHERE ref = '100_CONSUEL_NEUF'"
cursor.execute(requete)

# 5- Vérification que les valeurs sont bien passées. Affichage uniquement dans la console
requete = "SELECT price FROM llx_product WHERE ref = '100_CONSUEL_NEUF'"
cursor.execute(requete)

resultat = cursor.fetchone()[0]
print("La valeur récupérée après modification est :", resultat)

# 6- Validation des modifications. A faire obligatoirement sinon, la base n'est pas modifiée durablement.
connexion.commit()

#Fermer la connexion
cursor.close()
conn.close()

# Pour debuguer dans calc
from apso_utils import msgbox
msgbox('terminé')
Pour que ça fonctionne, il faut installer les pilotes correspondant au type de connecteur que l'on souhaite disponible ici :
https://www.mysql.com/fr/products/connector/.
J'ai eu un petit souci avec une dépendance du paquet mysql-community-client-plugin. J'ai trouvé ce paquet sur le même site. Une fois installé, j'ai pu installé le connecteur.

Dans mon cas, j'avais besoin du connecteur ODBC dont la doc est ici :
https://github.com/mkleehammer/pyodbc/w ... g-to-MySQL

Voila. Ça fonctionne juste pour une référence pour le moment et sans prendre la valeur des cellules. Il me reste à faire des boucles pour toutes les références, de la mise en forme, ... Le principe est là. Je pense que si quelqu'un cherche à faire quelque chose de similaires, les infos utiles sont là. Après, c'est du cas par cas.
Linux mint 20.3
Libre office 6.4.7.2 (Version stable des dépôts de mint)
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1468
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Résolu][Python] Envoyer une requète SQL avec Calc

Message par jeanmi2403 »

Bonsoir,
Bravo !!
Ca semble plus simple qu'en Basic (une fois tous les composants supplémentaires installés).
Mais on peu faire la même chose avec une connexion à la base odb qui te sert pour l'accès à ta base Mysql.
Je n'y avais pas pensé avant, le principe est le même.
En tout cas, pour moi, ce n'est pas "Envoi d'une requête SQL avec Calc", puisque c'est une macro qui peut être localisée dans un classeur ou une base.
Désolé d'être puriste au niveau du vocabulaire :D
Bon courage pour la suite !
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX