ขอโค๊ดควบคุมการคีย์ข้อมูลให้ตรงรูปแบบค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 4,002   16
URL.หัวข้อ / URL
ขอโค๊ดควบคุมการคีย์ข้อมูลให้ตรงรูปแบบค่ะ

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

1-ต้องคีย์ตัวเลขให้ครบ 13 หลัก = ถ้าไม่ครบให้ขึ้น MagBox เตือน
2-เลขรหัสจะซ้ำกับของเดิมไม่ได้ = ถ้าซ้ำให้ขึ้น MagBox เตือน
3-ให้โฟกัสอยู่ที่ฟิสด์เดิม จนกว่าจะทำถูกเงื่อนไข หรือยกเลิกการคีย์

หนูอขอทราบโค๊ดดังกล่าวว่าต้องเขียนอย่างไร และใส่ไว้ที่ตำแหน่งไหนค่ะ

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

1 @R00962
-- ตาราง
ตารางที่เก็บข้อมูลชื่อ tbEmployee
ฟิลด์ที่เก็บรหัสประจำตัวชื่อ em_idcard
-- ฟอร์ม
textboxt ที่ให้กรอกข้อมูลรหัสประจำตัว ชื่อ tx_idcard ผูกไว้กับฟิลด์ em_idcard

โค้ด เขียนไว้ในเหตุการณ์ ก่อนจะอัพเดต ของ textbox ตัวนี้แหละครับ

Private Sub tx_idcard_BeforeUpdate(Cancel As Integer)
if not isnumeric(tx_idcard) or _
len(tx_idcard)<>13 or _
not isnull(Dlookup("em_idcard", "tbEmployee","[em_idcard] = " & tx_idcard))_
then cancel = True
End Sub
2 @R00965
ขอขอบคุณ อาจารย์ yeadram ค่ะ แต่หนูยังไม่เข้าใจว่า จะเพิ่ม MsgBox คำเตือน ในแต่ละเหตุการ ได้ตรงไหนอย่างไร หนูลองใส่เพิ่มไประหว่างบรรทัดแล้วมัน Error ค่ะ ตอนนี้เลยยังทำต่อไม่ได้ รบกวนอาจารย์ช่วยชี้??นะอีกหน่อยนะคะ หนูเด็กใหม่ยังไม่ค่อยเข้าใจอะไรมากนักค่ะ
3 @R00967
ขออภัยครับ ลืมเรื่อง msg ที่คุณต้องการไปเลย
Private Sub tx_idcard_BeforeUpdate(Cancel As Integer)
if not isnumeric(tx_idcard) then
    MsgBox "ข้อมูลที่กรอกไม่ใช่ตัวเลข", vbCritical, "ข้อมูลผิด"
    cancel = True
Elseif len(tx_idcard)<>13 then
    MsgBox "จำนวนอักขระ ไม่ถูกต้อง", vbCritical, "ข้อมูลผิด"
    cancel = True
Elseif not isnull(Dlookup("em_idcard", "tbEmployee","[em_idcard] = " & tx_idcard)) then
    MsgBox "รหัสนี้มีในระบบแล้ว", vbCritical, "ข้อมูลผิด"
    cancel = True
End If
End Sub


สังเกตดูโค้ดของ reply นี้กับ reply ก่อนหน้านะครับ มีจุดเหมือน จุดแตกต่างตรงไหนบ้าง อาจจะทำให้มือใหม่ๆ รู้จักวิธีพลิกๆ แพลงๆ ปรับๆ เปลี่ยนๆ นิดๆ หน่อยๆ มันก็จะตรง และลงตัวกับความต้องการของเราๆ ท่านๆ ได้ง่ายๆ ครับ
4 @R00968
ตอบได้ทันใจดีจังเลยค่ะอาจารย์ หนูขอแจ้งปัญหาเพิ่มเติมนิดนึงค่ะอาจารย์ โค้ดของ reply แรกนั้นหนูลองเอา MsgBox ออกหมดเลย แต่มันก็ยัง Error เป็นสีแดงทุกบรรทัดเลยค่ะ ยังไม่ทราบว่าผิดตรงไหน แต่ตอนนี้ได้โค้ดของ reply หลังนี่กำลังจะลองดูค่ะ

