IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Requete SQL dans VBA [AC-2010]


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Requete SQL dans VBA
    Bonjour à tous
    Débutant en VBA, je cherche depuis plusieurs semaines une solution à la création d'une liste déroulante avec images dans un formulaire; cette liste étant conditionnée par la valeur fournie dans un champ précédent du formulaire.
    En plus "clair", je choisi un producteur dans une liste puis je veux une liste des visuels qui appartiennent à ce producteur pour ma deuxième liste déroulante.
    Les données:
    R_Visuel_Producteur_Ord_Prod est une requête qui trie l'ensemble des visuels par producteur croissant dans un ordre prédéfini; Chaque record comprend:
    Visuel_Id qui est un numauto identifiant unique de chaque visuel, Photo qui est le chemin des photos (String), NomProducteur qui est le nom du producteur possédant ce visuel (String)
    J'ai suivi et même pompé le tuto sur les fenêtres étendues mais j'ai toujours une erreur à l'exécution à cause du WHERE (erreur de syntaxe -opérateur absent- dans l'expression).
    Si je ne mets pas de condition WHERE, cela fonctionne mais dès que je veux ma liste limitée par le nom du producteur, j'ai une erreur.

    Voici le code de la procédure événementielle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim lValue As String
     
    lValue = InputBoxlistView("Choix Visuel", _
     "SELECT Photo, Visuel_Id FROM R_Visuel_Producteur_Ord_Prod WHERE (R_Visuel_Producteur_Ord_Prod.NomProducteur = " & Me.NomProducteur & ")", _
     1, True, "Visuel", , , , , , 300, 500, 255, RGB(43, 249, 9), _
     "Comic sans MS", 16, "Arial", 12, True, , 0, True, Array(-1, 0))
     
    If lValue <> "" Then MsgBox "Saisie :" & vbCrLf & lValue
    Me.Id_Visuel = lValue
    A noter que la requête SQL fonctionne en tant que telle dans Access.
    Ou ai-je fait une erreur ?
    Un peu d'aide me serait bien utile. Merci d'avance

  2. #2
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 878
    Points : 3 467
    Points
    3 467
    Par défaut
    Bonjour angel50,
    comme ton NomProducteur est au format texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE (R_Visuel_Producteur_Ord_Prod.NomProducteur ='" & Me.NomProducteur & "')", _
    ou autre possibilité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE (R_Visuel_Producteur_Ord_Prod.NomProducteur = " & chr(34) & Me.NomProducteur & chr(34) & ")", _
    Bonne journée

  3. #3
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 64
    Points : 94
    Points
    94
    Par défaut
    Bonsoir Angel50,

    A priori erreur classique dans la construction d'une requete SQL dans Vba,

    il faut encadrer la variable chaine (supposee telle, puisque c'est le nom du producteur) par un ' (l'apostrophe simple de la touche 4 sur le clavier
    pour obtenir ceci :
    "SELECT Photo, Visuel_Id FROM R_Visuel_Producteur_Ord_Prod WHERE (R_Visuel_Producteur_Ord_Prod.NomProducteur = '" & Me.NomProducteur & "')"
    donc apres le signe = et avant la parenthese fermante
    A la construction de la requete, lors de l'execution, la requete va devenir :
    SELECT Photo, Visuel_Id FROM R_Visuel_Producteur_Ord_Prod WHERE (R_Visuel_Producteur_Ord_Prod.NomProducteur = 'DupondDurant')
    et DupondDurant sera le nom du producteur recherche dans la table R_Visuel_Producteur
    et la Inputboxlistview aura comme 2eme parametre une requete SQL bien construite.

    Attention, les ' sont necessaires parce que la requete cherche une chaine de caracteres dans la table. Il ne faut pas les mettre si on cherche une valeur numerique. Exemple :
    "Select AnneeDuFilm from TableDesFilms where (AnneeDeSortie = " & LAnneeDemandee & ")"
    en supposant que AnneeDeSortie est un entier.

    Dans les deux cas les parentheses ne servent qu'a faire joli !!!

    Cdlt
    Caramel13

    Cdlt

  4. #4
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Caramel13, Robert1957 bonjour

    Vos explications sont claires et répondent parfaitement au problème posé.

    Juste une petite remarque, l'utilisation de ' dans la chaîne de requête et pour reprendre ton exemple Robert peut poser problème si le nom du producteur devait contenir un ' (exemple : l'herminier).

    "WHERE (R_Visuel_Producteur_Ord_Prod.NomProducteur ='" & Me.NomProducteur & "')", _
    pourrait renvoyer une erreur dans la chaîne.


    donc je préfère cette syntaxe : (qui limite les risques...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE (R_Visuel_Producteur_Ord_Prod.NomProducteur = " & chr(34) & Me.NomProducteur & chr(34) & ")", _
    Il existe certaines techniques permettant de pallier à ces inconvénient. L'utilisation d'un double quote permettrait de résoudre ce problème (je ne l'ai personnellement pas testé).

    Nous pourrions donc avoir ceci :

    Nom_Producteur = replace(Me.NomProducteur,chr(39),chr(39) & chr(39))

    "WHERE (R_Visuel_Producteur_Ord_Prod.NomProducteur ='" & Nom_Producteur & "')", _
    A valider ou requalifier...

    JimBoLion

  5. #5
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 64
    Points : 94
    Points
    94
    Par défaut
    Bonjour a Tous

    Ce qui est sur, c'est que la presence de simple/double apostrophe dans un element variable dynamiquement dans une chaine de requete est une veritable galere a gerer proprement. On ne sait jamais s'il faut en mettre une, deux, trois voire meme quatre !!! pour n'en conserver qu'une a la fin ...

    Donc je suis de l'avis de la solution de Jimbolion mais au lieu de mettre un chr(39) soit la simple, ou un chr(34) soit la double , je mets plutot le _ (underscore de la touche 8) qui permet une lecture beaucoup sympa dans un log ou un debug.
    et ne pose aucun souci dans une chaine SQL
    Et mieux encore, meme si c'est moins sympa pour le nom, ne jamais enregistrer ni simple, ni double apostrophe dans un champ de bdd. Mais c'est moins joli sur une adresse !!!

    Bonne journee
    Cdlt
    Caramel13

  6. #6
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Le plus propre est de passer par une requête paramétrée. Cela évite justement de devoir se battre avec les "'"'"''".

    Voir du côté de l'objet QueryDef : http://warin.developpez.com/access/d...=partie_4#L4.7

  7. #7
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    A tous,

    Je n'osais suggérer les requêtes paramétrées mais Tofalu l'a fait et c'est effectivement la meilleure solution.

    Tofalu la protection par un \ fonctionne t-elle à l'instar de postgresql ou mysql ? (ou l'idée de Caramel13 par le _)

    As-tu déjà essayé cela sur access ?

    Merci de ta réponse

    JimBoLion

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Il faut doubler la quote ou la double-quote avec Replace pour échapper les délimiteurs de chaines de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "SELECT * FROM MATABLE WHERE CRITERE=" & Chr(34) & Replace(zonetexte.Value, Chr(34), Chr(34) & Chr(34)) & Chr(34)
    le _ ne sert qu'à formater le code dans VBA.

    Mais dans le cas des requêtes paramétrées, il n'y a pas besoin d'échapper le délimiteur de chaînes de caractères puisqu'il ne figure pas dans la clause SQL.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PARAMETERS Param_Com Text ( 10 );
    SELECT *
    FROM Client
    WHERE Commentaire=Param_Com;

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous et merci pour vos commentaires et solutions. J'ai testé les différentes propositions.
    J'ai essayé la solution de jimbolion (#4) qui me semblait la meilleure pour prendre en compte l'évolution du programme. C'est Ok cela fonctionne. Je n'ai pas essayé la solution de Tofalu mais ce n'est que partie remise.
    Merci à Tous. Super pour votre aide.
    Cordialement
    Daniel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme requete SQL dans VBA
    Par sylvmand dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/03/2012, 15h17
  2. [AC-2007] Agregation requete SQL dans VBA avec combobox
    Par kimai dans le forum VBA Access
    Réponses: 5
    Dernier message: 22/03/2011, 05h23
  3. compter avec une requete SQL dans VBA
    Par michael1971 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/01/2008, 10h20
  4. requete SQL dans un programme VBA ?
    Par shuin dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/06/2007, 22h25
  5. Format dans Requete SQL sous VBA
    Par Sam 069 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/07/2006, 13h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo