stock control แบบ fifo
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 377   5
URL.หัวข้อ / URL
stock control แบบ fifo

สวัสดีค่ะ  
 คือว่า ใช้ 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 นะคะ)
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.0949s