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,