กระทู้เก่าบอร์ด อ.Yeadram
7,223 18
URL.หัวข้อ /
URL
การเตือนเมื่อข้อมูลซ้ำ
มีปัญหาให้ช่วยอีกแล้วคะ
มีฟอร์มที่ไว้กรอกรายงาน PM นะคะจะมีข้อมูลคือ วันที่ ผลัดที่ตรวจงาน
กลุ่มเครื่องจักร ชื่อเครื่องจักร รายละเอียด
รายงาน PM จะมีการตรวจทุกวันและจะมีเรื่องเดียวกันเยอะมาก จนกว่าช่างจะแก้ไข ก็จะตัดเอง
เช่น เครื่องบดสกปรก จะมีรายงานตั้งแต่วันที่1-7 ซ้ำกัน 7 วัน 7ข้อมูล
ปัญหานะคะจะให้คนที่กรอกรู้ได้ยังไงว่ามีข้อมูลนี้อยู่แล้ว เป็นการเตือนข้อมูลซ้ำนะคะ จะได้ไม่ต้องเสียเวลาการตัดข้อมูลเองตอนท้ายเดือนนะคะ
มีฟอร์มที่ไว้กรอกรายงาน PM นะคะจะมีข้อมูลคือ วันที่ ผลัดที่ตรวจงาน
กลุ่มเครื่องจักร ชื่อเครื่องจักร รายละเอียด
รายงาน PM จะมีการตรวจทุกวันและจะมีเรื่องเดียวกันเยอะมาก จนกว่าช่างจะแก้ไข ก็จะตัดเอง
เช่น เครื่องบดสกปรก จะมีรายงานตั้งแต่วันที่1-7 ซ้ำกัน 7 วัน 7ข้อมูล
ปัญหานะคะจะให้คนที่กรอกรู้ได้ยังไงว่ามีข้อมูลนี้อยู่แล้ว เป็นการเตือนข้อมูลซ้ำนะคะ จะได้ไม่ต้องเสียเวลาการตัดข้อมูลเองตอนท้ายเดือนนะคะ
18 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R05600
ขอบคุณสำหรับคำตอบนะคะ
แต่มีข้อสงสัยอยู่อย่างหนึ่งนะคะ
ตรง
If rst![id_TabianBoek] = Me.id_TabianBoek And rst![id_DR]=Me.id_DR Then
อธิบายได้ไหมคะว่าเป็นยังไงนะคะ
แล้วก้อ
Private Sub id_DR_AfterUpdate()
ของดิวเป็นแบบฟอร์มนะคะ มีtext ชื่อว่า รายละเอียด ต้องเปลี่ยนจาก id_DR เป็น รายละเอียด ถูกต้องหรือป่าวคะ
แต่มีข้อสงสัยอยู่อย่างหนึ่งนะคะ
ตรง
If rst![id_TabianBoek] = Me.id_TabianBoek And rst![id_DR]=Me.id_DR Then
อธิบายได้ไหมคะว่าเป็นยังไงนะคะ
แล้วก้อ
Private Sub id_DR_AfterUpdate()
ของดิวเป็นแบบฟอร์มนะคะ มีtext ชื่อว่า รายละเอียด ต้องเปลี่ยนจาก id_DR เป็น รายละเอียด ถูกต้องหรือป่าวคะ
3 @R05608
ทดสอบอัพรูป
ทดสอบอัพรูป
4 @R05617
ของคุณดิวก็อ้างมาว่า
Rst![ชื่อ Field ที่เป็น Recordset] =ME.รายละเอียด
แต่ก่อนจะมาถึงตรงนี้ได้ การอ้าง RECORDSET ให้อ้างให้ถูกต้อง
ใช้จินตนาการเล็กน้อย ตรง Set rst = Me.RecordsetClone
มันจะไม่ใช่ Set rst = Me.RecordsetClone เสมอไป
การอ้าง Me.RecordsetClone เป็นการอ้าง recortset ชุดเดียวกับ Form
ที่ทำงานอยู่ นัยว่า ขี้เกียจเขียน
คุณต้องไป Set rst ให้ได้ว่าจะให้มันเป็นชุดของ Record ไหน
เช่นการอ้างแบบ ภาษา SQL
Set rst = CurrentDb.OpenRecordset("select buylaw from buylaw order by buylaw")
ตรง Private Sub id_DR_AfterUpdate()
ก็เป็น Private Sub รายละเอียด _AfterUpdate()
เพราะต้องการตรวจสอบหลัง TEXT รายละเอียด มีการ UPDATE ข้อมูล
เอาไปผูกไว้ครับ
ข้อสงสัยทีว่า
If rst![id_TabianBoek] = Me.id_TabianBoek And rst![id_DR]=Me.id_DR Then
มันเป็นยังงัย ขอให้ไปหอ่าน OBJECT เรื่อง DAO พอเป็นพื้นฐานจะเข้าใจการอ้างมาใช้งาน อธิบายในนี้ไม่พอ เพราะยังมีอีกหลาย PROPERTY ที่น่สนใจ
หรือไปที HELP ก็มีครับ
Rst![ชื่อ Field ที่เป็น Recordset] =ME.รายละเอียด
แต่ก่อนจะมาถึงตรงนี้ได้ การอ้าง RECORDSET ให้อ้างให้ถูกต้อง
ใช้จินตนาการเล็กน้อย ตรง Set rst = Me.RecordsetClone
มันจะไม่ใช่ Set rst = Me.RecordsetClone เสมอไป
การอ้าง Me.RecordsetClone เป็นการอ้าง recortset ชุดเดียวกับ Form
ที่ทำงานอยู่ นัยว่า ขี้เกียจเขียน
คุณต้องไป Set rst ให้ได้ว่าจะให้มันเป็นชุดของ Record ไหน
เช่นการอ้างแบบ ภาษา SQL
Set rst = CurrentDb.OpenRecordset("select buylaw from buylaw order by buylaw")
ตรง Private Sub id_DR_AfterUpdate()
ก็เป็น Private Sub รายละเอียด _AfterUpdate()
เพราะต้องการตรวจสอบหลัง TEXT รายละเอียด มีการ UPDATE ข้อมูล
เอาไปผูกไว้ครับ
ข้อสงสัยทีว่า
If rst![id_TabianBoek] = Me.id_TabianBoek And rst![id_DR]=Me.id_DR Then
มันเป็นยังงัย ขอให้ไปหอ่าน OBJECT เรื่อง DAO พอเป็นพื้นฐานจะเข้าใจการอ้างมาใช้งาน อธิบายในนี้ไม่พอ เพราะยังมีอีกหลาย PROPERTY ที่น่สนใจ
หรือไปที HELP ก็มีครับ
5 @R05618
เอาอย่างนี้ก็แล้วกัน ตารางที่คุณต้องการไปตรวจสอบค่าซ้ำสมมุติชื่อตาราง A Field B
code มันจะเป็นอย่างนี้
Private Sub รายละเอียด_AfterUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select B from A")
On Error GoTo errl:
Do Until rst.EOF
If rst![B] = Me.ลายละเอียด Then
MsgBox ("ซ้ำ")
Exit Sub
End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
errl: Exit Sub
End Sub
ประมาณนี้แหละครับ ลองดูครับ อย่าถามมาก แล้วก็ไปอ่านมา
ปล.การวนลูปไปเรื่อยๆ ไม่เหมาะสมนักกับการตรวจสอบข้อมูลจำนวน หลาย RECORD เพราะมันจะช้า คุณต้องไปอ้างการเขียน SQL โดยใช้ WHERE ร่วมด้วย สรุปแล้วก็ไปอ่าน ภาษา SQL พอเป็นพื้นฐาน+DAO พอรู้ ลองผิดลองถูกเดี๋ยวก็ได้ครับ โชคดีครับ
code มันจะเป็นอย่างนี้
Private Sub รายละเอียด_AfterUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select B from A")
On Error GoTo errl:
Do Until rst.EOF
If rst![B] = Me.ลายละเอียด Then
MsgBox ("ซ้ำ")
Exit Sub
End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
errl: Exit Sub
End Sub
ประมาณนี้แหละครับ ลองดูครับ อย่าถามมาก แล้วก็ไปอ่านมา
ปล.การวนลูปไปเรื่อยๆ ไม่เหมาะสมนักกับการตรวจสอบข้อมูลจำนวน หลาย RECORD เพราะมันจะช้า คุณต้องไปอ้างการเขียน SQL โดยใช้ WHERE ร่วมด้วย สรุปแล้วก็ไปอ่าน ภาษา SQL พอเป็นพื้นฐาน+DAO พอรู้ ลองผิดลองถูกเดี๋ยวก็ได้ครับ โชคดีครับ
6 @R05624
ขออภัยพิมพ์ตก
แก้จาก If rst! = Me.ลายละเอียด Then
เป็น If rst![B] = Me.ลายละเอียด Then
แก้จาก If rst! = Me.ลายละเอียด Then
เป็น If rst![B] = Me.ลายละเอียด Then
7 @R05625
อ้าวตกเหมือนเดิม สงสัยเป็นเรื่องของ Webbroad เพราะสังเกตว่าเป็นตัวหนา โดยไม่ตั้งใจ แก้เป็น
If rst![ และพิมฑ์ B และพิมพ์ ] = Me.ลายละเอียด
If rst![ และพิมฑ์ B และพิมพ์ ] = Me.ลายละเอียด
8 @R05639
ขอบคุณนะคะ
9 @R15647
สวัสดีครับ ไม่ได้ตั้งใจขุดนะครับแต่พอดี อยากจะใช้คำสั่งนี้พอดีแต่มัน error ที่ Then ครับ
Private Sub name_AfterUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select name from Test")
On Error GoTo errl:
Do Until rst.EOF
If rst! ME.name = Me.name Then
MsgBox ("ซ้ำ")
Exit Sub
End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
errl: Exit Sub
End Sub
Private Sub name_AfterUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select name from Test")
On Error GoTo errl:
Do Until rst.EOF
If rst! ME.name = Me.name Then
MsgBox ("ซ้ำ")
Exit Sub
End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
errl: Exit Sub
End Sub
10 @R15648
แก้เป็น
If rst!name = Me.name Then
หรือ
If rst(0) = Me.name Then
หรือแก้ทั้งหมดเป็น
If rst!name = Me.name Then
หรือ
If rst(0) = Me.name Then
หรือแก้ทั้งหมดเป็น
Private Sub name_AfterUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select count(name) from Test Where name = '" & Me.name & "'")
If rst(0) > 0 Then
MsgBox ("ซ้ำ")
End If
rst.Close
Set rst = Nothing
End Sub
11 @R15661
ขอบคุณมากๆครับ แต่ยังงงว่า
สรุปมันต้อง ก่อนอัพเดท หรือ หลังอัพเดท ครับ มันน่าจะก่อนนะผมว่า ตรวจสอบผ่านค่อยอัพเดทหรือเปล่าครับ
อันนี้ ไม่รู้ว่าผมเข้าใจถูกไหมครับ
Private Sub ชื่อช่องที่ใส่ข้อมูล_BeforeUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select count(ฟิวในตาราง) from ตาราง Where ฟิวในตาราง = '" & Me.ช่องที่ใส่ในฟอร์ม & "'")
If rst(0) > 0 Then
MsgBox ("ซ้ำ")
End If
rst.Close
Set rst = Nothing
End Sub
สรุปมันต้อง ก่อนอัพเดท หรือ หลังอัพเดท ครับ มันน่าจะก่อนนะผมว่า ตรวจสอบผ่านค่อยอัพเดทหรือเปล่าครับ
อันนี้ ไม่รู้ว่าผมเข้าใจถูกไหมครับ
Private Sub ชื่อช่องที่ใส่ข้อมูล_BeforeUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select count(ฟิวในตาราง) from ตาราง Where ฟิวในตาราง = '" & Me.ช่องที่ใส่ในฟอร์ม & "'")
If rst(0) > 0 Then
MsgBox ("ซ้ำ")
End If
rst.Close
Set rst = Nothing
End Sub
12 @R15682
คือมันไม่ผ่านอะครับ
ผมดันไปตั้งชื่อเหมือนกันหมดเลยเช่น
Table ชือ name
fild ชื่อ name
from ชื่อ name
ช่องกรอก ชื่อ name
เลยงงไปหมดเลยครับ ถ้าแก้ก็ไม่ได้เพราะเก็บข้อมูลไว้เยอะแล้ว และเริ่มทำงานไปแล้วด้วยครับ
ตอนนี้ก็ยังไม่ผ่านอะครับ
ไม่ว่าจะพิมพ์อะไรไปมันก็ขึ้นแบบนี้อะครับ ข้อความเตือน Error
ผมดันไปตั้งชื่อเหมือนกันหมดเลยเช่น
Table ชือ name
fild ชื่อ name
from ชื่อ name
ช่องกรอก ชื่อ name
เลยงงไปหมดเลยครับ ถ้าแก้ก็ไม่ได้เพราะเก็บข้อมูลไว้เยอะแล้ว และเริ่มทำงานไปแล้วด้วยครับ
ตอนนี้ก็ยังไม่ผ่านอะครับ
ไม่ว่าจะพิมพ์อะไรไปมันก็ขึ้นแบบนี้อะครับ ข้อความเตือน Error
This error occurs when an event has failed to run because the location of the logic for the event cannot be evaluated. For example, if the OnOpen property of a form is set to =[Field], this error occurs because a macro or event name is expected to run when the event occurs.
13 @R15683
ชื่อแบบนี้ยังงัยก็ต้องแก้ครับ แก้ได้
14 @R15685
มันเป็นผลทำให้ error ด้วยใช่หรือไม่ครับ
ของผมดังนี้ครับ ควรแก้ยังไงครับ
Table ชื่อ doc_name
Fild ชื่อ doc_name
From ชื่อ add_doc
ช่องใส่ ชื่อ doc_name
แบบนี้อะครับ รันไ่ม่ผ่าน หรือผมใส่ผิดอะครับ
ของผมดังนี้ครับ ควรแก้ยังไงครับ
Table ชื่อ doc_name
Fild ชื่อ doc_name
From ชื่อ add_doc
ช่องใส่ ชื่อ doc_name
แบบนี้อะครับ รันไ่ม่ผ่าน หรือผมใส่ผิดอะครับ
15 @R15686
ฟ้อง Error แบบนี้มันหลายสาเหตุ ผมทดสอบเล็กๆดู ไม่น่าจะเกี่ยวกับชื่อซ้ำนะครับ ตัวโค๊ดเองก็ใช้ได้ไม่มีปัญหา ยังไงลองเช็ค References ของโปรแกรมดูก่อนว่ามีอะไรซ้ำซ้อนกันหรือเปล่า หากมีให้ตัดทิ้งไป
ดูตัวอย่างที่นี่
http://www.access-diva.com/d5.html
แล้วลอง Compile ดูก่อนครับ
ดูตัวอย่างที่นี่
http://www.access-diva.com/d5.html
แล้วลอง Compile ดูก่อนครับ
16 @R15687
ขอบคุณมากครับ แต่ที่ผมใส่แบบนี้มันถูกไหมครับผม
Private Sub doc_name_BeforeUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select count(doc_name) from doc_name Where doc_name = '" & Me.doc_name & "'")
If rst(0) > 0 Then
MsgBox ("ซ้ำ")
End If
rst.Close
Set rst = Nothing
End Sub
Private Sub doc_name_BeforeUpdate()
Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select count(doc_name) from doc_name Where doc_name = '" & Me.doc_name & "'")
If rst(0) > 0 Then
MsgBox ("ซ้ำ")
End If
rst.Close
Set rst = Nothing
End Sub
17 @R15688
ถูกแล้วนะครับ เพื่อความมั่นใจคุณอาจใส่วงเล็บใหญ่คล่อมลงในชื่อฟิลด์ และตารางแบบนี้ดูก็ได้นะครับ
'Private Sub Doc_Name_BeforeUpdate(Cancel As Integer)
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT Count([Doc_Name]) FROM [Doc_Name] WHERE [Doc_Name] ='" & Me.Doc_Name & "'")
If rst(0) > 0 Then
MsgBox ("ซ้ำ")
End If
rst.Close
Set rst = Nothing
'End Sub
18 @R15690
กรณีนี้ตรวจสอบทันทีที่พิมพ์ค่าใน field เสร็จ จะใช้ BeforeUpdate หรือ AfterUpdate ก็ได้ครับ ได้ผลเท่ากัน
ส่วนที่ว่า error เท่าที่ดูก็ไม่น่าจะมี จะให้ดี รบกวนแจ้งด้วยว่า error จากบรรทัดไหน จะได้ตรวจสอบได้ง่ายขึ้น
ส่วนที่ว่า error เท่าที่ดูก็ไม่น่าจะมี จะให้ดี รบกวนแจ้งด้วยว่า error จากบรรทัดไหน จะได้ตรวจสอบได้ง่ายขึ้น
Time: 0.2479s
คุณต้องเอาค่า ไปตรวจสอบกับ TABLE ที่มีข้อมูลอยู่แล้วว่ามันซ้ำกันหรือไม่
ถ้าซ้ำ ให้ปฏิเสธการ UPDATE สำหรับวิธีที่ผมใช้อยู่ ผมใช้ DAO ในการอ้าง
RECORDSET มา เพราะมีความยืดหยุ่นสูง เพราะมันสามารถอ้างไปยังตัวแทนข้อมูลที่เราต้องการตรวจสอบได้ง่าย ตัวอย่างเช่น
Private Sub id_DR_AfterUpdate()
Dim rst As dao.Recordset
Set rst = Me.RecordsetClone
On Error GoTo errl:
Do Until rst.EOF
If rst![id_TabianBoek] = Me.id_TabianBoek And rst![id_DR]=Me.id_DR Then
MsgBox ("ซ้ำ")
Exit Sub
End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
errl: Exit Sub
End Sub
-ตัวอย่างเป็นการเตือนเมื่อซ้ำเฉยๆ
-ตรง Set rst = Me.RecordsetClone คุณอ้าง Recordset ได้หลายวิธี ต้องหาอ่านเพิ่มเติม โดยเฉรพาะการอ้างโดยใช้ภาษา SQL
-ถ้ายกเลิกการ UPDATE ใน EVENT FORM_BEFOREUPDATE
ให้ CANCEL = TRUE ครับ เขียนแทรกลงไปในระหว่าง ลำดับ CODE
คุณต้องลองดัดแปลงเองนะครับ ผมก็ลอกๆ เขามา แต่ต้องลอกโดยพยายามทำความเข้าใจไปด้วย ของงี้มันลองผิดลองถูกกันได้ครับ เมื่อได้แล้วมันก็ประยุกต์ได้อีกหลายอย่าง "ความพยายามอยู่ที่ไหน ความพยามยามที่นั่น"
"ไชโย บ้านเมืองเราจะเลิกร้อนแล้ว"