การเตือนเมื่อข้อมูลซ้ำ
กระทู้เก่าบอร์ด อ.Yeadram

 7,066   18
URL.หัวข้อ / URL
การเตือนเมื่อข้อมูลซ้ำ

มีปัญหาให้ช่วยอีกแล้วคะ

มีฟอร์มที่ไว้กรอกรายงาน PM นะคะจะมีข้อมูลคือ วันที่ ผลัดที่ตรวจงาน
กลุ่มเครื่องจักร ชื่อเครื่องจักร รายละเอียด

รายงาน PM จะมีการตรวจทุกวันและจะมีเรื่องเดียวกันเยอะมาก จนกว่าช่างจะแก้ไข ก็จะตัดเอง
เช่น เครื่องบดสกปรก จะมีรายงานตั้งแต่วันที่1-7 ซ้ำกัน 7 วัน 7ข้อมูล

ปัญหานะคะจะให้คนที่กรอกรู้ได้ยังไงว่ามีข้อมูลนี้อยู่แล้ว เป็นการเตือนข้อมูลซ้ำนะคะ จะได้ไม่ต้องเสียเวลาการตัดข้อมูลเองตอนท้ายเดือนนะคะ

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

1 @R05599
เอาหลักการณ์นะครับ เวลา USER KEY ข้อมูล เข้ามา ก่อน UPDATE ข้อมูล
คุณต้องเอาค่า ไปตรวจสอบกับ 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

คุณต้องลองดัดแปลงเองนะครับ ผมก็ลอกๆ เขามา แต่ต้องลอกโดยพยายามทำความเข้าใจไปด้วย ของงี้มันลองผิดลองถูกกันได้ครับ เมื่อได้แล้วมันก็ประยุกต์ได้อีกหลายอย่าง "ความพยายามอยู่ที่ไหน ความพยามยามที่นั่น"

"ไชโย บ้านเมืองเราจะเลิกร้อนแล้ว"
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 เป็น รายละเอียด ถูกต้องหรือป่าวคะ
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 ก็มีครับ
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 พอรู้ ลองผิดลองถูกเดี๋ยวก็ได้ครับ โชคดีครับ
6 @R05624
ขออภัยพิมพ์ตก
แก้จาก If rst! = Me.ลายละเอียด Then
เป็น If rst![B] = Me.ลายละเอียด Then
7 @R05625
อ้าวตกเหมือนเดิม สงสัยเป็นเรื่องของ Webbroad เพราะสังเกตว่าเป็นตัวหนา โดยไม่ตั้งใจ แก้เป็น

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
10 @R15648
แก้เป็น
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
12 @R15682
คือมันไม่ผ่านอะครับ

ผมดันไปตั้งชื่อเหมือนกันหมดเลยเช่น

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


แบบนี้อะครับ รันไ่ม่ผ่าน หรือผมใส่ผิดอะครับ
15 @R15686
ฟ้อง Error แบบนี้มันหลายสาเหตุ ผมทดสอบเล็กๆดู ไม่น่าจะเกี่ยวกับชื่อซ้ำนะครับ ตัวโค๊ดเองก็ใช้ได้ไม่มีปัญหา ยังไงลองเช็ค References ของโปรแกรมดูก่อนว่ามีอะไรซ้ำซ้อนกันหรือเปล่า หากมีให้ตัดทิ้งไป
ดูตัวอย่างที่นี่
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

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 จากบรรทัดไหน จะได้ตรวจสอบได้ง่ายขึ้น
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3061s