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,
Partager