Somme dans nu tableau

kobee
Invité n'ayant pas de compte PHPfrance

16 nov. 2011, 12:05

Bonjour,

J'ai une partie de mon code qui me permet de lister des commandes, des les inscires dans un tableau puis de lister tous les produits de toutes les commandes (une sorte de regroupement).
J'aimerais faire la somme des prix (variable serialno) de mes produits. Comment puis-je procéder ? Avez-vous une idée ?

Code : Tout sélectionner

//boucle pour chacune des entrées de mon tableau de commandes for($i=0;$i<count($tableau_idcommandes);$i++){ //requete pour afficher les produits commandés $q5 = "SELECT * FROM products WHERE id='".$tableau_idcommandes[$i]."' $dbs->query($q5); while($dbs->next_record()){ $contenu_mailMG .= "<tr><td>".$dbs->f("serialno")."</td><td>".$dbs->f("product_name")."</td><td>".$dbs->f("quantity")."</td><td>".$dbs->f("listprice")."</td></tr>"; } }
Merci pour votre aide,

KB

ViPHP
ViPHP | 2577 Messages

16 nov. 2011, 12:49

$somme = 0 avant le while
$somme = $somme + $dbs->f("serialno") dans le while

La même chose à faire avant le for et dans le for pour le total global en se basant sur le $somme au lieu du $dbs->f("serialno").

kobee
Invité n'ayant pas de compte PHPfrance

24 nov. 2011, 13:07

Bonjour,

dsl du retard, un peu occupé en ce moment...
Donc si j'ai bien compris la réponse de mazarini, ça me donne :

Code : Tout sélectionner

//boucle pour chacune des entrées de mon tableau de commandes for($i=0;$i<count($tableau_idcommandes);$i++){ //requete pour afficher les produits commandés $q5 = "SELECT * FROM products WHERE id='".$tableau_idcommandes[$i]."' $dbs->query($q5); $somme=0; while($dbs->next_record()){ $somme = $somme + $dbs->f("serialno") $contenu_mailMG .= "<tr><td>"$somme"</td><td>".$dbs->f("product_name")."</td><td>".$dbs->f("quantity")."</td><td>".$dbs->f("listprice")."</td></tr>"; } }
Est-ce bien cela ? Car je ne suis pas sure d'avoir entièrement saisi.

Merci pour votre aide,

KB

ViPHP
ViPHP | 1996 Messages

25 nov. 2011, 00:18

C'est cela en effet.
Je conseille cependant de séparer le contenu de l'affichage.
Dans ton cas comme tu fais plusieurs boucles imbriquées cela peut augmenter la rapidité.
De même pourquoi faire un boucle sur ta variable $tableau_idcommandes ? Inscrit plutôt le contenu de ta varaible dans la requête, çà ira plus vite.
<?php

//requete pour afficher les produits commandés 
$q5  = "SELECT * FROM products WHERE id IN (";
foreach ($tableau_idcommandes as $id)
	$q5 .= $id.",";
$q5 = substr($q5,0,-1).")";

$dbs->query($q5);
$tabProduits = array();
$i=0;
$somme = 0;
while($dbs->next_record())
{
	$tabProduits[$i]["serialno"] = $dbs->f("serialno");
	$tabProduits[$i]["product_name"] = $dbs->f("product_name");
	$tabProduits[$i]["quantity"] = $dbs->f("quantity");
	$tabProduits[$i]["listprice"] = $dbs->f("listprice");
	$somme += $dbs->f("serialno");
	$i++;
}

if (empty($tabProduits))
	$contenu_mailMG .= "<tr><td>PAS de Produits</td></tr>";
else
{
	foreach ($tabProduits as $produits)
		$contenu_mailMG .= "<tr><td>".$produits["serialno"]."</td><td>".$produits["product_name"]."</td><td>".$produits["quantity"]."</td><td>".$produits["listprice"]."</td></tr>";
}

?>
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

kobee
Invité n'ayant pas de compte PHPfrance

25 nov. 2011, 15:42

Merci, ca fonctionne impéc' !
Du coup, il y a un détail que j'avais masqué dans mon premier fragment de code, c'est le classement de la liste des produits.
En effet, pour chaque commande stockée dans un tableau, il peut y avoir des produits identiques.
Du coup, j'aimerais que dans mon tableau les produit soit classé par nom et non par commande puis par nom.

J'avais ajouté la clause ORDER BY, mais cela ne semble pas fonctionner.

Code : Tout sélectionner

$q5 = "SELECT * FROM product WHERE id IN ("; foreach ($tableau_idcommandes as $id) $q5 .= $id.","; $q5 = substr($q5,0,-1).") AND inventaire.id=product.productid AND inventaire.id=vente.salesorderid ORDER BY 'vtiger_inventoryproductrel.productid' ASC ";
Avez-vous des idées ?
Faut-il que je sorte ce lcassement de la boucle de Select pour trier dans le tableau ? Mais comment faire dans ce cas ?

