การเช็คข้อมูล
กระทู้เก่าบอร์ด อ.Yeadram

 3,122   6
URL.หัวข้อ / URL
การเช็คข้อมูล

สวัสดีครับอาจารย์ทุกท่าน

       ผมรบกวนเรื่อง การบันทึกข้อมูลครับ
คือผมใช้บันทึกข้อมูลผ่านฟอร์ม โดยการเขียนโค๊ด sql

   Dim sql As String
   sql = "Insert into tblTrReceive (RecFaxInDate,RecComp,RecDist)"
   
   sql = sql & " values(" & txtStartHo & "," & RecComp & "," & RecDist & ")

DoCmd.SetWarnings False
DoCmd.RunSQL sql

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

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

1 @R05596
"อยากให้เช็คว่ายังมี ข้อมูลไหนบ้างที่ยังไม่ได้บันทึกลงในฟอร์ม" ?!?

if dcount("a",tblTrReceive", "[a] = " & ?!? ) < 1 then
docmd.runsql sql
else
msgbox "Already record in Database"
end if

ความหมาย ว่าดังนี้
--- ถ้าข้อมูล ?!? มีอยู่แล้วในฟิลด์ a ของตาราง tblTrReceive ให้แจ้งข้อความเตือน แล้วหยุดทำงาน
--- ถ้าข้อมูล ยังไม่มี ให้ทำการ รัน statement แล้วหยุดทำงาน
2 @R05597
ขอบคุณครับ อาจารย์
        สำหรับคำตอบนี้มีประโยคมากครับ ผมจะนำไปประยุกต์ใช้ครับ
ผมขอโทษครับอาจารย์ ที่ผมอธิบายไม่ชัดเจนทำให้สื่อความหมายให้
อาจารย์ไม่ตรงประเด็นเท่าไหร่ครับ
        คือในฟอร์มที่ผมจะบันทึกข้อมูลลงในตารางมีอยู่เกือบ 30 ฟิลด์ครับ
ปกติแล้วจากประสบการณ์ที่ผ่านมาพบว่า มีข้อมูลที่บันแล้วไม่ครบ ก็หมาย
ความว่า มีบางข้อมูลที่ไม่ได้บันทึกจากฟอร์ม แต่พอกดบันทึก ก็สามารถ
บันทึกข้อมูลได้
        ดังนั้น ผมจึงอยากให้เช็คก่อนว่า มีข้อมูลที่จะต้องบันทึกครบหรือยัง
ถ้ายังไม่ครบ ก็ยังไม่สามารถที่จะบันทึกข้อมูลได้ครับ
        รบกวนอาจารย์ ด้วยครับ

          ขอบคุณครับ อาจารย์       


           
       
3 @R05603
"พบว่า มีข้อมูลที่บันแล้วไม่ครบ ก็หมาย
ความว่า มีบางข้อมูลที่ไม่ได้บันทึกจากฟอร์ม"

ปรับเปลี่ยนข้อความสื่อความหมายได้ว่า
"เมื่อมีการสั่งบันทึกข้อมูล ระบบยินยอมให้บันทึกได้ แต่ไม่ครบทุกฟิลด์"

--------------------------------------------------------------------------------
"อยากให้เช็คก่อนว่า มีข้อมูลที่จะต้องบันทึกครบหรือยัง
ถ้ายังไม่ครบ ก็ยังไม่สามารถที่จะบันทึกข้อมูลได้ครับ"

ปรับเปลี่ยนข้อความเขียนใหม่เพื่อให้อ่านเข้าใจง่ายขึ้นได้ว่า
"อยากให้ตรวจสอบหน้าฟอร์ม ตรวจสอบข้อมูลในแต่ละคอนโทรล ว่ามีข้อมูลมาหรือไม่ และข้อมูลที่กรอกมาถูกต้องตามชนิดข้อมูลที่ต้องการหรือไม่ ถ้าการตรวจสอบผ่าน ก็สั่งบันทึก ถ้าข้อมูลมีไม่ครบ หรือเป็นข้อมูลผิดประเภท ก็จะไม่สั่งบันทึก"
---------------------------------------------------------------------------------

สรุปคือ ต้องการให้มีการตรวจสอบความถูกต้องครบถ้วนของข้อมูล ก่อนการบันทึก

แนวทางความเข้าใจ ตามชนิดการออกแบบฟอร์ม
1 การใช้ bound control
2 การใช้ unbound control

ถ้าเป็นแนวทางที่ 2 เราสามารถเขียน if...then ...else ไปที่ละคอนโทรลได้เลย ถ้าคอนโทรลใดตรวจสอบแล้วพบว่ามีข้อมูลถูกต้องครบถ้วน เราก็ไปทำการตรวจสอบที่คอนโทรลตัวต่อไป
     ถ้าไปเจอคอนโทรลใดๆ ที่ข้อมูลไม่ถูกต้อง ก็สั่งให้หยุดทำงานทันที
     เมื่อตรวจสอบต่อๆไป จนครบทุกคอนโทรลแล้ว ผ่านทุกตัว ค่อยทำการเขียน statement เอามารัน โดยเขียนเป็น Insert into...
     เพราะฉะนั้นเมื่อมีคอนโทรลใดๆ ที่มีข้อมูลผิดพลาด ก็จะไม่มีกันสั่ง รัน SQL เพราะเราสั่งให้มันหยุดทำงานไปแล้ว และนั่นก็หมายความว่า เราไม่มีการบันทึกข้อมูล
     วิธีนี้ค่อนข้างให้อิสระและความยืดหยุ่นกับผู้ใช้ โดยแล้วแต่ผู้ใช้ว่า สะดวกกรอกข้อมูลในช่องใดก่อนก็ได้ เพราะเราจะทำการตรวจสอบครั้งเดียว เมื่อมีการกดปุ่มบันทึกเท่านั้น

-----------------------------------------------





4 @R05605
ถ้าเป็นแนวทางที่ 1 (การใช้ bound control)
     ระบบ Access จะทำการบันทึกข้อมูลให้โดยอัตโนมัติ ทันที่ที่ผู้ใช้เอาเคอร์เซอร์ออกจากคอนโทรล ดังนั้นปุ่มกด บันทึก แทบจะไม่มีความหมายอะไรเลย

ลักษณะการบันทึกของมัน (ระบบ Access)

1 ถ้าไม่มีข้อมูล (คือ เอาเคอร์เซอร์เข้าไปวาง แล้วก็ย้ายไปที่อื่นเลย ทั้งๆ ที่ยังไม่ได้คีย์ข้อมูลใดๆ เข้าไป) ระบบจะ..
        1.1 ถ้าการออกแบบตารางยินยอมให้ฟิลด์นั้นบันทึกค่าว่างได้ ระบบจะบันทึกค่า Null เข้าตาราง
        2.2 ถ้าการออกบบตารางไม่ยินยอมให้ฟิลด์นั้นเป็นค่าว่าง ระบบจะแจ้งเตือนโดยอัตโนมัติ ซึ่งถ้าเราไม่กรอกข้อมูลให้มัน มันก็จะไม่ยอมให้เราย้ายเคอร์เซอร์ไปไหนได้เลย
****** เมื่อทราบข้อจำกัดตรงนี้ก็สามารถประยุกต์ใช้ตรงนี้ เพื่อช่วยได้อีกแนวทาง****
2 ถ้ามีข้อมูล
        2.1 ถ้าข้อมูลดังกล่าวถูกต้องครบถ้วนตามเงื่อนไขของการออกแบบตาราง (ชนิดข้อมูลถูกต้อง, ความกว้างเขตข้อมูลไม่ผิด) มันจะบันทึกค่านั้นทันที
ในขณะที่
        2.2 ถ้าบันทึกข้อมูลผิดประเภท มันก็จะไม่ยอมให้เราไปไหนเช่นกัน เช่นถ้ามันต้องการข้อมูลแบบตัวเลข แต่ผู้ใช้คีย์อักษร ก.ไก่ เข้าไป มันก็ไม่ยอมเช่นกัน หรือถ้าตั้งค่าว่าให้รับข้อมูลตัวเลข 4 หลัก แต่ผู้ใช้กรอกเข้ามาเป็นตัวเลข 3 หลัก มันก็ไม่ยอมเช่นกัน
****** เมื่อทราบข้อจำกัดตรงนี้ก็สามารถประยุกต์ใช้ตรงนี้ เพื่อช่วยได้อีกแนวทาง****

แต่ความเป็นจริง เราไม่ต้องการฟิกซ์หรือสร้างข้อจำกัดที่เข้มงวดขนาดที่ต้องไปกำหนดเงื่อนไขให้กับทุกๆ ฟิลด์ เพราะทุกงานเราต้องการความยืดหยุ่นที่แตกต่างกัน
ถ้า......
   เราไม่มีการกำหนดเงื่อนไขให้แต่ละฟิลด์ ระบบก็จะไม่ช่วยตรวจสอบใดๆ เรา (ผู้เขียนโปรแกรม) ก็ต้องเขียนการตรวจสอบเอาเองโดยไปฝังระบบการตรวจสอบไว้ในเหตุการณ์ BeforeUpdate ของแต่ละคอนโทรลบนฟอร์ม
    การฝัง โค้ดการตรวจสอบไว้ในแต่ละคอนโทรล มันมีความละเอียดยิ่งนัก แต่ข้อเสียคือ ถ้าคอนโทรลใดๆ ไม่เคยถูกโฟกัสหรือไม่เคยถูกคีย์ข้อมูลเข้าไป มันก็จะไม่มีการตรวจสอบใดๆ
    ดังนั้นระบบ Access จึงมีเหตุการณ์อีกเหตุการณ์เพื่อให้คุณดักแก้ปัญหานี้ได้ นั่นก็คือ BeforeUpdate ของฟอร์มครับ

การเขียนคำสั่งตรวจสอบก็ไม่หนีไปจาก If...then...else หรอกครับ ซึ่งจะเขียนอย่างไร จะตรวจสอบกี่ขั้น จะตรวจสอบซ้อน if กี่ชั้นกี่รอบมันก็ขึ้นอยู่กับชนิดข้อมูลของ ฟิลด์นั้นๆ ครับ ซึงคงไม่มีใครรู้ละเอียดถึงข้อกำหนดของมันได้มากไปกว่าคนออกแบบฐานข้อมูลล่ะครับ

เช่นผมขอยกตัวอย่างว่า ถ้าผมมีฟิลด์จะเก็บข้อมูล เลขบัตรประชาชน ผมก็จะตั้งข้อกำหนดไว้ในใจ (ไม่กำหนดในตารางเพราะมันไม่ยืดหยุ่น) ดังนี้
- ต้องเก็บข้อมูล เป็น text (ไม่เอาไปบวกลบคูณหารกับฟิลด์อื่นใด)
- ต้องเก็บความกว้าง 13หลัก น้อยกว่านี้ไม่ได้ มากกว่าก็ไม่ได้
- แต่ละอักขระต้องเป็นตัวเลขเท่านั้น
- ฯลฯ

ผมก็จะเขียนเงื่อนไขการตรวจสอบดังนี้
Private Sub...... (cancel as integer)
if len(text1)<> 13 then goto noSave
for i = 1 to 13
if isnumeric(mid(text1,i,1))=false then goto noSave
next
' ---- if .... ฯลฯ
exit sub

noSave:
    msgbox "กรอกข้อมูลใน Text1 ไม่ถูกต้อง"
    cancel=true
End Sub

คงพอได้แนวทางนะครับ
5 @R05611
      ขอบพระคุณมากครับอาจารย์ ต้องลำบากให้อาจารย์ตีความใหม่อีกผมนี้แย่จริงครับ อาจารย์ตีความถูกต้องแล้วครับผม

       ที่ผมใช้อยู่เป็นแบบที่ 2 ครับอาจารย์ อาจารย์ชี้แนะดีมากเลยครับ
ผมเข้าใจแล้วครับ ทำให้ผมคิดต่อยอดจากคำตอบของอาจารย์ได้มาก
เลยครับ   

        ขอพระคุณมากเลยครับ
6 @R06918
สวัสดีคะ ดิฉันมาขอความช่วยเหลือเรื่องการตรวจสอบข้อมูลก่อนการบันทึกคะ
ดิฉันมีtextbox 3 ตัวที่ต้องการให้ตรวจสอบ
text1 เป็น การใส่วันที่ type เป็น date/time (17-Oct-10)     
text2 เป็น การใส่เวลา type เป็น date/time (08.00)
text3 เป็น การใส่เวลา type เป็น date/time (17.00)
เมื่อมีการป้อนข้อมูลผ่านหน้าฟอร์ม แล้วต้องการให้ข้อมูลวันเวลาไม่ซ้ำกัน จะเขียนcodeหรือเงื่อนไขยังไง
ตัวอย่างเช่น 17-Oct-10 08.00 17.00 (1)
17-Oct-10 08.00 11.00 (2) ไม่สามารถใส่ข้อมูลนี้ได้ (เนื่องจากเวลาอยู่ในช่วงที่มีการร้องขอแล้ว)
17-Oct-10 09.00 11.00 (3) ไม่สามารถใส่ข้อมูลนี้ได้ (เนื่องจากเวลาอยู่ในช่วงที่มีการร้องขอแล้ว)

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