กระทู้เก่าบอร์ด อ.Yeadram
1,289 6
URL.หัวข้อ /
URL
สอบถาม - ระบบการนับสต๊อกแบบ transection
สวัสดีครับ
สอบถามครับ ผมลองทำระบบการนับสต๊อกแบบ transection (เอามาจาก northwind) อยากจะขอคำแนะนำครับ
โครงสร้างเบื้องต้น
ใน transection ของผมจะเก็บ
transection_type มี สินค้าเข้า / สินค้าออก
product_id เป็นรหัสสินค้า
Quantity เป็นจำนวนสินค้าที่เข้า หรือออก
เวลาจะเอาสินค้าเข้าคลัง
ก็เปิดฟอร์ม transection แล้วเพิ่ม สินค้า / ชนิด (เข้าหรือออก) / จำนวนสินค้า
โดยที่ transection ชนิด [สินค้าออก] จะสร้างอัตโนมัติเมื่อเปิด order โดย order จะมี order_detail ซึ่งจะเก็บรหัสสินค้า และจำนวนสินค้า ที่ซื้อ
ปัญหาคือ ผมจะเอา รหัสสินค้าและจำนวนจาก order_detail โดย order id = ฟอร์มที่เปิดอยู่ มาเปรียบเทียบกับ กับ สินค้าที่เหลืออยู่ได้อย่างไร
ที่ผมคิดคือ สามารถ "select [product_id],[Quantity] from [order_detail] where order_id=" (อ้างอิงฟอร์มที่เปิด)
แต่ผมไม่รู้ว่าจะเอาค่าจากการ query ด้านบนมาใช้ได้อย่างไร มันต้องมีการวนลูป ? และเช็คกับ sum ของ [Quantity] ในตาราง [transection]
ผมพยายามทำระบบตาม Northwind แต่โค้ดของอันนี้ ซับซ้อนมากครับสำหรับผม มึนตึบเลยครับ
ผมลองศึกษาโพสเก่าอย่าง Topic 586 ซึ่งผมคิดว่าตรงนี้น่าจะเป็นส่วนของการออกรายงาน มันยังไม่ตรงที่ต้องการมากนัก (แต่คงต้องใช้ในอนาคต)
ท่านใดพอจะแนะนำแนวทางได้บ้างครับ ขอบคุณครับ
สอบถามครับ ผมลองทำระบบการนับสต๊อกแบบ transection (เอามาจาก northwind) อยากจะขอคำแนะนำครับ
โครงสร้างเบื้องต้น
ใน transection ของผมจะเก็บ
transection_type มี สินค้าเข้า / สินค้าออก
product_id เป็นรหัสสินค้า
Quantity เป็นจำนวนสินค้าที่เข้า หรือออก
เวลาจะเอาสินค้าเข้าคลัง
ก็เปิดฟอร์ม transection แล้วเพิ่ม สินค้า / ชนิด (เข้าหรือออก) / จำนวนสินค้า
โดยที่ transection ชนิด [สินค้าออก] จะสร้างอัตโนมัติเมื่อเปิด order โดย order จะมี order_detail ซึ่งจะเก็บรหัสสินค้า และจำนวนสินค้า ที่ซื้อ
ปัญหาคือ ผมจะเอา รหัสสินค้าและจำนวนจาก order_detail โดย order id = ฟอร์มที่เปิดอยู่ มาเปรียบเทียบกับ กับ สินค้าที่เหลืออยู่ได้อย่างไร
ที่ผมคิดคือ สามารถ "select [product_id],[Quantity] from [order_detail] where order_id=" (อ้างอิงฟอร์มที่เปิด)
แต่ผมไม่รู้ว่าจะเอาค่าจากการ query ด้านบนมาใช้ได้อย่างไร มันต้องมีการวนลูป ? และเช็คกับ sum ของ [Quantity] ในตาราง [transection]
ผมพยายามทำระบบตาม Northwind แต่โค้ดของอันนี้ ซับซ้อนมากครับสำหรับผม มึนตึบเลยครับ
ผมลองศึกษาโพสเก่าอย่าง Topic 586 ซึ่งผมคิดว่าตรงนี้น่าจะเป็นส่วนของการออกรายงาน มันยังไม่ตรงที่ต้องการมากนัก (แต่คงต้องใช้ในอนาคต)
ท่านใดพอจะแนะนำแนวทางได้บ้างครับ ขอบคุณครับ
6 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R24127
ขอบคุณมากเลยครับอาจารย์ yeadram
รบกวนสอบถามเพิ่มเติม
ภาพ Query ที่ 1 และ ผลลัพธ์
ภาพ Query ที่ 2 และ ผลลัพธ์ โดยผม filter เอาเฉพาะ Order ID 3449
จาก query ที่ 2 เมื่อผม filter Order id 3449 ซึ่งมีสินค้าอยู่ 2 ชิ้น คือ
Product id = 1 เหลือสินค้า 9
Product id = 2 เหลือสินค้า 50
ทั้งหมดนี้ ถูกต้องใช่มั้ยครับ
สมมตนะครับว่า
order id 3449
ขายสินค้ารายการที่ 1 = [product id = 1] จำนวน 1 ชิ้น / เช็คสต๊อกแล้ว เหลือ 9 ชิ้น
ขายสินค้ารายการที่ 2 = [product id = 2] จำนวน 1 ชิ้น / เช็คสต๊อกแล้ว เหลือ 50 ชิ้น
ความต้องการ :
ผมต้องเช็คว่า order=3449/product_id=1/มี qty > product stock ของสินค้า 1 หรือไม่
และต้องวนลูปเช็ค order=3449/product_id=2/มี qty > product stock ของสินค้า 2 หรือไม่
ในทางการเขียนโปรแกรม
ผมมติว่าผมดึงค่าแบบนี้
ผลลัพธ์คือ ผมไม่สามารถเอาค่า Product_Stock ไปใช้ตรวจสอบจำนวนสินค้าที่ซื้อตาม order ได้เลย ไม่รู้จะวนลูปค่า Product_Stock
ผมจะเช็คได้อย่างไรครับ
ขอบคุณครับ
รบกวนสอบถามเพิ่มเติม
ภาพ Query ที่ 1 และ ผลลัพธ์
ภาพ Query ที่ 2 และ ผลลัพธ์ โดยผม filter เอาเฉพาะ Order ID 3449
จาก query ที่ 2 เมื่อผม filter Order id 3449 ซึ่งมีสินค้าอยู่ 2 ชิ้น คือ
Product id = 1 เหลือสินค้า 9
Product id = 2 เหลือสินค้า 50
ทั้งหมดนี้ ถูกต้องใช่มั้ยครับ
สมมตนะครับว่า
order id 3449
ขายสินค้ารายการที่ 1 = [product id = 1] จำนวน 1 ชิ้น / เช็คสต๊อกแล้ว เหลือ 9 ชิ้น
ขายสินค้ารายการที่ 2 = [product id = 2] จำนวน 1 ชิ้น / เช็คสต๊อกแล้ว เหลือ 50 ชิ้น
ความต้องการ :
ผมต้องเช็คว่า order=3449/product_id=1/มี qty > product stock ของสินค้า 1 หรือไม่
และต้องวนลูปเช็ค order=3449/product_id=2/มี qty > product stock ของสินค้า 2 หรือไม่
ในทางการเขียนโปรแกรม
ผมมติว่าผมดึงค่าแบบนี้
Dim rstData As DAO.Recordset
Dim Product_Stock As Variant
Set rstData = CurrentDb.OpenRecordset("SELECT ...จากคิวรี่ที่ 2 " + "Order_ID = ฟอร์มปัจจุบัน" )
Product_Stock = rstData.GetRows(rstData.RecordCount)
ผลลัพธ์คือ ผมไม่สามารถเอาค่า Product_Stock ไปใช้ตรวจสอบจำนวนสินค้าที่ซื้อตาม order ได้เลย ไม่รู้จะวนลูปค่า Product_Stock
ผมจะเช็คได้อย่างไรครับ
ขอบคุณครับ
3 @R24142
ไปดักจับที่ เหตุการณ์การคีย์ข้อมูลดีกว่าไหมครับ
เช่น ในหน้าจอการคีย์ใบสั่ง
เมื่อมีการคีย์รหัสสินค้า และจำนวนสินค้า
ให้ เอา statement ของคิวรี่1 มาใส่เงื่อนไขรหัสสินค้า เพื่อหาจำนวนสต็อกคงเหลือ
แล้วทำการเทียบข้อมูล ณ ตอนนั้นเลย
แบบนี้ มันก็จะเช็คเป็นรายสินค้าไป ขณะป้อนข้อมูลเลย ไม่จำเป็นต้องวนลูปเช็คอีก
เช่น ในหน้าจอการคีย์ใบสั่ง
เมื่อมีการคีย์รหัสสินค้า และจำนวนสินค้า
ให้ เอา statement ของคิวรี่1 มาใส่เงื่อนไขรหัสสินค้า เพื่อหาจำนวนสต็อกคงเหลือ
แล้วทำการเทียบข้อมูล ณ ตอนนั้นเลย
แบบนี้ มันก็จะเช็คเป็นรายสินค้าไป ขณะป้อนข้อมูลเลย ไม่จำเป็นต้องวนลูปเช็คอีก
Sql = "select sum(iif(Transaction_Type=เข้า,Quantity*1,Quantity*-1)) as stock from Transaction WHERE Product_ID = " & รหัสที่ผู้ใช้เพิ่งจะคีย์เข้ามา
Set rstData = CurrentDb.OpenRecordset(Sql)
Product_Stock = rstData(0)
if Product_Stock > จำนวนที่ผู้ใช้เพิ่งกรอกเข้ามา then
...
else
...
end if
4 @R24143
แต่ถ้าสถานการณ์ของคุณไม่เป็น แบบนี้
ต้องการอยากได้ statement เป็นคิวรี่ที่ 2 จริง
ในคิวรี่ที่ 2 ที่คุณเอารูปมาให้ดูนั่นแหละครับ ประยุกต์เพิ่มฟิลด์เข้าไปครับ
- ถ้าอยากได้จำนวนว่ามันต่างกันเท่าไร
เพิ่มฟิลด์ stkBalance: Product_Stock_Left - OD_Quantity
- แต่ถ้าอยากได้แค่ค่า Boolean ว่า เกินหรือไม่ (ตอบเพียง yes/no)
ก็อาจเพิ่มฟิลด์เป็น IsStockOver: iif(OD_Quantity>Product_Stock_Left,-1,0)
ต้องการอยากได้ statement เป็นคิวรี่ที่ 2 จริง
ในคิวรี่ที่ 2 ที่คุณเอารูปมาให้ดูนั่นแหละครับ ประยุกต์เพิ่มฟิลด์เข้าไปครับ
- ถ้าอยากได้จำนวนว่ามันต่างกันเท่าไร
เพิ่มฟิลด์ stkBalance: Product_Stock_Left - OD_Quantity
- แต่ถ้าอยากได้แค่ค่า Boolean ว่า เกินหรือไม่ (ตอบเพียง yes/no)
ก็อาจเพิ่มฟิลด์เป็น IsStockOver: iif(OD_Quantity>Product_Stock_Left,-1,0)
5 @R24163
ในส่วนนี้ ผ่านเรียบร้อยครับ
ผมใช้วิธี dlookup จำนวนใน query ที่ 1 ที่คุณ yeadram แนะนำ
ในเหตุการณ์ AfterUpdate แล้วเทียบจำนวน ถ้าใส่เกิน ให้ใส่ใหม่ไปเลย
ขอบคุณมากครับ
ในส่วนนี้ ผ่านเรียบร้อยครับ
ผมใช้วิธี dlookup จำนวนใน query ที่ 1 ที่คุณ yeadram แนะนำ
ในเหตุการณ์ AfterUpdate แล้วเทียบจำนวน ถ้าใส่เกิน ให้ใส่ใหม่ไปเลย
ขอบคุณมากครับ
6 @R24164
ตัวอย่างใน northwind ทำไว้เยอะมากดูแล้ว งง ได้เลยนะครับ
ผมทำคลิปไว้ ไม่รู้ว่าพอช่วยได้หรือป่าวลองดูนะครับ พยามทำแบบง่ายที่สุดแล้วคิดได้ประมาณนี้:
https://youtu.be/izIG1u1D-GM?t=33m20s
ผมทำคลิปไว้ ไม่รู้ว่าพอช่วยได้หรือป่าวลองดูนะครับ พยามทำแบบง่ายที่สุดแล้วคิดได้ประมาณนี้:
https://youtu.be/izIG1u1D-GM?t=33m20s
Time: 0.3530s
select Product_ID, sum(iif(Transaction_Type=เข้า,Quantity*1,Quantity*-1)) as stock from Transaction GROUP BY Product_ID;
คิวรี่ตัวที่2
เชื่อมตารางตามรูปข้างบน แต่
- ให้เอาตาราง Transaction ออก
- เอาคิวรี่ตัวที่ 1 มาแทน
- ในคิวรี่ตัวที่ 1 ให้เชื่อมกับตาราง Order_Detail ด้วยฟิลด์ Product_ID
- ลากฟิลด์ Stock (จากคิวรี่ตัวที่1) ลงมาแสดงด้วย
1. ลองแสดงผลดูครับ (อย่าเพิ่งใส่เงื่อนไข)
2. ถ้ามันมียอดคงเหลือมาให้เห็นแล้ว ค่อยไป Copy เอา SQL Statement ของคิวรี่ตัวที่ 2 มาใช้ครับ เอามาแทน Statement ตัวที่คุณเขียนนั่นแหละครับ เอาไปใช้ตรงไหน event ไหนก็ตามถนัดเลยครับ (แต่ว่ามันจะมียอด หรือมีรายการก็ต่อเมื่อมีการคีย์รหัสสินค้าลงในฟอร์ม Order แล้วเท่านั้นนะครับ ถ้ายังไม่มีการคีย์สินค้าลงในฟอร์ม statement ตัวนี้จะคิวรี่รายการใดๆ ออกมาไม่ได้เลย) เมื่อตอนเอาไปใช้ ก็ค่อยใส่เงื่อนไขให้มันครับ
where order_id=" (อ้างอิงฟอร์มที่เปิด)