[Base] Conseil pour construire une requête SQL

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur: Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.

[Base] Conseil pour construire une requête SQL

Messagepar cris59 » 02 Juin 2006 07:22

RAPPEL 1

" ou guillemet ou double cote ou chr(34)

' ou apostrophe ou simple cote ou chr(39)

quelque soit le nom que vous utilisez, ce ne sont pas les mêmes touches sur votre clavier... deux apostrophes ne sont pas égales à un guillemet


RAPPEL 2

Une requête SQL est chaine avec un formatage spécifique

SELECT "Champ1" FROM "uneTable" WHERE "Champ2"='uneValeur'

- les noms de champs et de tables sont entre double cote

- les valeurs de champs sont entre simple cote


Méthode de construction d'une requête envoyée par macro

1. Ecrivez votre requête telle qu'elle devra être vue par votre base

SELECT "Champ1" FROM "uneTable" WHERE "Champ2"='uneValeur'

2. Mettre sa requête dans une chaine

METHODE 1

Mettre les " en début et fin de votre requête, puis doubler les " qui sont à l'intérieur de votre chaine

"SELECT ""Champ1"" FROM ""uneTable"" WHERE ""Champ2""='uneValeur'"

si uneValeur doit être une variable :

"SELECT ""Champ1"" FROM ""uneTable"" WHERE ""Champ2""='" & uneVariable & "'"


METHODE 2

Utiliser le code ASCII des " --> chr(34) et des ' --> chr(39)

"SELECT " & chr(34) & "Champ1" & chr(34) & " FROM " & chr(34) & "uneTable" & chr(34) & " WHERE " & chr(34) & "Champ2" & chr(34) & "='uneValeur'"

si uneValeur doit être une variable :


"SELECT " & chr(34) & "Champ1" & chr(34) & " FROM " & chr(34) & "uneTable" & chr(34) & " WHERE " & chr(34) & "Champ2" & chr(34) & "=" & chr(39) & uneVariable & chr(39)


ATTENTION

Si votre valeur de champ contient des ', il est nécessaire de les doubler !!

exemple

'l'artiste' deviendra 'l''artiste'



cris59

PS : j'espère ne pas avoir fait d'erreur, si c'est le cas dites le moi ....


Le modérateur a écrit:Merci pour ce sujet interessant mis en Post-it.
WinXP PRO SP2 avec OOo2.2 & Vista avec OOo2.3.1
& Debian avec OOo2.2

http://www.cpserv.net/
Avatar de l’utilisateur
cris59
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 482
Inscrit le : 20 Mars 2006 16:15
Localisation : Paris

Messagepar cris59 » 02 Juin 2006 07:55

CONSEIL 1

Avant d'envoyer votre requête, faites un MsgBox dessus pour visualiser ce que vous allez envoyer ...

Cela vous permettra une correction rapide des problèmes de formatage de la chaine!

cris59
WinXP PRO SP2 avec OOo2.2 & Vista avec OOo2.3.1
& Debian avec OOo2.2

http://www.cpserv.net/
Avatar de l’utilisateur
cris59
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 482
Inscrit le : 20 Mars 2006 16:15
Localisation : Paris

Messagepar cris59 » 12 Juin 2006 19:34

CONSEIL 2

Avant de vous lancer dans les requête par macro, assurez-vous que cela vous est nécessaire.

N'oubliez pas que vous pouvez faire des requêtes directement dans OOoBase :

1. des requêtes de type SELECT dans la section requête ... en mode ébauche, en vue SQL ou avec l'assistant

2. tous types de requêtes dans Outils / SQL ...

cris59
WinXP PRO SP2 avec OOo2.2 & Vista avec OOo2.3.1
& Debian avec OOo2.2

http://www.cpserv.net/
Avatar de l’utilisateur
cris59
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 482
Inscrit le : 20 Mars 2006 16:15
Localisation : Paris

Messagepar Dude » 19 Jan 2007 10:15

Requête INSERT pour insérer un enregistement :

On part du principe que vous avez un fichier ODB avec un nom de base enregistré "Test" (menu Outils / Options / Base / Base de données).

Dans notre exemple, nous avons une table Clients avec comme structure :
ID -> Clé primaire [INTEGER] + AutoValeur
Nom -> Texte [VARCHAR] 100

Code : Tout sélectionner   AgrandirRéduire
dim maConnexion as Object

Sub ConnecterSource()
Dim NomSource As String, login As String, password As String
Dim maSource As Object, monDbContext As Object
'Création du contexte
NomSource = "test"
monDbContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
maSource = monDbContext.getByName(NomSource)

