2016-10-18 1 views
0

je un formulaire HTML que les utilisateurs de données d'entrée en ce que enregistre les valeurs dans deux tables MySQL, factures et LineItems. Lorsque vous cliquez sur le bouton "Enregistrer", ces valeurs sont insérées en tant que nouvelle ligne dans les factures et les éléments de ligne. La page s'actualise pour afficher le même formulaire, mais avec les valeurs entrées par l'utilisateur enregistrées dans les champs de saisie. La page Web a multiplier 'lineitems' l'utilisateur peut créer. Ces données sont enregistrées dans la table lineitems. Chaque ligne de facture a un identifiant unique qui est ajouté à chaque ligne que l'utilisateur crée. De cette façon, la facture peut obtenir chaque élément de ligne associé à la table lineitems. J'ai besoin d'effectuer un calcul de somme sur lineitems.quantity pour chaque facture et enregistrer la valeur à invoices.totalquantity.Mettre à jour la colonne de la table MySQL en utilisant la somme d'une valeur de php stockée dans un tableau

J'ai essayé la mise en place des déclencheurs sur la table LineItems lui-même, mais il ne parvient pas toujours. J'essaie maintenant de le faire du côté du programme.

MON CODE:

// LINE ITEMS CLASS 
    // ============================================================================================== 
class lineitems{ 

    var $queryresult = NULL; 

    function lineitems($db, $invoiceid, $invoicetype = "Order"){ 

     $this->db = $db; 
     $this->invoiceid = ((int) $invoiceid); 
     $this->invoicetype = $invoicetype; 

    }//end method 


    function get(){ 

    $querystatement = " 
      SELECT 
       products.partname, 
       products.partnumber, 
       products.claveid, 
       products.claveid2, 
       products.layupid, 

       lineitems.id, 
       lineitems.productid, 

       lineitems.quantity, 




       lineitems.nipple, 
       lineitems.polish, 
       lineitems.edgeseal, 
       lineitems.leads, 

       lineitems.leadsl, 

       lineitems.width, 
       lineitems.widthf, 
       lineitems.height, 
       lineitems.heightf, 
       lineitems.comment 



      FROM 
       lineitems LEFT JOIN products ON lineitems.productid = products.id 
      WHERE 
       invoiceid = ".$this->invoiceid." 
      ORDER BY 
       lineitems.displayorder"; 



      /* 
      FROM 
       lineitems LEFT JOIN products ON lineitems.productid = products.id 
      WHERE 
       invoiceid = ".$this->invoiceid." 
      ORDER BY 
       lineitems.displayorder"; */ 

     $this->queryresult = $this->db->query($querystatement); 

}//end method 