ขอขอบคุณอาจารย์ที่กรุณาค่ะ
5 @R00969
ขอรายงานผลค่ะอาจารย์

_เมื่อคีย์ข้อมูลไม่ครบ 13 หลักหรือผิดอักขระ MsgBox เตือนได้ถูกต้องค่ะ

แต่ว่า...

_เมื่อคีย์ข้อมูลซ้ำกับที่มีอยู่แล้ว มันจะ Error ที่บรรทัดล่างนี้ค่ะ

Elseif not isnull(Dlookup("em_idcard", "tbEmployee","[em_idcard] = " & tx_idcard)) then

หนูไม่ทราบว่ามันผิดตรงไหน ลองปรับแก้ดู (เดาสุ่ม) ก็ไม่ได้ผลค่ะอาจารย์
6 @R00971
ขอรายงานเพิ่มเติมค่ะอาจารย์

OK..ได้แล้วค่ะ...

ลองค้นหาเรื่อยไป พอดีไปเจอโค๊ดใน expert2you ของ อาจารย์ sakdapl ท่านเขียนเอาไว้ ซึ่งดูแล้วตรงตามที่หนูต้องการ จึงลองเอามาใช้ดู โดยเอามาแทนที่เฉพาะบรรทัดที่ Error นอกนั้นใช้อันเดิมของอาจารย์ yeadram ทั้งหมด ปรากฏว่าเรียบร้อยใช้ได้ครบถ้วนเข้ากันได้ดีค่ะ โค๊ดที่ อาจารย์ sakdapl เขียนไว้ เมื่อนำมาปรับแก้แล้ว จะมีดังนี้ค่ะ

ElseIf Nz(DLookup("em_idcard", "tbEmployee", "em_idcard='" & Me.tx_idcard & "'"), "zzzz") <> "zzzz" Then

ีหนูอยากทราบเพื่อเก็บไว้เป็นความรู้ค่ะอาจารย์ ว่า โค๊ดทั้งสองนี้มันมีความหมายแตกต่างกันอย่างไรค่ะ

ยังไงก็ต้องขอขอบคุณ อาารย์ yeadram และอาจารย์ sakdapl ไว้เป็นอย่างสูงนะคะ
7 @R00972
ขอเรียนถามเพิ่มเติมเพื่อต้องการนำไปประยุกต์อีกหน่อยค่ะ

Private Sub tx_idcard_BeforeUpdate(Cancel As Integer)
if not isnumeric(tx_idcard) then
    MsgBox "ข้อมูลที่กรอกไม่ใช่ตัวเลข", vbCritical, "ข้อมูลผิด"
    cancel = True

จากโค๊ดคำสั่งที่อาจารย์ให้ไว้นี้ หากหนูต้องการประยุกต์นำไปใช้กับฟิลด์รหัสรูปแบบอื่น เช่น

รูปแบบของรหัสจะต้องเป็น A-0000 (ต้องเริ่มด้วย A-แล้วตามด้วยตัวเลขอีก4หลัก)

ลักษณะนี้เราต้องใช้โค๊ดอย่างไรคะอาจารย์
8 @R00974
ตอบ R00972
sq = "A-0000"

แยกการตรวจ sq ออกเป็นสองส่วน
ส่วนหน้าคือตัวอักษรและสัญลักษณ์ มีสองอักขระหน้าสุด ก็ใช้

if left(sq, 2)<>"A-" then

ส่วนที่เหลือ คือ อักขระ 4 ตัวหลังต้องการตรวจสอบว่าเป็นตัวเลขหรือไม่ ก็ใช้

