กระทู้เก่าบอร์ด อ.Yeadram
1,877 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 ข้อมูลใหม่ในครั้งนั้นๆ ประมานนี้ค่ะ
หาอธิบายไม่เข้าใจ ต้องขออภัยด้วยน่ะค่ะ มือใหม่ค่ะ
ขอบคุณค่ะ
สร้าง ตาราง 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
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 ครั้งเดียวเท่านั้น
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
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 อ่ะค่ะ
แต่ทำ ไม่ได้อ่ะค่ะ ไม่รุว่าทำผิดวิธีรึป่าว มันแจ้งเตือนว่า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 ตามชื่อที่ใช้จริงครับ
มันไปค้างที่บรรทัดไหน เอารูปมาให้ดูได้ไหมครับ ลองดูพวก 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)
ประมานนี้คะ
รบกวนอีกเรื่องนึงค่ะ ในเรื่องที่ 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
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 มากๆเลยน่ะค่ะ
Time: 0.7843s
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