[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.
Avatar de l’utilisateur
cris59
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 482
Inscription : 20 mars 2006 16:15
Localisation : Paris
Contact :

[Base] Conseil pour construire une requête SQL

Message par cris59 »

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
Messages : 482
Inscription : 20 mars 2006 16:15
Localisation : Paris
Contact :

Message par cris59 »

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
Messages : 482
Inscription : 20 mars 2006 16:15
Localisation : Paris
Contact :

Message par cris59 »

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
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25142
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

Message par Dude »

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

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
NB : executeUpdate sera logiquement utilisé pour une requête de mise à jour UPDATE
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25142
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

Requête DELETE

Message par Dude »

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

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)
kimaidou
Fraîchement OOthentifié
Messages : 8
Inscription : 10 sept. 2008 11:54

Requête SELECT

Message par kimaidou »

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

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
leo42
NéOOphyte
NéOOphyte
Messages : 62
Inscription : 18 sept. 2008 19:00

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

Message par leo42 »

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
alphaville974
Fraîchement OOthentifié
Messages : 1
Inscription : 14 sept. 2011 04:31

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

Message par alphaville974 »

Merci pour ce post :D :D :D
OpenOffice 2.4 sous Windows XP
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 09:15
Localisation : T'as pas dit bonjour, merci et à bientot !

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

Message par martinbrait »

@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"
Répondre