Merci beaucoup pour votre aide en tout cas.

++

KB

ViPHP
xTG
ViPHP | 7331 Messages

25 nov. 2011, 16:11

Si tu veux ordonner par nom ce n'est pas l'id qu'il faut mettre dans la clause ORDER BY dans ce cas. :)

kobee
Invité n'ayant pas de compte PHPfrance

25 nov. 2011, 16:18

En fait, peut importe :)
je veux surtout qu'il soient trié entre eux et pas entre eux dans chaque commande...

mais effectivement, pour que ma demande colle à mon code, j'aurais du mettre ceci...

Code : Tout sélectionner

$q5 = "SELECT * FROM product WHERE id IN ("; foreach ($tableau_idcommandes as $id) $q5 .= $id.","; $q5 = substr($q5,0,-1).") AND inventaire.id=product.productid AND inventaire.id=vente.salesorderid ORDER BY 'inventaire.productname' ASC ";

ViPHP
ViPHP | 1996 Messages

25 nov. 2011, 18:45

Ca ne marchera pas car tu demande une liaison sur deux tables que tu n'a pas indiquées à savoir "inventaire" et "vente".

Code : Tout sélectionner

$q5 = "SELECT * FROM product WHERE id IN ("; foreach ($tableau_idcommandes as $id) $q5 .= $id.","; $q5 = substr($q5,0,-1).") AND inventaire.id=product.productid AND inventaire.id=vente.salesorderid ORDER BY 'inventaire.productname' ASC ";
Soit tu l'indique dans le FROM mais c'est lourding.

Code : Tout sélectionner

$q5 = "SELECT * FROM product, inventaire, stock WHERE id IN ("; foreach ($tableau_idcommandes as $id) $q5 .= $id.","; $q5 = substr($q5,0,-1).") AND inventaire.id=product.productid AND inventaire.id=vente.salesorderid ORDER BY 'inventaire.productname' ASC ";
soit tu fais une liaison mais il faut modifier un peu le "*" en indiquant ce que tu veux dans la clause select. :

Code : Tout sélectionner

$q5 = "SELECT * FROM product WHERE id IN ("; foreach ($tableau_idcommandes as $id) $q5 .= $id.","; $q5 = substr($q5,0,-1).")"; $q5 .= "LEFT JOIN inventaire ON inventaire.id=product.productid LEFT JOIN vente ON inventaire.id=vente.salesorderid ORDER BY 'inventaire.productname' ASC ";
Vérifie aussi ton histoire de ta colonne "id" tu fais une recherche selon id ta ta clause WHERE mais plus loin tu utilise la colonne product.productid. Ne serais-ce pas plutôt : product.id ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

ViPHP
xTG
ViPHP | 7331 Messages

25 nov. 2011, 20:02

La dernière requête proposée par Aureusms est fausse, il faut intégrer les jointures avant le WHERE.

ViPHP
ViPHP | 1996 Messages

25 nov. 2011, 21:35

Exact ! Bien vu =D>
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

kobee
Invité n'ayant pas de compte PHPfrance

20 déc. 2011, 15:22

Bonjour,

Me voici de retour sur ce problème...
Par rapport à la remarque concerant les jointures avant le where, cela veux dire qu'il faut le code suivant ?

Code : Tout sélectionner

$q5 = "SELECT * FROM product LEFT JOIN inventaire ON inventaire.id=product.productid LEFT JOIN vente ON inventaire.id=vente.salesorderid WHERE id IN ("; foreach ($tableau_idcommandes as $id) $q5 .= $id.","; $q5 = substr($q5,0,-1).")"; $q5 .= "ORDER BY 'inventaire.productname' ASC ";
Merci d'avance pour votre aide,

kobee

ViPHP
ViPHP | 1996 Messages

21 déc. 2011, 00:18

