กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
299 3
URL.หัวข้อ /
URL
... เรียนอาจารย์สุภาพ ครับ สืบเนื่องจากกระทู้ 1042 คือ วิธีที่อาจารย์บอกมันไม่ได้อ่ะครับ ช่วยดูที ..
คือ ต้องคำนวนราคาต้นทุนแบบ Lifo น่ะครับ เลยต้องมีการใช้ตัวแปรและวนลูป (คล้ายFIFO ที่เป็นตัวอย่างของอาจาร น่ะ ) แล้วจะแก้ยังไงต่อดีครับ เออ แล้วที่อาจารย์บอกให้คำนวณ ใน Query จะทำยังไงครับ เพราะมันมีการใช้ตัวแปรและวนลูป
เออ แล้วมีคนแนะนำให้ลองไปเขียน Function แล้ว มาใช้ใน recordsource ของรายงานน่ะครับ
มันต้องเขียนยังไงเหรอ แล้วคล้ายๆ กับของเดิมหรือปล่าว
อาจาย์ช่วยแนะนำที ครับ
ขอบคุณมากครับ
เออ แล้วมีคนแนะนำให้ลองไปเขียน Function แล้ว มาใช้ใน recordsource ของรายงานน่ะครับ
มันต้องเขียนยังไงเหรอ แล้วคล้ายๆ กับของเดิมหรือปล่าว
อาจาย์ช่วยแนะนำที ครับ
ขอบคุณมากครับ
3 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R02348
ok ครับ ผมจะอธิบาย code ที่อยู่ใน report นะ(หลักๆ เลย)
ตาราง Buy คือตารางรายการสั่งซื้อ ตาราง Merchandise คือตารางรายการสินค้า
Private Sub Report_Activate()
Dim MerAmount As Long
Dim rst2 As DAO.Recordset
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("select mer_amount from merchandise where mer_id = '" & Me.MER_ID & "'")
' ตรงส่วนนี้ก็เข้าไปดูจำนวนสินค้าคงเหลือที่มีอยู่ใน stock โดยดูตามรหัสสินค้า
Set rst2 = dbs.OpenRecordset("select buy_amount , buy_unitprice from buy where mer_id = '" & Me.MER_ID & "' order by buy_date desc")
' ตรงส่วนนี้เข้าไปดู จำนวนสินค้าที่ซื้อเข้ามา กับ ราคาต่อหน่วยที่ซื้อเข้ามา โดยดูตามรหัส และตามวันที่หลังสุด (ตามหลัก Lifo )
If Not rst.EOF And Not rst2.EOF Then
MerAmount = rst!MER_AMOUNT ' ถ้ามีข้อมูลตรง ก็จะให้ตัวแปร MerAmount เท่ากับ จำนวนสินค้าคงเหลือ(ที่อยู่ในตาราง Merchandise น่ะ)
TotalPrice = 0
If rst2!BUY_AMOUNT < MerAmount Then ' ถ้า เรคอดนั้น จำนวนสินค้าซื้อเข้าในตาราง buy มีน้อยกว่า จำนวนสินค้าคงเหลือในตาราง merchandise ก็จะให้ทำการวนลูป
Do
TotalPrice = TotalPrice + (rst2!BUY_AMOUNT * rst2!BUY_UNITPRICE) ' (ตัวแปร totalpriceผมกำหนดไว้ที่ Module นะ) TotalPrice คือตัวแปรที่จะรวมราคาต้นทุนจากสินค้าคงเหลือของสินค้านั้นๆ และบรรทัดนี้คือ เมื่อเงื่อนไข ข้างต้นเป็นจริง(ก่อน Do น่ะ) ก็จะให้นำ จำนวนสินค้าที่ซื้อเข้ามา * ราคาต่อหน่วยที่ซื้อเข้ามา จากตาราง buy
MerAmount = MerAmount - rst2!BUY_AMOUNT ' ในการซือ้สินค้าเข้ามาแต่ละครั้ง ถึงเป็นสินค้าชนิดเดียวกันแต่บางครั้งอาจซื้อเข้าในราคาต่อหน่วยไม่เท่ากัน และถ้าในการซื้อสินค้าเข้ามารอบนั้นยังมีจำนวนไม่ครบกับสินค้าคงเหลือที่มีอยู่ จึงต้องทำการไล่เรคอดไปเรื่อยๆ จนครบ (ไล่ตามวันที่หลังสุดก่อนและย้อนขึ้นไป ตามหลัก Lifo ) และก็คำนวณราคาซื้อเข้าต่อหน่วย ของแต่ละรอบไปด้วย และบรรทัดนี้คือ ก็จะทำการหักลบจำนวนสินค้าที่ซื้อเข้ามาในรอบนั้น ออกจากจำนวนสินค้าคงเหลือ (ก็จะทำการหักลบไปเรื่อยๆ จนจำนวนที่ซื้อเข้าในรอบนั้นๆ มีค่าเท่ากับหรือมากกว่า จำนวนสินค้าคงเหลือ หรือ หักลบไปเรื่อยๆ จนกว่า MerAmount หรือสินค้าคงเหลือมีค่าเป็น 0 คือไม่ต้องทำการคำนวณหาราคาต้นทุนอีกต่อไป )
rst2.MoveNext ' ดูเรคอดต่อไปอีกว่ายังเป็นตามเงื่อนไขหรือป่าว
If rst2!BUY_AMOUNT >= MerAmount Then GoTo jaja
' ถ้าจำนวนสินค้าที่ซือ้เข้ามาในรอบนั้นๆ มีค่ามากกว่หรือเท่ากับจำนวนสินค้าคงเหลือแล้วให้ทำการ เอาจำนวนสินค้าที่ซื้อเข้ามารอบนั้นๆ * ราคาซื้อเข้าต่อหน่วยได้เลย ดังนั้นบรรทัดนี้จึงข้ามไปที่ ส่วน jaja
Loop
Text20 = TotalPrice ' กำหนดให้ text20 ที่อยู่ใน report (ตรงส่วน detail) แสดงค่าเป็นจำนวนเงินต้นทุนจากสินค้าคงเหลือทั้งหมดของสินค้านั้นๆ
jaja:
TotalPrice = TotalPrice + (rst2!BUY_AMOUNT * rst2!BUY_UNITPRICE)
Text20 = TotalPrice ' ตรงส่วนนี้ก็ถ้าการซื้อสินค้ารอบไหน จำนวนสินค้าที่ซือ้เข้ามีค่ามากกว่าหรือเท่ากับจำนวนสินค้าคงเหลือ ก็ให้ทำการคูณปกติ ได้เลย
End If
End If
End Sub
คือสรุปแล้วต้องการคำนวณหาจำนวนเงินต้นทุนจากสินค้าคงเหลือทั้งหมด ของสินค้านั้นๆ น่ะครับ โดยคำนวนตอนเปิด report (ไม่มีการแก้ไขหรอืลบอะไรทั้งสิ้นในตาราง แค่เข้าไปดูและดึงมาคำนวณ) พอได้ผลลัพแล้วก็นำมาแสดงบน text20 ใน report ส่วน detail เท่านั้นเอง
ปัญหาคือ คำนวณได้แล้ว แต่พอแสดงบน report มันดันแสดงเหมือนเรคอดแรกสุดหมดเลยอ่ะครับ ต้องการให้มันแสดงผลลัพของเรคอดใคร ของมัน
-----------------------
รบกวนให้อาจาร ช่วยดูอีกทีนะครับ ทำมาตั้งนานแล้ว และใกล้ถึงวันส่งงานแล้ว
ขอบคุณมากครับ
ตาราง Buy คือตารางรายการสั่งซื้อ ตาราง Merchandise คือตารางรายการสินค้า
Private Sub Report_Activate()
Dim MerAmount As Long
Dim rst2 As DAO.Recordset
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("select mer_amount from merchandise where mer_id = '" & Me.MER_ID & "'")
' ตรงส่วนนี้ก็เข้าไปดูจำนวนสินค้าคงเหลือที่มีอยู่ใน stock โดยดูตามรหัสสินค้า
Set rst2 = dbs.OpenRecordset("select buy_amount , buy_unitprice from buy where mer_id = '" & Me.MER_ID & "' order by buy_date desc")
' ตรงส่วนนี้เข้าไปดู จำนวนสินค้าที่ซื้อเข้ามา กับ ราคาต่อหน่วยที่ซื้อเข้ามา โดยดูตามรหัส และตามวันที่หลังสุด (ตามหลัก Lifo )
If Not rst.EOF And Not rst2.EOF Then
MerAmount = rst!MER_AMOUNT ' ถ้ามีข้อมูลตรง ก็จะให้ตัวแปร MerAmount เท่ากับ จำนวนสินค้าคงเหลือ(ที่อยู่ในตาราง Merchandise น่ะ)
TotalPrice = 0
If rst2!BUY_AMOUNT < MerAmount Then ' ถ้า เรคอดนั้น จำนวนสินค้าซื้อเข้าในตาราง buy มีน้อยกว่า จำนวนสินค้าคงเหลือในตาราง merchandise ก็จะให้ทำการวนลูป
Do
TotalPrice = TotalPrice + (rst2!BUY_AMOUNT * rst2!BUY_UNITPRICE) ' (ตัวแปร totalpriceผมกำหนดไว้ที่ Module นะ) TotalPrice คือตัวแปรที่จะรวมราคาต้นทุนจากสินค้าคงเหลือของสินค้านั้นๆ และบรรทัดนี้คือ เมื่อเงื่อนไข ข้างต้นเป็นจริง(ก่อน Do น่ะ) ก็จะให้นำ จำนวนสินค้าที่ซื้อเข้ามา * ราคาต่อหน่วยที่ซื้อเข้ามา จากตาราง buy
MerAmount = MerAmount - rst2!BUY_AMOUNT ' ในการซือ้สินค้าเข้ามาแต่ละครั้ง ถึงเป็นสินค้าชนิดเดียวกันแต่บางครั้งอาจซื้อเข้าในราคาต่อหน่วยไม่เท่ากัน และถ้าในการซื้อสินค้าเข้ามารอบนั้นยังมีจำนวนไม่ครบกับสินค้าคงเหลือที่มีอยู่ จึงต้องทำการไล่เรคอดไปเรื่อยๆ จนครบ (ไล่ตามวันที่หลังสุดก่อนและย้อนขึ้นไป ตามหลัก Lifo ) และก็คำนวณราคาซื้อเข้าต่อหน่วย ของแต่ละรอบไปด้วย และบรรทัดนี้คือ ก็จะทำการหักลบจำนวนสินค้าที่ซื้อเข้ามาในรอบนั้น ออกจากจำนวนสินค้าคงเหลือ (ก็จะทำการหักลบไปเรื่อยๆ จนจำนวนที่ซื้อเข้าในรอบนั้นๆ มีค่าเท่ากับหรือมากกว่า จำนวนสินค้าคงเหลือ หรือ หักลบไปเรื่อยๆ จนกว่า MerAmount หรือสินค้าคงเหลือมีค่าเป็น 0 คือไม่ต้องทำการคำนวณหาราคาต้นทุนอีกต่อไป )
rst2.MoveNext ' ดูเรคอดต่อไปอีกว่ายังเป็นตามเงื่อนไขหรือป่าว
If rst2!BUY_AMOUNT >= MerAmount Then GoTo jaja
' ถ้าจำนวนสินค้าที่ซือ้เข้ามาในรอบนั้นๆ มีค่ามากกว่หรือเท่ากับจำนวนสินค้าคงเหลือแล้วให้ทำการ เอาจำนวนสินค้าที่ซื้อเข้ามารอบนั้นๆ * ราคาซื้อเข้าต่อหน่วยได้เลย ดังนั้นบรรทัดนี้จึงข้ามไปที่ ส่วน jaja
Loop
Text20 = TotalPrice ' กำหนดให้ text20 ที่อยู่ใน report (ตรงส่วน detail) แสดงค่าเป็นจำนวนเงินต้นทุนจากสินค้าคงเหลือทั้งหมดของสินค้านั้นๆ
jaja:
TotalPrice = TotalPrice + (rst2!BUY_AMOUNT * rst2!BUY_UNITPRICE)
Text20 = TotalPrice ' ตรงส่วนนี้ก็ถ้าการซื้อสินค้ารอบไหน จำนวนสินค้าที่ซือ้เข้ามีค่ามากกว่าหรือเท่ากับจำนวนสินค้าคงเหลือ ก็ให้ทำการคูณปกติ ได้เลย
End If
End If
End Sub
คือสรุปแล้วต้องการคำนวณหาจำนวนเงินต้นทุนจากสินค้าคงเหลือทั้งหมด ของสินค้านั้นๆ น่ะครับ โดยคำนวนตอนเปิด report (ไม่มีการแก้ไขหรอืลบอะไรทั้งสิ้นในตาราง แค่เข้าไปดูและดึงมาคำนวณ) พอได้ผลลัพแล้วก็นำมาแสดงบน text20 ใน report ส่วน detail เท่านั้นเอง
ปัญหาคือ คำนวณได้แล้ว แต่พอแสดงบน report มันดันแสดงเหมือนเรคอดแรกสุดหมดเลยอ่ะครับ ต้องการให้มันแสดงผลลัพของเรคอดใคร ของมัน
-----------------------
รบกวนให้อาจาร ช่วยดูอีกทีนะครับ ทำมาตั้งนานแล้ว และใกล้ถึงวันส่งงานแล้ว
ขอบคุณมากครับ
3 @R02349
ลองดูที่ผมแก้ไขให้ครับ
โดยผมเปลี่ยน Record Source ของ Report ให้เป็น Query1 ครับ
ไม่รู้ว่าตรงกับที่ต้องการหรือไม่นะครับ
โดยผมเปลี่ยน Record Source ของ Report ให้เป็น Query1 ครับ
ไม่รู้ว่าตรงกับที่ต้องการหรือไม่นะครับ
Time: 0.3124s
ช่วยยกตัวอย่างให้ดูสักรายการ ว่ามีการเก็บค่าต่างๆ ในตารางอย่างไร และผลลัพธ์ที่ต้องการเป็นอย่างไร
ถ้ามีตัวอย่างจริงก็จะเข้าใจปัญหาได้ง่ายขึ้นครับ ไม่ต้องเอาข้อมูลมาก แค่ 2-3 ข้อมูลก็พอ และให้เอาเฉพาะส่วนที่เกี่ยวข้องเท่านั้น ไม่ต้องเอาส่วนอื่นๆ มาด้วย
จากนั้นช่วย Compact แล้ว Zip แนบมาในกระทู้นี้ได้เลยครับ