Somme dans nu tableau

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 : Somme dans nu tableau

Re: Somme dans nu tableau

par kobee » 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

Re: Somme dans nu tableau

par kobee » 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é :)

Re: Somme dans nu tableau

par kobee » 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

Re: Somme dans nu tableau

par Aureusms » 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 ";

Re: Somme dans nu tableau

par kobee » 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

Re: Somme dans nu tableau

par Aureusms » 25 nov. 2011, 21:35

Exact ! Bien vu =D>

Re: Somme dans nu tableau

par xTG » 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.

Re: Somme dans nu tableau

par Aureusms » 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 ?

Re: Somme dans nu tableau

par kobee » 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 ";

Re: Somme dans nu tableau

par xTG » 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. :)

Re: Somme dans nu tableau

par kobee » 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

Re: Somme dans nu tableau

par Aureusms » 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>";
}

?>

Re: Somme dans nu tableau

par kobee » 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

Re: Somme dans nu tableau

par Mazarini » 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").

Somme dans nu tableau

par kobee » 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