diff --git a/PROMS/VEPROMS User Interface/PROMSFixes.Sql b/PROMS/VEPROMS User Interface/PROMSFixes.Sql index b8e92a44..38edb970 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -19,191 +19,6 @@ end print 'Adding procedures and functions to ' + db_name() - -IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[PasteItemReplace]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) - DROP PROCEDURE [PasteItemReplace]; -GO -/****** Object: StoredProcedure [dbo].[PasteItemReplace] Script Date: 03/20/2012 16:02:54 ******/ -/* -declare @NewItemID int -declare @dts datetime -set @newitemid = 0 -set @dts = getdate() -exec PasteItemReplace 398,397,20014,@dts,'bodine',@NewItemID output -*/ --- ItemID is item to replace --- StartItemID is item to copy -/***************************************************************************** - Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE - Copyright 2012 - Volian Enterprises, Inc. All rights reserved. -*****************************************************************************/ -CREATE PROCEDURE [dbo].[PasteItemReplace] -( - @ItemID int=null, @StartItemID int=null, - @Type int=null, @DTS datetime, @UserID nvarchar(100), - @NewItemID int output -) -WITH EXECUTE AS OWNER -AS -BEGIN TRY -- Try Block - BEGIN TRANSACTION - DECLARE @ContentID AS INT - DECLARE @NextItemID AS INT - DECLARE @PreviousItemID AS INT - DECLARE @ExternalChildCount AS INT - DECLARE @ExternalCount AS INT - DECLARE @Path AS VARCHAR(MAX) - DECLARE @Children AS TABLE - ( - ItemID INT PRIMARY KEY, - ContentID INT - ) - - if exists (select * from tblitems where itemid = @ItemID and DeleteStatus !=0) - BEGIN - RAISERROR ('###Cannot Paste Step###This current step has been deleted in another session',16,1) - RETURN - END - -- First check if the replaced item can be deleted, i.e. it doesn't have transitions - -- pointing to it or children. - - DECLARE @ExternalTrans TABLE - ( - [FromItemID] int, - [TransitionID] [int] NOT NULL, - [FromID] [int] NOT NULL, - [ToID] [int] NOT NULL, - [RangeID] [int] NOT NULL, - [Config] [nvarchar](max) NULL - ) - SET NOCOUNT ON - DECLARE @DeleteID int - INSERT INTO DeleteLog (UserID) VALUES (@UserID) - SELECT @DeleteID = SCOPE_IDENTITY() - SELECT @ContentID = ContentID, @PreviousItemID = PreviousID FROM Items WHERE ItemID = @ItemID - SELECT @NextItemID = ItemID FROM Items WHERE PreviousID = @ItemID - --SELECT @ExternalCount = count(*) FROM vefn_FindExternalTransitions(@ItemID) - SELECT @ExternalChildCount = count(*) FROM vefn_FindExternalChildTransitions(@ItemID) - SET @Path = [dbo].[ve_GetShortPath](@ItemID) - - --IF @ExternalCount > 0 AND @NextItemID is null - --BEGIN - -- RAISERROR ('###Cannot Delete Item###Step %d has External Transitions and has no next step - (%s)',16,1,@ItemID,@Path) - -- RETURN - --END - - IF @ExternalChildCount > 0 - BEGIN - RAISERROR ('###Cannot Delete Item###Step %d has External Transitions to it''s children - (%s)',16,1,@ItemID,@Path) - RETURN - END - - -- Copy the item, 'NewItemID' represents the new item(s) - -- DestFormatID is the formatid for the destination parent's format - DECLARE @DestFormatID int - SET @DestFormatID = .dbo.vefn_GetInheritedFormat(@ItemID, 0) - EXECUTE CopyItemAndChildren @StartItemID, @DestFormatID, @UserID, @NewItemID OUTPUT - - -- Adjust the next/previous to point to the new item - - DECLARE @PreviousID int - SELECT @PreviousID = [PreviousID] - FROM [ITEMS] II - WHERE [ItemID]=@ItemID - UPDATE [ITEMS] SET [PreviousID]=@PreviousID where [ItemID]=@NewItemID - UPDATE [CONTENTS] SET [Type]=@Type - FROM [CONTENTS] CC JOIN [ITEMS] ii ON CC.[ContentID]=II.[ContentID] - WHERE [ItemID]=@NewItemID - UPDATE [ITEMS] SET [PreviousID]=@NewItemID where [PreviousID]=@ItemID - UPDATE [PARTS] SET [ItemID]=@NewItemID where [ItemID]=@ItemID - - -- UPDATE DocVersion if this was a procedure - UPDATE DocVersions SET ItemID=@NewItemID where ItemID = @ItemID - - -- If there were 'external transitions' that pointed to the original - -- top replaced step, adjust them to point to the new top. - INSERT INTO @ExternalTrans SELECT * FROM vefn_FindExternalTransitions(@ItemID) - OPTION (MAXRECURSION 10000) - IF (SELECT COUNT(*) from @ExternalTrans) > 0 - BEGIN - -- Update content records for the transitions - Update CC - Set Text = DBO.vefn_FixTransitionText(Text,TT.TransitionID,TT.TranType,TT.ToID,TT.RangeID,@ItemID,@NewItemID) - From CONTENTS CC - JOIN Transitions TT ON TT.FromID = CC.ContentID - WHERE TransitionID in(Select TransitionID from @ExternalTrans) - -- Update transitions that point to @ItemID to Point to @NextItemID - UPDATE TRANSITIONS - SET ToID = case when ToID = @ItemID then @NewItemID else ToID END, - RangeID = case when RangeID = @ItemID then @NewItemID else RangeID END - WHERE TransitionID in(Select TransitionID from @ExternalTrans) - - DECLARE @typeID int -- AnnotationType - SELECT @typeID = TypeID from AnnotationTypes where Name = 'Verification Required' - IF(@typeID IS NULL) - BEGIN - INSERT INTO [AnnotationTypes] ([Name],[UserID]) VALUES ('Verification Required','Volian') - SELECT @typeID = SCOPE_IDENTITY() - END - -- Add 'Verification Required' annotions for transtions that pointed to top step - -- and need to point to - INSERT INTO [Annotations] ([ItemID],[TypeID],[SearchText],[UserID]) - SELECT ItemID, @typeID,'Verify Replaced Step Transition Destination',@UserID - FROM Items where ItemID in (SELECT FromItemID FROM @ExternalTrans) - - END - -- Remove the old one - - -- Get list of Children - INSERT INTO @Children SELECT * FROM vefn_ChildItems(@ItemID) - -- Delete Annotations for @ItemID and children - DELETE from Annotations where ItemID in(Select ItemID from @Children) - -- Delete Details associated with @ContentID and children - DELETE from Details where ContentID in(Select ContentID from @Children) - -- Delete Grids associated with @ContentID and children - DELETE from Grids where ContentID in(Select ContentID from @Children) - -- Delete Images associated with @ContentID and children - DELETE from Images where ContentID in(Select ContentID from @Children) - -- Delete Entries associated with @ContentID and children - DELETE from Entries where ContentID in(Select ContentID from @Children) - -- Delete ROUsages associated with @ContentID and children - DELETE from RoUsages where ContentID in(Select ContentID from @Children) - -- Delete ZTransitions records associated with @ContentID and children - DELETE FROM ZTransitions where TransitionID - in(SELECT TransitionID from Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID) - -- Delete Transitions associated with @ContentID and children - DELETE FROM Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID - -- Delete Parts associated with @ContentID and children - DELETE from Parts where ContentID in(Select ContentID from @Children) - -- Delete ZContents associated with @ContentID and children - DELETE from ZContents where ContentID in(Select ContentID from @Children) - -- Disconnect Items from Each Other - DELETE from Items where ItemID in(Select ItemID from @Children) and PreviousID Is Not Null - -- Disconnect Items to be deleted from each other - Update Items set PreviousID = null where ItemID in (Select ItemID from @Children) and PreviousID Is Not Null - -- Delete Item Records - DELETE from Items where ItemID in(Select ItemID from @Children) - -- DELETE Contents - DELETE from Contents where ContentID in(Select ContentID from @Children) ---delete from itemaudits where itemid = @newitemid -delete from itemaudits where itemid in (select itemid from vefn_ChildItems(@newitemid)) ---delete from contentaudits where contentid = (select contentid from items where itemid = @newitemid) -delete from contentaudits where contentid in (select contentid from vefn_ChildItems(@newitemid)) - DELETE from DeleteLog where DeleteID = @DeleteID - IF( @@TRANCOUNT > 0 ) COMMIT - EXECUTE GetItem @NewItemID -END TRY -BEGIN CATCH -- Catch Block - IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level - ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback - EXEC vlnErrorHandler -END CATCH -GO --- Display the status of Proc creation -IF (@@Error = 0) PRINT 'Procedure Creation: PasteItemReplace Succeeded' -ELSE PRINT 'Procedure Creation: PasteItemReplace Error on Creation' -GO - IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[vefn_ChronologyReport]') AND OBJECTPROPERTY(id,N'IsTableFunction') = 1) DROP FUNCTION [vefn_ChronologyReport]; /****** Object: UserDefinedFunction [dbo].[vefn_ChronologyReport] Script Date: 03/20/2012 17:50:44 ******/ @@ -22637,215 +22452,6 @@ BEGIN CATCH -- Catch Block END CATCH GO - - - - - - -IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[PasteItemReplace]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) - DROP PROCEDURE [PasteItemReplace]; -GO - - /***************************************************************************** - Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE - Copyright 2024 - Volian Enterprises, Inc. All rights reserved. - *****************************************************************************/ - /* - ========================================================================================================== - Author: Kevin Laskey - Create Date: 07/15/2024 - Description: B2024-041: "Copy of" is no longer being appended for paste before/after - ========================================================================================================== - */ - - -SET ANSI_NULLS ON -GO -SET QUOTED_IDENTIFIER ON -GO -/****** Object: StoredProcedure [dbo].[PasteItemReplace] Script Date: 03/20/2012 16:02:54 ******/ -/* -declare @NewItemID int -declare @dts datetime -set @newitemid = 0 -set @dts = getdate() -exec PasteItemReplace 398,397,20014,@dts,'bodine',@NewItemID output -*/ --- ItemID is item to replace --- StartItemID is item to copy -/***************************************************************************** - Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE - Copyright 2012 - Volian Enterprises, Inc. All rights reserved. -*****************************************************************************/ -CREATE PROCEDURE [dbo].[PasteItemReplace] -( - @ItemID int=null, @StartItemID int=null, - @Type int=null, @DTS datetime, @UserID nvarchar(100), - @NewItemID int output -) -WITH EXECUTE AS OWNER -AS -BEGIN TRY -- Try Block - BEGIN TRANSACTION - DECLARE @ContentID AS INT - DECLARE @NextItemID AS INT - DECLARE @PreviousItemID AS INT - DECLARE @ExternalChildCount AS INT - DECLARE @ExternalCount AS INT - DECLARE @Path AS VARCHAR(MAX) - DECLARE @Children AS TABLE - ( - ItemID INT PRIMARY KEY, - ContentID INT - ) - - if exists (select * from tblitems where itemid = @ItemID and DeleteStatus !=0) - BEGIN - RAISERROR ('###Cannot Paste Step###This current step has been deleted in another session',16,1) - RETURN - END - -- First check if the replaced item can be deleted, i.e. it doesn't have transitions - -- pointing to it or children. - - DECLARE @ExternalTrans TABLE - ( - [FromItemID] int, - [TransitionID] [int] NOT NULL, - [FromID] [int] NOT NULL, - [ToID] [int] NOT NULL, - [RangeID] [int] NOT NULL, - [Config] [nvarchar](max) NULL - ) - SET NOCOUNT ON - DECLARE @DeleteID int - INSERT INTO DeleteLog (UserID) VALUES (@UserID) - SELECT @DeleteID = SCOPE_IDENTITY() - SELECT @ContentID = ContentID, @PreviousItemID = PreviousID FROM Items WHERE ItemID = @ItemID - SELECT @NextItemID = ItemID FROM Items WHERE PreviousID = @ItemID - --SELECT @ExternalCount = count(*) FROM vefn_FindExternalTransitions(@ItemID) - SELECT @ExternalChildCount = count(*) FROM vefn_FindExternalChildTransitions(@ItemID) - SET @Path = [dbo].[ve_GetShortPath](@ItemID) - - --IF @ExternalCount > 0 AND @NextItemID is null - --BEGIN - -- RAISERROR ('###Cannot Delete Item###Step %d has External Transitions and has no next step - (%s)',16,1,@ItemID,@Path) - -- RETURN - --END - - IF @ExternalChildCount > 0 - BEGIN - RAISERROR ('###Cannot Delete Item###Step %d has External Transitions to it''s children - (%s)',16,1,@ItemID,@Path) - RETURN - END - - -- Copy the item, 'NewItemID' represents the new item(s) - -- DestFormatID is the formatid for the destination parent's format - DECLARE @DestFormatID int - SET @DestFormatID = .dbo.vefn_GetInheritedFormat(@ItemID, 0) - EXECUTE ReplaceItemAndChildren @StartItemID, @DestFormatID, @UserID, @NewItemID OUTPUT - - -- Adjust the next/previous to point to the new item - - DECLARE @PreviousID int - SELECT @PreviousID = [PreviousID] - FROM [ITEMS] II - WHERE [ItemID]=@ItemID - UPDATE [ITEMS] SET [PreviousID]=@PreviousID where [ItemID]=@NewItemID - UPDATE [CONTENTS] SET [Type]=@Type - FROM [CONTENTS] CC JOIN [ITEMS] ii ON CC.[ContentID]=II.[ContentID] - WHERE [ItemID]=@NewItemID - UPDATE [ITEMS] SET [PreviousID]=@NewItemID where [PreviousID]=@ItemID - UPDATE [PARTS] SET [ItemID]=@NewItemID where [ItemID]=@ItemID - - -- UPDATE DocVersion if this was a procedure - UPDATE DocVersions SET ItemID=@NewItemID where ItemID = @ItemID - - -- If there were 'external transitions' that pointed to the original - -- top replaced step, adjust them to point to the new top. - INSERT INTO @ExternalTrans SELECT * FROM vefn_FindExternalTransitions(@ItemID) - OPTION (MAXRECURSION 10000) - IF (SELECT COUNT(*) from @ExternalTrans) > 0 - BEGIN - -- Update content records for the transitions - Update CC - Set Text = DBO.vefn_FixTransitionText(Text,TT.TransitionID,TT.TranType,TT.ToID,TT.RangeID,@ItemID,@NewItemID) - From CONTENTS CC - JOIN Transitions TT ON TT.FromID = CC.ContentID - WHERE TransitionID in(Select TransitionID from @ExternalTrans) - -- Update transitions that point to @ItemID to Point to @NextItemID - UPDATE TRANSITIONS - SET ToID = case when ToID = @ItemID then @NewItemID else ToID END, - RangeID = case when RangeID = @ItemID then @NewItemID else RangeID END - WHERE TransitionID in(Select TransitionID from @ExternalTrans) - - DECLARE @typeID int -- AnnotationType - SELECT @typeID = TypeID from AnnotationTypes where Name = 'Verification Required' - IF(@typeID IS NULL) - BEGIN - INSERT INTO [AnnotationTypes] ([Name],[UserID]) VALUES ('Verification Required','Volian') - SELECT @typeID = SCOPE_IDENTITY() - END - -- Add 'Verification Required' annotions for transtions that pointed to top step - -- and need to point to - INSERT INTO [Annotations] ([ItemID],[TypeID],[SearchText],[UserID]) - SELECT ItemID, @typeID,'Verify Replaced Step Transition Destination',@UserID - FROM Items where ItemID in (SELECT FromItemID FROM @ExternalTrans) - - END - -- Remove the old one - - -- Get list of Children - INSERT INTO @Children SELECT * FROM vefn_ChildItems(@ItemID) - -- Delete Annotations for @ItemID and children - DELETE from Annotations where ItemID in(Select ItemID from @Children) - -- Delete Details associated with @ContentID and children - DELETE from Details where ContentID in(Select ContentID from @Children) - -- Delete Grids associated with @ContentID and children - DELETE from Grids where ContentID in(Select ContentID from @Children) - -- Delete Images associated with @ContentID and children - DELETE from Images where ContentID in(Select ContentID from @Children) - -- Delete Entries associated with @ContentID and children - DELETE from Entries where ContentID in(Select ContentID from @Children) - -- Delete ROUsages associated with @ContentID and children - DELETE from RoUsages where ContentID in(Select ContentID from @Children) - -- Delete ZTransitions records associated with @ContentID and children - DELETE FROM ZTransitions where TransitionID - in(SELECT TransitionID from Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID) - -- Delete Transitions associated with @ContentID and children - DELETE FROM Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID - -- Delete Parts associated with @ContentID and children - DELETE from Parts where ContentID in(Select ContentID from @Children) - -- Delete ZContents associated with @ContentID and children - DELETE from ZContents where ContentID in(Select ContentID from @Children) - -- Disconnect Items from Each Other - DELETE from Items where ItemID in(Select ItemID from @Children) and PreviousID Is Not Null - -- Disconnect Items to be deleted from each other - Update Items set PreviousID = null where ItemID in (Select ItemID from @Children) and PreviousID Is Not Null - -- Delete Item Records - DELETE from Items where ItemID in(Select ItemID from @Children) - -- DELETE Contents - DELETE from Contents where ContentID in(Select ContentID from @Children) ---delete from itemaudits where itemid = @newitemid -delete from itemaudits where itemid in (select itemid from vefn_ChildItems(@newitemid)) ---delete from contentaudits where contentid = (select contentid from items where itemid = @newitemid) -delete from contentaudits where contentid in (select contentid from vefn_ChildItems(@newitemid)) - DELETE from DeleteLog where DeleteID = @DeleteID - IF( @@TRANCOUNT > 0 ) COMMIT - EXECUTE GetItem @NewItemID -END TRY -BEGIN CATCH -- Catch Block - IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level - ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback - EXEC vlnErrorHandler -END CATCH -go - - - - - - IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[CopyItemAndChildren]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) DROP PROCEDURE [CopyItemAndChildren]; GO @@ -23603,6 +23209,804 @@ GO ========================================================================================================== */ +/* +========================================================================================================== + Start: C2017-031: SQL to allow copy/replace enhanced step +========================================================================================================== +*/ + +IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'PasteItemEnhancedReplace') +DROP PROCEDURE [dbo].PasteItemEnhancedReplace +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +/***************************************************************************** + Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE + Copyright 2024 - Volian Enterprises, Inc. All rights reserved. +*****************************************************************************/ +create PROCEDURE [dbo].[PasteItemEnhancedReplace] +( + @ItemID int=null, -- item to replace (keep this item, only copy over children) + @StartItemID int=null, -- item to copy (children only) + @Type int=null, @DTS datetime, @UserID nvarchar(100), + @NewItemID int output +) +WITH EXECUTE AS OWNER +AS +BEGIN TRY -- Try Block + BEGIN TRANSACTION + DECLARE @ContentID AS INT + DECLARE @NextItemID AS INT + DECLARE @PreviousItemID AS INT + DECLARE @ExternalChildCount AS INT + DECLARE @ExternalCount AS INT + DECLARE @Path AS VARCHAR(MAX) + DECLARE @Children AS TABLE + ( + ItemID INT PRIMARY KEY, + ContentID INT + ) + + if exists (select * from tblitems where itemid = @StartItemID and DeleteStatus !=0) + BEGIN + RAISERROR ('###Cannot Paste Step###This current step has been deleted in another session',16,1) + RETURN + END + + -- First check if the replaced item can be deleted, i.e. it doesn't have transitions + -- pointing to it or children. + DECLARE @ExternalTrans TABLE + ( + [FromItemID] int, + [TransitionID] [int] NOT NULL, + [FromID] [int] NOT NULL, + [ToID] [int] NOT NULL, + [RangeID] [int] NOT NULL, + [Config] [nvarchar](max) NULL + ) + SET NOCOUNT ON + DECLARE @DeleteID int + INSERT INTO DeleteLog (UserID) VALUES (@UserID) + SELECT @DeleteID = SCOPE_IDENTITY() + SELECT @ContentID = ContentID, @PreviousItemID = PreviousID FROM Items WHERE ItemID = @StartItemID + SELECT @NextItemID = ItemID FROM Items WHERE PreviousID = @StartItemID + -- Need to delete children of the item being replaced, see if they can be deleted, i.e. no external transitions + SELECT @ExternalChildCount = count(*) FROM vefn_FindExternalChildTransitions(@ItemID) + SET @Path = [dbo].[ve_GetShortPath](@ItemID) + IF @ExternalChildCount > 0 + BEGIN + RAISERROR ('###Cannot Delete Item###Step %d has External Transitions to it''s children - (%s)',16,1,@ItemID,@Path) + RETURN + END + + -- Delete all children of this item that is being replaced, after the delete a query is run that will + -- copy the children to this + -- Get list of Children + INSERT INTO @Children SELECT * FROM vefn_ChildItems(@ItemID) + DELETE from @Children where ItemID = @ItemID + + -- Copy the children of the copied item below this enhanced item + -- DestFormatID is the formatid for the destination parent's format + DECLARE @DestFormatID int + SET @DestFormatID = .dbo.vefn_GetInheritedFormat(@StartItemID, 0) + --EXECUTE CopyChildrenEnhanced @ItemID, @StartItemID, 206, @UserID + EXECUTE CopyChildrenEnhanced @ItemID, @StartItemID, @DestFormatID, @UserID + Set @NewItemID = @ItemID + -- Delete Annotations for @ItemID and children + DELETE from Annotations where ItemID in(Select ItemID from @Children) + -- Delete Details associated with @ContentID and children + DELETE from Details where ContentID in(Select ContentID from @Children) + -- Delete Grids associated with @ContentID and children + DELETE from Grids where ContentID in(Select ContentID from @Children) + -- Delete Images associated with @ContentID and children + DELETE from Images where ContentID in(Select ContentID from @Children) + -- Delete Entries associated with @ContentID and children + DELETE from Entries where ContentID in(Select ContentID from @Children) + -- Delete ROUsages associated with @ContentID and children + DELETE from RoUsages where ContentID in(Select ContentID from @Children) + -- Delete ZTransitions records associated with @ContentID and children + DELETE FROM ZTransitions where TransitionID + in(SELECT TransitionID from Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID) + -- Delete Transitions associated with @ContentID and children + DELETE FROM Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID + -- Delete Parts associated with @ContentID and children + DELETE from Parts where ContentID in(Select ContentID from @Children) + -- Delete ZContents associated with @ContentID and children + DELETE from ZContents where ContentID in(Select ContentID from @Children) + -- Disconnect Items from Each Other + DELETE from Items where ItemID in(Select ItemID from @Children) and PreviousID Is Not Null + -- Disconnect Items to be deleted from each other + Update Items set PreviousID = null where ItemID in (Select ItemID from @Children) and PreviousID Is Not Null + -- Delete Item Records + DELETE from Items where ItemID in(Select ItemID from @Children) + -- DELETE Contents + DELETE from Contents where ContentID in(Select ContentID from @Children) + + DELETE from DeleteLog where DeleteID = @DeleteID + IF( @@TRANCOUNT > 0 ) COMMIT + EXECUTE GetItem @NewItemID +END TRY +BEGIN CATCH -- Catch Block + IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level + ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback + EXEC vlnErrorHandler +END CATCH + +GO +IF (@@Error = 0) PRINT 'Procedure Creation: [PasteItemEnhancedReplace] Succeeded' +ELSE PRINT 'Procedure Creation: [PasteItemEnhancedReplace] Error on Creation' +GO + +IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'CopyChildrenEnhanced') +DROP PROCEDURE [dbo].CopyChildrenEnhanced +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +/***************************************************************************** + Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE + Copyright 2024 - Volian Enterprises, Inc. All rights reserved. +*****************************************************************************/ +create PROCEDURE [dbo].[CopyChildrenEnhanced] +( + @ItemID INT, -- item to replace children + @StartItemID INT, -- copy the children to ItemID + @DestFormatID INT, + @UserID NVARCHAR(100) +) +WITH EXECUTE AS OWNER +AS +BEGIN TRY -- Try Block + +--+-----------------------------------------------------------------+ +--& BEGIN TRANSACTION to make these changes temporary & +--+-----------------------------------------------------------------+ +BEGIN TRANSACTION + +DECLARE @Children AS TABLE +( + ItemID INT PRIMARY KEY, + NewItemID INT, + ContentID INT, + NewContentID INT, + FormatID INT, + NewFormatID INT +) +DECLARE @NewDocuments AS TABLE +( + DocID INT PRIMARY KEY, + NewDocID INT +) +-- Locals +DECLARE @DTS DATETIME -- DTS of all New Items +DECLARE @StartContentID INT +DECLARE @OrigContentID INT +Select @StartContentID = ContentID from Items where ItemID = @StartItemID +select @OrigContentID = ContentID from Items where ItemID= @ItemID +SET @DTS = GETDATE() -- Get the current Date and Time +-- Get a list of all of the Items to be copied based upon StartItemID and EndItemID +-- If the StartItemID = EndItemID then it is a single item and its children + +INSERT INTO @Children SELECT ItemID,ItemID,ContentID,ContentID,FormatID,FormatID FROM vefn_ChildItemsRange(@StartItemID,@StartItemID,null) + where ContentID != @StartContentID + +-- <<< Copy Contents >>> +-- Create new content rows to match the existing rows. Set the type to the Current ContentID temporarily +-- so that the new content rows can be associated with the existing content rows. +INSERT INTO Contents + ([Number],[Text],[Type],[FormatID],[Config],[DTS],[UserID]) + select [Number],[Text],[ContentID],[FormatID],[Config],@DTS,@UserID + from Contents where (ContentID in(Select ContentID from @Children)) + +-- Update the @Children with the NewContentIDs +UPDATE NN set NN.NewContentID = CC.ContentID +From Contents CC +Join @Children NN on NN.ContentID = CC.Type AND CC.DTS = @DTS and CC.UserID = @UserID +-- Reset the Type column in the Contents table with the Type column from the original Records. +DECLARE @SourceType INT +Select @SourceType = Type from Contents where ContentID = @StartContentID +if @SourceType = 0 + BEGIN + UPDATE CC set CC.Type = CC2.Type, CC.DTS = CC2.DTS, CC.UserID = CC2.UserID + From Contents CC + Join @Children NN on NN.NewContentID = CC.ContentID + Join Contents CC2 on NN.ContentID = CC2.ContentID + END +else + BEGIN + UPDATE CC set CC.Type = CC2.Type + From Contents CC + Join @Children NN on NN.NewContentID = CC.ContentID + Join Contents CC2 on NN.ContentID = CC2.ContentID + END +-- Contents are done + +-- <<< Copy Grids >>> +INSERT INTO [Grids]([ContentID],[Data],[Config],[DTS],[UserID]) + SELECT NN.[NewContentID],[Data],[Config],@DTS,@UserID + FROM [Grids] GG Join @Children NN on GG.ContentID = NN.ContentID +-- <<< Copy Images >>> +INSERT INTO [Images]([ContentID],[ImageType],[FileName],[Data],[Config],[DTS],[UserID]) + SELECT NN.[NewContentID],[ImageType],[FileName],[Data],[Config],@DTS,@UserID + FROM [Images] II Join @Children NN on II.ContentID = NN.ContentID + +-- Copy (insert) the item records now +INSERT INTO [Items] ([PreviousID],[ContentID],[DTS],[UserID]) + SELECT II.[PreviousID], -- Leave the PreviousID as is for now + NN.NewContentID, @DTS, @UserID + from @Children NN + join Items II on II.ContentID = NN.ContentID + where ii.ItemID != @ItemID + +-- Update the @Children with the NewItemIDs +UPDATE NN set NN.NewItemID = II.ItemID + From Items II + Join @Children NN on NN.NewContentID = II.ContentID AND II.DTS = @DTS and II.UserID = @UserID + +DECLARE @NewItemID int +SELECT @NewItemID = NewItemID + FROM @Children + WHERE ItemID = @StartItemID + +UPDATE NN SET NN.[NewFormatID] = CC.[FormatID] + FROM @Children NN + Join vefn_ChildItemsRange(@NewItemID,@NewItemID,@DestFormatID) CC + ON NN.NewItemID = CC.ItemID +-- The @Children table is now complete + +-- Update the PreviousID in the new Item rows, to the new ItemIDs based upon the old ItemIDs +Update II Set II.[PreviousID] = NN.NewItemID +from Items II +Join @Children NN on NN.ItemID = II.PreviousID AND II.DTS = @DTS and II.UserID = @UserID +-- Items are done + +-- <<< Copy Parts >>> +UPDATE CC set CC.Type = CC2.Type + From Contents CC + Join @Children NN on NN.NewContentID = CC.ContentID + Join Contents CC2 on NN.ContentID = CC2.ContentID + +INSERT INTO [Parts] ([ContentID],[FromType],[ItemID],[DTS],[UserID]) +Select NNF.NewContentID,[FromType],NNT.NewItemID, @DTS, @UserID from Parts PP +JOIN @Children NNF on PP.ContentID = NNF.ContentID +JOIN @Children NNT on PP.ItemID = NNT.ItemID +where NNT.ItemID != @ItemID + +DECLARE @NewParts AS TABLE +( + ContentID INT, + FromType INT, + ItemID INT +) + +DECLARE @DeleteID int +INSERT INTO DeleteLog (UserID) VALUES (@UserID) +SELECT @DeleteID = SCOPE_IDENTITY() + +DELETE from tblParts where ContentID = @OrigContentID +INSERT into @NewParts SELECT ContentID, FromType, ItemID from Parts where ContentID = @StartContentID +UPDATE PP set PP.ItemID = NN.NewItemID, PP.ContentID = @OrigContentID +FROM @NewParts PP +join @Children NN on PP.ItemID = NN.ItemID + +INSERT INTO [Parts] ([ContentID],[FromType],[ItemID],[DTS],[UserID]) + Select ContentID,[FromType],ItemID, @DTS, @UserID from @NewParts + +-- <<< Copy Annotations >>> +INSERT INTO [Annotations] ([ItemID],[TypeID],[RtfText],[SearchText],[Config],[DTS],[UserID]) + Select NewItemID, TypeID, RtfText, SearchText, Config, @DTS, @UserID + from Annotations AA Join @Children NN on AA.ItemID = NN.ItemID +-- Annotations are done +-- <<< Copy Documents and Entries>>> +-- logic to create Entries for Library Documents +INSERT INTO [Entries] ([ContentID],[DocID],[DTS],[UserID]) + SELECT NN.[NewContentID],EE.[DocID],@DTS,@UserID + FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID + JOIN [Documents] DD on EE.[DocID] = DD.[DocID] and Isnull(LibTitle,'') <> '' +-- Logic to create new documents for any documents used that do not have libtitles +INSERT INTO [Documents] ([LibTitle],[DocContent],[DocAscii],[Config],[DTS],[UserID],[FileExtension]) + OUTPUT CAST(INSERTED.[LibTitle] as INT),INSERTED.[DocID] INTO @NewDocuments + SELECT str(DD.[DocID]),[DocContent],[DocAscii],[Config],@DTS,@UserID,[FileExtension] + FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID + JOIN [Documents] DD on EE.[DocID] = DD.[DocID] and Isnull(LibTitle,'') = '' +UPDATE DD SET LibTitle = '' + FROM Documents DD JOIN @NewDocuments ND on DD.[DocID] = ND.[NewDocID] + where DTS = @DTS and UserID = @UserID +-- Documents are Done + +-- Logic to create entries for these newly created documents +INSERT INTO [Entries] ([ContentID],[DocID],[DTS],[UserID]) + SELECT NN.[NewContentID],ND.[NewDocID],@DTS,@UserID + FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID + JOIN @NewDocuments ND on EE.[DocID] = ND.[DocID] +-- Logic to Create DROUsages for these newly created documents +INSERT INTO [DROUsages] ([DocID],[ROID],[Config],[DTS],[UserID],[RODbID]) + SELECT ND.[NewDocID],[ROID],[Config],@DTS,@UserID,[RODbID] + FROM [DROUsages] RR + JOIN @NewDocuments ND on RR.[DocID] = ND.[DocID] +-- Entries are done + +-- <<< Copy RoUsages >>> +INSERT INTO [RoUsages] ([ContentID],[ROID],[Config],[DTS],[UserID],[RODbID]) + SELECT NN.[NewContentID],CAST([ROUsageID] as nvarchar(16)),[Config],@DTS,@UserID,[RODbID] + FROM [RoUsages] RR Join @Children NN on RR.ContentID = NN.ContentID +-- Update content records for newly copied records to use correct RO usage ids in the RO tags +DECLARE @RowsAffected int +SET @RowsAffected=1 +WHILE @RowsAffected > 0 +BEGIN + UPDATE CC SET [TEXT] = C2.NewText + FROM CONTENTS CC + JOIN (SELECT C1.ContentID, .dbo.vefn_FixROText(C1.Text, CAST([ROID] as int), [ROUsageID]) NewText + FROM CONTENTS C1 + JOIN @Children NN on C1.ContentID = NN.NewContentID + JOIN RoUsages RO on NN.NewContentID = RO.ContentID where Len([ROID]) < 12) C2 ON CC.ContentID = C2.ContentID + WHERE [TEXT] <> C2.NewText + SET @RowsAffected = @@RowCount +END +-- Update grid records for newly copied records to use correct RO usage ids in the RO tags +SET @RowsAffected=1 +WHILE @RowsAffected > 0 +BEGIN + UPDATE GG SET [Data] = G2.NewData + FROM GRIDS GG + JOIN (SELECT G1.ContentID, .dbo.vefn_FixROData(G1.Data, CAST([ROID] as int), [ROUsageID]) NewData + FROM GRIDS G1 + JOIN @Children NN on G1.ContentID = NN.NewContentID + JOIN RoUsages RO on NN.NewContentID = RO.ContentID where Len([ROID]) < 12) G2 ON GG.ContentID = G2.ContentID + WHERE Cast([Data] as nvarchar(max)) <> cast(G2.NewData as nvarchar(max)) + SET @RowsAffected = @@RowCount +END +UPDATE RON SET [ROID] = ROO.[ROID] + FROM RoUsages RON + JOIN @Children NN on RON.ContentID = NN.NewContentID + JOIN RoUsages ROO on CAST(RON.ROID as int) = ROO.RoUsageID + where Len(RON.[ROID]) < 12 +-- RoUsages are done + +-- <<< Copy Transtions >>> +-- Note that the inserted record has the 'TranType' field set to old transitionid. This is done +-- so that the next step can replace the old transitionid with the new transitionid in the +-- content record's transition tokens. The TranType gets reset after the content records are +-- updated. +-- Also note that the 'toid/rangeid' may need converted to newly copied ids or may not. If it's +-- not a range, then it always is converted to new, if there is a new. If it's a range, both +-- the toid & the rangeid must be new in order for the conversion to be correct. You cannot +-- have part of the range pointing to the new and part of the range pointing to the original +-- locations. + +INSERT INTO .[dbo].[Transitions] ([FromID],[ToID],[RangeID],[IsRange],[TranType],[Config],[DTS],[UserID]) + SELECT NNF.[NewContentID], + -- if both toid & range are null, use the original toid & rangeid + CASE WHEN NNT.[NewItemID] is null or NNR.[NewItemID] is null THEN [ToID] ELSE NNT.[NewItemID] END, + CASE WHEN NNT.[NewItemID] is null or NNR.[NewItemID] is null THEN [RangeID] ELSE NNR.[NewItemID] END, + [IsRange],[TransitionID],[Config],@DTS,@UserID + FROM .[dbo].[Transitions] TT + JOIN @Children NNF on TT.[FromID] = NNF.[ContentID] + LEFT JOIN @Children NNT on TT.[ToID] = NNT.[ItemID] + LEFT JOIN @Children NNR on TT.[RangeID] = NNR.[ItemID] +-- -- Update content records for newly copied records to use correct TransitionIDs in the Transition tags +SET @RowsAffected=1 +WHILE @RowsAffected > 0 +BEGIN +UPDATE CC SET [TEXT] = C2.NewText + FROM CONTENTS CC + JOIN (SELECT C1.ContentID, .dbo.vefn_FixTransitionTextForCopy(C1.Text, TRO.TransitionID, TRO.TranType, TRO.[ToID], TRO.[RangeID],TR.[TransitionID], TR.[ToID], TR.[RangeID], .dbo.vefn_GetNewTranType(NN.FormatID, NN.NewFormatID, TRO.TranType)) NewText + FROM CONTENTS C1 + JOIN @Children NN on C1.ContentID = NN.NewContentID + JOIN Transitions TR on NN.NewContentID = TR.FromID + JOIN Transitions TRO on TR.TranType = TRO.TransitionID) C2 ON CC.ContentID = C2.ContentID + WHERE [TEXT] <> C2.NewText + SET @RowsAffected = @@RowCount +END +--set nocount off +-- -- Update grid records for newly copied records to use correct TransitionIDs in the Transition tags +declare @grids table +( +contentid int primary key, +data xml +) +insert into @grids select gg.contentid,gg.data from GRIDS GG + where gg.contentid in (select nn.newcontentid from + @Children NN + JOIN Transitions TR on NN.NewContentID = TR.FromID + JOIN Transitions TRO on TR.TranType = TRO.TransitionID) + +SET @RowsAffected=1 +WHILE @RowsAffected > 0 +BEGIN +UPDATE GG SET [DATA] = G2.NewData + FROM @GRIDS GG + JOIN (SELECT G1.ContentID, .dbo.vefn_FixTransitionDataForCopy(G1.Data, TRO.TransitionID, TRO.TranType, TRO.[ToID], TRO.[RangeID],TR.[TransitionID], TR.[ToID], TR.[RangeID], .dbo.vefn_GetNewTranType(NN.FormatID, NN.NewFormatID, TRO.TranType)) NewData + FROM @GRIDS G1 + JOIN @Children NN on G1.ContentID = NN.NewContentID + JOIN Transitions TR on NN.NewContentID = TR.FromID + JOIN Transitions TRO on TR.TranType = TRO.TransitionID) G2 ON GG.ContentID = G2.ContentID + WHERE Cast([DATA] as nvarchar(max)) <> CAST(G2.NewData as nvarchar(max)) + SET @RowsAffected = @@RowCount +END +update GG set data = g1.data from Grids gg join @grids g1 on gg.contentid = g1.contentid +-- Add 'Verification Required' AnnotationType + DECLARE @typeID int + SELECT @typeID = TypeID from AnnotationTypes where Name = 'Verification Required' + IF(@typeID IS NULL) + BEGIN + INSERT INTO [AnnotationTypes] ([Name],[UserID]) VALUES ('Verification Required','Volian') + SELECT @typeID = SCOPE_IDENTITY() + END + -- Add "Verification Required" Annotation for each Transition whose transition format changes +INSERT INTO [Annotations] ([ItemID],[TypeID],[SearchText],[UserID]) + SELECT NN.NewItemID, @typeID,'Verify Transition Format',@UserID + FROM Transitions TR + JOIN @Children NN on TR.FromID = NN.NewContentID + JOIN Transitions TRO on TR.TranType = TRO.TransitionID + WHERE .dbo.vefn_CompareTranFormat(NN.FormatID, NN.NewFormatID, TRO.TranType) <> 0 + +UPDATE TR SET TR.[TranType] = .dbo.vefn_GetNewTranType(NN.FormatID, NN.NewFormatID, TRO.TranType) + FROM Transitions TR + JOIN @Children NN on TR.FromID = NN.NewContentID + JOIN Transitions TRO on TR.TranType = TRO.TransitionID +-- Transitions are done + + IF( @@TRANCOUNT > 0 ) COMMIT +END TRY +BEGIN CATCH -- Catch Block + IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level + ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback + EXEC vlnErrorHandler +END CATCH + +GO +IF (@@Error = 0) PRINT 'Procedure Creation: [CopyChildrenEnhanced] Succeeded' +ELSE PRINT 'Procedure Creation: [CopyChildrenEnhanced] Error on Creation' +GO + +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[vefn_RemoveEnhanced]') AND OBJECTPROPERTY(id,N'IsScalarFunction') = 1) + DROP FUNCTION [vefn_RemoveEnhanced]; +GO +/****** Object: UserDefinedFunction [dbo].[vefn_RemoveEnhanced] Script Date: 09/26/2024 14:31:13 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +/* +C2017-031 Remove Enhanced Tag from Configuration + Used in cases where a Paste/Replace is done from an Enhanced item + over top of a non-enhanced item. + see PasteItemReplace for usage +*/ +/***************************************************************************** + Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE + Copyright 2024 - Volian Enterprises, Inc. All rights reserved. +*****************************************************************************/ +CREATE function [dbo].[vefn_RemoveEnhanced](@config varchar(max)) +returns varchar(max) +begin + + DECLARE @xconfigNew XML = cast(@config as xml) + SET @xconfigNew.modify('delete //Enhanced[1]'); + return cast(@xconfigNew As nvarchar(max)) +end + +GO + +-- Display the status +IF (@@Error = 0) PRINT 'ScalerFunction [vefn_RemoveEnhanced] Succeeded' +ELSE PRINT 'ScalerFunction [vefn_RemoveEnhanced] Error on Creation' +go + +------------------------------------------------------------------------------ + +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[PasteItemReplace]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) + DROP PROCEDURE [PasteItemReplace]; +GO + + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +/****** Object: StoredProcedure [dbo].[PasteItemReplace] Script Date: 03/20/2012 16:02:54 ******/ +/* +declare @NewItemID int +declare @dts datetime +set @newitemid = 0 +set @dts = getdate() +exec PasteItemReplace 398,397,20014,@dts,'bodine',@NewItemID output +*/ +-- ItemID is item to replace +-- StartItemID is item to copy +/***************************************************************************** + Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE + Copyright 2024 - Volian Enterprises, Inc. All rights reserved. +*****************************************************************************/ +CREATE OR ALTER PROCEDURE [dbo].[PasteItemReplace] +( + @ItemID int=null, @StartItemID int=null, + @Type int=null, @DTS datetime, @UserID nvarchar(100), + @NewItemID int output +) +WITH EXECUTE AS OWNER +AS +BEGIN TRY -- Try Block + BEGIN TRANSACTION + DECLARE @ContentID AS INT + DECLARE @NextItemID AS INT + DECLARE @PreviousItemID AS INT + DECLARE @ExternalChildCount AS INT + DECLARE @ExternalCount AS INT + DECLARE @Path AS VARCHAR(MAX) + DECLARE @Children AS TABLE + ( + ItemID INT PRIMARY KEY, + ContentID INT + ) + + if exists (select * from tblitems where itemid = @ItemID and DeleteStatus !=0) + BEGIN + RAISERROR ('###Cannot Paste Step###This current step has been deleted in another session',16,1) + RETURN + END + -- First check if the replaced item can be deleted, i.e. it doesn't have transitions + -- pointing to it or children. + + DECLARE @ExternalTrans TABLE + ( + [FromItemID] int, + [TransitionID] [int] NOT NULL, + [FromID] [int] NOT NULL, + [ToID] [int] NOT NULL, + [RangeID] [int] NOT NULL, + [Config] [nvarchar](max) NULL + ) + SET NOCOUNT ON + DECLARE @DeleteID int + INSERT INTO DeleteLog (UserID) VALUES (@UserID) + SELECT @DeleteID = SCOPE_IDENTITY() + SELECT @ContentID = ContentID, @PreviousItemID = PreviousID FROM Items WHERE ItemID = @ItemID + SELECT @NextItemID = ItemID FROM Items WHERE PreviousID = @ItemID + --SELECT @ExternalCount = count(*) FROM vefn_FindExternalTransitions(@ItemID) + SELECT @ExternalChildCount = count(*) FROM vefn_FindExternalChildTransitions(@ItemID) + SET @Path = [dbo].[ve_GetShortPath](@ItemID) + + --IF @ExternalCount > 0 AND @NextItemID is null + --BEGIN + -- RAISERROR ('###Cannot Delete Item###Step %d has External Transitions and has no next step - (%s)',16,1,@ItemID,@Path) + -- RETURN + --END + + IF @ExternalChildCount > 0 + BEGIN + RAISERROR ('###Cannot Delete Item###Step %d has External Transitions to it''s children - (%s)',16,1,@ItemID,@Path) + RETURN + END + + -- Copy the item, 'NewItemID' represents the new item(s) + -- DestFormatID is the formatid for the destination parent's format + DECLARE @DestFormatID int + SET @DestFormatID = .dbo.vefn_GetInheritedFormat(@ItemID, 0) + EXECUTE ReplaceItemAndChildren @StartItemID, @DestFormatID, @UserID, @NewItemID OUTPUT + + --CSM C2017-031 - If Paste/Replacing from Linked Step over top of a non-linked Step + --then remove the link from the copy + --if original item was not linked, update new items to not be linked + DECLARE @xconfig XML = (Select cast(config as xml) xconfig from Contents where ContentID = @ContentID); + IF @xconfig.exist('//Enhanced[1]') = 0 + BEGIN + UPDATE Contents SET Config = dbo.vefn_RemoveEnhanced(Contents.Config) + Where ContentID in (Select ContentID FROM vefn_ChildItems(@NewItemID)) + --Where ContentID in (Select ContentID FROM Items where ItemID = @NewItemID) + END + + -- Adjust the next/previous to point to the new item + + DECLARE @PreviousID int + SELECT @PreviousID = [PreviousID] + FROM [ITEMS] II + WHERE [ItemID]=@ItemID + UPDATE [ITEMS] SET [PreviousID]=@PreviousID where [ItemID]=@NewItemID + UPDATE [CONTENTS] SET [Type]=@Type + FROM [CONTENTS] CC JOIN [ITEMS] ii ON CC.[ContentID]=II.[ContentID] + WHERE [ItemID]=@NewItemID + UPDATE [ITEMS] SET [PreviousID]=@NewItemID where [PreviousID]=@ItemID + UPDATE [PARTS] SET [ItemID]=@NewItemID where [ItemID]=@ItemID + + -- UPDATE DocVersion if this was a procedure + UPDATE DocVersions SET ItemID=@NewItemID where ItemID = @ItemID + + -- If there were 'external transitions' that pointed to the original + -- top replaced step, adjust them to point to the new top. + INSERT INTO @ExternalTrans SELECT * FROM vefn_FindExternalTransitions(@ItemID) + OPTION (MAXRECURSION 10000) + IF (SELECT COUNT(*) from @ExternalTrans) > 0 + BEGIN + -- Update content records for the transitions + Update CC + Set Text = DBO.vefn_FixTransitionText(Text,TT.TransitionID,TT.TranType,TT.ToID,TT.RangeID,@ItemID,@NewItemID) + From CONTENTS CC + JOIN Transitions TT ON TT.FromID = CC.ContentID + WHERE TransitionID in(Select TransitionID from @ExternalTrans) + -- Update transitions that point to @ItemID to Point to @NextItemID + UPDATE TRANSITIONS + SET ToID = case when ToID = @ItemID then @NewItemID else ToID END, + RangeID = case when RangeID = @ItemID then @NewItemID else RangeID END + WHERE TransitionID in(Select TransitionID from @ExternalTrans) + + DECLARE @typeID int -- AnnotationType + SELECT @typeID = TypeID from AnnotationTypes where Name = 'Verification Required' + IF(@typeID IS NULL) + BEGIN + INSERT INTO [AnnotationTypes] ([Name],[UserID]) VALUES ('Verification Required','Volian') + SELECT @typeID = SCOPE_IDENTITY() + END + -- Add 'Verification Required' annotions for transtions that pointed to top step + -- and need to point to + INSERT INTO [Annotations] ([ItemID],[TypeID],[SearchText],[UserID]) + SELECT ItemID, @typeID,'Verify Replaced Step Transition Destination',@UserID + FROM Items where ItemID in (SELECT FromItemID FROM @ExternalTrans) + + END + -- Remove the old one + + -- Get list of Children + INSERT INTO @Children SELECT * FROM vefn_ChildItems(@ItemID) + -- Delete Annotations for @ItemID and children + DELETE from Annotations where ItemID in(Select ItemID from @Children) + -- Delete Details associated with @ContentID and children + DELETE from Details where ContentID in(Select ContentID from @Children) + -- Delete Grids associated with @ContentID and children + DELETE from Grids where ContentID in(Select ContentID from @Children) + -- Delete Images associated with @ContentID and children + DELETE from Images where ContentID in(Select ContentID from @Children) + -- Delete Entries associated with @ContentID and children + DELETE from Entries where ContentID in(Select ContentID from @Children) + -- Delete ROUsages associated with @ContentID and children + DELETE from RoUsages where ContentID in(Select ContentID from @Children) + -- Delete ZTransitions records associated with @ContentID and children + DELETE FROM ZTransitions where TransitionID + in(SELECT TransitionID from Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID) + -- Delete Transitions associated with @ContentID and children + DELETE FROM Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID + -- Delete Parts associated with @ContentID and children + DELETE from Parts where ContentID in(Select ContentID from @Children) + -- Delete ZContents associated with @ContentID and children + DELETE from ZContents where ContentID in(Select ContentID from @Children) + -- Disconnect Items from Each Other + DELETE from Items where ItemID in(Select ItemID from @Children) and PreviousID Is Not Null + -- Disconnect Items to be deleted from each other + Update Items set PreviousID = null where ItemID in (Select ItemID from @Children) and PreviousID Is Not Null + -- Delete Item Records + DELETE from Items where ItemID in(Select ItemID from @Children) + -- DELETE Contents + DELETE from Contents where ContentID in(Select ContentID from @Children) +--delete from itemaudits where itemid = @newitemid +delete from itemaudits where itemid in (select itemid from vefn_ChildItems(@newitemid)) +--delete from contentaudits where contentid = (select contentid from items where itemid = @newitemid) +delete from contentaudits where contentid in (select contentid from vefn_ChildItems(@newitemid)) + DELETE from DeleteLog where DeleteID = @DeleteID + IF( @@TRANCOUNT > 0 ) COMMIT + EXECUTE GetItem @NewItemID +END TRY +BEGIN CATCH -- Catch Block + IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level + ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback + EXEC vlnErrorHandler +END CATCH +GO + +IF (@@Error = 0) PRINT 'Procedure Creation: [PasteItemReplace] Succeeded' +ELSE PRINT 'Procedure Creation: [PasteItemReplace] Error on Creation' +GO +-- SP: AddDisplayTabState + + +SET QUOTED_IDENTIFIER ON +GO +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[AddDisplayTabState]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) + DROP PROCEDURE [AddDisplayTabState]; +GO +-- ============================================= +-- Author: Paul Larsen +-- Create date: 9/18/2024 +-- Description: Save current open tab state in PROMS editor. +-- ============================================= +CREATE PROCEDURE [dbo].[AddDisplayTabState] +( + @ItemID int, + @DisplayTabID varchar(30), + @DisplayTabName varchar(100), + @userID varchar(100), + @order int +) + +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT ON; + + -- Remove all records + -- DELETE FROM [dbo].[DisplayTabTmp]; + + -- Record current tab information + INSERT INTO [dbo].[DisplayTabTmp] (itemid,DisplayTabID,DisplayTabName,userid,active, taborder) + VALUES (@ItemID,@DisplayTabID,@DisplayTabName,@userID, 1, @order) +END +GO + +-- SP: GetDisplayTabdata +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[GetDisplayTabdata]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) + DROP PROCEDURE [GetDisplayTabdata]; +GO +/****** Object: StoredProcedure [dbo].[GetDisplayTabdata] Script Date: 10/3/2024 11:29:44 AM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: Paul Larsen +-- Create date: 09/18/2024 +-- Description: retrieve PROMS edit tab saved state. +-- ============================================= +CREATE PROCEDURE [dbo].[GetDisplayTabdata] +( + @UserID varchar(100) +) + +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT ON; + + SELECT [ItemID] + ,[DisplayTabID] + ,[DisplayTabName] + ,[UpdateDate] + ,[UserID] + ,[taborder] + FROM [dbo].[DisplayTabTmp] + WHERE UserID = @UserID AND Active = 1 + order by taborder +END +GO +-- SP: DeactivateStateDisplayTabTmp +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DeactivateStateDisplayTabTmp]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) + DROP PROCEDURE [DeactivateStateDisplayTabTmp]; +GO +/****** Object: StoredProcedure [dbo].[DeactivateStateDisplayTabTmp] Script Date: 10/3/2024 11:30:53 AM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: Paul Larsen +-- Create date: 10/1/2024 +-- Description: Set PROMES Edit window tabs state inactive. +-- ============================================= +CREATE procedure [dbo].[DeactivateStateDisplayTabTmp] +( + @UserID varchar(100) +) + +AS +UPDATE [dbo].[DisplayTabTmp] +SET Active = 0 +WHERE UserID = @UserID +GO +/* +========================================================================================================== + End: C2017-031: SQL to allow copy/replace enhanced step +========================================================================================================== +*/ + /* --------------------------------------------------------------------------- | ADD New Code Before this Block | @@ -23636,8 +24040,8 @@ BEGIN TRY -- Try Block DECLARE @RevDate varchar(255) DECLARE @RevDescription varchar(255) - set @RevDate = '07/29/2024 11:24' - set @RevDescription = 'C2021-059 Add SQL for Admin tool delete folders.' + set @RevDate = '09/26/2024 11:24' + set @RevDescription = 'SQL to allow copy/replace enhanced step.' Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription diff --git a/PROMS/VEPROMS User Interface/frmVEPROMS.cs b/PROMS/VEPROMS User Interface/frmVEPROMS.cs index e6861d29..5b6fcbe7 100644 --- a/PROMS/VEPROMS User Interface/frmVEPROMS.cs +++ b/PROMS/VEPROMS User Interface/frmVEPROMS.cs @@ -1670,16 +1670,36 @@ namespace VEPROMS return; } - string stk = Volian.Base.Library.vlnStackTrace.StackToString(); + string stk = Volian.Base.Library.vlnStackTrace.StackToString(); if (!stk.Contains("Exception")) { // B2018-091 Allow PROMS to close if only MSWord sections have been opened. // B2019-071 we will now close one or all of the tabs (even step editor ones) + + string DisplayTabID = ""; + int pos; + int TabItemID; + string DisplayTabName = ""; + int cnt = 0; + // Deactivate previous procedure tab state by user + VEPROMS.CSLA.Library.Item.DeactivateStateDisplayTabTmp(MySessionInfo.UserID); + // Save current procedure tab state + foreach (KeyValuePair pgTab in tc._MyDisplayTabItems) + { + cnt++; + DisplayTabID = pgTab.Key; + TabItemID = Int32.Parse(DisplayTabID.Substring(DisplayTabID.IndexOf("Item - ") + 7)); + DisplayTabName = pgTab.Value.ToString(); + //tc.SelectedDisplayTabItem.MyStepTabPanel.ToString() + VEPROMS.CSLA.Library.Item.AddDisplayTabsState(TabItemID, DisplayTabID, DisplayTabName, MySessionInfo.UserID, cnt); + } + int n = tc._MyDisplayTabItems.Count; while (n-- > 0 && tc._MyDisplayTabItems.Count > 0) { + tc.CloseTabItem(tc.SelectedDisplayTabItem); // B2019-071 close just the current tab and continue working @@ -2320,6 +2340,27 @@ namespace VEPROMS CurrentID = txtSearch.Text; } } + + // Add retrieve displaytabs state here. + openDisplaytabstate(); + } + + public void openDisplaytabstate() + { + DataTable DisPlayTabState = VEPROMS.CSLA.Library.Item.GetDisplayTabs(VlnSettings.UserID); + + if (DisPlayTabState.Rows.Count > 0) + { + foreach (DataRow TabState in DisPlayTabState.Rows) + { + int _ItemID = (int)TabState["ItemID"]; + //ItemInfoList _Procedures = ItemInfoList.GetList(_ItemID, (int)E_FromType.Procedure)); + ItemInfo _Procedure = ItemInfo.Get(_ItemID); + //ItemInfo.Get + //ItemInfo.Get + OpenItem(_Procedure); + } + } } void tc_RefreshEnhancedDocument(object sender, ItemSelectedChangedEventArgs args) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs index eae5674d..57949a02 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs @@ -8004,6 +8004,171 @@ namespace VEPROMS.CSLA.Library MyContent.Config = _ProcedureConfig.ToString(); } #endregion + public class DisplayTabs + { + private int _ItemID; + public int ItemID + { + get { return _ItemID; } + set { _ItemID = value; } + + } + private string _DisplayTabID; + public string DisplayTabID + { + get { return _DisplayTabID; } + set { _DisplayTabID = value; } + } + private string _DisplayTabName; + public string DisplayTabName + { + get { return _DisplayTabName; } + set { _DisplayTabName = value; } + } + + public SafeDataReader Dr { get; } + + public DisplayTabs() + { + + } + + public DisplayTabs(int itemID, String displayTabID, String displayTabName) + { + _ItemID = itemID; + _DisplayTabID = displayTabID; + _DisplayTabName = displayTabName; + } + + public DisplayTabs(SafeDataReader dr) + { + Dr = dr; + } + } + public static DataTable GetDisplayTabs(int itemID) //, string displayTabID, string displayTabName) + { + try + { + DataTable tmp = DataPortal.Fetch(new DisplayTabs(itemID, "", "")); //, displayTabID, displayTabName)); + //ItemInfo.AddList(tmp); + //tmp.AddEvents(); + return tmp; + } + catch (Exception ex) + { + throw new DbCslaException("Error on ItemInfoList.GetChildren", ex); + } + } + private DataTable dt = new DataTable(); + private DataTable DataPortal_Fetch(DisplayTabs criteria) + { + + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + try + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "GetDisplayTabData"; + cm.CommandTimeout = Database.DefaultTimeout; + SqlDataAdapter da = new SqlDataAdapter(cm); + da.Fill(dt); + cn.Close(); + da.Dispose(); + return dt; + } + catch (Exception ex) + { + //if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemExt.DataPortal_Fetch", ex); + throw new DbCslaException("ItemExt.DataPortal_Fetch", ex); + } + + } + } + + } + //public static void AddDisplayTabsState(int itemID, string displayTabID, string displayTabName) + //{ + // try + // { + // //DisplayTabs tmp = + // DataPortal.Fetch(new DisplayTabs(itemID, displayTabID, displayTabName)); //, displayTabID, displayTabName)); + // //ItemInfo.AddList(tmp); + // //tmp.AddEvents(); + // //return tmp; + // } + // catch (Exception ex) + // { + // throw new DbCslaException("Error on ItemInfoList.GetChildren", ex); + // } + //} + //private DataTable dt = new DataTable(); + //private void DataPortal_Fetch(int itemID, string displayTabID, string displayTabName) + //{ + + // using (SqlConnection cn = Database.VEPROMS_SqlConnection) + // { + // using (SqlCommand cm = cn.CreateCommand()) + // { + // try + // { + // cm.CommandType = CommandType.StoredProcedure; + // cm.CommandText = "AddDisplayTabState"; + // cm.CommandTimeout = Database.DefaultTimeout; + // cm.Parameters.AddWithValue("@ItemID", ItemID); + // cm.Parameters.AddWithValue("@displayTabID", displayTabID); + // cm.Parameters.AddWithValue("@displayTabName", displayTabName); + // cm.ExecuteNonQuery(); + // //SqlDataAdapter da = new SqlDataAdapter(cm); + // //da.Fill(dt); + // //cn.Close(); + // //da.Dispose(); + // //return dt; // fix + // } + // catch (Exception ex) + // { + // //if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemExt.DataPortal_Fetch", ex); + // throw new DbCslaException("ItemExt.DataPortal_Fetch", ex); + // } + + // } + // } + + //} + public static void AddDisplayTabsState(int itemID, string displayTabID, string displayTabName) + //private void DataPortal_Fetch(int itemID, string displayTabID, string displayTabName) + { + + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + try + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "AddDisplayTabState"; + cm.CommandTimeout = Database.DefaultTimeout; + cm.Parameters.AddWithValue("@ItemID", itemID); + cm.Parameters.AddWithValue("@displayTabID", displayTabID); + cm.Parameters.AddWithValue("@displayTabName", displayTabName); + cm.ExecuteNonQuery(); + //SqlDataAdapter da = new SqlDataAdapter(cm); + //da.Fill(dt); + //cn.Close(); + //da.Dispose(); + //return dt; // fix + } + catch (Exception ex) + { + //if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemExt.AddDisplayTabsState", ex); + throw new DbCslaException("ItemExt.AddDisplayTabsState", ex); + } + + } + } + + } } #endregion #region SectionInfo diff --git a/PROMS/VEPROMS.CSLA.Library/Generated/Item.cs b/PROMS/VEPROMS.CSLA.Library/Generated/Item.cs index 57a55d22..94168c79 100644 --- a/PROMS/VEPROMS.CSLA.Library/Generated/Item.cs +++ b/PROMS/VEPROMS.CSLA.Library/Generated/Item.cs @@ -1132,6 +1132,91 @@ namespace VEPROMS.CSLA.Library throw new DbCslaException("Item.Add", ex); } } + public static void DeactivateStateDisplayTabTmp(string UserID) + { + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + try + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "DeactivateStateDisplayTabTmp"; + cm.CommandTimeout = Database.DefaultTimeout; + cm.Parameters.AddWithValue("@UserID", UserID); + cm.ExecuteNonQuery(); + } + catch (Exception ex) + { + //if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemExt.DeactivateStateDisplayTabTmp", ex); + throw new DbCslaException("ItemExt.DeactivateStateDisplayTabTmp", ex); + } + + } + } + } + public static void AddDisplayTabsState(int itemID, string displayTabID, string displayTabName, string UserID, int order) + //private void DataPortal_Fetch(int itemID, string displayTabID, string displayTabName) + { + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + try + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "AddDisplayTabState"; + cm.CommandTimeout = Database.DefaultTimeout; + cm.Parameters.AddWithValue("@ItemID", itemID); + cm.Parameters.AddWithValue("@displayTabID", displayTabID); + cm.Parameters.AddWithValue("@displayTabName", displayTabName); + cm.Parameters.AddWithValue("@UserID", UserID); + cm.Parameters.AddWithValue("@order", order); + cm.ExecuteNonQuery(); + } + catch (Exception ex) + { + //if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemExt.AddDisplayTabsState", ex); + throw new DbCslaException("ItemExt.AddDisplayTabsState", ex); + } + } + } + } + public static DataTable GetDisplayTabs(string UserID) //, string displayTabID, string displayTabName) + //public static void DeactivateStateDisplayTabTmp(string UserID) + { + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + try + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "GetDisplayTabdata"; + cm.CommandTimeout = Database.DefaultTimeout; + cm.Parameters.AddWithValue("@UserID", UserID); + //cm.ExecuteNonQuery(); + SqlDataAdapter da = new SqlDataAdapter(cm); + //da.Fill(dt); + //cn.Close(); + //da.Dispose(); + //return dt; // fix + + SqlDataReader reader = cm.ExecuteReader(); + DataTable dt = new DataTable(); + dt.Load(reader); + return dt; + + } + catch (Exception ex) + { + //if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemExt.DeactivateStateDisplayTabTmp", ex); + throw new DbCslaException("ItemExt.DeactivateStateDisplayTabTmp", ex); + } + + } + } + } [Transactional(TransactionalTypes.TransactionScope)] protected override void DataPortal_Update() { diff --git a/PROMS/Volian.Controls.Library/DisplayTabControl.cs b/PROMS/Volian.Controls.Library/DisplayTabControl.cs index 5f37d421..eadede05 100644 --- a/PROMS/Volian.Controls.Library/DisplayTabControl.cs +++ b/PROMS/Volian.Controls.Library/DisplayTabControl.cs @@ -16,6 +16,12 @@ namespace Volian.Controls.Library public delegate ItemInfo DisplayTabControlEditorSearchIncTransEvent(object sender, vlnTreeItemInfoEventArgs args); public delegate void DisplayTabControlEvent(object sender, EventArgs args); public delegate void DisplayTabControlStatusEvent(object sender, DisplayTabControlStatusEventArgs args); + public class DisplayTabData + { + public int ItemID { get; set; } + public string DisplayTabID { get; set; } + public string DisplayTabName { get; set; } + } public partial class DisplayTabControlStatusEventArgs : EventArgs { private VolianStatusType _Type; @@ -1145,6 +1151,9 @@ namespace Volian.Controls.Library } else // If not already open, create a new Page { + + List DisplayTabs = new List(); + pg = new DisplayTabItem(this.components, this, proc, key); // Open a new Procedure Tab _MyDisplayTabItems.Add(key, pg); if (setFocus)