สอบถาม - ระบบการนับสต๊อกแบบ transection
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย

 1,047   6 สอบถาม - ระบบการนับสต๊อกแบบ 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 ซึ่งผมคิดว่าตรงนี้น่าจะเป็นส่วนของการออกรายงาน มันยังไม่ตรงที่ต้องการมากนัก (แต่คงต้องใช้ในอนาคต)

ท่านใดพอจะแนะนำแนวทางได้บ้างครับ ขอบคุณครับ

6 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R24121
คิวรี่ตัวที่1 หาสินค้าคงเหลือของแต่ละสินค้า
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=" (อ้างอิงฟอร์มที่เปิด)







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 หรือไม่

ในทางการเขียนโปรแกรม
ผมมติว่าผมดึงค่าแบบนี้
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 มาใส่เงื่อนไขรหัสสินค้า เพื่อหาจำนวนสต็อกคงเหลือ
แล้วทำการเทียบข้อมูล ณ ตอนนั้นเลย
แบบนี้ มันก็จะเช็คเป็นรายสินค้าไป ขณะป้อนข้อมูลเลย ไม่จำเป็นต้องวนลูปเช็คอีก


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)

5 @R24163

ในส่วนนี้ ผ่านเรียบร้อยครับ
ผมใช้วิธี dlookup จำนวนใน query ที่ 1 ที่คุณ yeadram แนะนำ
ในเหตุการณ์ AfterUpdate แล้วเทียบจำนวน ถ้าใส่เกิน ให้ใส่ใหม่ไปเลย

ขอบคุณมากครับ
6 @R24164
ตัวอย่างใน northwind ทำไว้เยอะมากดูแล้ว งง ได้เลยนะครับ
ผมทำคลิปไว้ ไม่รู้ว่าพอช่วยได้หรือป่าวลองดูนะครับ พยามทำแบบง่ายที่สุดแล้วคิดได้ประมาณนี้:

https://youtu.be/izIG1u1D-GM?t=33m20s
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.9843s