กระทู้เก่าบอร์ด อ.Yeadram
12,867 27
URL.หัวข้อ /
URL
ขอวิธีการดึงข้อมูลจากตารางมาไว้ที่ฟอร์มค่ะ
สวัสดีค่ะ วันนี้หนูมีข้อสงสัยมาสอบถามท่านอาจารย์ด้วยนะคะ
คือหนูมีตารางที่เก็บข้อมูลของการส่งสินค้าไปแปรรูปสินค้า โดยในประวัติจะมีแค่จำนวนสินค้าที่ส่งไป ทีนี้หนูก็สร้างฟอร์มขึ้นมาสองฟอร์ม ฟอร์มแรกหนูใช้สำหรับโชว์ขอมูลในตารางที่เก็บข้อมูลของการส่งสินค้าไปแปรรูปสินค้าขึ้นมาโดยที่หน้าของข้อมูลหนูจะสร้างปุ่มไว้เพื่อเปิดข้อมูลไปฟอร์มที่สอง ดังรูปตัวอย่างค่ะ
คือหนูมีตารางที่เก็บข้อมูลของการส่งสินค้าไปแปรรูปสินค้า โดยในประวัติจะมีแค่จำนวนสินค้าที่ส่งไป ทีนี้หนูก็สร้างฟอร์มขึ้นมาสองฟอร์ม ฟอร์มแรกหนูใช้สำหรับโชว์ขอมูลในตารางที่เก็บข้อมูลของการส่งสินค้าไปแปรรูปสินค้าขึ้นมาโดยที่หน้าของข้อมูลหนูจะสร้างปุ่มไว้เพื่อเปิดข้อมูลไปฟอร์มที่สอง ดังรูปตัวอย่างค่ะ
27 Reply in this Topic. Dispaly 2 pages and you are on page number 2
22 @R11061
หนูพอจะเข้าใจแล้วค่ะ น่าจะเป็นที่ primary key 4 ตัวที่หนูตั้งขึ้น พอเวลาที่หนูเขียนคิวรี่เพื่อที่จะผนวกข้อมูลกลับไป Access ไม่ยอมให้เซฟทับ เพราะซำกับเรคอร์ดเดิมถูกไหมค่ะ ทีนี้ ถ้าหนูต้องการที่จะดึงข้อมูลเก่าจากตาราง TbOutStockHistory ออกมา (ที่ต้องเป็นตาราง TbOutStockHistory เพราะข้อมูลจากการตัดสต๊อกสินค้าถูกเก็บไว้ในตารางนี้) แล้วนำมาใส่ของมูลในฟิลด์ "ราคาขาย", "ส่วนลด", "Vat 7%" ที่หนูได้เว้นฟิลด์ว่างไว้ในแต่ละเรคอร์ดของตาราง TbOutStockHistory แล้วยังต้องให้มีการคำนวณออกมาในฟิลด์ของ "ผลต่าง(ขาย-ทุน)", "กำไร" แล้วก็เซฟกลับเข้าไปในฟิลด์ที่ว่างไว้ในแต่ละเรคอร์ดของตาราง TbOutStockHistory อีกค่ะ หนูควรใช้วิธีอย่างไร หนูจนปัญญาจริงๆค่ะ เพราะวิธีที่หนูคิดดูเหมือนจะไม่ได้ผล เพราะหนูคิดผิดวิธี อยากทราบว่าวิธีที่ถูกต้องจริงๆ ต้องทำอย่างไรคะ รบกวนด้วยค่ะ
23 @R11062
เพิ่มเติมค่ะ.... หนูกลัวว่าหนูอธิบายไม่ค่อยเข้าใจหนูเลยนำภาพของตาราง TbOutStockHistory มาให้ดูค่ะ
24 @R11063
ตามทฤษฏีแล้ว ฟิลด์ต่างๆที่เกิดจากการคำนวน เรามักจะไม่เก็บเอาไว้ในเทเบิลครับ เราจะคำนวนหาเมื่อถึงเวลาที่ต้องการเท่านั้น สาเหตุเพราะจะได้จัดการง่ายและข้อมูลถูกต้องเสมอ เช่น ฟิลด์ผลต่าง = ขาย - ทุน ถ้าเราเก็บฟิลด์ผลต่างเอาไว้ เมื่อใดที่ฟิลด์ขายหรือทุนมีการแก้ไข คุณจะต้องมานั่งคำนวนหาค่าของฟิลด์ผลต่างใหม่ทุกครั้ง ถ้าลืมทำ คุณก็จะมีข้อมูลที่ผิดติดไปในระบบ แต่ถ้าเราไม่เก็บและใช้วิธีคำนวนเมื่อเราต้องการดูว่า ผลต่าง เป็นเท่าไหร่ เราก็จะได้ค่าที่ถูกต้องเสมอ อย่างไรก็ตาม ดูว่าจะเป็นเรื่องยาวหน่อยถ้าจะทำตามทฤษฏี เพราะดูแล้วคุณคงไม่มีความรู้เรื่องการออกแบบฐานข้อมูล ตอนนี้จึงข้ามเรื่องทฏษฏีไปก่อน โดยถือเอาตามการออกแบบเทเบิลที่คุณสร้างไว้มาพูดถึงแทน
เพื่อจะปรับปรุงค่าของฟิลด์ต่างๆ คุณสามารถสร้าง Update Query ซึ่งเป็นคิวรี่อีกประเภท SQL Statement สำหรับคิวรี่นี้ก็จะมีลักษณะเป็นดังนี้
Update TbOutStockHistory
Set VAT = ..., ส่วนลด = ..., ผลต่าง = ราคาขาย - ทุน, กำไร = .... , รวมขาย = .....
Where (Not ราคาขาย Is Null) And (ผลต่าง Is Null)
นั่นคือหลังจากที่ฝ่ายบัญชีได้ป้อนราคาขายไปทุกเรคอร์ดแล้ว ก็ให้มารันคิวรี่นี้ทุกครั้งเพื่อปรับปรุงค่าฟิลด์ต่างๆในกรอบสีฟ้า แต่จากการออกแบบค่าของฟิลด์ที่คุณทำอยู่นี้ มีปัญหาอยู่นิดนึงว่าแล้วคิวรี่จะรู้ได้อย่างไรว่าจะต้องปรับปรุงเรคอร์ดไหนบ้าง เพราะไม่มีอะไรเป็นตัวบอกเช่นนั้น โดยความเห็นของผม ฟิลด์ทั้งหลายที่เกิดจากการคำนวนและฟิลด์ ราคาขาย ไม่ควรกำหนดค่า Default ให้เป็นศูนย์ แต่ควรกำหนดให้เป็น Null (Null ไม่ใช่ศูนย์ แต่หมายถึงฟิลด์นั้นยังไม่มีข้อมูลใส่ไปเลย) ดังนั้น เมื่อฝ่ายสต๊อคสร้างเรคอร์ดของสต๊ิอค ฟิลด์ที่เขาไม่ได้ป้อนก็จะมีค่าเป็น Null เราก็จะใช้การตรวจสอบว่าถ้าเรคอร์ดใดมีฟิลด์ราคาขายไม่เป็น Null (แสดงว่ามีการป้อนราคาขายแล้ว) แต่ฟิลด์ผลต่างเป็น Null (แสดงว่ายังไม่ได้คำนวนหาผลต่าง) ก็ให้คำนวนเรคอร์ดนั้นแหล่ะ นี่คือที่มาของส่วนที่เป็น Where clause ครับ
อย่างไรก็ตาม ให้คำนึงถึงเรื่องที่ผู้ใช้มีการแก้ไขฟิลด์ทุน,ราคาขาย,จำนวน เอาไว้ด้วย เพราะถ้าฟิดล์เหล่านี้มีค่าเปลี่ยนไปเมื่อไหร่ เราจะทำยังไงเพื่อให้ฟิลด์ที่เกิดจากการคำนวนนั้นอัพเดตถูกต้องไปด้วย ? ถ้าเป็นผม ผมก็ต้องเช็คในหน้าฟอร์มที่ให้แก้ค่าเหล่านี้ ถ้ามีการแก้ไขก็ต้องไปกำหนดให้ฟิลด์ ผลต่าง เป็น Null อีกครั้งครับ
เพื่อจะปรับปรุงค่าของฟิลด์ต่างๆ คุณสามารถสร้าง Update Query ซึ่งเป็นคิวรี่อีกประเภท SQL Statement สำหรับคิวรี่นี้ก็จะมีลักษณะเป็นดังนี้
Update TbOutStockHistory
Set VAT = ..., ส่วนลด = ..., ผลต่าง = ราคาขาย - ทุน, กำไร = .... , รวมขาย = .....
Where (Not ราคาขาย Is Null) And (ผลต่าง Is Null)
นั่นคือหลังจากที่ฝ่ายบัญชีได้ป้อนราคาขายไปทุกเรคอร์ดแล้ว ก็ให้มารันคิวรี่นี้ทุกครั้งเพื่อปรับปรุงค่าฟิลด์ต่างๆในกรอบสีฟ้า แต่จากการออกแบบค่าของฟิลด์ที่คุณทำอยู่นี้ มีปัญหาอยู่นิดนึงว่าแล้วคิวรี่จะรู้ได้อย่างไรว่าจะต้องปรับปรุงเรคอร์ดไหนบ้าง เพราะไม่มีอะไรเป็นตัวบอกเช่นนั้น โดยความเห็นของผม ฟิลด์ทั้งหลายที่เกิดจากการคำนวนและฟิลด์ ราคาขาย ไม่ควรกำหนดค่า Default ให้เป็นศูนย์ แต่ควรกำหนดให้เป็น Null (Null ไม่ใช่ศูนย์ แต่หมายถึงฟิลด์นั้นยังไม่มีข้อมูลใส่ไปเลย) ดังนั้น เมื่อฝ่ายสต๊อคสร้างเรคอร์ดของสต๊ิอค ฟิลด์ที่เขาไม่ได้ป้อนก็จะมีค่าเป็น Null เราก็จะใช้การตรวจสอบว่าถ้าเรคอร์ดใดมีฟิลด์ราคาขายไม่เป็น Null (แสดงว่ามีการป้อนราคาขายแล้ว) แต่ฟิลด์ผลต่างเป็น Null (แสดงว่ายังไม่ได้คำนวนหาผลต่าง) ก็ให้คำนวนเรคอร์ดนั้นแหล่ะ นี่คือที่มาของส่วนที่เป็น Where clause ครับ
อย่างไรก็ตาม ให้คำนึงถึงเรื่องที่ผู้ใช้มีการแก้ไขฟิลด์ทุน,ราคาขาย,จำนวน เอาไว้ด้วย เพราะถ้าฟิดล์เหล่านี้มีค่าเปลี่ยนไปเมื่อไหร่ เราจะทำยังไงเพื่อให้ฟิลด์ที่เกิดจากการคำนวนนั้นอัพเดตถูกต้องไปด้วย ? ถ้าเป็นผม ผมก็ต้องเช็คในหน้าฟอร์มที่ให้แก้ค่าเหล่านี้ ถ้ามีการแก้ไขก็ต้องไปกำหนดให้ฟิลด์ ผลต่าง เป็น Null อีกครั้งครับ
25 @R11064
ขอบคุณค่ะอาจารย์สันติสุข รู้สึกว่าหนูจะหลงทางมาผิดมากๆเลยค่ะ พออาจาย์ชี้แนะอย่างนี้แล้ว หนูขอกลับไปคิดการออกแบบฐานข้อมูลใหม่ก่อนนะคะ เพราะอย่างที่อาจาย์ชี้แนะ ถ้าหนูยังทำตามอย่างนี้อีก หนูคงต้องออกแบบฐานข้อมูลผิดๆไปตลอดแน่ๆเลยค่ะ ต้องขออภัยด้วยค่ะที่ต้องรบกวนอาจารย์สันติสุข หนูขอกลับไปศึกษาและรื้อฐานข้อมูลก่อนนะคะ ถ้ามีข้อสงสัยอย่างไรคงต้องขอคำชี้แนะอีกค่ะ อ่อ...คือหนุอยากทราบว่าท่าหนูต้องการค้นหาทฤษฏีการคำนวณ ว่าต้องออกแบบอย่างไร หนูสามารถหาได้จากที่ไหนบ้างค่ะ ขอบคุณค่ะ
26 @R11065
มันไม่ได้เรียกว่าทฤษฏีการคำนวนนะครับ การออกแบบฐานข้อมูลให้ดี เราเรียกว่าการทำ Database Normalization อย่างน้อยต้องทำถึง Third Normal Form (3NF) มันมีทั้งหมด 5 ลำดับครับ แต่โดยปกติทำถึงขั้นที่ 3 ก็ใช้ได้แล้ว
27 @R11066
ขอบคุณค่ะอาจารย์ที่ชี้แนะค่ะ.... หนูขอไปค้นหาข้อมูลก่อนค่ะ ติดขัดอย่างไรคงต้องรบกวนท่านอาจารย์อีกนะคะ
Time: 0.2638s
ขอบคุณค่ะอาจารย์สันติสุข เดี๋ยวหนูจะลองทำตามที่อาจารย์แนะนำดูนะคะ ได้ผลอย่างไรจะแจ้งให้ทราบค่ะ ขอบคุณค่ะ