anspauldou
Messages postés42Date d'inscriptionlundi 14 janvier 2002StatutMembreDernière intervention30 juin 2016
-
4 août 2009 à 16:44
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 2010
-
7 août 2009 à 21:51
Bonjour
Je suis débutant en MS SQL 2005 j'ai vu ce code sur le net et souhaiterai le traduire en une fonction pour SQL 2005. Le code le voici :
Private Function CalcEx(ByVal Text As String)
'------------------------
'Buffer de charactere
Dim Char As String * 1
'Mot temporaire
Dim Word As String
'Operateur en cours
Dim Oprd As String
'------------------------
'Tableau d'operateurs indentés
Dim Opr() As String
'Tableau de valeurs indentées
Dim Res() As Double
'Valeur en cours
Dim Value As Double
'------------------------
'Compteur d'indentation
Dim j As Long
'Variable de boucle
Dim i As Long
ReDim Res(0)
ReDim Opr(0)
Text = Text & " "
For i = 1 To Len(Text)
'Recuperation du charactere
Char = Mid(Text, i, 1)
'Selection en fonction de la valeur du charactere
Select Case Char
'Si c'est un chiffre ajoute dans le buffer
Case "0" To "9": Word = Word & Char
'Si c'est un point fait de meme /!\ regional settings /!\
Case ".": Word = Word & Char
'Si c'est un espace calcule l'expression
Case " ": GoSub Calc
'Si c'est une operation calcule et conserve l'operation en memoire
Case "+": GoSub Calc: Oprd = Char
Case "-": GoSub Calc: Oprd = Char
Case "*": GoSub Calc: Oprd = Char
Case "/": GoSub Calc: Oprd = Char
Case "^": GoSub Calc: Oprd = Char
Case "": GoSub Calc: Oprd = Char
'Si c'est une debut paranthese indente la valeur
Case "(":
'Redimentionne le tableau
ReDim Preserve Res(j)
ReDim Preserve Opr(j)
'Sauve la valeur et l'operande
Res(j) = Value
Opr(j) = Oprd
'Increment
j = j + 1
'Initialize les variables temporaires
Value = 0
Word = ""
Oprd = ""
'Si c'est une fin de paranthere decremente la hierarchie
Case ")"
'Si on n'est en indentation "positive"
If j Then
'Calcule l'expression
GoSub Calc
'Decremente
j = j - 1
'Si on dispose d'un operateur
If Opr(j) = "" Then
'NOP
Else
'Calcule
Select Case Opr(j)
Case "+": Value = Res(j) + Value
Case "-": Value = Res(j) - Value
Case "*": Value = Res(j) * Value
Case "/": Value = Res(j) / Value
Case "": Value = Res(j) \ Value
Case "^": Value = Res(j) ^ Value
'-----------------------------------
'Extra fonction
Case "MOD": Value = Res(j) Mod Value
Case "AND": Value = Res(j) And Value
Case "XOR": Value = Res(j) Xor Value
Case "OR": Value = Res(j) Or Value
'-----------------------------------
End Select
End If
Else
'NOP
End If
'Sinon recupere la valeur pour analyse ulterieure
Case Else: Word = Word & Char
End Select
Next
'That it ! Renvoi le resultat ! (En double precision)
CalcEx = Value
Exit Function
Calc:
'Si on dispose d'un operateur
If Oprd = "" Then
'Si le mot est un chiffre
If IsNumeric(Word) Then
'La valeur egale le mot
Value = CDbl(Word)
Else
'L'operateur egale le mot
If Len(Word) Then Oprd = UCase(Word)
End If
'Initialise le mot (buffer d'expression)
Word = ""
Else
'Si le mot est numerique
If IsNumeric(Word) Then
'Calcule
Select Case Oprd
Case "+": Value = Value + CDbl(Word)
Case "-": Value = Value - CDbl(Word)
Case "*": Value = Value * CDbl(Word)
Case "/": Value = Value / CDbl(Word)
Case "": Value = Value \ CDbl(Word)
Case "^": Value = Value ^ CDbl(Word)
'---------------------------------------
'Extra fonction
Case "MOD": Value = Value Mod CDbl(Word)
Case "AND": Value = Value And CDbl(Word)
Case "XOR": Value = Value Xor CDbl(Word)
Case "OR": Value = Value Or CDbl(Word)
'---------------------------------------
End Select
'Initialise l'operateur
Oprd = ""
Else
'L'operateur prend la valeur du mot
If Len(Word) Then Oprd = UCase(Word)
End If
'Initialise le mot
Word = ""
End If
Return
End Function
' ==== Utilisation :
' CalcEx("1 + 2 - 3")