'Les paramètres de connexion éventuels
login = ""
password = ""
maConnexion = maSource.getConnection(login, password)
if IsNull(maConnexion) then
  MsgBox("Connexion impossible", 16)
  Stop
end if
End Sub

Sub DeconnecterSource()
maConnexion.close
maConnexion.dispose
End Sub

Sub Insert()
dim maRequete as Object, resultat as long
dim insertSQL as String

ConnecterSource

insertSQL = "insert into " & chr(34) & "Clients" & chr(34) & " " & _
         "( " & chr(34) & "Nom" & chr(34) & ") values (" _
         & chr(39) & "DURAND" & chr(39) & ")"

maRequete = maConnexion.createStatement()
resultat = maRequete.executeUpdate(insertSQL)
MsgBox "Ok insertion effectuée !"

DeconnecterSource

End Sub
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20704
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Requête DELETE

Messagepar Dude » 21 Août 2008 11:36

Même chose pour une requête SQL visant à effacer des enregistrements

Dans l'exemple ci-dessous, je ne reprends que la procédure principale. La requête vise à détruire les clients dont le nom commence par "DU"
Code : Tout sélectionner   AgrandirRéduire
Sub Detruit()
dim maRequete as Object, resultat as long
dim reqSQL as String

ConnecterSource

reqSQL = "delete from " & chr(34) & "Clients" & chr(34) & " " & _
         " where " & chr(34) & "Nom" & chr(34) & " like " _
         & chr(39) & "DU%" & chr(39) & " "

maRequete = maConnexion.createStatement()
resultat = maRequete.executeUpdate(reqSQL)
MsgBox "Destruction effectuée pour " & resultat & " enregistrement(s)"

DeconnecterSource

End Sub


Vous noterez que le résultat d'exécution de la requête (via executeUpdate) contient le nombre d'enregistrements détruits.

8)
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20704
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Requête SELECT

Messagepar kimaidou » 16 Sep 2008 15:22

Pour compléter les requetes via une macro :
On cherche à récupérer la valeur renvoyée par une requête SELECT. Dans cet exemple, la requête ne renvoit qu'une ligne et qu'une colonne.

Code : Tout sélectionner   AgrandirRéduire
Sub ReqSELECT()
dim maRequete as Object, resultat as Object
dim selectSQL as String

ConnecterSource

selectSQL = "SELECT ""test"" FROM ""toto"" WHERE ""truc"" = '1'  "

maRequete = maConnexion.createStatement()
resultat = maRequete.executeQuery(selectSQL)

rem ** il faut utiliser la méthode next pour aller chercher le premier résultat de la requete
resultat.next

rem *** on affiche le resultat de la requete dans une boite de dialogue
msgbox resultat.getColumns().getByName("test").getString()

DeconnecterSource
End Sub
Kimaidou
Ubuntu Hardy Heron - OpenOffice2.4
kimaidou
Fraîchement OOthentifié
 
Message(s) : 8
Inscrit le : 10 Sep 2008 10:54

Re: [Base] Conseil pour construire une requête SQL

Messagepar leo42 » 03 Oct 2008 17:15

bonjour

un petit truc sympa qui simplifie la vie

quand on a une requête à passer par du code le plus simple c'est:
  1. créer la requête à l'aide de l'éditeur de base
  2. ouvrir l'éditeur en mode SQL
    puis copier le texte de la requête dans un logiciel de traitement de textes
  3. se servir de la fonction "REMPLACER" pour remplacer tous les " par des "" mettre un " en début et en fin de requête

et voila il ne reste plus qu'à coller la requête dans le code
leo42
NéOOphyte
NéOOphyte
 
Message(s) : 62
Inscrit le : 18 Sep 2008 18:00

Re: [Base] Conseil pour construire une requête SQL

Messagepar alphaville974 » 14 Sep 2011 04:48

Merci pour ce post :D :D :D
OpenOffice 2.4 sous Windows XP
alphaville974
Fraîchement OOthentifié
 
Message(s) : 1
Inscrit le : 14 Sep 2011 03:31

Re: [Base] Conseil pour construire une requête SQL

Messagepar martinbrait » 20 Mars 2016 09:23

@leo42
Dans le basic, on peut aussi écrire les champs sans aucune côte. :idea:

côté console :
SELECT ""JolieTable"" FROM ""MaBase""

suffisant, côté basic :
strSQL="SELECT JolieTable FROM MaBase"
LibreOffice version 5.1.6.2
Windows 10
+
LibreOffice version 4.3.6.2.0
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0


Bonjour, merci et à bientôt !
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 751
Inscrit le : 09 Avr 2013 08:15
Localisation : T'as pas dit bonjour, merci et à bientot !


Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)