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 :

Parser une chaine de caractère SQL avec un code en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Parser une chaine de caractère SQL avec un code en VBA
    Bonjour,

    Je dois réaliser un parser qui me permettrait de structurer et d'améliorer la lisibilité de requêtes SQL qui proviennent de MS ACCESS. Pour ça, j'ai créé un formulaire avec 2 TextBox (1 pour le code d'origine et l'autre qui affiche le code structuré une fois passé à la moulinette). Tout s'effectue au clic sur un bouton dans ce formulaire.

    Pour pouvoir gérer les chaines de caractères SQL, j'ai utilisé une première fonction Split avec comme séparateur " ", puis j'ai splité à nouveau le contenu de mon premier tableau avec cette fois ci comme séparateur ",". J'ai utilisé 2 boucles For afin de pouvoir renvoyer les résultats contenus dans mes 2 tableaux dans les TextBoxs


    Voici mon code:

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Private Sub btnConvertir_Click()
     
    Dim Tableau() As String
    Dim Tableau2() As String
     
    Dim intCount As Integer
    Dim intCount2 As Integer
    Dim strSQL As String
     
        'découpe la chaine en fonction des espaces " "
        'le résultat de la fonction Split est stocké dans un tableau
        Tableau = Split(UserForm1.TextBox1.Value, " ")
     
     
    'boucle sur le tableau pour visualiser le résultat
    For intCount = 0 To UBound(Tableau)
     
         Tableau2 = Split(Tableau(intCount), ",")
     
        For intCount2 = 0 To UBound(Tableau2)
     
    'conditions sur les éléments de syntaxe du langage SQL
    Select Case Tableau2(intCount2)
     
        Case Is = "SELECT", "UPDATE", "DELETE", "DISTINCT", "DISTINCTROW", "TOP", "PERCENT"
        strSQL = strSQL + Tableau2(intCount2) & vbCrLf
     
        Case Is = "INSERT"
        strSQL = strSQL + Tableau(intCount) & " " & Tableau(intCount + 1) & vbCrLf
        intCount = intCount + 1
     
        Case Is = "FROM", "WHERE", "HAVING", "AS", "IN", "In"
        strSQL = strSQL + vbCrLf & Tableau2(intCount2) & vbCrLf
     
        Case Is = "ORDER", "GROUP", "INNER", "LEFT", "RIGHT"
        strSQL = strSQL + vbCrLf & Tableau(intCount) & " " & Tableau(intCount + 1) & vbCrLf
        intCount = intCount + 1
     
        Case Is = "And", "Or", "AND", "OR"
        strSQL = strSQL + Chr(9) & vbCrLf & Chr(9) & Tableau2(intCount2)
     
        Case Else
        strSQL = strSQL + " " & Tableau(intCount) & vbCrLf
     
    End Select
     
     
     
          Next intCount2
     
     Next intCount
     
     
     
    strSQL = Replace(strSQL, "(", " " + "(" + " ")
    strSQL = Replace(strSQL, ")", " " + ")")
     
    UserForm1.TextBox2.Value = strSQL
     
     
    End Sub


    Le problème que je rencontre maintenant c'est que lors du traitement, certains résultats me sont renvoyés en double. Par exemple si j'ai ce code SQL en entrée:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ENTREE_OPERATIONS.CONCOURS, Sum(ENTREE_OPERATIONS.EAD_POST_CCF...

    Je vais avoir en sortie:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     SELECT
     ENTREE_OPERATIONS.CONCOURS,
     ENTREE_OPERATIONS.CONCOURS,
     Sum ( ENTREE_OPERATIONS.EAD_POST_CCF )...

    La mise en forme et l'indentation du code est ce que je recherche. Cependant, les projections et certains noms de champs apparaissent en double. Ceci est surement dû aux 2 boucles For, mais je n'ai pas réussi à identifer pourquoi et à quel endroit de mon code est "l'erreur".

    Pourriez-vous m'aider sur ce point ?

    Merci d'avance.

    Cdt,

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    ton approche est interagissante, créer son générateur de requêtes c'est cool.
    mais tu boucle sur des valeur de ton tableau qu'il est difficile interpréter.

    prenons cet exeple en mettant de coté les autres!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Case Is = "SELECT", "UPDATE", "DELETE", "DISTINCT", "DISTINCTROW", "TOP", "PERCENT"
        strSQL = strSQL + Tableau2(intCount2) & vbCrLf
    tu ajoute sql= "select" en admettant que Tableau2(intCount2) contient select! dans l'autre cas tu mes le champs.

    Microsoft Access, qui je te l'accorde a plus d’expérience que nous, dispose d'une interface graphique qui sur les colonnes désigne les champs et sur les ligne le champs,la table le trie le regroupement, le where ou le having.

    personnellement, sens y avoir plus réfléchi, j'opterai pour un algorithme sensiblement similaire !
    un tableau avec en entête tous mes champs en colonne, une ligne avec une case a cocher selelect O/N, une ligne champ pour l’insertion dans la table (visible si Insert ), une ligne value (visible si Insert ou update),un ligne Fonction (Groupé,Sum,Moy.. si regroupement cocher),un ligne pour le where, une ligne pour le having si regroupement cocher), et un ligne pour le order by (Non,Asc,Desc).

    mes Controls s’appelleraient ChampXX XX de 1 a X
    SelectXX
    DestinationXX
    Wherexx....

Discussions similaires

  1. Parser une chaine de caractères
    Par batchi dans le forum Général Python
    Réponses: 3
    Dernier message: 05/02/2014, 11h34
  2. [DOM] Parser une chaine de caractères au lieu d'un fichier
    Par kkt8 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 27/03/2012, 10h30
  3. [XML] Parser une chaine de caractère XML
    Par lololeuleu dans le forum APIs
    Réponses: 10
    Dernier message: 16/08/2007, 21h27
  4. Parser une chaine de caractères
    Par mariafan dans le forum Langage
    Réponses: 8
    Dernier message: 18/07/2007, 09h49
  5. Parser une chaine de caractère
    Par Nasky dans le forum C++
    Réponses: 7
    Dernier message: 04/12/2006, 19h37

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