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

Access Discussion :

Prise en compte de variable string vba dans SQL [AC-2016]


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Agronome
    Inscrit en
    Mars 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 31
    Points : 15
    Points
    15
    Par défaut Prise en compte de variable string vba dans SQL
    Bonjour,

    Je suis entrain de faire une requête pour afficher des valeurs à sélectionner sur la base d'une sélection de valeurs antérieures.
    Le problème que j'ai étant que lorsque je passe de la variable VBA où je stocke ma valeur à SQL je n'arrive pas à faire comprendre à sql que ma valeur de variable un texte .
    ex: WHERE R4_ReferencePrixSemaine.[Unité prix] = "kg"

    Lorsque je simple quote il m'affiche la variable comme un texte à remplir (msgbox du nom de ma valeur me demandant de rentrer un texte), lorsque je double quote "" strWhereUnite "" ; strWhereUnite apparait dans mon sql.

    Je vous indique mon code vba général en rouge est la partie qui bug ainsi que les sql qui résultent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Private Sub 
    Dim VarIDProd As Variant
    Dim VarUnite As String
    Dim VarBio As String
    
    VarIDProd = Nom_Produit.Column(1)
    strWhereProd = "[ID_Produit] = " & VarIDProd
    VarUnite = Unite.Column(0)
    strWhereUnite = " R4_ReferencePrixSemaine.[Unité prix] = " & VarUnite
    VarBio = Bio_Conventionnel.Column(0)
    strWhereBioconv = "R4_ReferencePrixSemaine.[Bio/Conventionnel] = " & VarBio
    
    'Choisir le tarif de réference pour un produit et un segment client
    SQL = "SELECT R4_ReferencePrixSemaine.TarifSelect, R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, " _
    & "R4_ReferencePrixSemaine.Source, R4_ReferencePrixSemaine.[Unité prix], Avg(R4_ReferencePrixSemaine.PrixRef) AS MoyenneDePrixRef, " _
    & "R4_ReferencePrixSemaine.[Bio/Conventionnel], R4_ReferencePrixSemaine.ID_Produit " _
    & "FROM R4_ReferencePrixSemaine " _
    & "GROUP BY R4_ReferencePrixSemaine.TarifSelect, R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, " _
    & "R4_ReferencePrixSemaine.Source , R4_ReferencePrixSemaine.[Unité prix], R4_ReferencePrixSemaine.[Bio/Conventionnel], " _
    & "R4_ReferencePrixSemaine.ID_Produit " _
    
    & "HAVING  " & strWhereUnite & " And " & strWhereBioconv & " " _
    
    & "And " & strWhereProd & " " _
    & " ORDER BY R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, R4_ReferencePrixSemaine.Source, " _
    & "Avg(R4_ReferencePrixSemaine.PrixRef); "
    Tarif1.RowSource = SQL
    Debug.Print SQL
    End Sub
    En SQL ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT R4_ReferencePrixSemaine.TarifSelect, R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, R4_ReferencePrixSemaine.Source, R4_ReferencePrixSemaine.[Unité prix], Avg(R4_ReferencePrixSemaine.PrixRef) AS MoyenneDePrixRef, R4_ReferencePrixSemaine.[Bio/Conventionnel], R4_ReferencePrixSemaine.ID_Produit FROM R4_ReferencePrixSemaine GROUP BY R4_ReferencePrixSemaine.TarifSelect, R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, R4_ReferencePrixSemaine.Source , R4_ReferencePrixSemaine.[Unité prix], R4_ReferencePrixSemaine.[Bio/Conventionnel], R4_ReferencePrixSemaine.ID_Produit 
    
    HAVING   R4_ReferencePrixSemaine.[Unité prix] = les 44 pièces And R4_ReferencePrixSemaine.[Bio/Conventionnel] = Bio 
    
    And [ID_Produit] = 4  ORDER BY R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, R4_ReferencePrixSemaine.Source, Avg(R4_ReferencePrixSemaine.PrixRef);
    SQL ne comprend donc pas que ma valeur est un texte et me sort un msgbox nommé bio et un msgbox nommé les 44 pièces ou je dois remplir du texte.

    Si je double quote, j'obtiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT R4_ReferencePrixSemaine.TarifSelect, R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, R4_ReferencePrixSemaine.Source, R4_ReferencePrixSemaine.[Unité prix], Avg(R4_ReferencePrixSemaine.PrixRef) AS MoyenneDePrixRef, R4_ReferencePrixSemaine.[Bio/Conventionnel], R4_ReferencePrixSemaine.ID_Produit FROM R4_ReferencePrixSemaine GROUP BY R4_ReferencePrixSemaine.TarifSelect, R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, R4_ReferencePrixSemaine.Source , R4_ReferencePrixSemaine.[Unité prix], R4_ReferencePrixSemaine.[Bio/Conventionnel], R4_ReferencePrixSemaine.ID_Produit 
    
    HAVING  " & strWhereUnite & " And " & strWhereBioconv & " 
    
    And [ID_Produit] = 4  ORDER BY R4_ReferencePrixSemaine.CategoriePrix, R4_ReferencePrixSemaine.PositionPrix, R4_ReferencePrixSemaine.Source, Avg(R4_ReferencePrixSemaine.PrixRef);
    Donc un résultat sans ce filtre..

    Quelle est la syntaxe pour faire fonctionner cette requête vba?

    Bien cordialement.
    Julien

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    SQL et les joies des delimteurs.



    A+

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Et en passant pour les noms internes meme si Access est TRES (voir trop) tolerant, il est prudent de se limiter a :

    • Lettres majuscules et minuscules non accentuees et non "decorees" (pas de c cedille).
    • Chiffres.
    • Le souligne (_).


    Utiliser d'autres caracteres peut etre source de bugs particulierement vicieux et sournois et un soucis si on exporte les donnees vers d'autres application comme Excel.

    A+

  4. #4
    Membre à l'essai
    Homme Profil pro
    Agronome
    Inscrit en
    Mars 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    ReBonjour Marot,

    Je te remercie beaucoup pour ton aide sur les différents post de ce forum!!

    J'ai essayé ta solution cependant elle ne me renvoi pas le bon résultat:

    Si je tappe le vba suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "HAVING  "" & strWhereUnite & "" And "" & strWhereBioconv & "" "
    J'obtiens un code SQL qui fait référence au nom de la variable comme un texte ce qui ne marche pas: voila le code SQL obtenu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING  " & strWhereUnite & " And " & strWhereBioconv & "
    Au lieu de ce que j'ai besoin pour faire marcher la requête (je l'ai testée et elle marche si je mets manuellement les quotes dans le SQL).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     HAVING  R4_ReferencePrixSemaine.[Unité prix] = "les 44 pièces" And R4_ReferencePrixSemaine.[Bio/Conventionnel] = "Bio"

    Sans les doubles quotes que tu m'indique, je me retrouve avec un SQL sans quote exemple: Bio au lieu de "Bio" et une erreur. car il ne reconnait pas cela comme un texte.

    J'ai aussi le code suivant pour les variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    VarUnite = Unite.Column(0)
    strWhereUnite = " R4_ReferencePrixSemaine.[Unité prix] = " & VarUnite
    VarBio = Bio_Conventionnel.Column(0)
    strWhereBioconv = "R4_ReferencePrixSemaine.[Bio/Conventionnel] = " & VarBio
    Sais-tu comment je peux faire pour solutionner cette erreur?
    Bien cordialement.
    Julien

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    C'ets toujours un peu delicat trop de guillemets pas assez de guillemets ... de moins en moins de cheveux.

    La solution que j'emploie est la suivante :
    1. Faire ma requete dans l'editeur de requetes avec un cas qui m'intersse.
    2. Une fois qu'elle donne le resultat que je veux, je bascule l'affichage sur SQL (en haut a gauche de l'editeur).
    3. Je selectionne tout le SQL et je le copie puis le colle dans NotePad (qui a l'avantage d'exister partout et de ne rien faire au texte).
    4. Une fois dans NotePad je fais un Rechercher/Replacer de tous les " par "".
    5. Ensuite je mets sur chaque ligne au debut sql=sql & " et a la fin ".
      J'obtiens donc une serie de ligne de VBA syntaxiquement correctes.
    6. Je selectionne le tout et je le copie dans mon code VBA au bon endrois.
    7. Je valide que cela marche en executant mon code.
      Bon la j'ai bien du VBA et du SQL correct mais il n'est pas dynamique.
    8. Apres je repere dans mon SQL les endrois ou je veux inserer mes variables.
      J'y mets alors " & MaSUperVariableQueJeVeuxIci & "


    Donc si au depart j'ai :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select UneTable.*
    from UneTable
    where UneTable.UnChamp="UnTexte"

    ou UnTexte devrait varier.

    j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sql = sql & " select UneTable.*"
    sql = sql & " from UneTable"
    sql = sql & " where UneTable.UnChamp=""UnTexte""" 'Noter le doublement des guillemets qui delimitent le texte
    et finalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sql = sql & " select UneTable.*"
    sql = sql & " from UneTable"
    sql = sql & " where UneTable.UnChamp=""" & UneVariable & """" 'Noter le quadrupement des guillemets qui donne une chaine qui ne contient qu'un guillemet au final
    En procedant par concatenations successives on peut plus facilement verifier si les morceaux de SQL sont corrects.

    A+

  6. #6
    Membre à l'essai
    Homme Profil pro
    Agronome
    Inscrit en
    Mars 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    Wahou!!! C'est magique la concaténation!!

    Un grand merci ça y est ça marche enfin!!
    Bien cordialement.
    Julien

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2018
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Variable texte dans requê SQL VBA
    Bonsoir j'ai le code suivant dans l'environnement VBA Access :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Commande48_Click()
     
    Code = 1006592
     
    SQL2 = ""
    SQL2 = SQL2 & "SELECT Import_Sage.Composant, Count(Import_Sage.Composant) AS CompteDeComposant"
    SQL2 = SQL2 & " FROM Import_Sage GROUP BY Import_Sage.Composant"
    SQL2 = SQL2 & " HAVING (((Import_Sage.Composant)= Like '*" & Code & "' ));"
     
    DoCmd.RunSQL (SQL2)
     
    End Sub
    Ce code provoque une erreur '3075'. Opérateur absent.
    Si j'utilise une Msgbox pour afficher la variable SQL2, j'ai exactement le code SQL générée lors de la création de la requête avec Access.

    Je ne trouvez pas comment faire un like en SQL avec une variable qui est un nombre ou une chaîne de caractère.
    Si je tape directement la valeur ça se finit de la même manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL2 = ""
    SQL2 = SQL2 & "SELECT Import_Sage.Composant, Count(Import_Sage.Composant) AS CompteDeComposant"
    SQL2 = SQL2 & " FROM Import_Sage GROUP BY Import_Sage.Composant"
    SQL2 = SQL2 & " HAVING (((Import_Sage.Composant)= Like *01006452 ));"
    Si vous collez le code SQL générée d'une requête faite dans Access dans un module VBA vous verrez qu'Access fait disparaitre les simples guillemets par des doubles car il remplace le vrai code SQL anglais par une traduction en français qui pose problème.

    Je n'arrive pas à trouver la syntaxe pour inclure avec les caractères qui lui plairont un texte présent dans une variable dans la fonction like

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    bonsoir,
    Si vous collez le code SQL générée d'une requête faite dans Access dans un module VBA vous verrez qu'Access fait disparaitre les simples guillemets par des doubles car il remplace le vrai code SQL anglais par une traduction en français qui pose problème.

    Je n'arrive pas à trouver la syntaxe pour inclure avec les caractères qui lui plairont un text
    le SQL est toujours en Anglais, il n'y a pas de SQL Français, il ne faut pas confondre l'interface de création dans la langue locale et le code SQL généré.
    Il FAUT privilégier les guillemets " plutôt que l'apostrophe '
    le signe = est de trop.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL2 = ""
    SQL2 = SQL2 & "SELECT Import_Sage.Composant, Count(Import_Sage.Composant) AS CompteDeComposant"
    SQL2 = SQL2 & " FROM Import_Sage GROUP BY Import_Sage.Composant"
    SQL2 = SQL2 & " HAVING (((Import_Sage.Composant) Like ""*" & Code & """ ));"

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

Discussions similaires

  1. [AC-2010] Contourner prise en compte d'un nombre entier dans DiffDate
    Par Khask dans le forum Access
    Réponses: 2
    Dernier message: 03/09/2013, 13h52
  2. Réponses: 7
    Dernier message: 29/05/2013, 17h23
  3. Réponses: 13
    Dernier message: 31/03/2010, 16h25
  4. Prise en compte des changements de droits dans un partage Windows
    Par lesouriciergris dans le forum Sécurité
    Réponses: 1
    Dernier message: 10/11/2009, 09h33
  5. Réponses: 4
    Dernier message: 07/02/2008, 11h57

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