if isnumeric(right(sq, 4)) then

เมื่อจะเอาสองการตรวจสอบมารวมกันก็อาจอยู่ในรูป
if left(sq, 2) <> "A-" OR not isnummeric(right(sq, 4)) then
----- คำสั่งเมื่อ ข้อมูลไม่ถูกต้อง เช่น cancel = true
Else
----- คำสั่งเมื่อข้อมูลถูกต้อง
End if

หรือหากต้องการแยกเงื่อนไขออกเพื่อจะแจ้งเหตุผิดพลาดออกเป็นคนละ message ก็อาจใช้ if--then--elseif--then-- หรือ อาจใช้ select--case ก็ได้
เช่น
if left(sq, 2) <> "A-" then
msgbox "กลุ่มรหัสไม่ถูกต้อง"
cancel=true
elseif not isnummeric(right(sq, 4)) then
msgbox "เลขลำดับ ผิดรูปแบบ"
cancel = true
end if
9 @R00975
ตอบ R00971

ความแตกต่างของ
ElseIf Nz(DLookup("em_idcard", "tbEmployee", "em_idcard='" & Me.tx_idcard & "'"), "zzzz") <> "zzzz" Then
กับ
Elseif not isnull(Dlookup("em_idcard", "tbEmployee","[em_idcard] = " & tx_idcard)) then

- โดยแนวคิด ตอบ ไม่แตกต่างกัน คือตรวจสอบว่าเคยมีข้อมูลนี้ในตารางหรือไม่
- โดยคำสั่ง
dlookup() คือการเข้าไปตรวจค้นจากแหล่งข้อมูล ถ้าผลการตรวจค้นไม่เจออะไรเลยจะคืนค่ามาเป็น NULL
อากิวร์เมนต์สุดท้ายคือเงื่อนไขการตรวจสอบ ของผมที่ตรวจสอบไม่ได้อาจเพราะเขียนเงื่อนไขผิด ไม่ได้ใส่ single quote คร่อมเอาไว้ในค่าเปรียบเทียบ ที่เหลือ ก็ ระหว่างของผมกับของ อ.sakdapl ก็เหมือนกันครับ

- nz() ของ อ.sakdapl คือการแทนค่าทันที ที่ผลลัพธ์เป็น NULL
nz(sq, "zzz") หมายความว่า ถ้าผลของ sq เป็นอื่นๆ ที่ไม่ใช่ NULL ฟังก์ชั่นนี้ จะคืนค่าเป็นผลนั้นๆ แต่ถ้าเป็น NULL เมื่อไหร่ มันจะคืนค่ามาเป็น zzz แทน
แล้ว อ.sakdapl เช็คต่อทันทีเลยว่า if nz(sq, "zzz")<> "zzz" then
มันเท่ากับ zzz หรือเปล่า
- ส่วน isnull ที่ผมใช้ จะตรวจสอบแค่ว่า ข้อมูลเป็น NULL หรือไม่ โดยจะปล่อยผลลัพธ์ให้เป็นอย่างที่เป็น ไม่มีการแทนค่าใดๆ เข้าไป
isnull(dlookup()) หมายความว่า ผลการค้นได้มาเป็นค่า NULL หรือไม่ โดยคำตอบที่ได้จะมีแค่สองทาง คือ True กับ False
10 @R00977
โห..หนูอยากเก่งแบบอาจารย์ทั้งสองจังเลย อ้อ..นอกจากท่านทั้งสองนี้แล้ว ยังมีอาจารย์ สุภาพ ไชยา อาจารย์ สุชาติ ชลบุรี อาจารย์ ผึ้งน้อย และอาจารย์ akk อีก ที่หนูได้เก็บกี่ยวความรู้ไว้มากมายแบบหาซื้อที่ไหน ก็คงไม่ได้ ที่หนูใช้ Access เป็น และพอเอาตัวรอดได้ ก็เพราะบรรดาท่านเหล่านี้แหละ ขอให้ทุกท่านมีความสุขและอยู่คู่ชาว Access ตลอดไปนะคะ
ขอบคุณค่ะ
11 @R00978
เรียนท่านอาจารย์ครับ ผมอยากได้ไฟล์ตัวอย่าง บ้างครับ เพราะผมหามานานแล้วครับ พึ่งจะเจอ รบกวนท่านอาจารย์ ส่งไฟล์ตัวอย่างให้ผมได้ไหมครับ เพื่อเป็นแนวทางที่จะฝึกและศึกษาต่อไปครับ (Piyaphan@se-ed.com)
12 @R00984
ต้องรบกวนอาจารย์ อีกแล้วละค่ะ
หนูลองแยกใช้เอาเฉพาะอันแรกก่อนคือ

if left(sq, 2) <> "A-" then
msgbox "กลุ่มรหัสไม่ถูกต้อง"

ผลคือ..มันจะแจ้งว่า "กลุ่มรหัสไม่ถูกต้อง" ตลอด แม้เราจะใส่ A เป็นตัวแรกถูกต้อง หรือ จะใส่เป็นตัวอื่นๆ เช่น B,C,D,E ก็ให้ผลแบบเดียวกัน

สำหรับอันที่สอง

if isnumeric(right(sq, 4)) then

นั้น กลับไม่มีอะไรเตือนมาเลยค่ะ ไม่ว่าจะใส่ตัวเลขครบจำนวนหรือไม่ก็ตาม

หนูจึงต้องขอรบกวนอาจารย์อีกจนได้่ค่ะ (รบกวนมาเยอะแล้ว)
13 @R00985
ตัวอย่างที่ทำไว้ ส่งไปทางอีเมล์แล้วนะครับ
และสำหรับผู้ที่เข้ามาอ่านทีหลัง ถ้าสนใจอยากได้ตัวอย่างบ้าง ก็ตามลิงค์นี้นะครับ
(ID=accboard, PW=accgmail)
http://mail.google.com/mail/?ui=1&ik=1989ec72df&view=att&th=11da9c0bcefa49c9&attid=0.1
14 @R00991
ประทานโทษครับท่านอาจารย์ครับ คือ ผมได้โหลดมาลองดูแล้วครับ แต่ปัญหามันเกิดขึ้นแบบเดียวกับ คุณมาลีเลยครับ คือพอป้อนรหัสที่ซ้ำเข้าไปแล้ว มันกลับขึ้นฟ้องตรงนี้ครับ Elseif not isnull(Dlookup("em_idcard", "tbEmployee","[em_idcard] = " & tx_idcard)) then
ผมเลยงงๆ ครับ รบกวนท่านอาจารย์ อธิบายให้ผมด้วยครับ (ขอโทษครับผมลืมไป Piyaphan@Se-ed.com)
15 @R00992
แก้ไขให้แล้วครับ
พอดีผมก็อปไปใส่เลย ไม่ได้แก้ตามที่เคยแจ้งไป จริงๆ ก็คือผมลืมใส่ single quote นั่นแหละครับ

ก่อนนี้
ElseIf Not IsNull(DLookup("em_idcard", "tbEmployee", "[em_idcard] = " & tx_idcard)) Then

เปลี่ยนเป็น
ElseIf Not IsNull(DLookup("em_idcard", "tbEmployee", "[em_idcard] = '" & tx_idcard & "'")) Then
16 @R00995
ไชโย..แก้ได้แล้วค่ะอาจารย์ หนูลองปรับนู่นแก้นี่เติมนั่นเติมนี่ จากเดิมบรรทัดบน แก้ใหม่เป็นบรรทัดล่าง ในที่สุดก็ได้ตามที่ต้องการแล้วค่ะ

if left(sq, 2) <> "A-" OR not isnummeric(right(sq, 4)) then
if (Left(sq, 2)) <> "A-" OR not isnumeric(Right(sq, 4)) then

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