    function show(){ 



     if($this->queryresult === NULL) 
      $this->get(); 

     $count = 1; 
     while($therecord = $this->db->fetchArray($this->queryresult)){ 



      ?><tr id="li<?php echo $count?>" class="lineitems"> 

       <td colspan="2" class="lineitemsLeft" <?php if($this->invoicetype == "Void" || $this->invoicetype == "Invoice") echo 'nowrap="nowrap"'?>> 
        <input type="hidden" id="li<?php echo $count?>ProductID" value="<?php echo $therecord["productid"]?>"/> 

        <div> 
         <?php if($therecord["partnumber"] || $therecord["partname"]) {?> 
         <p><?php echo formatVariable($therecord["partnumber"]) ?></p> 
     <!--    <p class="important"><?//php echo formatVariable($therecord["partname"])?></p> --> 

         <?php } else 
           echo "&nbsp;"; 
         ?> 
        </div> 
       </td> 



    <!--   <td><input id="li<?//php echo $count?>Memo" class="lineitemMemos" value="<?//php echo formatVariable($therecord["memo"])?>"/></td> --> 
      <!-- <td><input id="li<?////php echo $count?>Frontfinish" class="lineitemFrontfinishs" value="<?/////php echo formatVariable($therecord["frontfinish"])?>"/></td> 
       <td><input id="li<?////php echo $count?>Backfinish" class="lineitemBackfinishs" value="<?////php echo formatVariable($therecord["backfinish"])?>"/></td> --> 
        <td><input id="li<?php echo $count?>Comment" class="lineitemComments" value="<?php echo formatVariable($therecord["comment"])?>"/></td> 

        <td><input id="li<?php echo $count?>Nipple" class="lineitemNipples" value="<?php echo formatVariable($therecord["nipple"])?>"/></td> 



        <td><input id="li<?php echo $count?>Polish" class="lineitemPolishes" value="<?php echo formatVariable($therecord["polish"])?>"/></td> 




        <td><input id="li<?php echo $count?>Edgeseal" class="lineitemEdgeseals" value="<?php echo formatVariable($therecord["edgeseal"])?>"/></td> 

        <td><input id="li<?php echo $count?>Leads" class="lineitemLeadss" value="<?php echo $therecord["leads"]?>"/></td> 



        <td><input id="li<?php echo $count?>Leadsl" class="lineitemLeadsls" value="<?php echo $therecord["leadsl"]?>"/></td> 
       <!-- <td><input id="li<?///php echo $count?>RQ" class="lineitemRQs" value="<?///php echo $therecord["RQ"]?>"/></td> --> 



        <td><input id="li<?php echo $count?>Width" class="lineitemWidths" value="<?php echo $therecord["width"]?>"/></td> 
       <td> <input id="li<?php echo $count?>Widthf" class="lineitemWidthfs" value="<?php echo $therecord["widthf"]?>"/></td> 

        <td><input id="li<?php echo $count?>Height" class="lineitemHeights" value="<?php echo $therecord["height"]?>"/> </td> 
        <td> <input id="li<?php echo $count?>Heightf" class="lineitemHeightfs" value="<?php echo $therecord["heightf"]?>"/></td> 
        <!-- 
              <td><input id="li<?///php echo $count?>Claveid" class="uneditable lineitemClaveids" value="<?////php echo formatVariable($therecord["claveid"])?>"/></td> 

        <td><input id="li<?////php echo $count?>Claveid2" class="uneditable lineitemClaveid2s" value="<?/////php echo formatVariable($therecord["claveid2"])?>"/></td> 

    --> 
       <td><input id="li<?php echo $count?>Quantity" class="lineitemQuantities" value="<?php echo formatVariable($therecord["quantity"])?>"/></td> 

     <td><input id="li<?php echo $count?>Sqft" class="uneditable lineitemSqfts" value="<?php echo formatVariable(ceil($therecord["width"]*$therecord["height"]/144)) ?>"/></td> 


     <td><input id="li<?php echo $count?>Sqfttot" class="uneditable lineitemSqfttots" value="<?php echo formatVariable (ceil($therecord["width"]*$therecord["height"]/144* $therecord["quantity"]))?>"/></td> 


     <!-- <td><input id="li<?///php echo $count?>unitweight" class=" uneditable lineitemUnitweight" value="<?///php echo $unitweight ?>"/></td> --> 

     <!-- <td><input id="li<?///php echo $count?>totalweight" class="uneditable lineitemTotalweight" value="<?///php echo $totalweight ?>"/></td> -->      







       <td class="lineitemsButtonTDs"> 
        <div id="li<?php echo $count?>ButtonsDiv" class="lineitemsButtonDivs"> 
         <button type="button" id="li<?php echo $count?>ButtonDelete" class="graphicButtons buttonMinus LIDelButtons" title="Remove line item"><span>-</span></button><br /> 
         <button type="button" id="li<?php echo $count?>ButtonMoveUp" class="graphicButtons buttonUp LIUpButtons" title="Move Item Up"><span>Up</span></button><br /> 
         <button type="button" id="li<?php echo $count?>ButtonMoveDown" class="graphicButtons buttonDown LIDnButtons" title="Move Item Down"><span>Dn</span></button><br /> 
        </div>      
       </td> 

      </tr> 


      <?php 

      $count++; 

     }//endwhile 

    }//end method 


    function set($itemlist, $userid = NULL){ 

     if(!$userid) 
      $userid = $_SESSION["userinfo"]["id"]; 

     $deletestatement = " 
      DELETE FROM 
       lineitems 
      WHERE 
       invoiceid = ".$this->invoiceid; 

     $this->db->query($deletestatement); 

     $itemsArray = explode(";;", $itemlist); 

     $count = 0; 

     foreach($itemsArray as $item){ 

      $itemRecord = explode("::", $item); 
      if(count($itemRecord) > 1){ 

       $insertstatement =" 
        INSERT INTO 
         lineitems(
          invoiceid, 
          productid, 
          comment, 
          nipple, 
          polish, 
          edgeseal, 
          leads, 
          leadsl, 
          width, 
          widthf, 
          height, 
          heightf, 
          quantity, 
          sqft, 
          sqfttot, 
          displayorder, 
          createdby, 
          creationdate, 
          modifiedby, 
          modifieddate 
         ) 
        VALUES (
         ".$this->invoiceid.", 
         ".((int) $itemRecord[0]).", 
         '".$itemRecord[1]."', 
         '".$itemRecord[2]."', 
         '".$itemRecord[3]."', 
         '".$itemRecord[4]."', 
         '".$itemRecord[5]."', 
         '".$itemRecord[6]."', 
         '".$itemRecord[7]."', 
         '".$itemRecord[8]."', 
         '".$itemRecord[9]."', 
         '".$itemRecord[10]."', 
         '".$itemRecord[11]."', 
         '".$itemRecord[12]."', 
         '".$itemRecord[13]."', 
         ".$count.", 
         ".$userid.", 
         NOW(), 
         ".$userid.", 
         NOW() 

        )"; 

       $this->db->query($insertstatement); 


       $count++; 

      }//end if 

     }//endforeach      

    }//end method 


    //this isn't actually updating my invoices table... 
    function updatesglitots() { 

     $sglitotalsupdate="UPDATE invoices i LEFT JOIN (SELECT invoiceid, SUM(quantity) AS sgtotqty FROM lineitems li GROUP BY invoiceid) AS t ON i.invoiceid = t.invoiceid SET i.totalquantity = t.sgtotqty WHERE i.invoiceid = ".$this->invoiceid.""; 


    $this->db->query($sglitotalsupdate); 


    } 

}//end class 

}// end if 

que je veux faire, soit quelque chose comme ceci:

"UPDATE invoices 
     SET totalquantity = SUM('".$itemRecord[11]."') 
     WHERE invoices.id = ".$this->invoiceid." 
    ;" 

NOTE: '. $ ItemRecord [11] "' est la valeur de tableau qui contient la quantité pour chaque ligne qu'un utilisateur crée.

OU ...

 "UPDATE invoices INNER JOIN lineitems 
     ON invoices.id=lineitems.invoiceid 
     SET invoices.totalquantity = SUM(lineitems.quantity) 
     WHERE invoices.id=lineitems.invoiceid 
     ;" 

S'il vous plaît aider comme je l'ai essayé plusieurs méthodes différentes ...

Thank you !!

Répondre

0

Vous pouvez utiliser une sous-requête corrélée ou joindre la table de factures à une table dérivée. Une fois que vous avez inséré tous les éléments de campagne, le total sera calculé.

"UPDATE invoices i 
SET totalquantity = (
    SELECT SUM(quantity) 
    FROM lineitems li 
    WHERE li.invoiceid = i.invoiceid) 
WHERE i.invoiceid = " . $this->invoiceid; 

// or 

"UPDATE invoices i 
LEFT JOIN 
    (SELECT invoiceid, SUM(quantity) AS total 
    FROM lineitems li 
    GROUP BY invoiceid) AS t 
ON i.invoiceid = t.invoiceid 
SET i.totalquantity = t.total 
WHERE i.invoiceid = " . $this->invoiceid; 

i, li et t sont des alias pour la table invoices, table lineitems, et la table dérivée dans la deuxième requête, respectivement.

+0

pouvez-vous me dire ce que le "i", "li" et "t" représentent? Je devine qu'ils sont les noms des tables dérivées? Est-ce que cela mettra à jour la colonne dans les factures dont j'ai besoin? – rdimouro

+0

J'ai mis à jour la réponse pour expliquer ces abréviations. L'une de ces requêtes doit mettre à jour la colonne correcte dans la table des factures. –

+0

J'ai donc édité ma question pour refléter le code que j'ai ajouté sur la base de votre suggestion, mais je ne suis pas entièrement sûr de l'implémenter pour que ma table de factures soit mise à jour ... – rdimouro

0

Vous ne pouvez pas combiner la fonction sum de mysql avec le type array de php.

Vous pouvez utiliser la fonction array_sum de php sur la array de php.

"UPDATE invoices 
    SET totalquantity = '". array_sum($itemRecord[11]) ."' 
    WHERE invoices.id = ".$this->invoiceid." 
;" 
+0

Etes-vous sûr de la deuxième version? Je n'ai jamais vu cette utilisation de la fonction 'SUM()' dans MySQL. AFAIK, il ne peut être utilisé comme une fonction d'agrégation. – Barmar

+0

@Barmar, merci! J'étais sûr de l'avoir utilisé avant ... mon mauvais. SUM est pour les agrégations. Réponse mise à jour – Dekel

+0

Merci d'avoir répondu si rapidement. Il me vient maintenant à l'esprit que l'utilisation de la valeur de tableau ne me donnerait toujours qu'une seule valeur pour cette ligne. Je dois résumer toutes les lignes associées à la facture. Je pense que je devrais utiliser "UPDATE factures INNER JOIN lineitems sur factures.id = lineitems.invoiceid SET factures.totalquantity = SOMME (lineitems.quantity) WHERE factures.id = lineitems.invoiceid;" . Ou quelque chose de similaire à ça. Avez-vous des suggestions sur la façon de mettre en œuvre cela? – rdimouro