กระทู้เก่าบอร์ด อ.Yeadram
        
           2,019   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.7009s
    
      
		
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