-
Thông báo trùng khóa chính
QAT115 > 16-10-20, 09:58 PM
Con chào các cô các bác, các chú ạ
Còn là thành viên mới, mong mọi người giúp đỡ ạ
Con có tạo 1 table tbl_HangHoa gồm 2 trường: maHH (khoác chính), TenHH,
Con có tạo 1 form có nguồn từ table này,
khi con nhập vào textbox maHH thì nếu trùng khóa chính sẽ 1 thông báo của access
Nhờ mọi người chỉ giúp con cách đổi thông báo này thành
msgbox "trùng mã khách hàng, vui lòng nhập lại"
Con xin cảm ơn -
RE: Thông báo trùng khóa chính
tranthanhan1962 > 16-10-20, 11:17 PM
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Response = acDataErrContinue
Select Case DataErr
Case 3022
MsgBox "trùng mã khách hàng, vui lòng nhập lại", vbOKOnly, "CHÚ Ý!"
End Select
End Sub -
RE: Thông báo trùng khóa chính
QAT115 > 18-10-20, 01:53 AM
(16-10-20, 11:17 PM)tranthanhan1962 Đã viết: Private Sub Form_Error(DataErr As Integer, Response As Integer)
Chú ơi, con áp dụng trên form Bound thì chạy rất tốt,
Response = acDataErrContinue
Select Case DataErr
Case 3022
MsgBox "trùng mã khách hàng, vui lòng nhập lại", vbOKOnly, "CHÚ Ý!"
End Select
End Sub
Giờ con sử dụng form Unbound và dùng lệnh dưới để thêm record
rs.addnew
rs!maHH=txtmahh
rs!tenHH=txttenHH
rs.update
thì nó vẫn hiện thông báo trùng khóa chính của access ạ,
chú có cách nào chỉ con với
Con xin cảm ơn -
RE: Thông báo trùng khóa chính
QAT115 > 19-10-20, 09:46 AM
cháu đã tìm ra code báo trùng dữ liệu ở form unbound, có gì sai nhờ mọi người chỉ giúp,
cháu xin cảm ơn
Private Sub Command4_Click()
Dim rs As dao.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM tableB ")
On Error GoTo cmdLuu_Err
rs.AddNew
rs!mahh = Me.txtMaHH
rs!Ten = Me.txtTenHH
rs.Update
rs.Close
Exit Sub
cmdLuu_Err:
Select Case Err.Number
Case 3022
MsgBox "trùng mã HH", vbOKOnly, "CHÚ Ý!"
End Select
End Sub -
RE: Thông báo trùng khóa chính
ongke0711 > 19-10-20, 10:46 AM
Thay vì bẫy lỗi 3022, bạn dùng Dcount hoặc DLookup mã trong Table trước khi OpenRecodset cũng là một cách.
Nếu dùng OpenRecordset thì bạn dùng luôn Rs.FindFirst + Rs.Nomatch để tìm mã trùng. -
RE: Thông báo trùng khóa chính
QAT115 > 19-10-20, 11:16 AM
(19-10-20, 10:46 AM)ongke0711 Đã viết: Thay vì bẫy lỗi 3022, bạn dùng Dcount hoặc DLookup mã trong Table trước khi OpenRecodset cũng là một cách.
Cháu cũng nghĩ tới phương án ấy nhưng lại nghỉ giả sử có 2 người cùng nhập 1 lúc thì hàm dcount chạy cùng 1 lúc sẽ báo là mã chưa tồn tại trước đó, do vậy cả 2 ng đều có thể nhập cùng 1 mã, cùng 1 lúc
Nếu dùng OpenRecordset thì bạn dùng luôn Rs.FindFirst + Rs.Nomatch để tìm mã trùng.
Nên cháu bám vào khoa chính của access, và bắt sự kiện đó, vì cháu nghĩ nếu kể cả 2 ng ấn nhập cùng 1 lúc (chính xác từng mili giây)thì access vẫn nhập 1 ng trước, ng sau, và nó sẽ báo trùng cho người nhập sau ạ -
RE: Thông báo trùng khóa chính
ongke0711 > 19-10-20, 03:57 PM
(19-10-20, 11:16 AM)QAT115 Đã viết:
(19-10-20, 10:46 AM)ongke0711 Đã viết: Thay vì bẫy lỗi 3022, bạn dùng Dcount hoặc DLookup mã trong Table trước khi OpenRecodset cũng là một cách.
Cháu cũng nghĩ tới phương án ấy nhưng lại nghỉ giả sử có 2 người cùng nhập 1 lúc thì hàm dcount chạy cùng 1 lúc sẽ báo là mã chưa tồn tại trước đó, do vậy cả 2 ng đều có thể nhập cùng 1 mã, cùng 1 lúc
Nếu dùng OpenRecordset thì bạn dùng luôn Rs.FindFirst + Rs.Nomatch để tìm mã trùng.
Nên cháu bám vào khoa chính của access, và bắt sự kiện đó, vì cháu nghĩ nếu kể cả 2 ng ấn nhập cùng 1 lúc (chính xác từng mili giây)thì access vẫn nhập 1 ng trước, ng sau, và nó sẽ báo trùng cho người nhập sau ạ
Cái vụ nhập liệu nhiều người dùng trùng khoá này cũng đau đầu chứ không chơi.
Cách của bạn cũng là một trong các giải pháp khá hữu hiêu nhưng khi đã tính tới mili giây thì bạn phải tính thời gian từ giai đoạn OpenRecordset chứ không phải thời gian từ rs.Update vì khi OpenRecorsset là nó lưu ảnh của Recordset thời điểm đó lên bộ nhớ, những gì phát sinh đối với Recordset sau đó nó cũng chưa kịp cập nhật. Một vấn đề nữa là sau khi báo trùng thì bạn xử lý mã như thế nào?
Một hướng suy nghĩ khác là dùng Record Lock. Nhưng đối với Record lock cũng có những mặt hạn chế là: đối với EDIT là bạn khoá các record đang sửa thì OK, không vấn đề gì nhưng đối với thêm mới (AddNew) record thì bạn không thể Lock nguyên cái Table không cho người khác thao tác gì trên Table này là không hay. (Có thể thời gian Lock tính bằng mili giây nhưng cũng là điểm không hay)
Từ hướng Record lock này ta sẽ bàn tới việc tạo mã không trùng. Sau khi tạo mã PPK sẽ Lock cái mã đó lại không cho người khác sửa dụng, sau khi user 1 Update xong, sẽ giải phóng để tạo cái mã PK mới để user thứ 2 lấy. Mã không trùng này sẽ lưu vào Table tạm để mỗi khi User thêm mới dữ liệu sẽ vào đó lấy mã PK được cấp phát. Về cách làm này tôi đã diễn giải cách làm ở một bài viết khác rồi nhưng quên mất cái tiêu đề của nó. Để tìm lại xem.
-
RE: Thông báo trùng khóa chính
tranthanhan1962 > 19-10-20, 09:13 PM
Kinh nghiệm để sử lý mạng nhiều User cùng nhập lên 1 table có dùng autonumnber làm khóa chính. Không nên dùng autonumnber trực tiếp làm khóa chính mà Khóa chính = Mã User + autonumber -
RE: Thông báo trùng khóa chính
QAT115 > 20-10-20, 12:19 AM
[/quote]
Cái vụ nhập liệu nhiều người dùng trùng khoá này cũng đau đầu chứ không chơi.
Cách của bạn cũng là một trong các giải pháp khá hữu hiêu nhưng khi đã tính tới mili giây thì bạn phải tính thời gian từ giai đoạn OpenRecordset chứ không phải thời gian từ rs.Update vì khi OpenRecorsset là nó lưu ảnh của Recordset thời điểm đó lên bộ nhớ, những gì phát sinh đối với Recordset sau đó nó cũng chưa kịp cập nhật.
....
[/quote]
chỗ này cháu chưa hiểu lắm, chú nói rõ hơn được không ạ,
Cháu nghĩ cái tính năng cảnh báo trùng nó ở sẵn trong table, nên giả sử khi chạy openrecordset, và sau đó 1 s thì table này được cập nhật MaHH mới thì dữ liệu ở recordset load lúc trước là cũ,
tuy nhiên khi cháu nhập liệu vào table bằng rs.update thì bản thân tính năng báo trùng của table vẫn thông báo, vì nó là nơi dữ liệu gốc (cả mới + cũ)
Đó là kiểu suy luận của cháu không biết đúng không ạ
Còn phương án xử lý của cháu thì do còn ít hiểu biết nên là tạm thời sẽ thêm câu lệnh MahH=MaHH+1 rồi tiếp tục resume addnew ạ -
RE: Thông báo trùng khóa chính
ongke0711 > 20-10-20, 02:13 PM
(19-10-20, 11:16 AM)QAT115 Đã viết: Cháu cũng nghĩ tới phương án ấy nhưng lại nghỉ giả sử có 2 người cùng nhập 1 lúc thì hàm dcount chạy cùng 1 lúc sẽ báo là mã chưa tồn tại trước đó, do vậy cả 2 ng đều có thể nhập cùng 1 mã, cùng 1 lúc
Nên cháu bám vào khoa chính của access, và bắt sự kiện đó, vì cháu nghĩ nếu kể cả 2 ng ấn nhập cùng 1 lúc (chính xác từng mili giây)thì access vẫn nhập 1 ng trước, ng sau, và nó sẽ báo trùng cho người nhập sau ạ
Vì bạn nói tính đến mili giây nên tôi mới phân tích ra cái khoản thời gian mà Access lấy Recordset cho bạn thấy thôi.
Cách bạn làm là một cách hay chứ không phải là sai. Thủ thuật xử lý tương tự như cái cách tôi đề cập ở trên tức là thấy sai, thấy đụng là quay lại, làm lại từ đầu (tạo mã khác) đến khi lưu được dữ liệu thì thôi.