Transformer chaine texte venant de SQL en chaine math (formule de calcul)

Tafa60 Messages postés 4 Date d'inscription lundi 23 octobre 2006 Statut Membre Dernière intervention 9 mars 2010 - 23 avril 2008 à 10:27
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 - 23 avril 2008 à 15:27
Bonjour,

Je dois réaliser une sorte de bulletin de note automatisé pour un grand nombre de type de BAC (donc pas de saisie en dur dans mon script) sachant que :

   Bac Scientifique
      Moyenne Math (coef 5) : (total_notes/nb_notes)*5
      Moyenne Français(coef 2) : (total_notes/nb_notes)*2
   Bac Literaire
      Moyenne note Math (coef 2) : (total_notes/nb_notes)*2
      Moyenne note Français(coef 5) : (total_notes/nb_notes)*5

J'ai donc créé : 
   table BAC
      id_BAC  |    type_BAC
      ----------|-------------
            1       |     Scientifique
            2       |     Literaire

   table MATIERE
      id_MATIERE    |    type_MATIERE
      -----------------|-------------
               1               |     Math 
               2               |    Français

   table CALCUL
      id_CALCUL |  id_BAC |  id_MATIERE |  formule_calcul
      --------------|-----------|----------------|--------------------------- 
              1           |       1       |            1          | (total_notes/nb_notes)*5
              2           |       1       |            2          | (total_notes/nb_notes)*2
              3           |       2       |            1          | (total_notes/nb_notes)*2
              4           |       2       |            2          | (total_notes/nb_notes)*5

(je suis parti du principe que les coef des matières peuvent changer, d'ou la redondance des formules)

Avec mes tri, je récupère bien ma formule, je remplace total_notes & nb_notes par leurs valeurs respectives mais...

formule_calcul est un VARCHAR, et donc je n'arrive pas à avoir le résultat du calcul mais une chaine texte

$moyenne = (30/2)*5   MAIS PAS 15

Quelqu'un connait-il une astuce ou une soluce ?

Merci d'avance

7 réponses

Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
23 avril 2008 à 10:38
(total_notes/nb_notes)* === superflux

   table CALCUL
      id_CALCUL |  id_BAC |  id_MATIERE |  coef
      --------------|-----------|----------------|--------------------------- 
              1           |       1       |            1          | 5
              2           |       1       |            2          | 2
              3           |       2       |            1          | 2
              4           |       2       |            2          | 5

Ensuite ya SUM, COUNT... (en SQL)...

===================Version  Cracra=====================
sinon tu as toujours eval mais attention les conneries >_< et c'est supra degeu

   table CALCUL
      id_CALCUL |  id_BAC |  id_MATIERE |  formule_calcul
      --------------|-----------|----------------|--------------------------- 
              1           |       1       |            1          | ($total_notes/$nb_notes)*5
              2           |       1       |            2          | ($total_notes/$nb_notes)*2
              3           |       2       |            1          | ($total_notes/$nb_notes)*2
              4           |       2       |            2          | ($total_notes/$nb_notes)*5

Evidement il faudra évaluer la string et que les 2 variables soient definit ça ressemblera a ça
(hou que c'est moche )
eval("$iMoy=$sFormule;");

Il vaut mieux poser une question et passer pour bête que le rester toute sa vie

 Les geeks n'ont pas une case en moins ils commencent juste à compter à partir de zéro
0
Tafa60 Messages postés 4 Date d'inscription lundi 23 octobre 2006 Statut Membre Dernière intervention 9 mars 2010
23 avril 2008 à 11:21
Salut Teclis01

(total_notes/nb_notes)* === superflux
Non, j'ai fais un exemple simple, mais certains calculs diffèrent, donc il faut obligatoirement que je mette l'ensemble de la formule.
Ensuite, j'intéroge la présence des variables avec avec un strpos();

>_< et c'est supra degeu
Ouai, bof..... c'est toujours mieux qu'un tiret, et ça a le merite de bien identifier la variable...

eval("$iMoy=$sFormule;");
Y ai pas pensé, vais tester et te tiens au courant.

En tout cas, merci
0
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
23 avril 2008 à 11:32
La calcul d'une moyenne est toujours la même si la formule change c'est que tu ne calcules plus une moyenne auquel cas c'est le modèle de la base de données qui est faux (pas optimisé).

Ton exemple ne donne pas les divergences du calcul Mais au risque de me répéter, si le calcul est différent c'est un problème de moèlisation de la BDD !!!

Il vaut mieux poser une question et passer pour bête que le rester toute sa vie

 Les geeks n'ont pas une case en moins ils commencent juste à compter à partir de zéro
0
Tafa60 Messages postés 4 Date d'inscription lundi 23 octobre 2006 Statut Membre Dernière intervention 9 mars 2010
23 avril 2008 à 11:43
si la formule change c'est que tu ne calcules plus une moyenne :

Exact, par exemple, pour les options, tu n'utilises pas la moyenne, mais seulement les points >10



si le calcul est différent c'est un problème de moèlisation de la BDD

Toujours Exact, car eval me remplace bien les variables, mais ne me calcule pas le résultat.

Dans ma table CALCUL, mon champ formule_calcul est en VARCHAR, d'ou la non-éxécution de ma formule, et d'ou le sujet de mon 1er message.

Mais, étant un peu leger en SQL, je ne sais pas quel type il faut mettre pour mon champ (si un type adéquat existe !)

Je tourne en rond dessus depuis hier soir, et je ne vais bientôt plus avoir de cheuveux !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
23 avril 2008 à 12:14
Ce que je trouve juste et propre:

ton champ formule_calcul devrait se nommer coefficient deja et de type int

Ce que tu peux faire rapidement pour que ça marche sans changer la modèlisation:

tu gardes le eval et ton resultat sera dans $iMoy

Pour ton histoire d'option (c'est des vieux souvenirs le BAC )

Il faudrait ajouter un boolean (booléen) afin de définir dans quel mode tu es
0=>calcul normal
1=>option

Il vaut mieux poser une question et passer pour bête que le rester toute sa vie

 Les geeks n'ont pas une case en moins ils commencent juste à compter à partir de zéro
0
Tafa60 Messages postés 4 Date d'inscription lundi 23 octobre 2006 Statut Membre Dernière intervention 9 mars 2010
23 avril 2008 à 14:46
ton champ formule_calcul devrait se nommer coefficient deja et de type int

Je ne savais pas que l'on pouvait mettre de l'alphabétique dans un int (total_notes;nb_notes)

Il faudrait ajouter un boolean (booléen) afin de définir dans quel mode tu es
0=>calcul normal
1=>option
Tu as entièrement raison. Je vais proceder autrement en créant d'autres tables et en mettant (ce que je ne voulais pas faire, mais bon) en dur toutes les formules de calcul dans un array, et en indiquant laquelle prendre via un int dans la base.

Merci encore
0
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
23 avril 2008 à 15:27
Je ne savais pas que l'on pouvait mettre de l'alphabétique dans un int (total_notes;nb_notes)

On ne peut pas on va juste mettre le coef soit 5 ou 2

en dur toutes les formules de calcul dans un array

pour moi c juste un calcul qui depend d'un entier (switch...)

Merci encore
Je t'en prie c'est un plaisir

Il vaut mieux poser une question et passer pour bête que le rester toute sa vie

 Les geeks n'ont pas une case en moins ils commencent juste à compter à partir de zéro
0
Rejoignez-nous