กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
470 5
URL.หัวข้อ /
URL
stock control แบบ fifo
สวัสดีค่ะ
คือว่า ใช้ access สร้างโปรแกรม stock control ของคลังสินค้าอยู่ค่ะ มีปัญหาว่า ไม่สามารถทำให้
มันตัดสต้อกแบบ fifo ได้ค่ะ ลองเข้าไปอ่านข้อความที่อาจารย์ตอบไว้ แล้วload มาดู ก็ไม่ค่อยเข้าใจค่ะ
(เขียนprogram vb ใน module ไม่เป็นค่ะ) เลยอยากจะขอ source ของอาจารย์น่ะค่ะ เพราะต้องการให้มันตัดสต้อกแบบ เข้าก่อน ออกก่อน แล้วเอาไปคูณกับจำนวนเงินของที่เข้าก่อนน่ะค่ะ เหมือนของคุณ Bishop แต่อ่านดูแล้วไม่เข้าใจค่ะ ช่วยหน่อยนะคะ
ขอบคุณค่ะ
คือว่า ใช้ access สร้างโปรแกรม stock control ของคลังสินค้าอยู่ค่ะ มีปัญหาว่า ไม่สามารถทำให้
มันตัดสต้อกแบบ fifo ได้ค่ะ ลองเข้าไปอ่านข้อความที่อาจารย์ตอบไว้ แล้วload มาดู ก็ไม่ค่อยเข้าใจค่ะ
(เขียนprogram vb ใน module ไม่เป็นค่ะ) เลยอยากจะขอ source ของอาจารย์น่ะค่ะ เพราะต้องการให้มันตัดสต้อกแบบ เข้าก่อน ออกก่อน แล้วเอาไปคูณกับจำนวนเงินของที่เข้าก่อนน่ะค่ะ เหมือนของคุณ Bishop แต่อ่านดูแล้วไม่เข้าใจค่ะ ช่วยหน่อยนะคะ
ขอบคุณค่ะ
5 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00459
ไม่ทราบว่าทำถึงไหนแล้วครับ
ถ้าสามารถส่งไฟล์มาให้ผมดูต่อให้ ก็จะสะดวก และจะเร็วขึ้นครับ
ถ้าเป็นไฟล์ที่มีขนาดไม่ใหญ่จนเกินไป ให้ทำการ compact ไฟล์ แล้ว zip จากนั้นก็ส่งมาให้ผมที่
kaeg_chaiya@hotmail.com'>
kaeg_chaiya@hotmail.com ครับ โดยระบุปัญหามาด้วยครับ
2 @R00462
ลองเอาตัวอย่างเดิมไปดูใหม่นะครับ ผมได้อธิบายโค้ดแต่ส่วนไว้ค่อนข้างมาก
และได้เพิ่มให้มีปุ่ม Reset เพื่อจะได้ลองได้หลายๆ รอบตามต้องการครับ
สำหรับท่านที่ได้ d/l ตัวเดิมไปแล้ว ให้เอาไปดูใหม่นะครับที่เดิม ที่ http://agserver.kku.ac.th/basiceng/FIFO.zip
ถ้าไม่เข้าใจตรงไหนให้แจ้งมาได้ครับ ผมจะอธิบายเพิ่มเติมให้
โค้ดที่ผมแก้ไขให้มีดังนี้ครับ
Private Sub cmdReset_Click()
Dim dbs As Database
Set dbs = CurrentDb
' ปรับฟีลด์ Balance ให้เป็น 0 ให้หมด
dbs.Execute "UPDATE Table1 SET Table1.Balance = 0 " _
& "WHERE Table1.Balance>0;"
' ลบข้อมูลในตาราง Table3
dbs.Execute "Delete * From Table3;"
dbs.Close
Set dbs = Nothing
Me.Requery
Me.Table1.Requery
End Sub
Private Sub cmdSubmit_Click()
Dim dbs As Database, rst1 As Recordset, rst2 As Recordset, rst3 As Recordset
Dim qdf As QueryDef
Dim I As Integer, J As Integer, MyQTY As Integer, MyQTY1 As Integer
Dim dblTotalCost As Double
Set dbs = CurrentDb
' เปิด Query ชื่อ Query1 ซึ่งสร้างไว้แล้ว และเป็นแบบ Parameter เพื่อกรองเอาเฉพาะข้อมูลตาม
' StockID ที่ต้องการเท่านั้น
Set qdf = dbs.QueryDefs("Query1")
' ส่งค่า StockID ที่อยู่ในฟอร์ม ไปให้ Query1
' เช่น ถ้า StockID = 1 ก็จะได้
' StockID InDate QTY UnitCost Balance
' 1 1/7/2002 10 10 0
' 1 3/7/2002 5 9 0
qdf.Parameters!MyStock = Me.StockID
' ส่งค่าจำนวนที่สั่งซื้อให้ MyQTY เพื่อใช้ในการตัดออกจาก Stock
' ลองใส่ QTY ให้เป็น 5 แล้วครั้งต่อไปให้ลองเปลี่ยนเป็น 12 ดู
MyQTY = Me.QTY
' เปิด Query1 ซึ่งตอนนี้อยู่ในรูปของ Recordset ชื่อ rst2 แล้ว
Set rst2 = qdf.OpenRecordset
' ปรับค่าที่จะเก็บราคารวมของสินค้า
' ผมให้ dblTotalCost เป็นราคาของสินค้ารวม
dblTotalCost = 0
' ตรวจดูว่ามีข้อมูลอยู่ใน rst2 หรือไม่
If Not rst2.EOF Then
' Refresh เพื่อให้ RecordCount มีความถูกต้อง
rst2.MoveLast
rst2.MoveFirst
' ให้วิ่งตั้งแต่ข้อมูลแรกไปจนถึงข้อมูลสุดท้าย
' จากตัวอย่างข้างต้น ก็จะได้ RecordCount = 2
For J = 1 To rst2.RecordCount
' ตรวจดูว่าจำนวนที่สั่งซื้อจะต้องใช้ Stock ถึง 2 รายการหรือไม่
' ถ้าครั้งนี้ใส่ QTY = 5 การใช้ If เงื่อนไขแรกข้างล่างนี้จะได้ค่าเป็น False
' เพราะ 5 ไม่ได้มากกว่า (>) 10 - 0
' แต่ถ้า QTY เป็น 12 การใช้ If เงื่อนไขแรก ก็จะจริง (True)
If MyQTY > rst2("QTY") - rst2("Balance") Then
' จากนั้นให้ส่งค่าให้ MyQTY1 ต่อ ด้วยสูตรข้างล่าง
' ฉะนั้นถ้า QTY เป็น 12 ก็จะทำให้ MyQTY1 = 10-0 หรือ 10 นั่นเอง
MyQTY1 = rst2("QTY") - rst2("Balance")
' แล้วให้ส่งค่าราคาสินค้ารวม คือ dblTotalCost
' ซึ่งถ้าวนรอบแรก จะได้ค่าเป็น 0 จึงได้ผลลัพธ์ดังนี้
' ราคาสินค้ารวม = 0 + (10 x 10) ซึ่ง 10 ตัวหลังคือ ราคาสินค้า lot แรก
' ตอนนี้ dblTotalCost จะเท่ากับ 100
dblTotalCost = dblTotalCost + (MyQTY1 * rst2("UnitCost"))
Debug.Print MyQTY1 * rst2("UnitCost")
' ปรับฟีลด์ Balace ให้ หรือจำนวนสินค้าที่ถูกตัด Stock ออกไป
' จะได้ค่าเป็น 10 หรือจำนวนสินค้านี้ lot วันที่ 1/7/2002 หมดแล้ว
rst2.Edit
rst2("Balance") = rst2("QTY")
rst2.Update
' ปรับค่า MyQTY ให้เป็นปัจจุบัน
' จะได้ = 12 - 10 ก็จะได้ MyQTY = 2
MyQTY = MyQTY - MyQTY1
' เลื่อนไปยังข้อมูลถัดไป
rst2.MoveNext
' เมื่อมาถึงจุดนี้แล้ว โปรแกรมจะวนไปยังบันทัด Next J ซึ่งอยู่ข้างล่าง
' แล้วจึงวิ่งไปยังบัดทัด For ข้างบนใหม่ โดยส่งค่า MyQTY = 2
' จึงทำให้มันกระโดนมายังบันทัด Else ข้างล่างนี้
' เพราะว่า MyQTY ซึ่งมีค่าเป็น 2 ผิดเงื่อนไขตัวแรก
Else
' ปรับจำนวนสินค้าที่ขายไปใน lot ที่ 2 นี้อีก 2
rst2.Edit
rst2("Balance") = rst2("Balance") + MyQTY
rst2.Update
' ปรับค่าราคาสินค้ารวมใหม่ จะได้
' ราคาสินค้ารวมใหม่ (dblTotalCost) = 100 + (2 * 9)
' ฉะนั้นจะได้ dblTotalCost = 118
dblTotalCost = dblTotalCost + (MyQTY * rst2("UnitCost"))
Debug.Print MyQTY * rst2("UnitCost")
' ถ้ามาถึงบันทัดนี้ ก็แสดงว่ามีการตัดสต๊อกเรียบร้อยแล้ว
' ให้ออกจากการวนลูปได้ โดยกระโดดข้ามไปยังบันทัด ShowUnitCost ข้างล่าง
GoTo ShowUnitCost
End If
Next J
' ถ้าไม่มีสินค้าในสต๊อกให้แจ้งเป็น Message Box
Else
MsgBox "ไม่มีสินค้าในสต๊อก", vbOKOnly, "Sorry!."
End If
ShowUnitCost:
' บังคับให้มีการ Save ข้อมูลการขายสินค้าก่อน ถึงจะทำการข้างล่างได้
DoCmd.RunCommand acCmdSaveRecord
' เปิดตาราง Table2 โดยเลือกเอาเฉพาะรายการสินค้าที่กำลังทำการอยู่
' ถ้าในการสร้างฐานข้อมูลจริง
' จะต้องมีการเพิ่มฟีลด์ในตารางนี้อีกตารางหนึ่ง โดยให้เป็น Primary Key ด้วย
' เพราะลูกค้า 1 คน สามารถมาซื้อสินค้าตัวเดิมได้หลายๆ ครั้ง
Set rst3 = dbs.OpenRecordset("Select UnitCost From Table3 Where CustID='" & Me.CustID & "' And " _
& "StockID='" & Me.StockID & "'")
' ตรวจดูว่ามีข้อมูลหรือไม่ ซึ่งจะต้องมี 1 รายการอยู่แล้ว ซึ่งจะได้ข้อมูลดังนี้
' CustID StockID QTY UnitCost
' D001 1 12 0
If Not rst3.EOF Then
' จากนั้นเข้าไปเขียนค่า UnitCost ลงไป
' โดยได้จากหาร 118 ด้วย 12 ก็จะได้ค่าเป็น 9.8333333333
' ดังนี้
' CustID StockID QTY UnitCost
' D001 1 12 9.83333333333333
rst3.Edit
rst3("UnitCost") = dblTotalCost / Me.QTY
rst3.Update
End If
' บังคับให้มีการ Refresh หน้าจอ เพื่อให้ค่า 9.8333333 มาแสดงในช่อง Unit Cost
Me.txtUnitCost.Requery
' บังคับให้มีการ Refresh หน้าจอ เพื่อแสดงค่าในตาราง Table1 ซึ่งเป็นตารางเก็บ Stock
Me.Table1.Requery
' ปิด Object ต่างที่เปิดไว้ เพื่อคลายความจำให้เครื่องคอมฯ
rst3.Close
Set rst3 = Nothing
qdf.Close
rst2.Close
dbs.Close
Set qdf = Nothing
Set rst2 = Nothing
Set dbs = Nothing
End Sub
' บันทัดข้างล่างนี้ จะใช้ตรวจดูว่าสินค้าที่จะขาย มีปริมาณในสต๊อกเพียงพอหรือไม่
' โดยใช้ DSum มาช่วย
Private Sub QTY_AfterUpdate()
Dim intQTY As Integer
intQTY = Nz(DSum("[QTY]-[Balance]", "Table1", "[StockID]='" & Me.StockID & "'"), 0)
If intQTY < Me.QTY Then
MsgBox "ไม่มีสินค้าเพียงพอ", vbOKOnly, intQTY
End If
End Sub
3 @R00475
ผมได้รับ db แล้วครับ เดี๋ยวผมดูให้นะ
4 @R00497
คำอธิบายที่เขียนไป อ่านแล้วงงรึป่าวคะ
5 @R00532
อาจารย์สุภาพคะ
พอดีไปเจอโปรแกรมควบคุมสินค้าตัดสตอ้กแบบ fifo บนเน็ตน่ะคะ เป็นโปรแกรมร้านเครื่องเขียน
น่าสนใจมากค่ะ ลองเอามาเปิดดู ก็ปรากฎว่าเป็น mde file ค่ะ เลยนำมาประยุกต์ แก้ไข ให้ตรงกับการ
ใช้งานไม่ได้น่ะค่ะ db ทำเองที่ส่งไปให้ อยากจะให้ออกมาเป็นลักษณะนี้คล้ายๆแบบนี้น่ะค่ะ ไม่ต้องอัตโนมัติแบบนี้ก็ได้ค่ะ จะได้แก้ไขง่ายๆ จะต้องทำยังไงดีคะ (ส่ง db ให้ทาง hotmail นะคะ)
Time: 0.1177s