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

Macros et VBA Excel Discussion :

Requête SQL avec Simples et Doubles Quotes [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Points : 40
    Points
    40
    Par défaut Requête SQL avec Simples et Doubles Quotes
    Bonjour le forum,

    j'avais fait une petite requête qui lit des fichiers Excel pour les exporter dans une base de données.
    ça marchait bien mais voilà, dans certains cas ça ne fonctionne pas !

    Et c'est quand il y a des ' et/ou "

    J'avais trouvé une parade avec "Char(34)", ça marchait bien pour les cas où il y a juste des " ' " mais pas dans le cas où il y a un double quote.

    J'ai cherché à éditer à la volée mes Recordset, avec un Replace, mais ça ne marche pas comme je voudrais.
    Quand je mets Char(92)&Char(34) cela me sort 0 au lieu de " \" "

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import_sql = "Insert Into saisie (ChampA, ChampB, ChampC, ChampD, ChampE, ChampF) VALUES ('" & Format(Rst.Fields(0).Value, "YYYY/MM/DD") & "', '" & Rst.Fields(1) & "', '" & Rst.Fields(2) & "', '" & Rst.Fields(3) & "', '" & Rst.Fields(4).Value & "', '" & Rst.Fields(6) & "')" & _
    "ON DUPLICATE KEY UPDATE ChampA = '" & Format(Rst.Fields(0).Value, "YYYY/MM/DD") & "', ChampB = '" & Rst.Fields(1) & "', ChampC = '" & Rst.Fields(2) & "', ChampD = '" & Rst.Fields(3) & "', ChampE = '" & Rst.Fields(4) & "', ChampF = '" & Rst.Fields(6) & "';"
    C'est le champ E qui pose problème, car il est libre.

    J'ai essayé ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Replace(Replace(" & Rst.Fields(4).Value & ", Char(34),Char(92)), ','')
    Mais sans plus de succès.

    J'ai aussi essayé d'éditer mon Adodb.Recordset avant d'envoyer la commande,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Rst.Fields(0).Value = blop
    Rst.Update
    Mais ça ne fonctionne pas (rien ne se passe, plus aucune insertion dans la base de données).

    Si quelqu'un a une idée, je suis preneur, que ce soit en VBA/SQL ou sur le recordset, car je m'arrache les cheveux avec ces " et ' !

    Pour mes tests j'avais utilisé un cas extrême du genre :

    "Bloaslalas""'asasa"allsas"

    Si je fais l'insert directement sur mon serveur MySQL en rajoutant des \, ça marche très bien, comme ceci : "Bloaslalas\"\"'asasa\"allsas"

    Mais ça c'est à la main, le soucis étant que VBA utilise aussi " et '....


    Merci!

  2. #2
    Membre chevronné Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Points : 2 003
    Points
    2 003
    Par défaut
    Slt,
    j'ai eu un probleme similaire pour le ' .
    en effet je devais a l'aide d'un userform mettre à jour un champ dans une base de donnée réalisé avec le module base de open office. la démarche reste la même puisque c une requete sql.
    j'ai donc utilisé une fonction qui parcours le texte d'une textbox et si il trouve un ' il met dans la requête " ' ' " au lieu de " ' ". Et ceci à fonctionner. j'ai lu çà dans un tutos (introSQL_Base sur fr.openoffice.org)et j'ai appliqué donc voici la fonction:
    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
    Function DbleApostr(sEntree As String) As String
     Dim lLongueur As Long, sChar As String
     Dim sSortie As String, i As Long
     
     lLongueur = Len(sEntree)
     sSortie = ""
     
     For i = 1 To lLongueur
         sChar = Mid(sEntree, i, 1)
         If sChar = "'" Then
            sChar = "''"
         End If
         sSortie = sSortie & sChar
     Next i
     
     DbleApostr = sSortie
     End Function
    et dans la macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Obser = DbleApostr(Me.Textbox1.value)
    reqSQL = "UPDATE ""T_LISTE_INTERVENTION"" SET ""observations"" = '" & Obser & "' "
    et pour moi c'est ok. ceci fonctionne avec Excel.

    reste à voir pour le ".
    @+
    @+

    Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
    Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
    Ou sur si ce n'est pas le cas

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Merci pour ta réponse.

    ça marche d'une certaine façon ta solution mais bizarrement, si j'ai un ' au début du mot, il n'est pas pris en compte, il "disparait" même d'après l'espion que j'ai mis !

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Insert Into saisie (Journee, Imputation, Tache, Lieu, Notes, Collaborateur) VALUES ('2009/01/12', 'CA00132', 'Programmation', 'Domicile', 'bloblo\' : blabla', 'SRT');"
    le ' devant bloblo est juste celui qui entoure la donnée du champ Notes, et normalement il y avait un autre ' devant bloblo, ça devrait donc me donner :
    '
    Aussi, on dirait que ça bloque si le champ est vide (mais pas considéré comme NULL), j'ai essayé de contourner ainsi dans ma commande SQL pour ne lancer DbleApostr que si le champ n'est pas vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '" & IIf(Rst.Fields(4).Value = "", "", DbleApostr(Rst.Fields(4).Value)) & "'
    Mais sans succès pour l'instant, seulement je ne suis pas loin de la solution je pense!

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox IIf(IsNull(Rst.Fields(4).Value), "", Rst.Fields(4).Value)
    Si je fais ça, et que Rst.Fields(4) n'est pas vide, ça marche.
    Si je le fais est qu'il est vide, ça marche aussi.

    Maintenant si je rajoute ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox IIf(IsNull(Rst.Fields(4).Value), "", DbleApostr(Rst.Fields(4).Value))
    Si je relance la macro, et que Rst.Fields(4) n'est pas vide, ça marche.
    Si il est vide, rien ne se passe, et l'espion ne m'indique rien du tout.

    Ce qui est bizarre c'est que justement avec le IIf ça ne devrait pas avoir d'importance, car la fonction DbleApostr ne se lance que si le champ n'est pas vide pour contourner le problème, donc c'est bizarre qu'en la rajoutant à la condition plus rien ne se passe.

    Apparemment c'est le fait d'envoyer une valeur nulle à la fonction qui bloque le tout, car ça fait la même chose avec l'exemple du lien que tu m'as envoyé.

    Donc il faut que je vois comment envoyer cela à la fonction, car même en rajoutant une condition dans la fonction, ça fait la même chose, comme si la variable "n'arrivait pas" jusque là.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Points : 547
    Points
    547
    Par défaut
    Salut,

    Juste pour info.
    C'est normal d'avoir l'erreur quand Rst.Fields(4) est vide avec IIf(....)

    IIf evalue les 2 parties (vrai et faux) donc quand c'est vide il y a une erreur.

    Il faut decomposer peut etre, utiliser une variable pour tester et retourner Rst.Fields(4) et l'utiliser ensuite.
    ++
    Minick

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Sauf que le IIF marche très bien même quand c'est vide, c'est quand je combine le IIF avec la fonction DbleApostr que ça ne marche plus, donc le problème ne vient pas du IIF je pense (sinon cela ne marcherait pas pour le premier exemple de mon dernier post).

    Enfin, c'est ce que je constate.

    Vide avec IIF et sans DbleApostr, ça marche.
    Vide avec IIF et avec DbleApostr, ça ne marche plus.

    Merci quand même pour la suggestion

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Points : 547
    Points
    547
    Par défaut
    Re,

    Ok au temps pour moi, j'avais mal compris.
    ++
    Minick

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Finalement j'y suis parvenu en changeant un peu de méthode.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
        Dim Chp_Champ1 As String
        Dim Chp_Champ2 As String
        Dim Chp_Champ3 As String
        Dim Chp_Champ4 As String
        Dim Chp_Champ6 As String
     
     
    Do Until Rst.EOF = True
    If IsNull(Rst.Fields(1).Value) Then
    Chp_Champ1 = ""
    Else
    Chp_Champ1 = DbleApostr(Rst.Fields(1).Value)
    End If
    If IsNull(Rst.Fields(2).Value) Then
    Chp_Champ2 = ""
    Else
    Chp_Champ2 = DbleApostr(Rst.Fields(2).Value)
    End If
    If IsNull(Rst.Fields(3).Value) Then
    Chp_Champ3 = ""
    Else
    Chp_Champ3 = DbleApostr(Rst.Fields(3).Value)
    End If
    If IsNull(Rst.Fields(4).Value) Then
    Chp_Champ4 = ""
    Else
    Chp_Champ4 = DbleApostr(Rst.Fields(4).Value)
    End If
    If IsNull(Rst.Fields(6).Value) Then
    Chp_Champ6 = ""
    Else
    Chp_Champ6 = DbleApostr(Rst.Fields(6).Value)
    End If
    Import_sql = "Insert Into saisie (Champ, Champ1, Champ2, Champ3, Champ4, Champ6)"
    Import_sql = Import_sql & "Values('" & Format(Rst.Fields(0).Value, "YYYY/MM/DD") & "',"
    Import_sql = Import_sql & "'" & Chp_Champ1 & "', '" & Chp_Champ2 & "',"
    Import_sql = Import_sql & "'" & Chp_Champ3 & "', '" & Chp_Champ4 & "', '" & Chp_Champ6 & "')"
    Import_sql = Import_sql & "ON DUPLICATE KEY UPDATE Champ = '" & Format(Rst.Fields(0).Value, "YYYY/MM/DD") & "',"
    Import_sql = Import_sql & "Champ1 = '" & Chp_Champ1 & "', Champ2 = '" & Chp_Champ2 & "',"
    Import_sql = Import_sql & "Champ3 = '" & Chp_Champ3 & "', Champ4 = '" & Chp_Champ4 & "',"
    Import_sql = Import_sql & "Champ6 = '" & Chp_Champ6 & "';"
    cn.Execute (Import_sql), True
    Rst.MoveNext
    Loop


    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
    Function DbleApostr(sEntree As String) As String
     Dim lLongueur As Long, sChar As String, sChar2 As String
     Dim sSortie As String, i As Long
     
    lLongueur = Len(sEntree)
     sSortie = ""
     For i = 1 To lLongueur
          sChar = Mid(sEntree, i, 1)
         If sChar = "'" Then
            sChar = "\'"
         End If
         sSortie = sSortie & sChar
     Next i
     
     
     DbleApostr = sSortie
    End Function
    Ainsi ça a l'air de marcher avec les ' et les ", en tout cas j'ai testé plusieurs combinaisons dans mes fichiers, et tout est passé.
    (Au passage, rien ne se passage car j'avais oublié d'enlever un "On error goto ...." et du coup je ne voyais pas l'erreur de la mauvaise utilisation de Ifnull)

    Merci!

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

Discussions similaires

  1. [MySQL] Erreur requête SQL avec simple variable.
    Par Mck698 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 31/05/2012, 14h33
  2. Problème de requête SQL avec instruction TRANSFORM
    Par Nosper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/06/2005, 16h15
  3. requête SQL avec paramètre en vb avec base de donnée SQL srv
    Par dialydany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/02/2005, 10h33
  4. Réponses: 4
    Dernier message: 05/07/2004, 13h17
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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