我有一个用户输入数据的html表单,它将值保存在两个MySQL表,发票和lineitems中。单击“保存”按钮时,这些值将作为新行插入发票和行项目中。页面刷新以显示相同的表单,但用户输入的值保存在输入字段中。该网页具有用户可以创建的多个“lineitems”。此数据将保存到lineitems表中。每个发票行都有一个唯一ID,可添加到用户创建的每个lineitem。这样,发票可以从lineitems表中获取与之关联的每个lineitem。我需要对每张发票的lineitems.quantity执行总和计算,并将值保存到invoices.totalquantity。
我尝试在lineitems表上设置触发器,但它总是失败。我现在正试图从程序方面做到这一点。
我的代码:
// 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 " ";
?>
</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
我想做这样的事情:
"UPDATE invoices
SET totalquantity = SUM('".$itemRecord[11]."')
WHERE invoices.id = ".$this->invoiceid."
;"
注意:'“。$ itemRecord [11]。”'是保存用户创建的每个lineitem的数量的数组值。
... OR
"UPDATE invoices INNER JOIN lineitems
ON invoices.id=lineitems.invoiceid
SET invoices.totalquantity = SUM(lineitems.quantity)
WHERE invoices.id=lineitems.invoiceid
;"
请帮助,因为我尝试了几种不同的方法......
谢谢!
答案 0 :(得分:0)
您无法将来自sum
的{{1}}函数与来自php的mysql
类型相结合。
您可以使用来自array
array_sum
的php中的array
功能。
php
答案 1 :(得分:0)
您可以使用相关子查询,或将发票表连接到派生表。插入所有订单项后,这将计算总计。
react-native run-ios
"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
分别是t
表,invoices
表和第二个查询中派生表的别名。