ورود

View Full Version : آموزش: تشخیص و جلوگیری از ورود رکورد تکراری (با استفاده از تعریف unique constraint در جدول)



mazoolagh
چهارشنبه 18 مهر 1403, 16:04 عصر
تاپیک های مرتبط:

آموزش: تشخیص و جلوگیری از ورود رکورد تکراری در فرم bound (با استفاده از رخداد before update) (barnamenevis.org) (https://barnamenevis.org/showthread.php?589738-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D9%88-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D9%88%D8%B1%D9%88%D8%AF-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-%D9%81%D8%B1%D9%85-bound-(%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%B1%D8%AE%D8%AF%D8%A7%D8%AF-before-update))
آموزش: تشخیص و جلوگیری از ورود رکورد تکراری (با استفاده از data-macro در جدول) (barnamenevis.org) (https://barnamenevis.org/showthread.php?589743-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D9%88-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D9%88%D8%B1%D9%88%D8%AF-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C-(%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-data-macro-%D8%AF%D8%B1-%D8%AC%D8%AF%D9%88%D9%84))
آموزش: جلوگیری از ورود داده تکراری در اکسس + نمایش پیغام خطا (barnamenevis.org) (https://barnamenevis.org/showthread.php?413205-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D9%88%D8%B1%D9%88%D8%AF-%D8%AF%D8%A7%D8%AF%D9%87-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-%D8%A7%DA%A9%D8%B3%D8%B3-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D9%BE%DB%8C%D8%BA%D8%A7%D9%85-%D8%AE%D8%B7%D8%A7)


جدول نمونه زیر رو در نظر بگیرین:

https://barnamenevis.org/attachment.php?attachmentid=156167&d=1728473809

میخواهیم که جلوی ثبت رکورد تکراری بر اساس سه فیلد FirstName, LastName, DepartmentID رو بگیریم - به فیلدهای JobID و BirthDate کاری نداریم.

mazoolagh
چهارشنبه 18 مهر 1403, 16:23 عصر
برای تعریف یک constraint هم میتونیم از یکی راه های زیر بریم:

1- در محیط طراحی جدول بخش indexs رو باز میکنیم،
تعریف فعلی ایندکس های جدول به این شکل هست:

156171

حالا یک constraint از نوع unique روی سه فیلد مورد نظر میسازیم:

156172

و جدول رو save میکنیم.

2- یک کوئری data definition تعریف میکنیم:
ALTER TABLE Personnel
ADD CONSTRAINT unique_constraint UNIQUE (FirstName, LastName, DepartmentID)

mazoolagh
چهارشنبه 18 مهر 1403, 16:42 عصر
بعد از تعریف این constraint ،
دیگه هیچ راهی برای insert/update رکورد تکراری نیست: چه در فرم، چه جدول و چه از طریق کوئری.

در جدول:
156173


از طریق UPDATE کوئری:
UPDATE Personnel
SET FirstName = "gina", LastName = "grimes", DepartmentID = 2
WHERE ID=5
156174

از طریق INSERT کوئری:
INSERT INTO Personnel
(FirstName, LastName, DepartmentID, JobID, BirthDate)
VALUES ("gina", "grimes", 2, 5, #2024-10-09#)
156175

mazoolagh
چهارشنبه 18 مهر 1403, 16:52 عصر
در فرم برای تشخیص رکورد تکراری از رخداد form error استفاده میکنیم:
Option Compare Database
Option Explicit

Private Sub Form_Error(DataErr As Integer, Response As Integer)
Select Case DataErr
Case 3022
If MsgBox( _
Prompt:="A record with same (FirstName, LastName, Department) exists!" _
& vbCrLf & vbCrLf & "Drop Changes ?", _
Buttons:=vbExclamation + vbYesNo, _
Title:="Duplicate Record") = vbYes Then
Me.Undo
End If
Response = acDataErrContinue
Case Else
Response = acDataErrDisplay
End Select
End Sub

156176

mazoolagh
چهارشنبه 18 مهر 1403, 16:56 عصر
1- در اینجا برای سادگی فقط کدهای مورد نیاز همین بحث آمده،
در یک برنامه عملی باید form validation رو دقیق پیاده کنین - یک آموزش همراه با کد نمونه رو در تاپیک زیر میتونین ببینین (پست شماره 14 و به بعد):
مبتدی: راهنمایی در نوشتن مسیج باکس (barnamenevis.org)

2- این روش جلوی ورود تکراری در هر موقعیتی رو میگیره (فرم، اجرای کوئری یا مستقیم از طریق جدول).
هر چند که به طور منطقی در یک برنامه درست کاربر مطلقا هیچ دسترسی مستقیم به جدول ها نداره.

برنامه پیوست: