TR_PDACCOUNTSTRUCTURE_UPDDEL
Definition
Copy
CREATE trigger [dbo].[TR_PDACCOUNTSTRUCTURE_UPDDEL]
on [dbo].[PDACCOUNTSTRUCTURE]
for update,delete
as
set nocount on
declare @IsDelete bit = 0
declare @SysID uniqueidentifier
declare @ChangeAgentID uniqueidentifier
declare @Now datetime = getdate()
declare @UpdateSequence bit = 0
declare @UpdateLength bit = 0
declare @UpdateSeparator bit = 0
declare @IsBasicGL bit;
if (select count(*) from deleted) > 0 and (select count(*) from inserted) = 0
select top 1 @IsBasicGL = ISBASICGL from deleted
else
select top 1 @IsBasicGL = ISBASICGL from inserted
if @IsBasicGL = 1
begin
if exists(select COUNT(ID) from PDACCOUNTSTRUCTURE where DESCRIPTION is not null group by PDACCOUNTSYSTEMID,DESCRIPTION having COUNT(ID) > 1
)
BEGIN
RAISERROR ('UIX_PDACCOUNTSTRUCTURE_DESCRIPTION_PDACCOUNTSYSTEMID', 16, 1)
ROLLBACK
END
if (select count(*) from deleted) > 0 and (select count(*) from inserted) = 0
begin
set @IsDelete = 1
select top 1 @ChangeAgentID = CHANGEDBYID, @SysID = PDACCOUNTSYSTEMID from deleted where CHANGEDBYID is not null order by DATECHANGED
end
else if (select count(*) from INSERTED) > 0
begin
select top 1 @ChangeAgentID = CHANGEDBYID, @SysID = PDACCOUNTSYSTEMID from inserted where CHANGEDBYID is not null order by DATECHANGED
--Infinity always updates all fields so if update(FIELDNAME) is useless
if exists (select t1.* from inserted t1 inner join deleted t2 on t1.id = t2.id where t1.SEQUENCE != t2.SEQUENCE)
set @UpdateSequence = 1
if exists (select t1.* from inserted t1 inner join deleted t2 on t1.id = t2.id where t1.LENGTH != t2.LENGTH)
set @UpdateLength = 1
if exists (select t1.* from inserted t1 inner join deleted t2 on t1.id = t2.id where t1.SEPARATORCODE != t2.SEPARATORCODE)
set @UpdateSeparator = 1
end
if exists (select t1.* from inserted t1 inner join deleted t2 on t1.id = t2.id where t1.LENGTH = t2.LENGTH and t1.LENGTH = 0 )
BEGIN
RAISERROR ('CK_PDACCOUNTSTRUCTURE_VALIDMAXMINLENGTH', 16, 1)
ROLLBACK
END
if @UpdateSequence = 1 or @IsDelete = 1 --Updating the sequence field or deleting a row
update dbo.PDACCOUNTSTRUCTURE set
SEQUENCE = V1.NewSequence,
CHANGEDBYID = @ChangeAgentID,
DATECHANGED = @Now
from dbo.PDACCOUNTSTRUCTURE inner join
(select t1.ID, row_number() over(partition by t1.SITEID order by t1.SEQUENCE, case when t2.SEQUENCE > t3.SEQUENCE then 99 when t2.SEQUENCE < t3.SEQUENCE then 0 else t1.SEQUENCE end, t1.DATEADDED) as NewSequence
from dbo.PDACCOUNTSTRUCTURE t1 left join inserted t2 on t1.ID = t2.ID
left join deleted t3 on t1.ID = t3.ID where T1.PDACCOUNTSYSTEMID = @SysID) V1
on PDACCOUNTSTRUCTURE.ID = V1.ID
if @UpdateLength = 1
begin
declare @Length int = 0
declare @Length2 int = 0
select top 1 @Length = LENGTH from inserted order by DATECHANGED
if exists (select 1 from dbo.GLACCOUNT where GLACCOUNT.PDACCOUNTSYSTEMID = @SysID)
begin
select top 1 @Length2 = LENGTH from deleted order by DATECHANGED
If @Length2 > @Length
BEGIN
RAISERROR ('CK_PDACCOUNTSTRUCTURE_NEWLENGTH', 16, 1)
ROLLBACK
END
end
If not (@Length > 0 and @Length < 101)
BEGIN
RAISERROR ('CK_PDACCOUNTSTRUCTURE_VALIDMAXMINLENGTH', 16, 1)
ROLLBACK
END
update t2 set
SHORTDESCRIPTION = case t1.SEGMENTTYPE when 1 then t2.SHORTDESCRIPTION+replicate('0',t1.LENGTH-len(t2.SHORTDESCRIPTION)) else replicate('0',t1.LENGTH-len(t2.SHORTDESCRIPTION))+t2.SHORTDESCRIPTION end,
CHANGEDBYID = @ChangeAgentID,
DATECHANGED = @Now
from inserted t1 inner join dbo.PDACCOUNTSEGMENTVALUE t2 on t1.ID = t2.PDACCOUNTSTRUCTUREID
end
if @UpdateSequence = 1 or @UpdateLength = 1 or @UpdateSeparator = 1 or @IsDelete = 1
exec dbo.USP_GLACCOUNT_REFRESH2 @SysID, @ChangeAgentID
if exists( select *
from deleted as D
left outer join inserted as I
on D.ID = I.ID
where
D.PDACCOUNTTABLESAVAILABLEFORSEGMENTID<>I.PDACCOUNTTABLESAVAILABLEFORSEGMENTID
or
I.PDACCOUNTTABLESAVAILABLEFORSEGMENTID is null
)
begin
exec dbo.USP_PDACCOUNTSEGMENTMAPPINGVIEW_RECREATE;
exec dbo.USP_PDCOMPOSITESEGMENTMAPPINGVIEW_RECREATE;
end;
If exists(select 1 from inserted where inserted.SEGMENTTYPE = 3)
begin
if not exists (select 1 from dbo.PDACCOUNTSEGMENTMAPPING T1 join inserted T2 on T1.PDACCOUNTSTRUCTUREID = T2.ID where T1.ISDEFAULT = 1)
begin
-- update / delete
declare @ID uniqueidentifier = NEWID();
insert into dbo.PDACCOUNTSEGMENTMAPPING
(ID,PDACCOUNTSTRUCTUREID, LONGDESCRIPTIONID, ISDEFAULT, ISCONSTANTVALUE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select
@ID,I.ID ,@ID, 1, I.ISCONSTANTVALUE, I.ADDEDBYID, I.CHANGEDBYID, I.DATEADDED, I.DATECHANGED from inserted as I
inner join deleted as D
on I.ID = D.ID
where
D.PDACCOUNTTABLESAVAILABLEFORSEGMENTID<>I.PDACCOUNTTABLESAVAILABLEFORSEGMENTID;
end
end
end