blankoworld
Messages postés
3
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
29 avril 2006
26 avril 2006 à 16:45
Bonjour,
J'ai donc commencé l'intepréteur algébrique en langage SQL, voici ce que cela donne.
D'abord je donne ce sur quoi je me suis appuyé :
R1 = PROJECTION NOMTABLE (attribut, attribut2, etc)R2 SELECTION NOMTABLE (attribut "truc" ET attribut2 = 3)R3 JOINTURE [NOMTABLE(NOMTABLE.propriété NOMTABLE2.propriété)NOMTABLE]
R4 = UNION (TABLE1, TABLE2)
R5 = INTERSECTION (TABLE1, TABLE2)
R6 = DIFFERENCE (TABLE1, TABLE2)
R6 = MINUS (TABLE1, TABLE2)
R7 = PRODUIT (TABLE1, TABLE2)
R8 = COMPTE TABLE (Attribut)
R9 = CUMUL TABLE (Attribut)
R10 = MAX TABLE (Attribut)
R11 = MIN TABLE (Attribut)
R12 = MOY TABLE (Attribut)
J'ajoute que je suis débutant en la matière donc :$
Code :
Module
Module1
Dim
decoupage() AsString
Dim
table() AsString
Dim
sql AsString
Dim
sql2 AsString
Dim
intermede() AsString
Dim
i AsInteger
Dim
j AsInteger
Function
tests(ByRef
decoupage)
'
Nous vérifions que l'une des entitées n'est pas un
opérateur logique PAS, ET ou OU.
'
Si c'est le cas nous le transformons en sont équivalent SQL.
If
decoupage = "ET"Then
decoupage = " AND "
Else
If
decoupage = "OU"Then
decoupage = " OR "
Else
If
decoupage = "PAS"Then
decoupage = " NOT "
EndIf
EndIf
EndIf
'
Ici nous nous occupons de remplacer les doubles quotes par de
simple quote pour le langage SQL.
'
S'il n'y en a pas, aucun effet sur la chaîne. S'il n'y en a
qu'au début ou en fin de mot, alors on ne remplace que ce qui
est nécessaire.
'
NB : Cette fonction n'est disponible qu'après VB5, c'est à
dire VB6 minimum. Il faut donc faire attention à ce que les
autres modules utilisés
'
ne soit pas utilisés dans une version antérieure.
decoupage
= decoupage.Replace(Chr(34), "'")
EndFunction
Function
proprietes(ByRef
sql, ByRef
intermede, ByRef
decoupage)
i
= decoupage.Length - 1
If
i > 4 Then
j
= 5
sql
= String.Concat(sql,
intermede(1))
sql
= String.Concat(sql,
" ")
While
j < i
tests(decoupage(j))
sql = String.Concat(sql,
decoupage(j))
sql = String.Concat(sql,
" ")
j
= j + 1
EndWhile
'
decoupage(j) = etc)
intermede = Split(decoupage(j), ")")
'
intermede(0) = etc
'
intermede(1) = ""
'
'
On remplace les doubles quotes par de simples quotes, ceci est
utilisé dans le cas de la séléction.
intermede(0) = intermede(0).Replace(Chr(34), "'")
sql
= String.Concat(sql,
intermede(0))
Else
'
intermede(0) = ""
'
intermede(1) = attribut)
intermede = Split(intermede(1), ")")
'
intermede(0) = attribut
'
intermede(1) = ""
'
'
On remplace les doubles quotes par de simples quotes, ceci est
utilisé dans le cas de la séléction.
intermede(0) = intermede(0).Replace(Chr(34), "'")
sql
= String.Concat(sql,
intermede(0))
EndIf
EndFunction
Function
proj(ByRef
sql)
'
R1 = PROJECTION TABLE (attribut, attribut2, etc)
'
decoupage(3) = TABLE
'
decoupage(4) = (attribut,
'
decoupage(5) = attribut2,
'
decoupage(6) = etc)
intermede
= Split(decoupage(4), "(")
'
intermede(0) = ""
'
intermede(1) = attribut
proprietes(sql, intermede, decoupage)
sql
= String.Concat(sql,
" FROM ")
sql
= String.Concat(sql,
decoupage(3))
EndFunction
Function
sel(ByRef
sql)
'
R2 SELECTION TABLE (Prédicat1 Nombre ET Prédicat2
= "Chaine")
'
decoupage(3) = TABLE
'
decoupage(4) = (Prédicat1
'
deoupage(6) = Nombre
'
decoupage(7) = ET
'
decoupage(8) = Prédicat2
'
decoupage(10) = "Chaîne")
intermede
= Split(decoupage(4), "(")
sql
= String.Concat(sql,
intermede(1))
sql
= String.Concat(sql,
" FROM ")
sql
= String.Concat(sql,
decoupage(3))
sql
= String.Concat(sql,
(Chr(10) + Chr(13)))
sql
= String.Concat(sql,
"WHERE ")
proprietes(sql, intermede, decoupage)
EndFunction
Function
join(ByRef
sql)
Dim
table2() AsString
'R3
JOINTURE [TABLE1(TABLE1.Propriété1
TABLE2.Propriété2)TABLE2]
'
decoupage(3) : [TABLE1(TABLE1.Propriété1
'
decoupage(4) : =
'
decoupage(5) : TABLE2.Propriété2)TABLE2]
table
= Split(decoupage(3), "(")
'
table(0) : [TABLE1
'
table(1) : TABLE1.Propriété1
intermede
= Split(table(1), ".")
'
intermede(0) = TABLE1
'
intermede(1) = Propriété1
table
= Split(decoupage(5), ")")
'
table(0) : TABLE2.Propriété2
'
table(1) : TABLE2]
table2
= Split(table(0), ".")
'
table2(0) : TABLE2
'
table2(1) : Propriété2
sql
= String.Concat(sql,
intermede(1))
sql
= String.Concat(sql,
", ")
sql
= String.Concat(sql,
table2(1))
sql
= String.Concat(sql,
" FROM ")
sql
= String.Concat(sql,
intermede(0))
sql
= String.Concat(sql,
", ")
sql
= String.Concat(sql,
table2(0))
sql
= String.Concat(sql,
(Chr(10) + Chr(13)))
sql
= String.Concat(sql,
"WHERE ")
sql
= String.Concat(sql,
intermede(1))
sql
= String.Concat(sql,
" ")
sql
= String.Concat(sql,
decoupage(4))
sql
= String.Concat(sql,
" ")
sql
= String.Concat(sql,
table2(1))
EndFunction
Function
union(ByRef
sql)
'
Nous voudrions ceci : SELECT * FROM Table1
'
union (SELECT * FROM Table2);
'
R4 = UNION (TABLE1, TABLE2)
'
decoupage(3) = (TABLE1,
'
decoupage(4) = TABLE2)
sql
= String.Concat(sql,
"* FROM ")
table
= Split(decoupage(3), "(")
'
table(0) = ""
'
table(1) = TABLE1,
intermede
= Split(table(1), ",")
'
intermede(0) = TABLE1
'
intermede(1) = ""
sql
= String.Concat(sql,
intermede(0))
sql
= String.Concat(sql,
(Chr(10) + Chr(13)))
sql
= String.Concat(sql,
"UNION (SELECT * FROM ")
sql
= String.Concat(sql,
decoupage(4))
EndFunction
Function
inter(ByRef
sql)
'
On voudrait ceci : SELECT DISTINCT Table1.* FROM Table1, Table2
'
WHERE Table1.* = Table2.*;
'
R5 = INTERSECTION (TABLE1, TABLE2)
'
decoupage(3) = (TABLE1,
'
decoupage(4) = TABLE2)
sql
= String.Concat(sql,
"DISTINCT ")
table
= Split(decoupage(3), "(")
'
table(0) = ""
'
table(1) = TABLE1,
intermede
= Split(decoupage(4), ")")
'
intermede(0) = TABLE2
'
intermede(1) = ""
sql2
= table(1).Replace(",",
".")
'
sql2 = TABLE1.
sql
= String.Concat(sql,
sql2)
sql
= String.Concat(sql,
"* ")
sql
= String.Concat(sql,
" FROM ")
sql
= String.Concat(sql,
table(1))
sql
= String.Concat(sql,
intermede(0))
sql
= String.Concat(sql,
(Chr(10) + Chr(13)))
sql
= String.Concat(sql,
"WHERE ")
sql
= String.Concat(sql,
sql2)
sql
= String.Concat(sql,
"* = ")
sql
= String.Concat(sql,
intermede(0))
sql
= String.Concat(sql,
".*")
EndFunction
Function
diff(ByRef
sql)
'
On voudrait ceci : Select * From TABLE1 Where * Not In (Select *
From TABLE2);
'
R6 = DIFFERENCE (TABLE1, TABLE2)
'
R6 = MINUS (TABLE1, TABLE2)
'
decoupage(3) = (TABLE1,
'
decoupage(4) = TABLE2)
sql
= String.Concat(sql,
"* FROM ")
table
= Split(decoupage(3), "(")
'
table(0) = ""
'
table(1) = TABLE1,
table
= Split(table(1), ",")
'
table(0) = TABLE1
'
table(1) = ""
sql
= String.Concat(sql,
table(0))
sql
= String.Concat(sql,
(Chr(10) + Chr(13)))
sql
= String.Concat(sql,
"WHERE * ")
sql
= String.Concat(sql,
"Not In (SELECT * FROM ")
sql
= String.Concat(sql,
decoupage(4))
EndFunction
Function
prod(ByRef
sql)
'
On veut obtenir ceci : SELECT TABLE1.*, TABLE2.* FROM TABLE1,
TABLE2
'
Access ne sachant que faire, prendra les tuples de la TABLE1 et les
associera à chaque fois aux tuples de la TABLE2
'
de sorte que nous obtenions TABLE1 x TABLE2
'
R7 = PRODUIT (TABLE1, TABLE2)
'
decoupage(3) = (TABLE1,
'
decoupage(4) = TABLE2)
table
= Split(decoupage(3), "(")
'
table(0) = ""
'
table(1) = TABLE1,
intermede
= Split(decoupage(4), ")")
'
intermede(0) = TABLE2
'
intermede(1) = ""
sql2
= table(1).Replace(",",
".")
'
sql2 = TABLE1.
sql
= String.Concat(sql,
sql2)
sql
= String.Concat(sql,
"*, ")
sql
= String.Concat(sql,
intermede(0))
sql
= String.Concat(sql,
".*")
sql
= String.Concat(sql,
" FROM ")
sql
= String.Concat(sql,
table(1))
sql
= String.Concat(sql,
" ")
sql
= String.Concat(sql,
intermede(0))
EndFunction
Function
calcul(ByRef
sql, ByRef
sql2)
'
Rx = OPERATEUR TABLE (Attribut)
'
où x est un chiffre entre 8 et 12 (pour voir les exmemples
donnés).
'
Dans le fichier.txt ce peut être n'importe quel chiffre.
'
découpage(3) = TABLE
'
decoupage(4) = (Attribut)
sql
= String.Concat(sql,
sql2)
sql
= String.Concat(sql,
decoupage(4))
sql
= String.Concat(sql,
" FROM ")
sql
= String.Concat(sql,
decoupage(3))
EndFunction
Sub
Main()
Dim
algebre AsString
Console.WriteLine("Phrase
: ")
algebre
= Console.ReadLine()
decoupage
= Split(algebre, " ")
sql
= "SELECT "
SelectCase
decoupage(2)
Case"PROJECTION"
'
Syntaxe présumée : R1 = PROJECTION TABLE (attribut,
attribut2, etc)
proj(sql)
Case"SELECTION"
'
Syntaxe présumée : R2 SELECTION TABLE (Prédicat1
Nombre ET Prédicat2 = "Chaine")
sel(sql)
Case"JOINTURE"
'
Syntaxe présumée : R3 = JOINTURE
[TABLE1(TABLE1.Propriété1 = TABLE2.Propriété2)TABLE2]
join(sql)
Case"UNION"
'
Syntaxe présumée : R4 = UNION (TABLE1, TABLE2)
union(sql)
Case"INTERSECTION"
'
Syntaxe présumée : R5 = INTERSECTION (TABLE1, TABLE2)
inter(sql)
Case"DIFFERENCE"
'
Syntaxe présumée : R6 = DIFFERENCE (TABLE1, TABLE2)
diff(sql)
Case"MINUS"
'
Syntaxe présumée : R6 = MINUS (TABLE1, TABLE2)
diff(sql)
Case"PRODUIT"
'
Syntaxe présumée : R7 = PRODUIT (TABLE1, TABLE2)
prod(sql)
Case"COMPTE"
'
Syntaxe présumée : R8 = COMPTE TABLE (Attribut)
sql2 = "count"
calcul(sql, sql2)
Case"CUMUL"
'
Syntaxe présumée : R9 = CUMUL TABLE (Attribut)
sql2 = "sum"
calcul(sql, sql2)
Case"MAX"
'
Syntaxe présumée : R9 = CUMUL TABLE (Attribut)
sql2 = "max"
calcul(sql, sql2)
Case"MIN"
'
Syntaxe présumée : R9 = CUMUL TABLE (Attribut)
sql2 = "min"
calcul(sql, sql2)
Case"MOY"
'
Syntaxe présumée : R9 = CUMUL TABLE (Attribut)
sql2 = "avg"
calcul(sql, sql2)
EndSelect
sql
= String.Concat(sql,
";")
MsgBox(sql, MsgBoxStyle.Information, "Salut")
EndSub
EndModule
Qu'en pensez vous ?