... เรียนอาจาย์สุภาพครับ สืบเนื่องจากกระทู้1045 มันยังไม่ได้น่ะครับ อาจารย์ช่วยเข้ามาดูอีกที ...
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 305   5
URL.หัวข้อ / URL
... เรียนอาจาย์สุภาพครับ สืบเนื่องจากกระทู้1045 มันยังไม่ได้น่ะครับ อาจารย์ช่วยเข้ามาดูอีกที ...

คือ ที่ผมเขียน code แล้วมีการวนลูปและมีการใช้ตัวแปรนั้น หากว่าในตารางสินค้า ( merchandise ) นั้นมีสินค้าคงเหลือ อยู่น้อย(ในความเป็นจริงต้องเป็นเช่นนั้นอยุ่แล้ว เพราะว่าว่าสินค้าก็ต้องถูกขายออกไปเรื่อยๆ) แต่ที่ผมยกตัวอย่างลงในฐานข้อมูล ที่ผมส่งให้อาจารดูนั้น คือยังไม่มีการขายสินค้าเลย ดังนั้นสินค้าคงเหลือที่อยู่ใน stock นั้นก็ยังอยู่ครบ อยู่ครบตามจำนวนที่ซื้อเข้ามา(จำนวนซื้อเข้าของสินค้านั้นๆ ในตาราง buy ของแต่ละรอบ รวมกันแล้ว ก็จะได้เท่ากับจำนวนสินค้าคงเหลือ เพราะยังไม่มีการขายสินค้าออกไปเลย) ดังนั้นพอเมื่อถึงเหตการจริง ก็ต้องมีการขายสินค้าออกไปใช่ปาวครับ ดังนั้นสินค้าคงเหลือใน stock ก็จะมีค่าน้อยกว่า จำนวนที่ซือ้เข้ามาแล้ว query ที่อาจารทำมาให้จึงใช้ไม่ได้น่ะครับ แล้วเมื่อมีการขายสินค้าออก ไป เวลาจะคิดต้นทุนจากสินค้าคงเหลือ ก็จะใช้หลัก LIFO คือจะคิดราคาต้นทุนจากสินค้าที่ซื้อเข้ามาวันหลังสุดก่อน จึงต้องมีการเขียน code วนลูป และใช้ตัวแปรกเก็บอ่ะครับ

เรียนอาจารย์ช่วยดูให้อีกทีนึงนะครับ ว่าจะแก้ยังไงต่อดี

ขอบคุณมากครับ ที่ให้ความช่วยเหลือตลอดมา ...

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

1 @R02359
ลองยกตัวอย่างสักรายการหนึ่งครับ
ว่าถ้าซื้อออกไป 5 ชิ้น แล้ว ราคาสินค้าคงเหลือ ควรจะเป็นเท่าไร
โดยระบุวิธีคิดด้วย เช่น
2 ชิ้น * 50 บาท = 100.-
10 ชิ้น * 45 บาท = 450.-
ราคาคงเหลือ ควรเป็น xxx

อะไรทำนองนี้ครับ
2 @R02362
ก็สมมติว่า ซื้อสินค้าเข้ามา 3 รอบใช่ปะครับ (ตาราง buy นะ)
รหัส จำนวนที่ซื้อเข้ามา ราคาต่อหน่วยที่ซื้อเข้ามา วันที่ซื้อ
00001 100 10 1/1/2545
00001 80 8 1/2/2545
00001 50 5 1/3/2545

เสร็จแล้ว สินค้าใน stock ก็จะเป็ฯ(ตาราง merchandise)
รหัส จำนวนสินค้าคงเหลือ
00001 230(คิดจากจำนวนสินค้าชนิดนี้รวมกัน 3 รอบ)

แล้วพอมีการขายสินค้าออกไป สมมติว่าพอสินปี ได้ทำการขายสินค้าออกไปทั้งหมด 150 ชิ้น ดังนั้นจะยังมีสินค้าคงเหลือใน stock อยู่ 80 ชิ้น (จำนวนสินค้าคงเหลือในตาราง merchandise ก็จะเท่ากับ 80 )

และทีนี้มาถึงวิธีการคิดราคาต้นทุนจากสินค้าคงเหลือ เพื่อที่จะมาทำรายงาน จะคิดแบบวิธี LIFO คือจะคิดจากสินค้าที่ซื้อเข้ามาหลังสุดก่อน แล้วย้อนขึ้นไป
ก็จะคิดดังนี้คือ

สินค้าคงเหลือใน stock เหลืออยู่ 80 ชิ้นใช่ป่าวครับ ก็จะทำการเข้าไปดูสินค้าที่ซื้อเข้ามาหลังสุดก่อนเลย คือสินค้าที่ซื้อเข้ามาในวันที่ 1/3/2545 ซึ่งซือ้เข้ามา 50 ชิ้นราคาต่อหน่วย 5 บาท
ทีนี้ก็จะคิดราคาต้นทุนเก็บไว้ก่อนคือ 50 * 5 = 250 บาท ใช่ปะครับ

แต่ว่าทีนี้สินค้าคงเหลือมันเหลืออยู่ 80 ชิ้น แต่เมื่อกี้คิดไปแค่ 50 ชิ้น
ที่นี้ก็ต้องไล่วันที่ขึ้นไปอีก
ทีนี้ต่อไปเป็นสินค้าที่ซื้อเข้ามาในวันที่ 1/2/2545
ซึ่งซื้อเข้ามา 80 ชิ้น ราคาต่อหน่วยคือ 8 บาท
แต่ว่าเมือ่กี้เราคิดราคาต้นทุนจากสินค้าคงเหลือไปแล้วจำนวน 50 ชิ้น ก็ต้องคิดราคาต้นทุนต่ออีกแค่ 30 ชิ้น ดังนั้น เราก็จะคำนวนจากการซื้อรอบนี้ โดยคิดสินค้าแค่ 30 ชิ้น
ก็จะเป็น 30 * 8 = 240 บาท

