Access : จุดเริ่มต้นที่ง่ายที่สุดสำหรับการเรียนรู้ ระบบฐานข้อมูล
Access : จุดเริ่มต้นที่ง่ายที่สุดสำหรับการเรียนรู้ การเขียนโปรแกรม
Access : เป็นได้ทั้งตัวเก็บฐานข้อมูล และตัวจัดการฐานข้อมูล
Thai Access : บอร์ดเสริมการเรียนรู้ Access ด้วยภาษาไทย

น้อมรำลึกในพระมหากรุณาธิคุณอันหาที่สุดมิได้ พระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดชฯ พระผู้เสด็จสู่สวรรคาลัย

Back to Board : Thai Access Webboard New Topic    Reply
สอบถาม - ระบบการนับสต๊อกแบบ transection

Topic by Message Posted : on : 23/9/2560 17:59:27
Kiang  สวัสดีครับ
สอบถามครับ ผมลองทำระบบการนับสต๊อกแบบ 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

Reply by Message on : 23/9/2560 20:46:29
yeadram
(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=" (อ้างอิงฟอร์มที่เปิด)








Back to Top
Reply by Message on : 25/9/2560 10:27:53
Kiang
(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

ผมจะเช็คได้อย่างไรครับ

ขอบคุณครับ
Back to Top
Reply by Message on : 26/9/2560 19:08:43
yeadram
(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

Back to Top
Reply by Message on : 26/9/2560 19:24:40
yeadram
(R24143)
แต่ถ้าสถานการณ์ของคุณไม่เป็น แบบนี้
ต้องการอยากได้ statement เป็นคิวรี่ที่ 2 จริง
ในคิวรี่ที่ 2 ที่คุณเอารูปมาให้ดูนั่นแหละครับ ประยุกต์เพิ่มฟิลด์เข้าไปครับ
- ถ้าอยากได้จำนวนว่ามันต่างกันเท่าไร
เพิ่มฟิลด์ stkBalance: Product_Stock_Left - OD_Quantity
- แต่ถ้าอยากได้แค่ค่า Boolean ว่า เกินหรือไม่ (ตอบเพียง yes/no)
ก็อาจเพิ่มฟิลด์เป็น IsStockOver: iif(OD_Quantity>Product_Stock_Left,-1,0)


Back to Top
Reply by Message on : 30/9/2560 11:02:16
Kiang
(R24163)

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

ขอบคุณมากครับ
Back to Top
Reply by Message on : 30/9/2560 11:44:27
TTT
(R24164)
ตัวอย่างใน northwind ทำไว้เยอะมากดูแล้ว งง ได้เลยนะครับ
ผมทำคลิปไว้ ไม่รู้ว่าพอช่วยได้หรือป่าวลองดูนะครับ พยามทำแบบง่ายที่สุดแล้วคิดได้ประมาณนี้:

https://youtu.be/izIG1u1D-GM?t=33m20s
Back to Top

Reply

 *Indicates required fields
Format:
Bold Under Line Italic Add Hyperlink Add Email Link Italic List Indent Add Image Emoticons Insert code Mode:
Message:*
Your Name*:
Normal word*: Please input : ไทยแอ็คเซส
+++ webboard source: ASPThai.Net Webboard 6.0 webbord +++++++ admin : yeadram +++