this is the trigger i created its calculating expiry date and buydate as soon as PackageStatus changes to true along with this i also calculated refEarning which was my need to calculate and insert as soon as package status changes to true
CREATE TRIGGER MyTrigger ON UserPackages
after update
as
DECLARE @PId INT
DECLARE *anonymous user* INT
declare @Val INT
SELECT @PId = inserted.P_ID ,*anonymous user*=inserted.U_ID
FROM INSERTED
select @Val=Packages.Validitiy from Packages where Packages.PID=@PId
update UserPackages
set BuyDate=GETDATE() , Expirydate = dateadd(dd,@Val,getdate())
where P_ID=@PId and U_ID=*anonymous user* and PackageStatus='True'
;
with firstCte(Name,UID,PName,Price,ReferComission,ReferredBy)
as
(
select distinct Users.Name,Users.ID,Packages.PName,Packages.Price,Packages.ReferCommission,(
select distinct Users.ID from users inner join Refers on Users.UserRef_No=Refers.RefOf
)as referedby
from Users inner join UserPackages on UserPackages.U_ID=Users.ID
inner join Packages on Packages.PID=UserPackages.P_ID
inner join Refers on Users.Ref_No=Refers.RefOf
where U_ID=*anonymous user* and UserPackages.PackageStatus='true'
)
--select Name,PName,Price,ReferComission,ReferredBy,RefEarning=Price*ReferComission/100 from firstCte
-- Define the outer query referencing the CTE name.
update Users set RefEarning+= Price*ReferComission/100 from firstCte where ID=ReferredBy ;
--with secondCte(UID,Name,Active)
--as
--(select ID,Name,Active from Users where ID=*anonymous user* and Active='False')
update Users set Active='True' where ID=*anonymous user* and Active='False'
thankyou all for the help and response
EDIT:- The above trigger fails for more then one row updates...so far can't get it to work for multiple rows
this is the new edited version but still not able to update for more then 1 records as subquery is returning more thn one row and i need some kind of loop to iterate over all of them
USE [TempInvestManage]
GO
/****** Object: Trigger [dbo].[HeavyTrigger3] Script Date: 9/13/2020 11:13:44 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[HeavyTrigger3] ON [dbo].[UserPackages]
after update
as
BEGIN
SET NOCOUNT ON;
IF UPDATE(PackageStatus)
begin
with firstCte(Name,UID,RefEarn,Active,PName,Price,ReferComission,Expiry,PackStat,ReferredBy,Val)
as
(
select distinct Users.Name,Users.ID,Users.RefEarning,Users.Active,Packages.PName,Packages.Price,Packages.ReferCommission,UserPackages.ExpiryDate,UserPackages.PackageStatus,(
select distinct Users.ID from users inner join Refers on Users.UserRef_No=Refers.RefOf
)as referedby ,(select Packages.Validitiy from Packages where Packages.PID=(select P_ID from inserted))as Val
from Users inner join UserPackages on UserPackages.U_ID=Users.ID
inner join Packages on Packages.PID=(select P_ID from inserted)
inner join Refers on Users.Ref_No=Refers.RefOf
where U_ID=(select U_ID from inserted) and UserPackages.PackageStatus='true'
)
update UserPackages set BuyDate=GETDATE(),ExpiryDate=DATEADD(dd,Val,GETDATE()) from firstCte
where P_ID=(select P_ID from inserted) and U_ID=(select U_ID from inserted);
with firstCte(Name,UID,RefEarn,Active,PName,Price,ReferComission,Expiry,PackStat,ReferredBy,Val)
as
(
select distinct Users.Name,Users.ID,Users.RefEarning,Users.Active,Packages.PName,Packages.Price,Packages.ReferCommission,UserPackages.ExpiryDate,UserPackages.PackageStatus,(
select distinct Users.ID from users inner join Refers on Users.UserRef_No=Refers.RefOf
)as referedby ,(select Packages.Validitiy from Packages where Packages.PID=(select P_ID from inserted))as Val
from Users inner join UserPackages on UserPackages.U_ID=Users.ID
inner join Packages on Packages.PID=(select P_ID from inserted)
inner join Refers on Users.Ref_No=Refers.RefOf
where U_ID=(select U_ID from inserted) and UserPackages.PackageStatus='true'
)
update Users set RefEarning+= Price*ReferComission/100 from firstCte where ID=ReferredBy ;
update Users set Active='True' where ID=(select U_ID from inserted) and Active='False'
end;
end;