อยากทำสต๊อกคงเหลือแต่ละวันเพื่อเก็บประวัติไว้ครับ
กระทู้เก่าบอร์ด อ.Yeadram

 2,847   8
URL.หัวข้อ / URL
อยากทำสต๊อกคงเหลือแต่ละวันเพื่อเก็บประวัติไว้ครับ

คือว่าในทุกๆเย็นผมต้อง มานั่งกดปุ่ม update stock ซึ่งปุ่มนี้ผมใช้วิธีการทำจาก append query ก๊อบข้อมูลจากตาราง stock มาไว้ที่ตาราง stock_history
ปล. ผมเพิ่มฟิลด์ใน append query เพื่อบันทึกวันที่ด้วย
เขตข้อมูล : Date : Date()
.
.
ผนวกไปยัง : stock_history

ประเด็นคือ มีวิธีอื่นที่ดีกว่านี้ไหมครับ ผมใช้วิธีนี้มันมีข้อผิดพลาดเยอะอย่างเช่น
- ถ้ามีการตัดสต๊อกผิดผมต้องมานั่งแก้หลายที่
- ถ้าข้อมูลชื่อหรือรายละเอียดในตาราง stock มีการเปลี่ยนแปลงไป ในตาราง stock_history จะไม่เปลี่ยนตาม

ขอบคุณครับ

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

1 @R17875
ทำไมจะต้องแยกเป็นอีกเทเบิลครับ ในเมื่อมีฟิลด์ต่างๆเหมือนๆกัน
2 @R17880
วิธีนี้ที่ทำ เพราะว่าผมต้องการดูสต๊อกในอดีตว่า ณ ว่าวันนั้นๆมีความเคลื่อนไหวเท่าไรบ้าง อ.สันติสุข พอจะมีวิธีอื่นไหมครับ ขอบคุณครับ
3 @R17881
ทำไมไม่ดูในเทเบิล Stock เดิมไปเลยหล่ะครับ ผมเข้าใจว่าใน Stock_History มีฟิลด์มาจากเทเบิล Stock ทั้งนั้น (ยกเว้นฟิลด์ Date) ใช่ไหมครับ ทำไมเราไม่เพิ่มฟิลด์ Date เข้าไปในเทเบิล Stock หล่ะครับ
4 @R17882
หรือว่ามีฟิลด์ที่เกิดการจากการคำนวนหรือผลรวมอะไรเพิ่มมาในเทเบิล Stock_History ด้วยหรือเปล่าครับ
5 @R17883
อ.สันติสุข โหลดไฟล์ดูได้เลยนะครับ ผมอธิบายไม่ค่อยเป็น วิธีนี้อาจไม่ใช่วิธีที่คนอื่นๆเขาใช้กัน อ. ดูให้หน่อยนะครับ
https://www.mediafire.com/?ta9q9i16q879juo

หลังจากโหลดดูแล้ว
- หลักการใช้ก็คือ เปิดฟอร์ม stock คลิกไปที่ ADD STOCK ก็จะเป็นฟอร์ม add_stock สมมุติให้ลองเพิ่มไปเล่นๆดู(ตรง Date ให้เลือก ตั้งแต่ วันที่ 11 ก่อนนะครับ เพราะเดี๋ยวมันจะทับกับข้อมูลเก่าใน stock_history ของผม) แล้วกด UPDATE ถ้า add stock ของวันที่ 11 เสร็จแล้ว ให้กลับไปฟอร์ม stock กดปุ่ม UPDATE STOCK / DAY
- ลองใช้ FIND BY DATE แล้วเลือกวันที่ 11 ดูนะครับ

ขอบคุณครับ
6 @R17890
คือผมไม่มีทางเข้าใจหรอกครับ แม้จะได้เห็นโค้ดทั้งหมดถ้าคุณไม่อธิบาย เพราะมันอยู่ที่วัตถุประสงค์ว่าคุณกำลังทำอะไร โค้ดมันก็ทำงานตามที่เขียนโปรแกรมมา มันทำถูกต้องแล้วครับ แต่จะถูกวัตถุประสงค์หรือเปล่า จำเป็นต้องอธิบายครับ
7 @R17893
วัตถุประสงค์หลักก็คือ ต้องการเก็บประวัติสต๊อกคงเหลือในทุกๆวันเอาไว้ เพื่อว่าถ้าเราต้องการย้อนมาดูก็จะสามารถดูได้ ใช้อ้างอิงเป็นหลักฐานได้

โค้ดทั้งหมดนี้สามารถช่วยผมได้ในระดับหนึ่งเท่านั้น ผมจึงอยากขอคำแนะนำจาก อ.สันติสุข

ปัญหาที่1 จากโค้ดนี้
เช่นวันนี้ถ้าผมเปลี่ยนแปลงชื่อสินค้า A ในตาราง stock เป็นชื่อ AB แล้วผมอยากจะดูประวัติการตัดสต๊อกย้อนหลังของ ของต้นเดือนนี้ จะพบว่า สินค้า AB เนี้ย ก็ยังเป็นชื่อ A อยู่ แล้วผมก็ต้องมานั่งแก้ชื่อ A ให้เป็น AB ตั้งแต่ต้นเดือนจนถึงวันนี้ อยากทราบว่าพอจะมีวิธีที่ไม่เยอะแบบนี้ไหมครับ ?

ปัญหาที่ 2 จากโค้ดนี้
การทำ stock history แบบนี้ใช้วิธี Append query ถ้าหากข้อมูลในตาราง stock มีซัก 1000 เรคอร์ด ผมก็ต้อง Append ด้วยปุ่ม UPDATE STOCK / DAY 1000 เรคอร์ด ทุกๆวัน ซึ่งเยอะพอสมควร หาเวลาผ่านไปนานๆ ตาราง stock_history ก็จะมีขนาดใหญ่ขึ้นตามไปด้วย ดังนี้ อ.สันติสุข มีข้อแนะนำไหมครับ

