Or a la toute dernière opération il y a quelques choses qui cloche... est ce quelqu'un aurait une idée, je bloque !
merci d'avance !

Code : Tout sélectionner
Procedure TestExpression(str.s)
ProcedureReturn Val(str) ; Pour simplifier le teste on utilise juste de valeur ...
EndProcedure
Procedure.s TestCondition(param.s)
Dim Mem(100)
Id.l=0
NbStartPar=CountString(param,"(") ;Nombre de parenthèse de debug
NbEndPar=CountString(param,")") ;Nombre de parenthèse final
If NbStartPar<>NbEndPar ; Si pas le même nombre il y a un problème
Debug "Error ()";
ProcedureReturn
EndIf
Debug "Chaine de depart"
Debug param
;Quelques remplacement de sécurité je dois avoir des espace entre les opérateur logique et le reste
param=ReplaceString(UCase(param),"AND(","AND (")
param=ReplaceString(UCase(param),"OR(","OR (")
param=ReplaceString(UCase(param),")AND",") AND")
param=ReplaceString(UCase(param),")OR",") OR")
Debug "Correction des espace:"
Debug param
Repeat
For l=1 To Len(param)
str.s=""
If Mid(param,l,1)="(" ;Si j'ai un debut de parenthèse je rajoute sa position sur la pile
Id=Id+1
Mem(Id)=l+1
ElseIf l=1 ;Dans le cas ou j'ai une chaine sans parenthèse on comme si ...
Id=Id+1
Mem(Id)=l-1
ElseIf Mid(param,l,1)=")" ;J'ai une fin de parenthèse donc j'ai une chaine a traité
str.s=Mid(param,Mem(Id),l-Mem(Id))
NbEndPar-1
ElseIf l=Len(param) ;Dans le cas ou j'ai une chaine sans parenthèse on comme si ...
str.s=Mid(param,Mem(Id),l-Mem(Id)+2)
NbEndPar-1
EndIf
If str<>"";On a une chaine a traiter alors on la traite
;_________________________________________
Debug "parenthèse a traiter:"+str
Nb=CountString(str," "); Nombre d'espace
NbAnd=CountString(UCase(str),"AND");Nombre de "AND" a traiter
NbOr=CountString(UCase(str),"OR") ;Nombre de "OR" a trairer
Repeat ; On repête le traitement tant qu'on a des opérateur logique
;Le Or est prioritaire donc on commence a le traiter
If NbOr>0
For z=1 To nb+1
If StringField(UCase(str),z," ")="OR"
Debug "--OR--"
PartA.s=StringField(str,z-1," ")
PartB.s=StringField(str,z+1," ")
ResultA=TestExpression(PartA)
ResultB=TestExpression(PartB)
newstr.s=""
For t=1 To z-2
newstr+StringField(str,t," ")+" "
Next
newstr+Str(ResultA Or ResultB)+" "
For t=z+2 To nb+1
newstr+StringField(str,t," ")+" "
Next
NbOr-1
str=newstr
Debug "Or Result:"+str
Break
EndIf
Next
;Lorsqu'il n'y a plus de OR on traire les AND
ElseIf NbAnd
For z=1 To nb
If StringField(UCase(str),z," ")="AND"
Debug "--AND--"+str
PartA.s=StringField(str,z-1," ")
PartB.s=StringField(str,z+1," ")
ResultA=TestExpression(PartA)
ResultB=TestExpression(PartB)
newstr.s=""
For t=1 To z-2
newstr+StringField(str,t," ")+" "
Next
Debug "PartA:"+PartA
Debug "PartB:"+PartB
newstr+Str(ResultA And ResultB)+" "
For t=z+2 To nb+1
newstr+StringField(str,t," ")+" "
Next
NbAnd-1
str=newstr
Debug "And Result:"+str
Break
EndIf
Next
EndIf
Nb=CountString(str," ")
NbAnd=CountString(UCase(str),"AND")
NbOr=CountString(UCase(str),"OR")
Until NbOr=0 And NbAnd=0 ; On repête le traitement tant qu'on a des opérateur logique
;________________________________________
param=Left(param,Mem(Id)-2)+str+Right(param,Len(param)-l); On remplace la parenthèse traité part son resulta
l=Len(Left(param,Mem(Id)-2)+str)-1;Nouvelle position du curseur
param=ReplaceString(param," "," ")
Debug "Nouvelle chaine:"+param
Id-1
EndIf
Next
Until NbEndPar<1
ProcedureReturn Param
EndProcedure
Debug "-----"
Debug "result final:"+TestCondition("(1 Or(1 And(0 Or 1 And 1))And 1)")
Debug "-----"
End