PDA

View Full Version : جلوگیری از ثبت تاریخ تکراری



safari_m4
پنج شنبه 29 آذر 1403, 11:59 صبح
با سلام خدمت دوستان من یک جدول دارم که دو تا ستون آن مربوطه به یکی تاریخ شروع و یکی تاریخ پایان می باشد حالا مثلا تاریخ 1403/09/25 یک برگه ماموریت از تاریخ 1403/09/25 لغایت 1403/09/29 به مدت پنج روز صادر می شه حالا فرض کنیم در تاریخ 1403/09/26 مجدد برای همان شخص برکه ماموریت از تاریخ 1403/09/26 لغایت 1403/09/27 صادر میشه سوال اینجاست چگونه جلوی ثبت مجدد ماموریت را بگیرم و پیام بدهد برکه ماموریت در محدوده این تاریخ قبلا برای این شخص صادر شده است با تشکر و سپاس

ROSTAM2
پنج شنبه 29 آذر 1403, 15:20 عصر
سلام

1- رکوردهای ثبت شده برای فرد باید پیمایش بشه
2- فیلدهای تاریخ شروع و تاریخ پایان از رکورد گرفته بشه
3- تاریخ اگر برابر یا بیشتر با تاریخ شروع و همچنین کمتر و برابر با تاریخ پایان بود پیام اعلام شود.

safari_m4
پنج شنبه 29 آذر 1403, 23:02 عصر
با تشکر از پاسخ تان منظور من ممکن است در ثبت مجدد مثلا 2 روز از محدوده تاریخ مشترک باشند مثال 1403/09/28 لغایت 1403/09/30 که دراینجا تاریخ پایان با کدی که گفتید مشکل می خورد چون 30 بزرکتر از 29 است در حالیکه 2 روز در تاریخ ثبت مجدد بصورت مشترک است یعنی تاریخ 28و29 که در این صورت پیام خطا نمی دهد با تشکر محدد
نمونه کد
Select NumberPersonnel from View_TB_Morakhasi_Personnel where ID_Personnel=2 And REPLACE(Start_Date,'/','') <= '14030925' And REPLACE(End_Date,'/','') >= '14030930'

mazoolagh
شنبه 01 دی 1403, 11:12 صبح
سلام و روز خوش

اول از همه این که این کار باید در سمت دیتابیس انجام بشه (لایه دیتا یا دیتااکسس) و نه برنامه (لایه اپلیکیشن)،
یعنی این پرسش در واقع مربوط به بخشی مثل mssql/mysql/access هست:
به این صورت که یک stored procedure یا action query نوشته بشه که مشخصات مرخصی رو بعنوان پارامتر بگیره،
و در صورت عدم همپوشانی با مرخصی های دیگه شخص insert کنه و true برگردونه
وگرنه false برگردونه - حالا در برنامه در موردش تصمیم گیری بشه.
حتی ممکنه از تریگر و constraint هم بشه استفاده کرد (به طور کلی).
به عبارت دیگه هیچ پردازشی سمت کد برنامه در رابطه با پیدا کردن همپوشانی نباید انجام بشه.

دویم این که برای تشخیص همپوشانی نیاز به چک 2 محدوه دارین
و هر کدوم که درست باشه یعنی هم پوشانی دارین:
DECLARE @START NVARCHAR(10)= '1403/09/25' ;
DECLARE @END NVARCHAR(10)= '1403/09/30' ;
DECLARE @ID= 2 ;

IF NOT EXISTS(
SELECT TOP 1 ([ID_Personnel])
FROM [View_TB_Morakhasi_Personnel]
WHERE @START BETWEEN [Start_Date] AND [End_Date]
OR
@END BETWEEN [Start_Date] AND [End_Date])
BEGIN
INSERT INTO View_TB_Morakhasi_Personnel (ID_Personnel , Start_Date , End_Date)
VALUES(@ID , @START , @END)
END



این رو به صورت STORED PROCEDURE یا FUNCTION در بیارین و return value مناسب براش بذارین و استفاده کنین.

safari_m4
پنج شنبه 06 دی 1403, 12:08 عصر
سلام و روز خوش

اول از همه این که این کار باید در سمت دیتابیس انجام بشه (لایه دیتا یا دیتااکسس) و نه برنامه (لایه اپلیکیشن)،
یعنی این پرسش در واقع مربوط به بخشی مثل mssql/mysql/access هست:
به این صورت که یک stored procedure یا action query نوشته بشه که مشخصات مرخصی رو بعنوان پارامتر بگیره،
و در صورت عدم همپوشانی با مرخصی های دیگه شخص insert کنه و true برگردونه
وگرنه false برگردونه - حالا در برنامه در موردش تصمیم گیری بشه.
حتی ممکنه از تریگر و constraint هم بشه استفاده کرد (به طور کلی).
به عبارت دیگه هیچ پردازشی سمت کد برنامه در رابطه با پیدا کردن همپوشانی نباید انجام بشه.

دویم این که برای تشخیص همپوشانی نیاز به چک 2 محدوه دارین
و هر کدوم که درست باشه یعنی هم پوشانی دارین:
DECLARE @START NVARCHAR(10)= '1403/09/25' ;
DECLARE @END NVARCHAR(10)= '1403/09/30' ;
DECLARE @ID= 2 ;

IF NOT EXISTS(
SELECT TOP 1 ([ID_Personnel])
FROM [View_TB_Morakhasi_Personnel]
WHERE @START BETWEEN [Start_Date] AND [End_Date]
OR
@END BETWEEN [Start_Date] AND [End_Date])
BEGIN
INSERT INTO View_TB_Morakhasi_Personnel (ID_Personnel , Start_Date , End_Date)
VALUES(@ID , @START , @END)
END



این رو به صورت STORED PROCEDURE یا FUNCTION در بیارین و return value مناسب براش بذارین و استفاده کنین.

با تشکر و سپاس فراوان