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

 1,705   14
URL.หัวข้อ / URL
จำกัดข้อมูลซ้ำและการดึงข้อมูลก่อนหน้า

มี 2 เรื่องด้วยกันที่จะสออบถามอาจารย์ทุก ท่านค่ะ

สร้าง ตาราง 1 ตาราง มี ฟิลด์ Date (Date/time)/ Machine(number) /DataOld (text) / DataNew(text)

เรื่องที่ 1 การบันทึกข้อมูลซ้ำ
โดยที่จะบันทึกข้อมูลใส่ ทั้ง 2 ฟิลด์ดังนี้

Date                    machine
17/7/2560               1
17/7/2560               2

แต่ถ้าคีย์ซ้ำวันที่ 17 ไปอีกรอบ ไม่ว่าเครื่องใดก็ตามให้แสดงว่าบันทึกข้อมูลซ้ำ ไม่สามารถให้บันทึกได้

เรื่องที่ 2 การดึงข้อมูลก่อนหน้ามาแสดง ในฟอร์มการบันทึก เมื่อคีย์ข้อมูลลงไปแล้ว ให้ดึงฟิลด์ข้อมูล DataNew ของข้อมูลที่บันทึกไปล่าสุด มาแสดงในTextbox ของ Dataold เพื่อที่จะบันทึกในฟิลด์ Dataold ข้อมูลใหม่ในครั้งนั้นๆ ประมานนี้ค่ะ

หาอธิบายไม่เข้าใจ ต้องขออภัยด้วยน่ะค่ะ มือใหม่ค่ะ

ขอบคุณค่ะ

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

1 @R23829
1. ตารางที่ว่า ให้ตั้งค่าที่ฟิลด์ Date ให้มีดัชนีเป็น Yes (No Duplicates) เวลาจะบันทึกวันที่ซ้ำ โปรแกรมจะไม่ยอมให้บันทึกและแจ้ง error ว่าไม่สามารถบันทึกได้

2. ที่ AfterUpdate event หลังจากคีย์ Machine แล้ว ใส่ code ประมาณนี้

Private Sub Machine_AfterUpdate()
Dim dLast As Variant, stData As String

dLast = DMax("[Date]", "ชื่อตาราง", "[Machine] = " & Me.Machine)
If IsNull(dLast) Then
    stData = ""
Else
    stData = DLookup("[DataNew]", "ชื่อตาราง", "[Date] = " & CDbl(dLast))
End If

Me.DataOld = stData

End Sub
2 @R23831
1. ตั้งค่าตรงฟิลด์ Date แล้วค่ะ แต่ที่นี้ ทุกครั้งที่บันทึก วันที่มันจะซ้ำได้ 2 ครั้ง แต่ ทาง Machine จะไม่ซ้ำ

จะกำหนด ได้มั้ยค่ะ

3 @R23832
เช่น บันทึก ได้

Date                    machine
17/7/2560               1
17/7/2560               2
18/7/2560               1
18/7/2560               2

ต้องการให้บันทึกแค่นี้ ถ้าหาก มีการบันทึก 17/7/2560 หรือ 18/7/2560 เข้าไปอีก เปนครั้งที่ 3 ให้ไม่สามารถบันทึก ได้ ประมานนี้ค่ะ

แต่ที่ตั้งค่า ดัชนีเป็น Yes (No Duplicates) นั้น มันจะบันทึกได้แค่ 17/7/2560 ครั้งเดียวเท่านั้น
4 @R23833
1. ที่ฟิลด์ Date กับ Machine ให้ใส่ BeforeUpdate event ดังนี้

Private Sub Date_BeforeUpdate(Cancel As Integer)
If FindDub() = True Then
        Me.Undo
        Cancel = True
End If
End Sub

Private Sub Machine_BeforeUpdate(Cancel As Integer)
If FindDub() = True Then
        Me.Undo
        Cancel = True
End If
End Sub

2. สร้าง Function หาค่าซ้ำประมาณนี้
2.1 กรณีที่ตารางนี้มี Primary Key สมมติชื่อ K_ID ชนิด Long

Private Function FindDub() As Boolean
Dim KeyID As Variant

If IsNull(Me.K_ID) Then    'เช็คกรณีถ้าเป็น new record และเป็นคีย์แบบ Autonumber
    KeyID = 0
Else
    KeyID = Me.K_ID
End If