Non je ne pense pas.
Je rajouterai d'où vient le "id " dans la clause where :
$q5  = "SELECT * FROM product
LEFT JOIN inventaire ON inventaire.id=product.productid
LEFT JOIN vente ON  inventaire.id=vente.salesorderid
WHERE inventaire.id IN (";
      foreach ($tableau_idcommandes as $id)
        $q5 .= $id.",";
      $q5 = substr($q5,0,-1).")";
$q5 .= "ORDER BY 'inventaire.productname' ASC ";
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

kobee
Invité n'ayant pas de compte PHPfrance

21 déc. 2011, 12:10

Bonjour,

J'ai fais les modification ce matin dans mon code mais le résultat ne fonctionne pas. les produits sont toujours triés par commandes. Par contre, dans chaque commande, ils sont dans l'ordre alphabétique :)
Je me dit que c'est peut-être dans l'intégralité de mon fragment de code qu'il y a un blocage aussi, je vous le copie/colle brut.
$q5  = "SELECT * FROM products
		LEFT JOIN inventoryproductrel ON inventoryproductrel.productid=products.productid
		LEFT JOIN salesorder ON inventoryproductrel.id=salesorder.salesorderid
		WHERE inventoryproductrel.id IN (";
		foreach ($tableau_idcommandes as $id)
        $q5 .= $id.",";
		$q5 = substr($q5,0,-1).")
		AND type_cadeau=''
		AND (subject LIKE '%INF%' OR subject LIKE '%indiv%')
		ORDER BY 'inventoryproductrel.product_name' ASC";

		$dbs->query($q5);
		$tabProduits = array();
		$i=0;
		$somme = 0;
		while($dbs->next_record())
		{
        $tabProduits[$i]["serialno"] = $dbs->f("serialno");
        $tabProduits[$i]["product_name"] = $dbs->f("product_name");
        $tabProduits[$i]["quantity"] = $dbs->f("quantity");
        $tabProduits[$i]["listprice"] = $dbs->f("listprice");
        $somme += $dbs->f("listprice");
        $i++;
		}

if (empty($tabProduits))
        $contenu_mailMG .= "<tr><td>Pas de produits</td></tr>";
else
{
        foreach ($tabProduits as $produits)
                $contenu_mailMG .= "<tr><td>".$produits["serialno"]."</td><td>".$produits["product_name"]."</td><td>".$produits["quantity"]."</td><td>".$produits["listprice"]."</td></tr>";
				$contenu_mailMG .= "<tr><td>TOTAL PRODUITS COMMANDES ".$somme."</td></tr>";
		}
Merci d'avance pour vos idées

Kobee

kobee
Invité n'ayant pas de compte PHPfrance

23 déc. 2011, 11:28

Bonjour,

en fait c'est comme si la requête qui liste les commandes était prioritaire sur l'ordre de classement par produit.
Est-ce que le fait d'aller lire les commande dans le $tableau_idcommande ne "bloquerait" pas la commande ORDER BY ?

merci d'avance pour votre regard avisé :)

kobee
Invité n'ayant pas de compte PHPfrance

26 déc. 2011, 14:48

Bonjour!

Alors, je viens d’analyser un petit peu mon code en essayant une à une les requêtes dans PHPmyadmin.
Ce qui est étrange, c'est que le fragment de code suivant, en remplaçant par les N° des commandes à la place du $tableau_idcommandes fonctionne !
J'obtiens la liste de tous les produits confondus de mes 2 commandes concernées.

Code : Tout sélectionner

$q5 = "SELECT * FROM vtiger_products LEFT JOIN vtiger_inventoryproductrel ON vtiger_inventoryproductrel.productid=vtiger_products.productid LEFT JOIN vtiger_salesorder ON vtiger_inventoryproductrel.id=vtiger_salesorder.salesorderid WHERE vtiger_inventoryproductrel.id IN ("; foreach ($tableau_idcommandes as $id) $q5 .= $id.","; $q5 = substr($q5,0,-1).") AND type_cadeau='' AND (subject LIKE '%INF%' OR subject LIKE '%indiv%') ORDER BY 'vtiger_inventoryproductrel.product_name' ASC";
Donc ce n'est pas cette partie qui fait défaut selon moi mais la construction du tableau.
Le code qui construit le tableau des commandes est celui ci, je pense qu'il n'est pas en tort non plus

Code : Tout sélectionner

$tableau_idcommandes = array(); //requete qui liste toutes les commandes qu'on va devoir exporter et les stocke dans un tableau $q4 = "SELECT * FROM vtiger_salesorder,vtiger_salesordercf, vtiger_crmentity,vtiger_contactdetails,vtiger_contactaddress "; $q4 .= "WHERE vtiger_salesorder.salesorderid=vtiger_crmentity.crmid "; $q4 .= "AND vtiger_contactdetails.contactid=vtiger_salesorder.contactid "; $q4 .= "AND vtiger_salesordercf.salesorderid=vtiger_salesorder.salesorderid "; $q4 .= "AND vtiger_contactdetails.contactid=vtiger_contactaddress.contactaddressid "; $q4 .= "AND smownerid='".$user."' "; $q4 .= "AND sostatus='En attente de traitement' AND deleted='0' "; $db->query($q4); while($db->next_record()){ { $tableau_idcommandes[]=$db->f("salesorderid"); }
donc finalement, pour moi ce qui fait défaut c'est la boucle qui va lire dans le tableau

Code : Tout sélectionner

for($i=0;$i<count($tableau_idcommandes);$i++){
Qu'en pensez-vous ?

Merci d'avance pour votre aide,

Kobee