แล้วก็เอาที่คิดจากรอบที่แล้วมารวมกับรอบนี้จะเป็น 250 + 240 = 490 บาท (นี่แหละคือเหตุผลที่ต้องใช้ตัวแปรคอยเก็บ)

ดังนั้นราคาต้นทุนทั้งหมดจากสินค้าคงเหลือของสินค้า (00001) จะเท่ากับ 490 บาท และส่วนสินค้าที่ซื้อเข้ามารอบแรกสุดคือของวันที่ 1/1/2545 ก็ไม่ต้องไปคิดแล้ว เพราะว่าสินค้าที่ซื้อเข้ามาก่อนก็ต้องถูกขายออกไปก่อนใช่ปะ (ตามหลัก FIFO )
ดังนั้นเมื่อเราคำนวณครบจำนวนสินค้าคงเหลือแล้ว สินค้ารอบอื่นก็ไม่จำเป็นต้องคิด

ทีนี้ก็เป็นอันครบราคาต้นทุนทั้งหมดของสินค้าคงเหลือ ชนิดนี้
ถึงได้จำเป็นจะต้องทำการวนลูป เพื่อทำการดูเรคอดต่อไปเรื่อยๆ ไงครับ จนคำนวณครบจำนวนสินค้าคงเหลือ และมีการใช้ตัวแปร เพื่อเก็บราคาต้นทุนทั้งหมดของแต่ละรอบแล้วนำมารวมกันตอนท้าย

เสร้จแล้วก็จะนำมาแสดงแต่ละเรคอดใน report แต่ที่ผมทำมันคำนวนได้แล้วแต่ว่ามันดันเหมือนเรคอดแรกสุดตลอด...

และอีกกรณีนึงคือ (ใช้ตัวอย่างเดียวกันเลยนะครับ) คือถ้าเกิดสินค้าเหลืออยู่ใน stock แค่ 30 ชิ้น ก็แค่ ไปดูวันที่ซื้อสินค้ามาหลังสุด และคำนวนแค่ 30 ชิ้น และไม่ต้องทำการไปคำนวนของสินค้าที่ซือ้เข้ามารอบอื่นๆ เพราะว่ารอบหลังสุดมันซื้อมา 50 ชิ้น ซึ่งมากกว่าจำนวนสินค้าคงเหลือที่มีอยู่
ก็จะเป็น 30 * 5 = 150 บาท ได้เลย ก็เป็นอันจบ

อาจารย์ช่วยดูให้อีกทีนะครับ
ขอบคุณครับผม
3 @R02363
เออ อาจารสุภาพครับ อยากถามอีกคำถามนึง คล้ายกรณีกระทู้ 01043 คือเปลี่ยนจากเลือกช่วงรหัสที่ต้องการดู เป็นเลือกช่วงวัน/เดือน/ปี แทนน่ะครับ คือผมเขียนเป็น

stDocName = "lost_decay"

stWhere = "[LD_CHECKDATE] between #" & CDate
(Text18.Value) & "# And #" & CDate(Text20.Value) & "# "

DoCmd.OpenReport stDocName, acViewPreview, , stWhere

พอ run ดูแล้วก็เปิด report ได้นะครับ แต่มันว่างเปล่า ไม่มีไรขึ้นเลย ลองอีกแบบนึงคือ เอาฟังชั่น CDate ออก แล้วก็เป็นเหมือนกัน ครับ
ควรแก้ยังไง
4 @R02366
สำหรับคำถามที่ถามเพิ่มเข้ามา ให้ลองใช้ CDbl() ช่วยครับ

ให้ค้น CDbl ดูประกอบด้วยก็ได้

ส่วนคำถามที่ค้างไว้ ผมจะเข้ามาดูให้อีกที ตอนนี้ผมรีบครับ
5 @R02367
ลองนำเอาโค้ดข้างหลังรายงานมาทำเป็นฟังก์ชันแทน แล้วใส่ใน Module ดังนี้

Function GetPrice(strID As String) As Double
Dim MerAmount As Long
Dim rst2 As DAO.Recordset
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("select mer_amount from merchandise where mer_id = '" & strID & "'")
Set rst2 = dbs.OpenRecordset("select buy_amount , buy_unitprice from buy where mer_id = '" & strID & "' order by buy_date desc")

If Not rst.EOF And Not rst2.EOF Then

MerAmount = rst!MER_AMOUNT
TotalPrice = 0

If rst2!BUY_AMOUNT < MerAmount Then
Do
TotalPrice = TotalPrice + (rst2!BUY_AMOUNT * rst2!BUY_UNITPRICE)
MerAmount = MerAmount - rst2!BUY_AMOUNT
rst2.MoveNext
If rst2!BUY_AMOUNT >= MerAmount Then GoTo jaja
Loop

GetPrice = TotalPrice

jaja:

TotalPrice = TotalPrice + (rst2!BUY_AMOUNT * rst2!BUY_UNITPRICE)
GetPrice = TotalPrice

End If
End If

End Function

แต่ผมดูแล้ว ตรง Do Loop ยังมีปัญหาอยู่ ลองแก้ไขดูนะครับ

เวลานำไปใช้ก็ให้ใช้โค้ดนี้ในรายงาน

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Me.Text20 = GetPrice(Me.MER_ID)
End Sub

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