If IsNull(DLookup("K_ID", "ชื่อตาราง", "[Date]=" & CDbl(Me.Date) & " AND [Machine]=" & Me.Machine & " AND [K_ID]<>" & KeyID)) Then
        FindDub = False
    Else
        MsgBox "พบรายการซ้ำ...", vbCritical, "รายการซ้ำ"
        FindDub = True
    End If

End Function

2.2 กรณีที่ตารางไม่มี Primary Key

Private Function FindDup() As Boolean
Dim MyFRS As Recordset, stCriteria As String, vBookmark1 As Variant, vBookmark2 As Variant

stCriteria = "[Date]=" & CDbl(Me.Date) & " AND [Machine]=" & Me.Machine
Set MyFRS = Me.RecordsetClone
MyFRS.FindFirst stCriteria
If MyFRS.NoMatch = False Then
    vBookmark1 = MyFRS.Bookmark
    vBookmark2 = Me.Bookmark
    If vBookmark1 = vBookmark2 And (Not Me.NewRecord) Then
        MyFRS.FindNext stCriteria
        If MyFRS.NoMatch = False Then
            FindDup = True
        Else
            FindDup = False
        End If
    Else
        FindDup = True
    End If
Else
    FindDup = False
End If
MyFRS.Close
Set MyFRS = Nothing

If FindDup = True Then
    MsgBox "พบรายการซ้ำ...", vbCritical, "รายการซ้ำ"
End If

End Function
5 @R23835
ขอบคุรนะคะ่
แต่ทำ ไม่ได้อ่ะค่ะ ไม่รุว่าทำผิดวิธีรึป่าว มันแจ้งเตือนว่าCompile Error : sub or function not defined อ่ะค่ะ

6 @R23836
เพิ่มฟิวด์แรกอีก 1 ฟิวด์เป็น AutoNumber โดยกำหนดเป็น PrimaryKey แทนฟิวด์วันที่ เพื่อให้ตารางนี้ทำหน้าที่เป็น Many
7 @R23838
แต่ทำ ไม่ได้อ่ะค่ะ ไม่รุว่าทำผิดวิธีรึป่าว มันแจ้งเตือนว่าCompile Error : sub or function not defined อ่ะค่ะ

มันไปค้างที่บรรทัดไหน เอารูปมาให้ดูได้ไหมครับ ลองดูพวก field และ control ต่างๆว่าได้ตั้งชื่อตรงกับ code ที่ผมให้ไปหรือไม่ ให้แก้ code ตามชื่อที่ใช้จริงครับ
8 @R23847

9 @R23849
Function FindDub() ในข้อ 2. ไม่ได้ใส่ไว้หรือครับ
10 @R23851
ใส่ไว้ใน module 1 ค่ะ ใส่ถูกมั้ยค่ะ หรือต้องใส่หน้าฟอร์ม
11 @R23852
เอามาใส่ในฟอร์มนี้เลยครับ
12 @R23853
ขอบคุณมากเลยนะค่ะ คุณ Pizza_p เรื่องที่ 2 ทำได้แล้วค่ะ

รบกวนอีกเรื่องนึงค่ะ ในเรื่องที่ 1 การดึงข้อมูลก่อนหน้า มาแสดง คะ

ติดปัญหาตรงที่ในโค้ด Date ต้องเป็น Key หลัก แล้วห้ามซ้ำ โค้ดถึงจะทำการดึงข้อมูลมา แต่ ที่ต้องการคือ Date กับ machine สามารถซ้ำได้

เช่น

Date            Machine        Datanew      Data old
24/7/2560        1                  2222           1111
24/7/2560        2                  4444            3333

พอเริ่มวันที่ ใหม่
25/7/2560        1                 รับค่าใหม่        2222 (ดึงข้อมูลมาจากDataNew ของวันที่ 24/7/2560 machine 1 )
25/7/2560          2               รับค่าใหม่        4444 (ดึงข้อมูลมาจากDataNew ของวันที่ 24/7/2560machine 2)

ประมานนี้คะ
13 @R23855
ให้เพิ่มโค้ดนี้ไปแทนครับ

Private Sub Machine_AfterUpdate()
Dim dLast As Variant, stData As String

dLast = DMax("[Date]", "ชื่อตาราง", "[Machine] = " & Me.Machine)
If IsNull(dLast) Then
    stData = ""
Else
    stData = DLookup("[DataNew]", "ชื่อตาราง", "[Date] = " & CDbl(dLast) & " AND [Machine] = " & Me.Machine)
End If

Me.DataOld = stData

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