ورود

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



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

آموزش: تشخیص و جلوگیری از ورود رکورد تکراری در فرم 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))
آموزش: تشخیص و جلوگیری از ورود رکورد تکراری (با استفاده از تعریف unique constraint در جدول) (barnamenevis.org) (https://barnamenevis.org/showthread.php?589739-%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-%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-unique-constraint-%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, 17:46 عصر
یک data-macro برای رخداد before change جدول میسازیم:

If [IsInsert]
LookUpRecord
Personnel Alias="PX"
Where [PX].[FirstName]=[Personnel].[FirstName] And
[PX].[LastName]=[Personnel].[LastName] And
[PX].[DepartmentID]=[Personnel].[DepartmentID]
RaiseError 5001,"Duplicate Record"
END LookUpRecord
Else
LookUpRecord
Personnel Alias="PX"
Where [PX].[ID]<>[Personnel].[ID] And
[PX].[FirstName]=[Personnel].[FirstName] And
[PX].[LastName]=[Personnel].[LastName] And
[PX].[DepartmentID]=[Personnel].[DepartmentID]
RaiseError 5001,"Duplicate Record"
END LookUpRecord
END If

156178

mazoolagh
چهارشنبه 18 مهر 1403, 17:59 عصر
در جدول:

156179

از طریق UPDATE/INSERT کوئری:

UPDATE Personnel
SET FirstName = "gina", LastName = "grimes", DepartmentID = 2
WHERE ID=5

INSERT INTO Personnel(FirstName, LastName, DepartmentID, JobID, BirthDate)
VALUES ("gina", "grimes", 2, 5, #2024-10-09#)

156180

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

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

3- اگر برنامه آپگرید به sql رو دارین از data-macro استفاده نکنین!
این روش اگر صرفا برای همین هدف باشه مزیت خاصی نسبت به استفاده از constraint نداره!

4- برای آموزش data-macro تاپیک زیر رو ببینین،
و پرسشها رو هم همونجا مطرح کنین:
آموزش: کلک های Acess (barnamenevis.org) (https://barnamenevis.org/showthread.php?534737-%DA%A9%D9%84%DA%A9-%D9%87%D8%A7%DB%8C-Acess&p=2356413&viewfull=1#post2356413)

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