กำหนดเงื่อนไขการบันทึกข้อมูลไม่ให้ซ้ำกัน
กระทู้เก่าบอร์ด อ.Yeadram

 7,938   17
URL.หัวข้อ / URL
กำหนดเงื่อนไขการบันทึกข้อมูลไม่ให้ซ้ำกัน

คือผมต้องการกำหนดเงื่อนไข ที่หน้าฟอร์มเพื่อต้องการบันทึกข้อมูลลงในตารางไม่ให้ซ้ำกัน เช่น ข้อมูล AA   อยู่ในตาราง 90tblITEM_BOM      แต่พอมาอีกวันหนึ่ง ผู้ใช้เลือกข้อมูล AA อีก แต่เมื่อมันถูกบันทึกไปแล้วเลยไม่ต้องการให้บันทึกซ้ำอีกครั้ง ต้องทำอย่างไรครับ

แต่ปัจจุบันผมลองใช้ แมโคร ช่วยแต่ยังมีปัญหา
1. เงื่อนไขคือ DCount("[ITEM_CODE]","90tblITEM_BOM","[ITEM_CODE]=Forms![90forITEM_BOM]![ITEM_CODE]")>0   
แอคชันคือ CancelEvent       ข้อคิดเห็นคือ หยุดขั้นตอนการเพิ่มข้อมูลใหม่

2. เงื่อนไขคือ   ...    แอคชันคือ MsgBox       ข้อคิดเห็นคือ   เงื่อนไขเดิม แจ้งว่าข้อมูลซ้ำ

แต่ก็ยังมีปัญหาอยู่ จะออกจากข้อมูลก็ไม่ได้ ไม่รู้มีเงื่อนไขเพิ่มอีกหรือเปล่าครับ

ขอบคุณมากครับ
paitoon



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