* จริงๆผมก็ไม่อยากใช้วิธี Append query ในการเก็บประวัติสต๊อกหรอกนะครับ ผมมือใหม่เกินกว่าคิดวิธีที่ดีกว่านี้ได้ครับ

ขอบคุณครับ
8 @R17898
หลังจากงมอยู่ระยะเวลานึง เข้าใจแล้ว คือคุณมี 3 เทเบิล

Stock - เป็น Master Table   ไว้เก็บ id ของสินค้า, ชื่อสินค้า, หน่วยนับ และ ยอดคงเหลือปัจจุบัน ซึ่งจะมีค่าเปลี่ยนไปเรื่อยๆจากการนำจำนวนรับในเทเบิล Add_Stock มาบวกเพิ่มทุกครั้งที่มีการกดปุ่ม UPDATE ในฟอร์ม ADD STOCK

Add_Stock - เป็น Transaction Table   ไว้เก็บ id ของสินค้า, วันที่รับเข้า, จำนวนรับ

Stock_History - เป็น Log Table มีฟิลด์เหมือนเทเบิล Stock พร้อมเพิ่มฟิลด์วันที่ที่นำข้อมูลจากเทเบิล Stock มาเก็บไว้ในนี้ด้วย ทำหน้าที่เป็นตัวเก็บยอดคงเหลือ ณ แต่ละวันของ Stock อีกทีจากการกดปุ่ม UPDATE STOCK / DAY ในฟอร์ม STOCK HISTORY

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

ส่วนปัญหาเรื่องต้องแก้ไขใน Stock_History ตามไปด้วยจะทำยังไง คำตอบคือ ปกติเราจะไม่ทำ Stock_History ครับ เมื่อไหร่ที่เราต้องการดูยอดคงเหลือในแต่ละวัน เราก็จะเอายอดยกมาของต้นเดือน (หรือจะต้นปี ก็แล้วแต่การออกแบบระบบ) บวกลบๆๆๆกับจำนวนรับเข้า/จ่ายออกทีละวันๆจนกว่าจะถึงวันที่สุดท้ายที่ต้องการดูผลลัพธ์ ผลของแต่ละวันก็มาเก็บเป็นแต่ละเรคอร์ดลงเทเบิลชั่วคราวไว้ แล้วก็เอาเทเบิลชั่วคราวนี้มาแสดงผลอีกทีครับ    จะเห็นได้ว่าเราจะต้องมีกระบวนการทำ "ปิดยอดสิ้นเดือน" (หรือจะปิดยอดสิ้นปี หรือจะสิ้นระยะเวลาอะไร ก็แล้วแต่จะออกแบบ) เพิ่มขึ้นมา ข้อมูลที่อยู่ก่อนวันที่ปิดยอดจะไม่สามารถแก้ไขได้อีกหลังปิดยอดไปแล้วครับ และในเมื่อไม่มีการทำเทเบิล Stock_History ปัญหาเรื่องการเปลี่ยนชื่อจาก A ไปเป็น AB ก็จะหมดไป แต่ถ้ายังอยากจะเก็บ Stock_History มันก็เลี่ยงไม่ได้ที่จะต้องมาเขียนโปรแกรมปรับปรุงตัวเลขเอาเองทุกๆเรคอร์ดตั้งแต่วันที่ที่มีการเปลี่ยนแปลงจนถึงวันที่สุดท้ายที่มีใน Stock_History ครับ

ไฟล์ฐานข้อมูลรองรับได้ขนาดไหน มันรองรับได้ประมาณ 2 GB   เทเบิลที่จะโตเรื่อยๆคือ Add_Stock ไม่ใช่ Stock ตีซะว่าครึ่งหนึ่งของฐานข้อมูลใช้เก็บอย่างอื่น อีกครึ่งเก็บตัว Add_Stock เอง   1 เรคอร์ดของ Add_Stock ผมกะคร่าวๆว่าใช้เนื้อที่ประมาณ 20 byte   ดังนั้นมันจะเก็บได้ = (1^1024^1024^1024) / 20 = 53 ล้านเรคอร์ดครับ เก็บจนลืมหล่ะครับ   แต่ในทางปฏิบัติมันอาจโตเร็วกว่าที่ควรจะเป็น เราควรทำสิ่งที่เรียกว่า Compact Database ซึ่งมันจะเอาพื้นที่ที่เป็นขยะออกไป แล้วจับพื้นที่ที่ถูกใช้งานจริงๆมาต่อๆกันเข้าใหม่   ทำบ่อยแค่ไหนดี ระบบเล็กๆจะเดือนละครั้งก็ได้ครับ

หวังว่าคงจะเป็นแนวทางได้นะครับ ที่จะติงนิดนึงคือ ฟอร์มของคุณมีการใช้แมโครพร้อมกับโค้ดใน VBA ผมอยากแนะนำว่า ถ้าเป็นไปได้ ให้เขียนเป็น VBA ให้หมด ไม่ก็แมโครให้หมด (แต่แมโครทำงานได้จำกัดกว่า VBA มาก) เพราะไม่งั้น ใครมาแก้ไขระบบนี่ เมาเลยครับ โค้ดที่สั่งงานโปรแกรม (แมโครและ VBA) อยู่กระจัดการะจายไปคนละที่ กว่าจะทำความเข้าใจได้ ใช้เวลาเยอะขึ้นกว่าที่ควรครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2940s