[API] Exécution de requête SQL sous Base
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
[API] Exécution de requête SQL sous Base
Question récurrente sur le forum.
Mais bon, avant de vous précipiter dans une macro, assurez-vous quand même que vous ne pouvez pas faire sans.
Les formulaires sous Base permettent de faire toutes les opérations SQL.
Vous pouvez aussi utiliser une requête ou une vue si vous avez quelque chose de plus complexe.
Bref, l'utilisation d'une macro ne doit être qu'un dernier recours.
Rappelez-vous qu'une macro ne fera jamais plus que se que vous feriez avec du SQL si ce n'est automatiser la tâche.
Sommaire
Mais bon, avant de vous précipiter dans une macro, assurez-vous quand même que vous ne pouvez pas faire sans.
Les formulaires sous Base permettent de faire toutes les opérations SQL.
Vous pouvez aussi utiliser une requête ou une vue si vous avez quelque chose de plus complexe.
Bref, l'utilisation d'une macro ne doit être qu'un dernier recours.
Rappelez-vous qu'une macro ne fera jamais plus que se que vous feriez avec du SQL si ce n'est automatiser la tâche.
Sommaire
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
A. Connexion à la base
Rappel : contrairement aux autres modules, Base est représenté par l'objet ThisDatabaseDocument
Explication des lignes
Attention car ce code est fourni uniquement pour le format natif HSQL.
L'utilisation de Base avec un autre SGBD (MySQL, Oracle, etc) imposera une autre syntaxe notamment pour la ligne 4 et la connexion à la base.
Code : Tout sélectionner
sUrl = ThisDatabaseDocument.URL
oDC = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oSrc = oDC.getByName(sUrl)
oDB = oSrc.getConnection("","")
oCnx = oDB.createStatement()
Explication des lignes
- on récupère d'abord le chemin complet (URL) de notre ODB
- on appelle le service pour se connecter à la base de données
- on lui passe le nom de base
- on donne les identifiant / mot de passe qui sont par défaut vides
- on récupère un objet pour la connexion obtenue
Attention car ce code est fourni uniquement pour le format natif HSQL.
L'utilisation de Base avec un autre SGBD (MySQL, Oracle, etc) imposera une autre syntaxe notamment pour la ligne 4 et la connexion à la base.
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
Avant de partir tête baissée
Si vous tentez d'exécuter un SELECT...
Assurez-vous que votre requête SQL est correcte et qu'elle renvoie bien des informations.
Pour cela, exécutez là d'abord dans l'interface :
Si vous tentez d'exécuter autre chose tel qu'un INSERT, UPDATE ou autre DELETE...
Assurez-vous que cela ne retourne pas d'erreur.
Pour cela, exécutez la requête dans le dialogue SQL :
Assurez-vous que votre requête SQL est correcte et qu'elle renvoie bien des informations.
Pour cela, exécutez là d'abord dans l'interface :
Si vous tentez d'exécuter autre chose tel qu'un INSERT, UPDATE ou autre DELETE...
Assurez-vous que cela ne retourne pas d'erreur.
Pour cela, exécutez la requête dans le dialogue SQL :
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
C. Règles de typographie dans une macro
Votre requête fonctionne, il faut alors ajouter quelques caractères afin de pouvoir la passer.
Exemple :
Trois règles simples :
Dans le cadre d'une apostrophe dans une variable, celle-ci doit être "échappée".
Exemple :
Exemple :
Code : Tout sélectionner
SELECT test FROM toto WHERE truc = 'x'
Trois règles simples :
- vous devez encadrer la requête par des guillemets
- vous devez encadrer chaque champ ou nom de table par des guillemets doubles
- vous devez ajouter des apostrophes simples pour les variables
Code : Tout sélectionner
sReq = "SELECT ""test"" FROM ""toto"" WHERE ""truc"" = 'x' "
Dans le cadre d'une apostrophe dans une variable, celle-ci doit être "échappée".
Exemple :
Code : Tout sélectionner
sReq = "SELECT ""test"" FROM ""toto"" WHERE ""truc"" = 'l\'apostrophe' "
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
D. Exécution d'un SELECT par macro
N'oubliez pas le code de connexion à la base sans quoi le script ne fonctionnera pas.
Code : Tout sélectionner
sReq = "SELECT ""test"" FROM ""toto"" WHERE ""truc"" = 'x' "
sRet = oCnx.executeQuery(sReq)
sRet.next
msgbox sRet.getColumns().getByName("test").getString()
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
E. Fermez la !
Code : Tout sélectionner
oCnx.dispose
N'oubliez pas de fermer la connexion
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
F. Alternative de stockage des requêtes
Avoir le texte de ses requêtes dans une macro n'est pas chose aisé pour la maintenance.
Il faut en effet trouver la routine et le SQL qui est exécuté. La difficulté est accrue avec la syntaxe particulière pour l'exécution vu précédemment.
Il est tout à fait possible d'utiliser le volet Requêtes dans Base :
Cela a l'avantage de :
Il faut en effet trouver la routine et le SQL qui est exécuté. La difficulté est accrue avec la syntaxe particulière pour l'exécution vu précédemment.
Il est tout à fait possible d'utiliser le volet Requêtes dans Base :
Cela a l'avantage de :
- pouvoir nommer sa requête avec un nom plus parlant
- rédiger plus naturellement le SQL sans avoir à respecter la syntaxe imposée dans une macro
- maintenir facilement chaque requête en cas de modification
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
G. Exécution d'une requête SELECT
Comme nous l'avons vu au paragraphe B, créons notre requête dans l'éditeur.
Vous pouvez bien sûr utiliser les 3 modes à votre disposition (ébauche, assistant ou SQL direct).
Par exemple, un SELECT pour l'échéance de clients après 2019 :
La requête s'appelle logiquement "Echeance apres 2019"
La macro exécutant cette requête sera :
NB : n'oubliez pas d'ajouter le code pour la connexion à la base et la déconnexion (§ A et E).
Vous pouvez bien sûr utiliser les 3 modes à votre disposition (ébauche, assistant ou SQL direct).
Par exemple, un SELECT pour l'échéance de clients après 2019 :
La requête s'appelle logiquement "Echeance apres 2019"
La macro exécutant cette requête sera :
Code : Tout sélectionner
oReq = oDB.Queries.getByName("Echeance apres 2019")
sReq = oReq.Command
sRet = oCnx.executeQuery(sReq)
sRet.next
msgbox sRet.getColumns().getByName("Nom").getString()
NB : n'oubliez pas d'ajouter le code pour la connexion à la base et la déconnexion (§ A et E).
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
H. Requête autre qu'un SELECT
L'éditeur en mode SQL direct refuse tout autre requête qu'un SELECT.
Il y a d'ailleurs la demande d'amélioration sur laquelle je vous invite à voter.
L'astuce dans ce cas, consiste à ne pas faire vérifier le code en cliquant sur le bouton "Exécuter directement l'instruction SQL" :
Seul bémol, vous ne pourrez jamais tester le résultat de ce type de requête.
Soyez donc très prudent lors de l'exécution en utilisant des copies de votre base.
La macro pour l'exécution d'une requête de mise à jour (UPDATE) ou d'effacement (DELETE) :
Il y a d'ailleurs la demande d'amélioration sur laquelle je vous invite à voter.
L'astuce dans ce cas, consiste à ne pas faire vérifier le code en cliquant sur le bouton "Exécuter directement l'instruction SQL" :
Seul bémol, vous ne pourrez jamais tester le résultat de ce type de requête.
Soyez donc très prudent lors de l'exécution en utilisant des copies de votre base.
La macro pour l'exécution d'une requête de mise à jour (UPDATE) ou d'effacement (DELETE) :
Code : Tout sélectionner
oReq = oDB.Queries.getByName("Nom de la requete")
sReq = oReq.Command
oCnx.executeUpdate(sReq)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
-
- Webmestre
- Messages : 513
- Enregistré le : lun. mai 21, 2007 2:08 pm
I. Exécution par macro avec paramètres
Comme au paragraphe D, on peut également préparer une requête avec paramètres.
Reprenons notre exemple précédent :
La méthode prepareStatement permet d'insérer le SQL comme suit :
Pour la récupération des valeurs d'un contrôle de formulaire, reportez-vous sur ce fil.
Reprenons notre exemple précédent :
Code : Tout sélectionner
UPDATE "Client" SET "Valeur" = ? WHERE "Nom" LIKE ?
La méthode prepareStatement permet d'insérer le SQL comme suit :
Code : Tout sélectionner
sSQL = "UPDATE ""Client"" SET ""Valeur"" = ? WHERE ""Nom"" LIKE ?"
oReq = oDB.prepareStatement(sSQL)
oReq.setLong(1, oCtrlNum.Value)
oReq.setString(2, oCtrlNom.Text)
sReq = oReq.Command
oCnx.executeUpdate(sReq)
Pour la récupération des valeurs d'un contrôle de formulaire, reportez-vous sur ce fil.
Qui est en ligne
Utilisateurs parcourant ce forum : claudebot [Crawler] et 1 invité