1 @R01671
ลอง   DCount("[ITEM_CODE]","90tblITEM_BOM","[ITEM_CODE]= """ & Forms![90forITEM_BOM]![ITEM_CODE] & """")>0
2 @R01672
ลอง
3 @R01673
ขออภัยครับ อาจารย์
คำว่า CODE พิมพ์ใหญ่ พร้อมกับเครื่องหมาย สี่เหลี่ยม
เมื่อมาติดกันแล้ว มันเป็นคำสั่งของ webbord ครับ

รูปแบบคือต้องการเน้นส่วนที่เป็น Code ให้เด่นด้วยพื้นสีเขียวอ่อน
แต่สคริปต์ไม่สมบูรณ์ครับ เลยไม่ทำเมนูไว้ให้ใช้กัน
แต่ถ้าใครอยากลองเล่น ก็เชิญครับ รูปแบบคำสั่งคือ ให้พิมพ์หน้าข้อความที่ต้องการด้วย
[ C O D E ] (เขียนติดกันให้หมดนะครับ) แล้วก้เขียนข้อความ แล้วตามด้วย
[ / C O D E ] (เขียนติดกันให้หมด เหมือนเดิมครับ)
4 @R01674
ขอบคุณ คุณ yeadram และอาจารย์ สันติสุข ครับ ที่ให้คำแนะนำ แต่ผมยังไม่ได้ลอง ผมลองไปทำ ที่ไฟล์ก่อนครับ เดียวผมจะมา รายงานอีกทีน่ะครับ

ขอบคุณมากครับ
PAITOON
5 @R01699
คุณ yeadram และอาจารย์ สันติสุข   ผมลองทำแล้วแต่ยังไม่ได้เลยครับ จะแนบไฟล์ภาพ ใช้ตรงไหนครับ ใช้ add image หรือ Image Upload ภาพ

ขอบคุณมากครับ
paitoon
6 @R01701
ถ้าวางภาพไว้ที่โฮสต์อื่น หรือ จะอ้างถึงภาพ ในอินเตอร์เน็ตอื่นๆ ให้ใช้ Add Image พอมีป๊อบอัพขึ้นมาถาม ก็ให้ใส่ URL ให้มัน (ไม่มีการย้ายไฟล์ ใดๆเกิดขึ้น แบบนี้ไม่ต้องรอสั่งปุ๊บ ใช้ได้เลย)


แต่ถ้าภาพนั้น อยู่นั้นเครื่องของเรา ให้ใช้คำสั่ง Image Upload ครับ
จะเป็นการก้อปปี้ภาพนั้น ขึ้นมาไว้ในเว็บนี้ อาจจะต้องรอหน่อยสำหรับภาพที่มีความจุเยอะ

ลองดูครับ
7 @R01702
ผมได้ upload ภาพแล้วช่วยดูให้หน่อยครับ
8 @R01703
ทำไมไม่มีภาพที่ถูก upload เลยครับ ผมต้องทำอย่างไรดีครับ เพื่อจะให้ทุกท่าน จะได้เห็นปัญหาที่ผมถาม พร้อมรายละเอียดที่ผมทำเป็นภาพไว้ครับ


ขอบคุณครับ
paitoon
9 @R01704
ส่งไฟล์ที่มันปัญหา หรือภาพตัวอย่าง ไปที่อีเมล์ accboard @ gmail
เขียนหัวเรื่องของอีเมล์ ว่า "บันทึกข้อมูลไม่ให้ซ้ำกัน - paitoon"
เขียนรายละเอียดของปัญหา หรือพยามชี้เป้าให้ถึงปัญหาของคุณ บอกไปเลยว่า ฟอร์มใด ตารางใด ชื่อคอนโทรลว่าอะไร อ้างถึงฟิลด์อะไรบ้าง แล้วคุณจะได้คำตอบเร็วครับ
10 @R01705
ผมได้ส่งไฟล์ ตัวอย่าง พร้อม รายละเอียดปัญหาที่เกิด เป็น ภาพ ประกอบส่งไปที่ อีเมล์แล้วครับ ช่วยหน่อยครับ


ขอบคุณครับ

paitoon
11 @R01706
เห็นไฟล์แล้ว จะต้องบอกว่า แม้มีแค่คำสั่งบรรทัดเดียว แต่มันผิดเละเทะไปหมด ผิดตั้งแต่การออกแบบฐานข้อมูลแล้ว จึงไม่สามารถทำงานคำสั่งนี้ได้

ปัญหาคือ
1) tblBOM มี BOM_ID เป็น AutoNumber และ ITEM_CODE เป็น Long Integer -- ทำไมถึงใช้เป็น AutoNumber ? รู้ไหมมันคืออะไร ทำงานอย่างไร ? แนวคิดของคุณในการออกแบบ BOM นี้เป็นอย่างไร ? ผมไม่สามารถบอกได้ว่ามันถูกหรือผิดเพราะผมไม่รู้จุดประสงค์ในการออกแบบอย่างนี้ แต่...มองโดยคร่าวๆแล้ว มันน่าจะ ผิด

2) tblITEM มี ITEM_ID เป็น AutoNumber (อีกแล้ว), ITEM_CODE คราวนี้ กลายเป็น Text Length 50, ITEM_NAME เป็น Text Length 50 -- ทำไมจะต้องมีทั้ง ITEM_ID และ ITEM_CODE ? ทำไม ITEM_CODE เป็น text ซึ่งไม่สัมพันธ์กับ ITEM_CODE ใน tblBOM ?

3) คุณล่อทั้ง macro และ event procedure พอเจอ macro มันก็ไม่ผ่านแล้วครับ แต่สมมุติว่าเอาแต่ event procedure ซึ่งคุณเขียนเป็น
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("ITEM_CODE", "tblBOM", "[ITEM_CODE] Like '" & Me.txtITEM_CODE & "'")) Then
MsgBox "ข้อมูลซ้ำ โปรดเลือกใหม่", vbCritical
Cancel = True
End If
End Sub


มันก็ไม่ผ่านอีกนั่นแหล่ะ

3.1) ทำไมใช้ Like operator ?
3.2) [ITEM_CODE] ใน tblBOM เป็น Long Integer คุณจะใช้ Like operator ไม่ได้ มันใช้กับเปรียบเทียบข้อมูลที่เป็น text เท่านั้น ดังนั้นมันก็ error ครับ

สรุปคือ สิ่งแรกที่ต้องทำให้ถูกต้องคือ ออกแบบเทเบิลทั้ง 2 ให้ถูกต้องก่อนครับ อย่างอื่นเอาไว้ทีหลังเลย
12 @R01707
อาจารย์ครับ
โค้ดนั่นผมเขียนเองครับ ผมเป็นคนตอบเมล์ไป ผมไม่ได้ดูด้วยซ้ำว่ามันเป็น Long Integer ผมนึกว่ามันเป็น string ผมใช้ทั้ง Like ทั้ง single quote เลย อิอิ

ปกติของเดิมๆ ของคุณ paitoon มีมาแค่ แม็คโครครับ ผมดูแมคโครแล้วงง กับงานของมัน (ส่วนตัวแล้ว ไม่ค่อยใช้แมคโครครับ) ผมเลยแนะให้คุณ paitoon ใช้ vba ดีกว่า แล้วก็เขียนโค้ดให้ไป ไม่มีอาจารย์คอยบอกนี่ ผิดเต็มๆ อย่างอาจารย์ว่าครับ เหอๆ ขออภัยคุณ paitoon ด้วยครับ ให้โค้ดผิด
13 @R01708
ขอบคุณท่าน อ.สันติสุข มากครับที่ให้คำแนะนำ ผมเลยมานั้งคิดผิดเต็ม ๆ ผมเลยออกแบบฐานข้อมูลใหม่ แล้วทำตามที่ อ.สันติสุข ส่งเมล์ให้ดู แต่ก็ยังติดที่ว่าเมื่อบันทึกข้อมูลที่มันซ้ำกันแล้ว มักก็ฟ้องครับ แต่มันจะทำงานต่อไปไม่ได้มันจะฟ้อง ( ข้อมูลซ้ำ โปรดเลือกใหม่ ) ไม่รู้ว่าถูกหรือเปล่าครับ ผมส่งเมล์ให้ อ.สันติสุข ดูให้ผมใหม่อีกทีครับใช้หรือเปล่า ที่เมล์ accboard@gmail.com
แล้ว   แล้วขอให้ อ.สันติสุข ช่วยอธิบายตรง Long Integer ว่ามันต้องใช้อย่างไรในฐานข้อมูลครับ

ขอบคุณมากครับผม
paitoon
14 @R01710
- จะว่า ถูก มันก็ถูกในแง่ที่มันก็ทำงานได้ ฟ้องว่าซ้ำได้ตามที่ต้องการ แต่ก็ไม่ต้องใช้ Like operator แล้ว เพราะมันไม่ใช่ Text ดังนั้นแก้เป็นอย่างนี้

If Not IsNull(DLookup("ITEM_ID", "tblBOM", "[ITEM_ID] = " & Me.item)) Then

- แต่จะว่า ผิด มันก็ผิดตรงที่เทเบิล BOM (หวังว่ามันคือ Bill of Material นะครับ) คุณออกแบบให้มี BOM_ID เป็น PrimaryKey (ผมจะเรียกย่อๆว่า PK) และมี ITEM_ID เป็นอีกฟิลด์นึง แล้วเช็คในโปรแกรมว่า ITEM_ID ไม่ให้ซ้ำกัน หมายความว่า คุณจะมี BOM_ID หรือไม่มี มันก็ไม่มีประโยชน์อะไรเลย จริงไหมครับ เพราะหลัก(ของคุณ) คือ ITEM_ID ไม่ให้ซ้ำกัน ก็ให้มีแต่ฟิลด์ ITEM_ID ไปเลย ! และถ้ามีแต่ ITEM_ID   มันก็คือเทเบิล tblITEM นั่นเอง ผมก็ไม่เข้าใจว่าทำไมต้องมี ITEM_ID ในเมื่อใช้ ITEM_CODE เป็น PK ก็ได้ ดังนั้นก็จะบอกด้วยว่า tblITEM ก็ น่าจะ ออกแบบผิดเช่นกัน

- ปกติเทเบิล tblITEM จะมี ITEM_CODE เป็น PK แล้วจะมีฟิลด์ ITEM_NAME, ITEM_SPECIFICATION, ...

- ส่วน tblBOM จะมี PK เป็น PARENT_ITEM_CODE และ CHILD_ITEM_CODE ทั้ง 2 ฟิลด์รวมกันครับ

- ส่วน Long Integer นั้นก็ใช้เก็บตัวเลขที่มีขนาด 4 bytes (32 bits) จึงเก็บค่าได้ตั้งแต่ ค่าลบ 2,147,483,648 ถึงค่าบวก 2,147,483,647 ครับ อีกอย่างคือ Long Integer ใช้สำหรับอ้างข้อมูลที่เกิดจากฟิลด์ประเภท AutoNumber ด้วย เพราะ AutoNumber ก็ใช้ 4 Bytes เช่นกัน
15 @R01712

ผมขอตอบ หัวข้อของ อ.สันติสุข ครับ //* ผมก็ไม่เข้าใจว่าทำไมต้องมี ITEM_ID ในเมื่อใช้ ITEM_CODE เป็น PK =// คือที่ผมสร้าง table ITEM_ID เพื่อไม่ให้ข้อมูลมันซ้ำกัน ส่วน ITEM_CODE ผมมีข้อมูลที่เป็น ตัวอักษรร่วมอยู่ด้วยมันเป็น code ของสินค้า ผมก็เลยทำคีย์หลักแยกกันโดยใช้ ITEM_ID

อ.สันติสุข ครับผมลองทำแล้วก็ยังไม่ได้ที่ต้องเลยคือมันฟ้องว่าซ้ำ แต่เวลาเราจะเลื่อนไปทำงานอย่างอื่น เช่น ยกเลิก หรือเลื่อนเม้าท์ มันก็ไม่ได้ ......มันบังคับให้เราเลือกแต่ ITEM_CODE ตัวใหม่อย่างเดี่ยว เพื่อที่จะได้ทำงานต่อได้ แล้วถ้าเราไม่มี ITEM_CODE หรือไม่ได้สร้าง ITEM_CODE ใหม่มันก็ทำงานไม่ได้

อ.สันติสุข ขอนิดหนึ่งครับ!!!!!! ทำเป็นตัวอย่างแบบให้ดูในไฟล์ที่ส่งให้ได้ไหมครับ ขอบคุณครับ

paitoon
16 @R01714
ITEM_CODE ไม่ว่ามันจะเป็นตัวเลขหรือตัวอักษร มันก็ทำเป็นคีย์หลัก (PK) ได้นี่ครับ สินค้าตัวหนึ่งๆ จะเปลี่ยนโค้ดไปได้เรื่อยๆหรือ? ผมคิดว่าไม่นะ ถ้าไม่เปลี่ยน มันก็จะไม่ซ้ำ ถ้าไม่ซ้ำ มันก็เหมือนกับ ITEM_ID ที่มีค่าไม่ซ้ำเช่นกัน ถ้าเช่นนั้นแล้ว เราจะสร้าง ITEM_ID ขึ้นมาให้มันรกเกินความจำเป็นในเทเบิลทำไมครับ เราก็ใช้ ITEM_CODE เป็น PK ไปเลย ... แต่ถ้ามีเหตุที่ไม่ทำให้เป็นเช่นนั้น การสร้าง ITEM_ID ขึ้นมาเป็น PK ก็มีเหตุผลที่รองรับ ก็เป็นสิ่งที่ยอมรับได้ อย่างไรก็ตาม การใช้ AutoNumber เป็น PK ระวังจะเจอปัญหายุงยากในการจัดการข้อมูลภายหลังครับ ... การออกแบบฐานข้อมูล มันไม่มีอะไรตายตัวหรอกครับว่าออกแบบอย่างนี้ถูก อย่างนี้ผิด มันขึ้นกับวัตถุประสงค์ ข้อกฏระเบียบ และเงื่อนไขในระบบนั้นเป็นตัวกำหนด

ผมไม่ค่อยแน่ใจที่คุณบอกว่า "เลื่อนไปทำงานอย่างอื่น เช่น ยกเลิก หรือเลื่อนเม้าท์ มันก็ไม่ได้" นั้น หมายถึงคุณต้องการทำอะไรแค่ไหนนะครับ ปกติถ้าคุณไม่ต้องการจะป้อนแล้วหรือต้องการเคลียร์เรคอร์ดที่กำลังป้อนอยู่ ก็ให้คุณกดคีย์ ESC ครับ กด 1 ครั้งยกเลิกฟิลด์ที่กำลังป้อน กดอีก 1 ครั้งเป็นการยกเลิกเรคอร์ดที่กำลังป้อนทั้งเรคอร์ด หรือถ้าต้องการผ่อนปรนการตรวจสอบให้เกิดเมื่อต้องการจะบันทึกเรคอร์ด แทนที่จะเกิดเมื่อเลือก ITEM_CODE ทันที ก็ให้ย้ายโค้ดเดิมทั้งหมดนั่นแหล่ะ ไปที่ Form_BeforeUpdate event procedure แทนครับ
17 @R01718
ขอบคุณ อ.สันติสุข มากครับ ...อ้อกด ESC หรือครับ นี้แหละครับที่ผมถามและสิ่
งที่ต้องการ ถามหัวข้อเดี่ยวแต่ได้ความรู้จาก พี่ ๆ ทุกท่านและ อ.สันติสุข มากเลยทำให้มีความรู้มากอีก

......สรุปแล้วตอนนี้ผมได้ความรู้และคำตอบตรงประเดนแล้วครับ


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