PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → champs formule comme excel
champs formule comme excel
Iniciado por nospam_gaetan.boudreau, 07,mar. 2006 22:57 - 7 respuestas
Publicado el 07,marzo 2006 - 22:57
Bonjour,

J'ai un champs au nom de «Formule» dans un fichier de type chaine de caractères. Je voudrais utiliser ce champs pour entrer une formule comme dans Excel. Par contre, je ne sais pas comment faire les calculs pour en extraire le résultat...


Ex: "2*(2+2)"
Je voudrais obtenir 8 mais la fonction Val("2+2+2") me retourne 2

Merci de votre aide!
Publicado el 08,marzo 2006 - 09:52
Bonjour,

Vous trouvez ici un code en c++ qui évalue des expressions.
http://www.codeproject.com/cpp/rwformulaparser.asp

Faites-en une dll et utilisez la dans votre programme WD. Ou sinon, vous pouvez écrire votre propre fonction d'évaluation mais ce n'est pas si simple.
Publicado el 08,marzo 2006 - 10:35
ou plus simplement avec la compilation dynamique peut etre ?

bon dev ;)

_stef a écrit :
Bonjour,

Vous trouvez ici un code en c++ qui évalue des expressions.
http://www.codeproject.com/cpp/rwformulaparser.asp

Faites-en une dll et utilisez la dans votre programme WD. Ou sinon, vous pouvez écrire votre propre fonction d'évaluation mais ce n'est pas si simple.
Publicado el 08,marzo 2006 - 10:37
utilise la fonction compile().

je te donne un exemple tiré de mon site "codewindev.com":

Compile("Calcul","2*(2+2)")
Trace(ExecuteTraitement("Calcul",trtProcédure)

A+
Adrien

http://www.codewindev.com
Publicado el 08,marzo 2006 - 10:38
Gaétan Boudreau vient de nous annoncer :
Bonjour,

J'ai un champs au nom de «Formule» dans un fichier de type chaine de
caractères. Je voudrais utiliser ce champs pour entrer une formule comme dans
Excel. Par contre, je ne sais pas comment faire les calculs pour en extraire
le résultat...


Ex: "2*(2+2)"
Je voudrais obtenir 8 mais la fonction Val("2+2+2") me retourne 2

Merci de votre aide!


voir compile dans l'aide, ça fait exactement ce que tu demandes

de rien
JD

--
Publicado el 08,marzo 2006 - 11:31
Gaétan Boudreau a écrit :
Bonjour,

J'ai un champs au nom de «Formule» dans un fichier de type chaine de caractères. Je voudrais utiliser ce champs pour entrer une formule comme dans Excel. Par contre, je ne sais pas comment faire les calculs pour en extraire le résultat...


Ex: "2*(2+2)"
Je voudrais obtenir 8 mais la fonction Val("2+2+2") me retourne 2

Merci de votre aide!


Bonjour,
Vous n'avez manifestement pas lu l'aide en ligne qui spécifie bien que
vous obtiendriez ce résultat. En effet, la fonction Val() transpose en
numérique une chaine de caractère. Ainsi elle commence par le premier,
si c'est un chiffre ou un point elle l'ajoute à la pile., passe au
suivant et ainsi de suite jusqu'au premier caractère qui n'est inclus
dans un nombre (le + en seconde position en l'occurrence). Pour finir
elle recompose la pile de caractères lu pour en faire une valeur
numérique : 2 dans les unités = 2.

Pour interpréter une chaine, je vous invite alors à étudier le
comportement des fonction Compile et ExécuteTraitement.
Compile va créer ajouter une procédure/fonction et la compiler. Il faut
lui transmettre une chaine qui sera une portion de code WLanguage et
sera le corps de la procédure.

ExecuteTraitement est alors simplement chargée de lancer la procédure
nouvelle crée.

Voici ci après un interpréteur de formule telle que vous l'entendez...
il faut lui passer la formule mathématique qui peut être réalisée de
deux manière :
- directement saisie par quelqu'un : "2+2+2"
- saisie et interprétant des paramètres.
cFormule = "(3*%1+2*%2)*(3*%1+2*%2)"
Calcule(ChaineConstruit(cForumule,2,2))
// revient à envoyer "(3*2+2*2)*(3*2+2*2)"

PROCEDURE calcule(cFormule)
// Retourne le résultat du calcul ou Null en cas d'erreur
nResultat est un Variant = Null
// Réalisation du calcul
CodeàCompiler est une chaîne = "PROCEDURE
CalcDyn(nResultat)"+RC+"nResultat = "+cFormule+""
// Compilation de la procédure
Res est une chaîne= Compile("CalcDyn", CodeàCompiler)
SI Res = "" ALORS
// Exécution du calcul
QUAND EXCEPTION DANS
ExécuteTraitement("CalcDyn", trtProcédure,nresultat)
FAIRE
// taite l'exception de la division par zéro
SI ExceptionInfo(errCode)85 ALORS
// division par zéro.
nresultat = MessTraduit(2001)
SINON
// retourne le message des autres exceptions
nresultat = ExceptionInfo()
FIN
FIN
// Libère la procédure dynamique
Compile("CalcDyn", "")
SINON
// Erreur dans la compilation
SI res="ERR" ALORS
// Erreur("Erreur compilation dynamique",codeacompiler, erreurinfo())
nresultat=ErreurInfo()
SINON
// Erreur("Erreur compilation dynamique",codeacompiler, Res)
nresultat=Res
FIN
FIN
RENVOYER nResultat


++ R&B
WDForge.org
Publicado el 08,marzo 2006 - 11:33
Bonjour,

Voici un bout de code qui fonctionne correctement

sFormule est une chaine

// [< Formule >]
sFormule = SansEspace(ChpFormule) // champ de saisie de la formule

// [< Adapter le MasqueSaisie >]
nNbre = ChpNbDécimale // chp saisie nbre décimales
ChpRésultat = 0

SELON nNbre
CAS 0 : ChpRésultat..MasqueSaisie = "999 999 999"
CAS 2 : ChpRésultat..MasqueSaisie = "999 999 999,99"

FIN

// [< Code de la compilation >]
sCodeSource = [
nRes est un réel = %1
Renvoyer nRes
]

sCodeSource = ChaîneConstruit(sCodeSource, sFormule)
sResCompile = Compile("Calc", sCodeSource)

SI sResCompile = "" ALORS

gnMontant = ExécuteTraitement("Calc", trtProcédure)
ChpRésultat = Arrondi(gnMontant, nNbre)
Fin

Cordialement

Albert
Publicado el 08,marzo 2006 - 15:11
MERCI à vous tous!