จะตัดสต็อกสินค้าแบบ First In First Out อย่างไรครับ
ถ้าเป็นผม จะวนลูปตัดตามหมายเลขล็อต หรือวันที่ของล็อต อันไหนมาก่อนก็อัพเดตก่อน
ขาดอีกเท่าไหร่ก็ตัดไปเรื่อยๆ ถ้าครบตั้งแต่รอบแรกก็ออกจากลูป ^^
Date :
2016-02-26 09:17:51
By :
{Cyberman}
กรณีที่ Update แบบ JOIN ครับ
Code (SQL)
UPDATE lot
SET lot.Amount_drug = lot.Amount_drug - b.Sum_Amount_drug
FROM lot
INNER JOIN
(SELECT LotNo, SUM(Amount_drug) AS Sum_Amount_drug FROM tb_order WHERE OrderID='xxx' GROUP BY LotNo) AS b
ON lot.LotNo = b.LotNo
Date :
2016-02-26 09:56:40
By :
mr.win
Code (PHP)
function order($drug_id, $amount) {
$drugs = DB::table('lot')
->where('DrugID', '=', $drug_id)
->where('Amount_drug', '>', 0)
->orderBy('LotNo', 'asc')
->select('LotNo', 'Amount_drug')
->get();
$index = 0;
$total = 0;
while ($amount > $total) {
$stock = $drugs[$index]->Amount_drug;
$draw = ($total + $stock > $amount) ? $amount - $total : $stock;
DB::table('lot')
->where('LotNo', '=', $drugs[$index]->LotNo)
->update(['Amount_drug' => $stock - $draw]);
$total += $draw;
}
}
Date :
2016-02-26 10:07:09
By :
ห้ามตอบเกินวันละ 2 กระทู้
ลืม $index++;
Date :
2016-02-26 10:08:49
By :
ห้ามตอบเกินวันละ 2 กระทู้
ตอบความคิดเห็นที่ : 4 เขียนโดย : ห้ามตอบเกินวันละ 2 กระทู้ เมื่อวันที่ 2016-02-26 10:08:49
รายละเอียดของการตอบ ::
$index++; บรรทัดไหนครับ
แล้วก็ไม่รู้จะเอาโค้ดไปว่างตรงส่วนไหน
นี่เป็นหน้าโค้ดครับ
Code (PHP)
<?ob_start();?>
<?
session_start();
include("db_connect.php");
$Total = 0;
$SumTotal = 0;
$strSQL = "SELECT * FROM member WHERE MemberID = '".$_POST["MemberID"]."' ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
if($objResult)
{
$strSQL = "UPDATE member SET Username = '".$_POST["Username"]."', Password = '".$_POST["Password"]."', Name_member = '".$_POST["Name_member"]."', Addr_member = '".$_POST["Addr_member"]."'
,Tel_member = '".$_POST["Tel_member"]."', Email_member = '".$_POST["Email_member"]."' WHERE MemberID = '".$_GET["MemberID"]."' ";
$objQuery = mysql_query($strSQL) or die(mysql_error());
}
else
{
$strSQL = "INSERT INTO member ";
$strSQL .="(MemberID,Name_member,Addr_member,Tel_member,Email_member,Status_member) ";
$strSQL .="VALUES ";
$strSQL .="('".$_POST["MemberID"]."','".$_POST["Name_member"]."' ";
$strSQL .=",'".$_POST["Addr_member"]."','".$_POST["Tel_member"]."','".$_POST["Email_member"]."','CUSTOMER')";
$objQuery = mysql_query($strSQL);
}
$strSQL = "INSERT INTO orders (OrderDate,MemberID,Status_order) VALUES
('".date("Y-m-d")."','".$_POST["MemberID"]."','0')";
mysql_query($strSQL) or die(mysql_error());
$strOrderID = mysql_insert_id();
for($i=0;$i<=(int)$_SESSION["intLine"];$i++)
{
if($_SESSION["strID_drug"][$i] != "")
{
$strSQL = "INSERT INTO orders_detail (OrderID,OrderDate,ID_drug,Qty) VALUES ('".$strOrderID."','".date("Y-m-d")."','".$_SESSION["strID_drug"][$i]."','".$_SESSION["strQty"][$i]."')";
mysql_query($strSQL) or die(mysql_error());
$strSQL2 = "SELECT g.*, dg.*, l.* FROM drug g, drug_group dg, lot l WHERE ID_drug = '".$_SESSION["strID_drug"][$i]."' AND g.ID_group = dg.ID_group AND g.ID_drug = l.DrugID ";
$objQuery2 = mysql_query($strSQL2) or die(mysql_error());
$objResult2 = mysql_fetch_array($objQuery2);
$strSQL3 = "SELECT * FROM shipping ";
$objQuery3 = mysql_query($strSQL3) or die(mysql_error());
$objResult3 = mysql_fetch_array($objQuery3);
$AllPrice = $_SESSION["strQty"][$i] * $objResult["Price_drug2"];
$Total = $Total + $AllPrice;
$ShippingCost = $objResult3["ShippingCost"];
$ShippingCost = '0';
$SumTotal = $Total + $ShippingCost;
}
}
$strSQL4 = "INSERT INTO payment_inform (OrderID,Status_inform) ";
$strSQL4 .="VALUES ";
$strSQL4 .="('".$strOrderID."','0')";
$objQuery = mysql_query($strSQL4) or die(mysql_error());
$Cost = $_POST["Cost"];
$strInformID = mysql_insert_id();
$strSQL5 = "INSERT INTO payment (PayDate,InformID,Cost,OrderID,Status_pay) ";
$strSQL5 .="VALUES ";
$strSQL5 .="('".date("Y-m-d")."','".$strInformID."','$Cost','".$strOrderID."','1')";
$objQuery = mysql_query($strSQL5) or die(mysql_error());
mysql_close();
unset($_SESSION["strID_drug"]);
unset($_SESSION["img_drug"]);
unset($_SESSION["Na1_drug"]);
unset($_SESSION["Price_drug"]);
unset($_SESSION["strQty"]);
unset($_SESSION["$Total,2"]);
echo "<script>alert('ทำรายการสั่งซื้อเสร็จเรียบร้อยเเล้ว')</script>";?>
<script type="text/javascript">
window.location="order.php";
</script>
ประวัติการแก้ไข 2016-02-26 10:29:27 2016-02-26 10:31:37 2016-02-26 10:51:02
Date :
2016-02-26 10:25:33
By :
kopkap_sitisak
Code (PHP)
function order($drug_id, $amount) {
$drugs = DB::table('lot')
->where('DrugID', '=', $drug_id)
->where('Amount_drug', '>', 0)
->orderBy('LotNo', 'asc')
->select('LotNo', 'Amount_drug')
->get();
$index = 0;
$total = 0;
while ($amount > $total) {
$stock = $drugs[$index]->Amount_drug;
$draw = ($total + $stock > $amount) ? $amount - $total : $stock;
DB::table('lot')
->where('LotNo', '=', $drugs[$index]->LotNo)
->update(['Amount_drug' => $stock - $draw]);
$total += $draw;
$index++;
}
}
เราเขียนเล่นๆ อ่านให้เข้าใจวิธีการแล้วแปลงเป็นโค้ดของนายดีกว่า
ดูที่เงื่อนไขการ update นะ
Date :
2016-02-26 11:11:39
By :
ห้ามตอบเกินวันละ 2 กระทู้
Code (PHP)
<?php
//$strSQL = "SELECT Qty FROM orders_detail";
// query ด้านบน ขาด id ของ orders_detail จะอา จำนวนอย่างเดียว ไม่ได้
// แล้วจะอ้างอิงกับอะไรครับ ครับมีจำนวนเท่ากัน ให้ ควรใส่ where เพื่อกำหนด ว่าจะเอา จาก อะไร
// และขาดการอ้างอิง กับ product จำเป็นต้อง เอาค่า product id มาใช้ด้วย แก้เป็น
$strSQL = "SELECT product_id, Qty FROM orders_detail where order_detail_id = ".($_REQUEST['order_detail_id'] * 1);
// ใส่ * 1 กระทำกับ request value number แปลงค่าเป็นตัวเลขสมบูรณ์ ป้องกัน sql injection การ hack ข้อมูลผ่าน sql statement
$objQuery = mysql_query($strSQL) or die(mysql_error() . "<br>$strSQL");
// ข้างบน อย่าแสดงแต่ เออเร่อร์อย่างเดียว แสดง statement ด้วยครับ ทำให้เคยชิน
// ถ้าอ่านจากโค๊ดตัวแปรอาจจะไม่รู้เรื่อง อ่านจาก statement เลยเข้าใจมากกว่าว่าขาดอะไรไป
if( mysql_num_rows($objResut)==0){
// เพิ่มการตรวจสอบจำนวน เรคคอร์ดก่อน ถ้าไม่มี จะให้ทำอะไร ก่อนการดึงค่าออกมา
exit("There is empty data");
}
//$objResult = mysql_fetch_array($objQuery);
// ข้างบน fetch_array ก็ไม่ต้องใช้ ให้ใช้ fetch_assoc แทน
// เพราะ result ที่ได้จาก fetch_array มันได้ 2 อย่าง
// คือ array ที่มีคีย์เป็นลำดับที่ และ คีย์ที่เป็นชื่อ field เปลือง memory แก้เป็น
$objResult = mysql_fetch_assoc($objQuery);
list($prod_id, $Qty) = $objResult; // อ่านค่าจาก array ไปใส่ในตัวแปร
while($Qty > 0){
//$strSQL2 = "SELECT * FROM lot WHERE Amount_drug > 0 order by LotNo asc";
// ข้างบน asc ไม่จำเป็นต้องใส่ เพราะ default คือ asc อยู่แล้ว และขาดการ อ้างอิง product id
// อย่าบอกนะครับว่า ทั้งตารางมี product id เดียว 5555 และ ใส่ชื่อ field ที่ต้องใช้ ด้วย อย่าเอามาทั้งหมด เปลือง memory
$strSQL2 = "SELECT trans_id, Amount_drug FROM lot
WHERE Amount_drug > 0 and procduct_id = $prod_id order by LotNo";
$objQuery2 = mysql_query($strSQL2) or die(mysql_error() . "<br>$strSQL2"); // อย่าลืมแสดง statement ด้วย
//$objResult2 = mysql_fetch_array($objQuery2); ตัดขั้นตอนบันทัดนี้ไป
list($tran_id, $Amount_drug) = mysql_fetch_row($objQuery2); // fetch ค่ามาเป็น array แล้ว นำใสในตัวแปรทันที
$balance = $Amount_drug - $Qty;
if($balance<0){
// ทำตรวจสอบ น้อยกว่าก่อน
//$strSQL4 = mysql_query("update lot set Amount_drug = '0' WHERE DrugID = '$DrugID' AND LotNo = '$LotNo'");
$strSQL4 = mysql_query("update lot set Amount_drug = 0 WHERE trans_id = $tran_id ");
$Qty -= $Amount_drug;
}else{
//$strSQL3 = mysql_query("update lot set Amount_drug = Amount_drug - $Qty WHERE DrugID = '$DrugID' AND LotNo = '$LotNo'");
mysql_query("update lot set Amount_drug = $balance WHERE trans_id = $tran_id ");
$Qty = 0;
}
}
ตัวอย่างข้างบน ยังไม่ใช่ วิธีการที่ดี เพราะแก้จาก โค๊ดที่เขียน แล้ว อธิบายตาม
ลองคิดวาง โค๊ดดูใหม่อย่าให้ทำงานซ้ำซ้อน พยายามทำให้การคิวรี่ น้อยครั้งที่สุด ได้ result พอในการทำครั้งเดียว
ปล. Trans_id คือ LotID ขอโทษทีไม่ได้กลับไปอ่านคำถาม
ประวัติการแก้ไข 2016-03-26 07:55:08 2016-03-26 07:56:50
Date :
2016-03-26 07:41:32
By :
Chaidhanan
ตอบความคิดเห็นที่ : 11 เขียนโดย : Chaidhanan เมื่อวันที่ 2016-03-26 07:41:32
รายละเอียดของการตอบ ::
จากโค้ดการสั่งซื้ออันนี้ครับที่ผมทำ ผมจะเอาโค้ดตัดสต็อกไปวางตรงส่วนไหนอ่ะครับ แล้วอีกอย่าง ค่า qty (จำนวนสินค้าที่สั่ง) เป็น session ด้วยอ่ะครับ
<?
session_start();
$Total = 0;
$SumTotal = 0;
$strSQL = "SELECT * FROM customer WHERE CustomerID = '".$_POST["CustomerID"]."' ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
if($objResult)
{
$strSQL = "UPDATE customer SET Name_cus = '".$_POST["Name_cus"]."', Address = '".$_POST["Address"]."',
Subdistrict = '".$_POST["Subdistrict"]."', District = '".$_POST["District"]."', Province_ID = '".$_POST["Province_ID"]."', Postcode = '".$_POST["Postcode"]."',
Tel_cus = '".$_POST["Tel_cus"]."', Email_cus = '".$_POST["Email_cus"]."' WHERE CustomerID = '".$_GET["CustomerID"]."' ";
$objQuery = mysql_query($strSQL) or die(mysql_error());
}
else
{
$strSQL = "INSERT INTO customer ";
$strSQL .="(CustomerID,Address,Subdistrict,District,Province_ID,Postcode,Tel_cus,Email_cus) ";
$strSQL .="VALUES ";
$strSQL .="('".$_POST["CustomerID"]."','".$_POST["Name_cus"]."','".$_POST["Address"]."','".$_POST["Subdistrict"]."','".$_POST["District"]."','".$_POST["Province_ID"]."','".$_POST["Postcode"]."' ";
$strSQL .=",'".$_POST["Tel_cus"]."','".$_POST["Email_cus"]."')";
$objQuery = mysql_query($strSQL);
}
$CustomerID = $_POST["CustomerID"];
$strSQL = "INSERT INTO orders (OrderDate,CustomerID,Status_order) VALUES
('".date("Y-m-d")."','$CustomerID','0')";
mysql_query($strSQL) or die(mysql_error());
$strOrderID = mysql_insert_id();
for($i=0;$i<=(int)$_SESSION["intLine"];$i++)
{
if($_SESSION["strID_drug"][$i] != "")
{
$strSQL = "INSERT INTO orders_detail (OrderID,OrderDate,ID_drug,Qty) VALUES ('".$strOrderID."','".date("Y-m-d")."','".$_SESSION["strID_drug"][$i]."','".$_SESSION["strQty"][$i]."')";
mysql_query($strSQL) or die(mysql_error());
$strSQL2 = "SELECT g.*, dg.*, l.* FROM drug g, drug_group dg, lot l WHERE ID_drug = '".$_SESSION["strID_drug"][$i]."' AND g.ID_group = dg.ID_group AND g.ID_drug = l.DrugID";
$objQuery2 = mysql_query($strSQL2) or die(mysql_error());
$objResult2 = mysql_fetch_array($objQuery2);
$strSQL3 = "SELECT * FROM shipping ";
$objQuery3 = mysql_query($strSQL3) or die(mysql_error());
$objResult3 = mysql_fetch_array($objQuery3);
$Total = $_SESSION["strQty"][$i] * $objResult["Price_drug2"];
$ShippingCost = $objResult3["ShippingCost"];
$ShippingCost = '0';
$SumTotal = $SumTotal + $Total + $ShippingCost;
$Total2 = $_SESSION["strQty"][$i] * $objResult["Price_drug1"];
$ShippingCost = $objResult3["ShippingCost"];
$ShippingCost = '0';
$SumTotal2 = $SumTotal2 + $Total2 + $ShippingCost;
$strSQL4 = mysql_query("update drug set AmountDrug = AmountDrug - '".$_SESSION["strQty"][$i]."' where ID_drug = '".$_SESSION["strID_drug"][$i]."'");
}
}
echo "<script>alert('ทำรายการสั่งซื้อเสร็จเรียบร้อยเเล้ว')</script>";?>
<script type="text/javascript">
window.location="order.php";
</script>
ประวัติการแก้ไข 2016-03-26 11:13:11
Date :
2016-03-26 11:12:21
By :
kopkap_sitisak
จะวางตรงไหนคงต้องคิดเองแล้วครับ เขียนรายการที่จะทำ ก่อนครับ ทำอะไรอย่างไร เหมือนการเขียน flowchart
เขียนเป็นกราฟรูปภาพไม่เก่ง ก็เขียนเป็นภาษาไทย อธิบายให้เข้าใจว่าจะทำอะไรอย่างไรเมื่อไหร่่
แล้วค่อยใส่โค๊ดจริง การใช้โค๊ดนั้นไม่ยาก แต่วิธีวางโค๊ด ต้องรู้ว่าจะทำอะไรเมื่อไหร่ ซึ่งเป็นงานที่คุณต้องวิเคราะห์เอาเองครับ
Date :
2016-03-26 21:52:25
By :
Chaidhanan
ผมว่าลองทำเองดูไหมครับก่อนที่จะถาม เอาเข้ากับเอาออก มันเหมือนกันมากนะครับ
แค่ + กับ -
Date :
2016-03-27 16:51:32
By :
Chaidhanan
การรับสินค้าคืน ไม่จำเป็นต้องกลับไปอยู่ในtrains_in เรคอร์ดเดิม
คุณสามารถทำให้มันเข้าไปในเรคอร์ดใหม่ได้ แค่มี type บอกว่า เป็นของคืน
และมี notice บอกว่ามาจากเลขที่ใบสำคัญหมายเลยอะไร
พยายามทำให้เหมือนการกรอกเอกสาร เมื่อทำคืนก็จะมีเอกสารคืน
เป็นสินค้าเข้าอย่างหนึ่ง เมื่อของมันออกไปแล้ว เมื่อกลับเข้ามามันไม่ได้วางไว้ที่เดิม
ก็ให้ถือซะว่ามันเป็นสินค้าใหม่ แค่ราคาเก่าเท่านั้นครับ
Date :
2016-03-28 03:48:02
By :
Chaidhanan
แบบนี้ คงต้องทำ การตัดสต๊อค เมื่อ ใบส่งของกลับมาพร้อมการรับเงินแล้วมั้งครับ
กำหนด flow การทำงานให้ดี ก็บอกแล้วว่า โค๊ดมันไม่ได้ยาก
แต่การวาง flow นั้นแหล่ะสำคัญ เขียน flow chart ออกมาดี ก็สบายไป 8 อย่าง
คงต้องศึกษาโครงสร้าง การทำงาน ให้ชัดเจน เพื่อมากำหนด flow control
ทำออกมาเป็น flow chart แล้วถึงค่อยมาเขียนโค๊ดตาม flow chart
เขียนโค๊ดผิดพอช่วยแก้ไขให้ได้ แนะนำการใช้ โค๊ดให้ได้ อาจมีตัวอย่างบ้างไม่เยอะ
แต่ถ้าต้องมากำหนด flow control ให้ด้วย นี่ขอคิดเงินครับ 5555
แหมมันเป็นอาชีพอะนะ จะคิดให้หมด มันเหมือนผูกคอตายยังไงยังงั้นเลย 55555
Date :
2016-03-28 10:00:37
By :
Chaidhanan
Load balance : Server 02