1 ضمیمه
تشخیص و جلوگیری از ورود رکورد تکراری در فرم bound (با استفاده از رخداد before update)
نقل قول: تشخیص و جلوگیری از ورود رکورد تکراری در فرم bound (با استفاده از رخداد before update)
گام اول این هست که ببینیم چنین رکوردی داریم یا نه،
و بعد با یک پیغام مناسب به کاربر خبر بدیم.
برای جستجو کافی هست از متد findfirst رکوردست استفاده کنیم که به مراتب از dlookup سریعتر هست.
ولی دامنه جستجو رو به همه رکوردها به جز رکورد فعلی محدود میکنیم.
همچنین به روال منطقی بجای رکوردست فرم از recordsetclone اون استفاده میکنیم.
Option Compare Database
Option Explicit
Const WHR = "[ID]<> @ID AND [FirstName]=""@FN"" AND LastName=""@LN"" AND [DepartmentID]=@DID"
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim Criteria As String
Criteria = Replace(WHR, "@ID", Me.ID)
Criteria = Replace(Criteria, "@FN", Me.FirstName)
Criteria = Replace(Criteria, "@LN", Me.LastName)
Criteria = Replace(Criteria, "@DID", Me.DepartmentID)
With Me.RecordsetClone
.FindFirst Criteria
If Not .NoMatch Then
Cancel = True
If MsgBox( _
Prompt:="ID=" & !ID & vbCrLf & _
"First Name=" & !FirstName & vbCrLf & _
"Last Name=" & !LastName & vbCrLf & _
"Birth Date=" & !BirthDate & vbCrLf & _
"Department=" & DLookup("Department", "Departments", "DepartmentID=" & !DepartmentID) & vbCrLf & _
"Job Title=" & DLookup("JobTitle", "JobTitles", "JobID=" & !JobID) & vbCrLf & vbCrLf & _
"Drop Changes ?", _
Buttons:=vbExclamation + vbYesNo, _
Title:="Duplicate Record") = vbYes Then
Me.Undo
End If
End If
End With
End Sub
2 ضمیمه
نقل قول: تشخیص و جلوگیری از ورود رکورد تکراری در فرم bound (با استفاده از رخداد before update)
تست در ویرایش رکورد:
ضمیمه 156168
تست در ثبت رکورد جدید:
ضمیمه 156169
1 ضمیمه
نقل قول: تشخیص و جلوگیری از ورود رکورد تکراری در فرم bound (با استفاده از رخداد before update)
1- در اینجا برای سادگی فقط کدها مورد نیاز همین بحث آمده،
در یک برنامه عملی باید form validation رو دقیق پیاده کنین - یک آموزش همراه با کد نمونه رو در تاپیک زیر میتونین ببینین (پست شماره 14 و به بعد):
مبتدی: راهنمایی در نوشتن مسیج باکس (barnamenevis.org)
2- در اینجا فرض شده که رکوردست فرم همه رکوردهای جدول رو در بر میگیره،
اگر اینجور نیست باید به جای recordsetclone ، یک رکوردست دیگه روی کل جدول استفاده کنین.
3- این روش جلوی ورود تکراری از فرم دیگه یا اجرای کوئری یا مستقیم از طریق جدول رو نمیگیره.
هر چند که به طور منطقی در یک برنامه درست کاربر مطلقا هیچ دسترسی مستقیم به جدول ها نداره،
ولی باید در هر فرمی که دیتا این جدول رو میتونه تغییر بده همین روش پیاده بشه،
و همچنین برای آپدیت از طریق کوئری ها این روش جوابگو نیست و باید در سطح خود جدول پیاده بشه،
که این رو در تاپیک دیگه ای میگم.
برنامه پیوست: