khorsandreza
دوشنبه 19 خرداد 1393, 22:36 عصر
سلام دوستان من یک SP نوشتم که موقع حذف یک رکورد چند کار مختلف انجام می دهد
در صورتی که سند توسط مدیر ارشد تائید نشده حذف سند بدون داشتن اثار و لاگ رکورد حذف میشود ولی در صورتی که سند تائید شده باشد چند کار مختلف باید انجام بگیرد
1 - قبل از حذف رکود در یک جدول دیگر با تما ایتم ها ذخیره شود.
2 - مقادیر از رکورد حذفی به رکورد پدر انتقال یابد
3 - مقادیر بعد از انتقال به رکورد پدر براساس مقدار ثابت یک فیلد به تعداد مقدار ضرب شود .
می خواستم بدانم اگر از تریگر استفاده کنم بهتر است یا موقع حذف یک SP را اجرا کنم ؟
ساختار دستور SP من
ALTER PROCEDURE [dbo].[BuySaham_Del]
(
@pkid int,
@ucod nvarchar(10)
)
AS
BEGIN
DECLARE @return_value int;
DECLARE @chkdel bit;
DECLARE @prnt int = 0;
DECLARE @khrd1 int = 0;
DECLARE @khrd2 int = 0;
DECLARE @fors int = 0;
DECLARE @smbl int = 0;
DECLARE @send bit = 0;
select @send = send,@chkdel=chkdel from TB_BuySaham where pk_id=@pkid;
if(@chkdel=1)
begin
IF (@send = 1)-- حذف رکورد بعد از تائید سند
Begin
select @prnt = prnt from TB_BuySaham where pk_id=@pkid;
select @khrd1 = khrd from TB_BuySaham where pk_id = @pkid
select @khrd2 = mojd,@fors=fors,@smbl=smbl from TB_BuySaham where pk_id = @prnt
Update TB_BuySaham set
mojd = @khrd1 + @khrd2,
fors = @fors - @khrd1,
jmbl = @smbl * (@khrd1 + @khrd2)
where pk_id = @prnt;
INSERT INTO TB_BuySaham_Del(radif,prnt,codm,sdate,tar,vazs,smb l,jmbl,khrd,fors,mojd,styp,nopr,send,ctyp,ucod,uac t,buycodm,mazad,tozh,keyid,id)
select radif,prnt,codm,sdate,tar,vazs,smbl,jmbl,khrd,fors ,mojd,styp,nopr,send,ctyp,@ucod,'D',buycodm,mazad, tozh,keyid,pk_id from TB_BuySaham
where keyid =@pkid
INSERT INTO TB_BuySaham_Del(radif,prnt,codm,sdate,tar,vazs,smb l,jmbl,khrd,fors,mojd,styp,nopr,send,ctyp,ucod,uac t,buycodm,mazad,tozh,keyid,id)
select radif,prnt,codm,sdate,tar,vazs,smbl,jmbl,khrd,fors ,mojd,styp,nopr,send,ctyp,@ucod,'D',buycodm,mazad, tozh,keyid,pk_id from TB_BuySaham
where pk_id =@pkid
Delete From TB_BuySaham Where pk_id =@pkid;
Delete From TB_BuySaham Where keyid =@pkid
Set @return_value = 1;
End else
begin
select @prnt = prnt from TB_BuySaham where pk_id=@pkid;
select @khrd1 = khrd from TB_BuySaham where pk_id = @pkid
select @khrd2 = mojd,@fors=fors,@smbl=smbl from TB_BuySaham where pk_id = @prnt
Update TB_BuySaham set
mojd = @khrd1 + @khrd2,
fors = @fors - @khrd1,
jmbl = @smbl * (@khrd1 + @khrd2)
where pk_id = @prnt;
Delete From TB_BuySaham Where pk_id =@pkid;
End
Set @return_value = 2;
end else Set @return_value = 99;-- سند دارای پدر می باشد امکان حذف نیست
print @return_value
return @return_value;
END
باید این را عرض کنم تما اتفاقات اصلی در یک جدول است . جدول بصورت درختی کنترل میشود
در صورتی که سند توسط مدیر ارشد تائید نشده حذف سند بدون داشتن اثار و لاگ رکورد حذف میشود ولی در صورتی که سند تائید شده باشد چند کار مختلف باید انجام بگیرد
1 - قبل از حذف رکود در یک جدول دیگر با تما ایتم ها ذخیره شود.
2 - مقادیر از رکورد حذفی به رکورد پدر انتقال یابد
3 - مقادیر بعد از انتقال به رکورد پدر براساس مقدار ثابت یک فیلد به تعداد مقدار ضرب شود .
می خواستم بدانم اگر از تریگر استفاده کنم بهتر است یا موقع حذف یک SP را اجرا کنم ؟
ساختار دستور SP من
ALTER PROCEDURE [dbo].[BuySaham_Del]
(
@pkid int,
@ucod nvarchar(10)
)
AS
BEGIN
DECLARE @return_value int;
DECLARE @chkdel bit;
DECLARE @prnt int = 0;
DECLARE @khrd1 int = 0;
DECLARE @khrd2 int = 0;
DECLARE @fors int = 0;
DECLARE @smbl int = 0;
DECLARE @send bit = 0;
select @send = send,@chkdel=chkdel from TB_BuySaham where pk_id=@pkid;
if(@chkdel=1)
begin
IF (@send = 1)-- حذف رکورد بعد از تائید سند
Begin
select @prnt = prnt from TB_BuySaham where pk_id=@pkid;
select @khrd1 = khrd from TB_BuySaham where pk_id = @pkid
select @khrd2 = mojd,@fors=fors,@smbl=smbl from TB_BuySaham where pk_id = @prnt
Update TB_BuySaham set
mojd = @khrd1 + @khrd2,
fors = @fors - @khrd1,
jmbl = @smbl * (@khrd1 + @khrd2)
where pk_id = @prnt;
INSERT INTO TB_BuySaham_Del(radif,prnt,codm,sdate,tar,vazs,smb l,jmbl,khrd,fors,mojd,styp,nopr,send,ctyp,ucod,uac t,buycodm,mazad,tozh,keyid,id)
select radif,prnt,codm,sdate,tar,vazs,smbl,jmbl,khrd,fors ,mojd,styp,nopr,send,ctyp,@ucod,'D',buycodm,mazad, tozh,keyid,pk_id from TB_BuySaham
where keyid =@pkid
INSERT INTO TB_BuySaham_Del(radif,prnt,codm,sdate,tar,vazs,smb l,jmbl,khrd,fors,mojd,styp,nopr,send,ctyp,ucod,uac t,buycodm,mazad,tozh,keyid,id)
select radif,prnt,codm,sdate,tar,vazs,smbl,jmbl,khrd,fors ,mojd,styp,nopr,send,ctyp,@ucod,'D',buycodm,mazad, tozh,keyid,pk_id from TB_BuySaham
where pk_id =@pkid
Delete From TB_BuySaham Where pk_id =@pkid;
Delete From TB_BuySaham Where keyid =@pkid
Set @return_value = 1;
End else
begin
select @prnt = prnt from TB_BuySaham where pk_id=@pkid;
select @khrd1 = khrd from TB_BuySaham where pk_id = @pkid
select @khrd2 = mojd,@fors=fors,@smbl=smbl from TB_BuySaham where pk_id = @prnt
Update TB_BuySaham set
mojd = @khrd1 + @khrd2,
fors = @fors - @khrd1,
jmbl = @smbl * (@khrd1 + @khrd2)
where pk_id = @prnt;
Delete From TB_BuySaham Where pk_id =@pkid;
End
Set @return_value = 2;
end else Set @return_value = 99;-- سند دارای پدر می باشد امکان حذف نیست
print @return_value
return @return_value;
END
باید این را عرض کنم تما اتفاقات اصلی در یک جدول است . جدول بصورت درختی کنترل میشود