Calcul + requete avec plusieur tables

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Calcul + requete avec plusieur tables

Re: Calcul + requete avec plusieur tables

par Ginta » 12 oct. 2011, 14:18

J'ai essayé de simplifié un peu plus le code pour se limité à ce que j'ai besoin.
C'est à dire 1 barre par coef de piece.
			<?php
			// On récupère l'id du projet
			$req1 = $bdd->prepare('SELECT id_projet FROM projet WHERE nom_projet = ?');
			$req1->execute(array($_POST['nom_projet']));
			$id_projet = $req1->fetch();
			// On récupère toutes les pièces du projet
			$req2 = $bdd->prepare('SELECT id_piece, nom_piece, quantite_piece, poids_total_piece FROM piece WHERE id_projet = ?');
			$req2->execute(array($id_projet['id_projet']));
			$chaquepiece = $req2->fetch();
			//On crée le graphique
			$num = 1;
			$xOffset = 0;
			$xIncrement = 40; // width of bars
			$scale = 1;
			// On effectue le calcul pour les pièces du projet	
			$req3 = $bdd->prepare('
			SELECT
			SUM(
			sous_ensemble.qte_sous_ensemble *
			(
				(
				sous_ensemble.poids_sous_ensemble *
				materiaux.indicateur_materiaux *
				process.indicateur_process
				) +
			(
			sous_ensemble.quantite_traitement_sous_ensemble *
			traitement.indicateur_traitement
			)
			)
			)AS coef_piece
			FROM sous_ensemble
			INNER JOIN materiaux ON sous_ensemble.matiere_sous_ensemble = materiaux.nom_materiaux
			INNER JOIN traitement ON sous_ensemble.traitement_matiere_sous_ensemble = traitement.nom_traitement
			INNER JOIN process ON sous_ensemble.processus_matiere_sous_ensemble = process.nom_process
			WHERE id_piece = ?');
			$req3->execute(array($chaquepiece['id_piece']));
			$coef_piece = $req3->fetch();
			while ($coef_piece = $req3->fetch())
				{
				echo "<ul class='TGraph' style='height: ".$coef_piece."px; left: ".$xOffset."px;' title='$date'>$coef_piece<br />p1</ul>";
				// On passe à la colonne suivante
				$xOffset = $xOffset + $xIncrement;
				$date = $date + 1;
				echo '</ul>';
				}
			$req1->closeCursor();
			$req2->closeCursor();
			$req3->closeCursor();?>
Mais la encore je n'ai rien d'afficher...
J'ai regardais le code source de la page généré il met rien non plus.
En fait si je reprend son code avec ses infos css, j'ai pas grand chose qui s'affiche.
Je suis pas sur de bien saisir le fonctionnement.

Re: Calcul + requete avec plusieur tables

par Cyrano » 11 oct. 2011, 13:50

Tu utilises des variables non définies.

Par exemple, tu fais un $req3->execute avec en paramètre $chaquepiece['id_piece'] alors que tu n'as pas récupéré le résultat de $req2

Re: Calcul + requete avec plusieur tables

par Ginta » 11 oct. 2011, 13:30

Hello :)

J'ai réussi :)

Voici le code :
//On boucle sur toutes les pièces du projet
				while ($chaquepiece = $req2->fetch())
				{// On effectue le calcul pour les pièces du projet	une par une		
				$req3 = $bdd->prepare('
				SELECT
				SUM(
				sous_ensemble.qte_sous_ensemble *
				(
					(
					sous_ensemble.poids_sous_ensemble *
					materiaux.indicateur_materiaux *
					process.indicateur_process
					) +
				(
				sous_ensemble.quantite_traitement_sous_ensemble *
				traitement.indicateur_traitement
				)
				)
				)AS coef_piece
				FROM sous_ensemble
				INNER JOIN materiaux ON sous_ensemble.matiere_sous_ensemble = materiaux.nom_materiaux
				INNER JOIN traitement ON sous_ensemble.traitement_matiere_sous_ensemble = traitement.nom_traitement
				INNER JOIN process ON sous_ensemble.processus_matiere_sous_ensemble = process.nom_process
				WHERE id_piece = ?');
				$req3->execute(array($chaquepiece['id_piece']));
				$coef_piece = $req3->fetch();
				echo 'La piece '. $chaquepiece['nom_piece'] .' a pour coefficient '. $coef_piece['coef_piece'] .'<br />';
				$req3->closeCursor();
				}
Du coup, j'ai bien mon tableau :
Id_piece | coef_de_la_piece

Maintenant (on arrive à la finalité de la chose^^), je voudrais les résultats en diagramme à barres.
J'ai vu un principe(ici) qui permet de faire ça simplement en php, le seul hic c'est en Mysql et d'après ce que j'ai compris l'avenir est porté par Pdo.
Du coup il me faut adapter ce code en Pdo.
Et la ça coince, car j'y connais pas grand chose :'(
J'ai essayer quelque chose dans ce genre :
			<fieldset>
			<legend>Eco-indicateur par pièce (graphique)</legend>
			<?php
			// On récupère l'id du projet
			$req1 = $bdd->prepare('SELECT id_projet FROM projet WHERE nom_projet = ?');
			$req1->execute(array($_POST['nom_projet']));
			$id_projet = $req1->fetch();
			// On récupère toutes les pièces du projet
			$req2 = $bdd->prepare('SELECT id_piece, nom_piece, quantite_piece, poids_total_piece FROM piece WHERE id_projet = ?');
			$req2->execute(array($id_projet['id_projet']));
			//On crée le graphique
			$days = array();
			$xOffset = 0;
			$xIncrement = 40; // width of bars
			$graphHeight = 500; // target height of graph
			$maxResult = 1;
			$scale = 1;
			// On effectue le calcul pour les pièces du projet	une par une		
			$req3 = $bdd->prepare('
			SELECT
			SUM(
			sous_ensemble.qte_sous_ensemble *
			(
				(
				sous_ensemble.poids_sous_ensemble *
				materiaux.indicateur_materiaux *
				process.indicateur_process
				) +
			(
			sous_ensemble.quantite_traitement_sous_ensemble *
			traitement.indicateur_traitement
			)
			)
			)AS coef_piece
			FROM sous_ensemble
			INNER JOIN materiaux ON sous_ensemble.matiere_sous_ensemble = materiaux.nom_materiaux
			INNER JOIN traitement ON sous_ensemble.traitement_matiere_sous_ensemble = traitement.nom_traitement
			INNER JOIN process ON sous_ensemble.processus_matiere_sous_ensemble = process.nom_process
			WHERE id_piece = ?');
			$req3->execute(array($chaquepiece['id_piece']));
			$coef_piece = $req3->fetch();
			while ($coef_piece = $req3->fetch())
				{
				$days[$row['date']] = array( "P1" => $row['priority1']
				, "P2" => $row['priority2']
				, "P3" => $row['priority3']);
				//On contrôle si cette colonne est la plus haute
				$total = $row['total'];
				if($maxResult < $total) $maxResult = $total;
				
				$result = NULL;
				// On applique l'échelle
				$scale = $graphHeight / $maxResult;
				echo '<ul class="TGraph">';
				foreach($days as $date => $values){
				//On retrie l'array
				arsort($values);
				foreach($values as $priority => $num){
				// On applique une échelle pour s'adapter au graphique
				$height = ($num*$scale);
				// On imprime la barre
				echo "<li class='$priority' style='height: ".$height."px; left: ".$xOffset."px;' title='$date'>$num<br />$priority</li>";
				}
				// On passe à la colonne suivante
				$xOffset = $xOffset + $xIncrement;
				}
				echo '</ul>';
				}
			$req1->closeCursor();
			$req2->closeCursor();
			$req3->closeCursor();?>
			</fieldset>
Mais ça ne m'affiche malheureusement rien.

Quelqu'un peux me donner un coup de pouce?

Re: Calcul + requete avec plusieur tables

par Cyrano » 06 oct. 2011, 13:45

Je te suggère de commencer par faire des essais pour un seul sous-ensemble, donc essaye de construire la requête qui fait le calcul, par exemple pour P1p2s1. Si tu y arrives correctement, il ne sera pas beaucoup plus compliqué de récupérer la même chose pour chacun des items en une seule requête, précisément avec cette clause GROUP BY.

Re: Calcul + requete avec plusieur tables

par Ginta » 06 oct. 2011, 13:13

J'utilise PhpMyAdmin, j'ai rentré la requete dans l'onglet SQL et voila :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? GROUP BY se.id_sous_ensemble LIMIT 0, 30' at line 17
Sinon j'ai inséré la requête dans le bout de code du dessus et j'obtiens toujours :
Le sous-ensemble P1p2s1 a pour coefficient 3.3
Le sous-ensemble P1p2s1 a pour coefficient 3.3
Le sous-ensemble P1p2s1 a pour coefficient 3.3
Le sous-ensemble P1p2s1 a pour coefficient 3.3
Je connais pas trop le GROUP BY je vais essayer de me renseigner sur son utilisation.

Dans le cas présent ce que j'attends c'est :
Le sous-ensemble P1p1s1 a pour coefficient (le nb calculé)
Le sous-ensemble P1p1s2 a pour coefficient (le nb calculé)
Le sous-ensemble P1p1s3 a pour coefficient (le nb calculé)
Le sous-ensemble P1p2s1 a pour coefficient (le nb calculé)
Le sous-ensemble P1p2s2 a pour coefficient (le nb calculé)
Le sous-ensemble P1p3s1 a pour coefficient (le nb calculé)
Edit :
J'ai remplacé :
			$coef_ss_ens = $req2->fetch();
			foreach( $coef_ss_ens as $value )
Par :
while ($coef_ss_ens = $req2->fetch())
Et ça marche :)

Par contre je veux bien que tu me donne un coup de main pour l'autre requête ou je peux récupérer :
La pièce P1p1 a pour coefficient (le nb calculé)
La pièce P1p2 a pour coefficient (le nb calculé)
La pièce P1p3 a pour coefficient (le nb calculé)

Re: Calcul + requete avec plusieur tables

par Cyrano » 05 oct. 2011, 14:53

Voyons déjà la première requête : j'ai du mal à suivre la logique parce que tu utilises des jointures sur des colonnes qui ne sont en réalité pas des clés étrangères correspondant à des clés primaires. En clair, ton modèle de données comporte pas mal de redondances. Mais peu importe. Il doit y avoir une clause de regroupement. Je vais te suggérer de faire des tests de ta requête dans phpMyAdmin ou dans un client MySQL en ligne de commande, ça ira plus vite pour tester et mettre au point ta requête. Commence avec ceci en remplaçant le « ? » par une valeur existante de ta base pour identifier un projet :
SELECT
  se.nom_sous_ensemble                        AS nom_sous_ensemble,
  (
    (
      se.poids_sous_ensemble *
      ma.indicateur_materiaux *
      pr.indicateur_process
    ) + (
      se.quantite_traitement_sous_ensemble *
      tr.indicateur_traitement
    )
  )                                           AS coef_ss_ens
FROM sous_ensemble      se
  INNER JOIN materiaux  ma ON se.matiere_sous_ensemble            = ma.nom_materiaux
  INNER JOIN traitement tr ON se.traitement_matiere_sous_ensemble = tr.nom_traitement
  INNER JOIN process    pr ON se.processus_matiere_sous_ensemble  = pr.nom_process
WHERE se.id_projet = ?
GROUP BY se.id_sous_ensemble;
Observe le résultat et vois si ça correspond à ce que tu attendais.

Re: Calcul + requete avec plusieur tables

par Ginta » 05 oct. 2011, 14:16

Hum un peu ^^

J'ai essayé de faire un tableau :
id_sous_ensemble | coef_du_sous_ensemble

Mais il me retourne pas ce que je veux :'(
			<?php
			// On récupère l'id du projet
			$req1 = $bdd->prepare('SELECT id_projet FROM projet WHERE nom_projet = ?');
			$req1->execute(array($_POST['nom_projet']));
			$id_projet = $req1->fetch();
			// On récupère tous les sous-ensembles du projet en appliquant les coefficients
			$req2 = $bdd->prepare('
			SELECT
			sous_ensemble.nom_sous_ensemble,
			(    
				(
				 sous_ensemble.poids_sous_ensemble *
			     materiaux.indicateur_materiaux *
			     process.indicateur_process
				)
				+
			    (
				 sous_ensemble.quantite_traitement_sous_ensemble *
				 traitement.indicateur_traitement
			    )
			)AS coef_ss_ens
			FROM sous_ensemble
			INNER JOIN materiaux ON sous_ensemble.matiere_sous_ensemble = materiaux.nom_materiaux
			INNER JOIN traitement ON sous_ensemble.traitement_matiere_sous_ensemble = traitement.nom_traitement
			INNER JOIN process ON sous_ensemble.processus_matiere_sous_ensemble = process.nom_process
			WHERE id_projet = ?');
			$req2->execute(array($id_projet['id_projet']));
			$coef_ss_ens = $req2->fetch();
			foreach( $coef_ss_ens as $value )
			echo 'Le sous-ensemble '. $coef_ss_ens['nom_sous_ensemble'] .' a pour coefficient '. $coef_ss_ens['coef_ss_ens'] .'<br />';
			$req1->closeCursor();
			$req2->closeCursor();?>
Les lignes qu'il me retourne sont :

Le sous-ensemble P1p2s1 a pour coefficient 3.3
Le sous-ensemble P1p2s1 a pour coefficient 3.3
Le sous-ensemble P1p2s1 a pour coefficient 3.3
Le sous-ensemble P1p2s1 a pour coefficient 3.3

Il me met 4 lignes alors que dans mon projet j'ai 6 sous-ensembles (c'est le id_projet 1 cf premier post) et il me répète l'id_sous_ensemble 4.
Je comprend pas trop où j'ai faux :x

Au niveau de l'autre tableau
Id_piece | coef_de_la_piece
je pense qu'il faut passer par ce premier tableau "id_sous_ensemble | coef_du_sous_ensemble" en récupérant la colonne "id_piece"
Donc cela ferait :
Id_piece | id_sous_ensemble | coef_du_sous_ensemble
Puis après je sais pas si c'est faisable avec un foreich on ferait la somme de chaque coeff des sous-ensembles par pièce.

Ça ressemble à ce que tu m'as indiqué?

Re: Calcul + requete avec plusieur tables

par Cyrano » 05 oct. 2011, 13:47

Pour le premier tableau, tu dois faire une requête qui va te donner les détails pièce par pièce.

Pour le second en revanche, ce n'est pas logique puisque par définition un coefficient pour un sous-ensemble concerne plusieurs pièces, donc plusieurs identifiants différents. Donc le second tableau pourrait comprendre un identifiant de sous-ensemble et le coefficient pour ce même sous-ensemble, mais en aucun cas l'identifiant d'une pièce particulière. Mais il faudra soit une seconde requête soit le faire par programmation à partir du résultat de la première et dans ce cas, il faudrait que dans la première requête tu récupères également le coefficient du sous-ensemble auquel appartient la pièce.

Est-ce que ça t'éclaire mieux ?

Re: Calcul + requete avec plusieur tables

par Ginta » 05 oct. 2011, 13:18

Autant pour moi :p
J'avais pas vu que tu avais supprimer la colonne des identifiants.

Par contre, j'avais en tête d'utiliser un tableau sous cette forme :

Id_piece | coef_de_la_piece

Et un autre tableau sous cette forme :

Id_piece | id_sous_ensemble | coef_du_sous_ensemble

Tu aurais une idée comment je pourrais m'y prendre?

Re: Calcul + requete avec plusieur tables

par Cyrano » 03 oct. 2011, 14:27

Gros malin, tu as regardé soigneusement ta requête avant de l'envoyer ? regarde donc ce que tu as mis dans ton SUM() : comme erreur de syntaxe, ça va devenir difficile de faire mieux... Je t'ai suggéré de virer une des colonnes demandées, mais au lieu de la virer, tu l'as déplacée DANS le SUM : MySQL n'aime pas du tout ça et te jette vigoureusement. :-k

Re: Calcul + requete avec plusieur tables

par Ginta » 03 oct. 2011, 13:07

J'avais essayé la même chose, mais apparemment j'ai une erreur de syntaxe que je ne comprend pas.

Voici mon code :
			$req2 = $bdd->prepare('
			SELECT 
                        SUM (
			sous_ensemble.id_sous_ensemble AS idss,
			sous_ensemble.quantite_piece *
			(
			 sous_ensemble.qte_sous_ensemble *
			  (
			    (
			     sous_ensemble.poids_sous_ensemble *
			     materiaux.indicateur_materiaux *
			     process.indicateur_process
				) +
			   (
			   sous_ensemble.quantite_traitement_sous_ensemble *
			   traitement.indicateur_traitement
			   )
			  )
			 )
                        )AS coefficient
			FROM sous_ensemble
			INNER JOIN materiaux ON sous_ensemble.matiere_sous_ensemble = materiaux.nom_materiaux
			INNER JOIN traitement ON sous_ensemble.traitement_matiere_sous_ensemble = traitement.nom_traitement
			INNER JOIN process ON sous_ensemble.processus_matiere_sous_ensemble = process.nom_process
			WHERE id_projet = ?');
			$req2->execute(array($id_projet['id_projet']));
			$coefficient = $req2->fetch();
			echo $coefficient;
			$req1->closeCursor();
			$req2->closeCursor();
Et j'ai donc le message d'erreur suivant :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1584 Incorrect parameters in the call to stored function 'SUM'' in C:\wamp\www\Site BE\eco-conception\Resultat_evaluation.php on line 191
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1584 Incorrect parameters in the call to stored function 'SUM' in C:\wamp\www\Site BE\eco-conception\Resultat_evaluation.php on line 191
C'est pour cela que j'avais essayé une solution ou j'essayé de faire une boucle avec une formule qui fait la somme des coefs en sortie de requete, mais sans succès non plus :'(

Re: Calcul + requete avec plusieur tables

par Cyrano » 30 sept. 2011, 14:14

Si tu rajoutes un SUM dans ta requête, tu n'auras plus les identifiants, mais j'ai idée qu'en fin de comtpte ce n'est pas vraiment un soucis et que ce qui t'intéresse réellement c'est ce coefficient. Si c'est bien ça, alors essaye ceci :
SELECT
SUM(
  sous_ensemble.quantite_piece *
  (
   sous_ensemble.qte_sous_ensemble *
    (
      (
       sous_ensemble.poids_sous_ensemble *
       materiaux.indicateur_materiaux *
       process.indicateur_process
          ) +
     (
     sous_ensemble.quantite_traitement_sous_ensemble *
     traitement.indicateur_traitement
     )
    )
  )
) AS coefficient
FROM sous_ensemble
  INNER JOIN materiaux ON sous_ensemble.matiere_sous_ensemble = materiaux.nom_materiaux
  INNER JOIN traitement ON sous_ensemble.traitement_matiere_sous_ensemble = traitement.nom_traitement
  INNER JOIN process ON sous_ensemble.processus_matiere_sous_ensemble = process.nom_process
WHERE id_projet = ?');
Et avec des alias sur les noms des tables, ce sera peut-être moins long à écrire :
SELECT
  SUM(
    se.quantite_piece *
    (
     se.qte_sous_ensemble *
      (
        (
         se.poids_sous_ensemble *
         ma.indicateur_materiaux *
         pr.indicateur_process
        ) +
        (
          se.quantite_traitement_sous_ensemble *
          tr.indicateur_traitement
        )
      )
    )
  ) AS coefficient
FROM sous_ensemble      se
  INNER JOIN materiaux  ma ON se.matiere_sous_ensemble            = ma.nom_materiaux
  INNER JOIN traitement tr ON se.traitement_matiere_sous_ensemble = tr.nom_traitement
  INNER JOIN process    pr ON se.processus_matiere_sous_ensemble  = pr.nom_process
WHERE id_projet = ?');

Re: Calcul + requete avec plusieur tables

par Ginta » 30 sept. 2011, 13:05

Comme je disais dans mon premier ^post :
Ce que je voudrais, c'est calculer le coef suivant la formule suivante :
Coef_projet = somme_toutes_pieces*(qte_piece*(qte_sous-ensemble*(poids_sous-ensemble*coef_matiere*coef_processus+qte_traitement*coef_traitement)))
Pour le moment avec la requête suivante :
			SELECT
			sous_ensemble.id_sous_ensemble AS idss,
			sous_ensemble.quantite_piece *
			(
			 sous_ensemble.qte_sous_ensemble *
			  (
			    (
			     sous_ensemble.poids_sous_ensemble *
			     materiaux.indicateur_materiaux *
			     process.indicateur_process
				) +
			   (
			   sous_ensemble.quantite_traitement_sous_ensemble *
			   traitement.indicateur_traitement
			   )
			  )
			) AS coefficient
			FROM sous_ensemble
			INNER JOIN materiaux ON sous_ensemble.matiere_sous_ensemble = materiaux.nom_materiaux
			INNER JOIN traitement ON sous_ensemble.traitement_matiere_sous_ensemble = traitement.nom_traitement
			INNER JOIN process ON sous_ensemble.processus_matiere_sous_ensemble = process.nom_process
			WHERE id_projet = ?');
Je récupère pour chaque ligne id_sous_ensemble la valeur calculer.

Mais ce que je voudrai c'est la somme de toutes ces valeurs, en gros la somme du champs coefficient.

J'ai essayé avec une boucle foreach :
	
			$coefficient = $req2->fetch();
	        	// Calcul du coeff total
			$sommecoef = 0;
			foreach ($coefficient as $value)
			{$sommecoef = $coefficient['coefficient'] + $sommecoef;
			}
			echo $sommecoef;
Mais je sais pas pourquoi pour il me compte 2 fois plus de lignes qu'il devrait en avoir.
C'est à dire si j'ai :
id_sous_ensemble -- coefficient
1 -- 5
2 -- 7
3 -- 6
4 -- 2
Si je fait la somme j'ai 20, lui me trouve 40.

Je pense que l'idéal serait de faire la somme dans la requête mais j'y arrive pas :'(

Re: Calcul + requete avec plusieur tables

par Cyrano » 29 sept. 2011, 19:44

Donne donc un exemple en quelques lignes de ce que tu voudrais obtenir en indiquant bien entendu à partir de quelles données. Ce sera beaucoup plus facile de comprendre exactement ce que tu veux faire.

Re: Calcul + requete avec plusieur tables

par Ginta » 29 sept. 2011, 14:36

Merci Cyrano !

Ca marche mieux ;)

Par contre j'ai un petit soucis, dans 1 projet il y a plusieurs pièces, et plusieurs sous-ensemble.
Dans "coefficient" je récupère un tableau avec le résultat sur chaque ligne, mais je ne sais pas ou placer la fonction SUM ( ) pour faire la somme de toutes ces lignes.

Quelqu'un peux me renseigner?