|
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.aspFaites-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 |
| |
| |
| | | |
|
| | | | |
| | |
|