feat: add startup config validation and document ConfigManager pipeline editor

Add ConfigurationValidationRunner with IConfigurationValidator interface for
validating required settings at startup. Includes SecureStore and LDAP validators.
Expand ConfigManager with pipeline editing UI, dialogs, and step editors.
Update documentation with config validation guidance.
This commit is contained in:
Joseph Doherty
2026-01-21 17:47:15 -05:00
parent ceb63bfefb
commit e5fe2f06e9
88 changed files with 4995 additions and 201 deletions
@@ -15,6 +15,7 @@ BEGIN
[UpdateType] SMALLINT NOT NULL,
[WasSuccessful] BIT NOT NULL,
[NumberRecords] BIGINT NOT NULL,
[Parameters] NVARCHAR(MAX) NULL,
CONSTRAINT [PK_DataUpdate] PRIMARY KEY CLUSTERED([ID])
);
END
@@ -0,0 +1,567 @@
-- Migration: 049_CreateProcessMisStagingDataProcedure
-- Processes MIS staging data (mis_temp) into MisData_Curr and MisData_Hist tables
-- Handles version management with Current/BackLevel status tracking
CREATE OR ALTER PROCEDURE [dbo].[usp_ProcessMisStagingData]
@SaveChanges BIT = 0 -- 0 = debug mode (SELECT only), 1 = save changes
AS
BEGIN
/*
=============================================
Stored Procedure: usp_ProcessMisStagingData
=============================================
PURPOSE:
Processes MIS (Manufacturing Inspection Specification) data from the staging
table (mis_temp) into production tables (MisData_Curr and MisData_Hist).
Handles version management, ensuring only the latest version remains in _Curr
while older versions are archived to _Hist with proper status and dates.
PARAMETERS:
@SaveChanges BIT (default 0)
0 = Debug/preview mode - shows what would happen without making changes
1 = Execute mode - applies all changes within a transaction
TABLES INVOLVED:
- mis_temp : Staging table with incoming MIS data
- MisData_Curr : Current/active MIS specifications (Status = 'Current')
- MisData_Hist : Historical MIS specifications (Status = 'BackLevel')
VERSION SCOPE:
Versions are scoped by: MisNumber + ItemNumber + BranchCode
Within each scope, RevID + ReleaseDate determine version ordering.
PROCESSING FLOW:
Step 0: Data Preparation
a) Clean staging data - remove 'IIS_' prefix from MisNumber values
b) Create performance indices on staging table
Step 1-3: Version Analysis
1) Build unified version list from MisData_Curr and mis_temp
2) Identify the latest version for each scope
3) Build version chain with calculated ObsoleteDates
(ObsoleteDate = ReleaseDate of the next version)
Step 4-7: Record Classification
4) Records to obsolete - Current records superseded by newer versions
5) Intermediate versions - Staging records that are not the latest
6) Records to merge - Existing current records with field changes
7) Records to insert - New records for latest versions
Step 8: Debug Output
- Displays summary counts and detailed record lists for review
Step 9: Apply Changes (when @SaveChanges = 1)
a) UPDATE MisData_Curr: Set Status='BackLevel' and ObsoleteDate
for records being moved to history
b) INSERT INTO MisData_Hist: Copy BackLevel records from MisData_Curr
c) DELETE FROM MisData_Curr: Remove the BackLevel records
d) INSERT INTO MisData_Hist: Add intermediate versions with Status='BackLevel'
e) UPDATE MisData_Curr: Merge field changes for existing current records
f) INSERT INTO MisData_Curr: Add new records with Status='Current'
STATUS VALUES:
- 'Current' : Active specification in MisData_Curr (ObsoleteDate = NULL)
- 'BackLevel' : Superseded specification in MisData_Hist (ObsoleteDate = set)
ERROR HANDLING:
All changes in Step 9 are wrapped in a transaction. On error, changes are
rolled back and the error is re-thrown.
USAGE:
-- Preview changes (debug mode)
EXEC usp_ProcessMisStagingData @SaveChanges = 0;
-- Apply changes
EXEC usp_ProcessMisStagingData @SaveChanges = 1;
=============================================
*/
SET NOCOUNT ON;
-- =============================================
-- Step 0a: Clean staging data - remove IIS_ prefix from MisNumber
-- =============================================
UPDATE mis_temp
SET MIS_IIS_Number = SUBSTRING(MIS_IIS_Number, 5, LEN(MIS_IIS_Number) - 4)
WHERE MIS_IIS_Number LIKE 'IIS_%';
PRINT 'Cleaned ' + CAST(@@ROWCOUNT AS VARCHAR(10)) + ' MisNumber values (removed IIS_ prefix)';
-- =============================================
-- Step 0b: Recreate indices on staging table for performance
-- Naming convention: IX_<TableName>_<Purpose>
-- =============================================
-- Drop existing indices if they exist
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'IX_mis_temp_VersionLookup' AND object_id = OBJECT_ID('mis_temp'))
DROP INDEX IX_mis_temp_VersionLookup ON mis_temp;
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'IX_mis_temp_CharLookup' AND object_id = OBJECT_ID('mis_temp'))
DROP INDEX IX_mis_temp_CharLookup ON mis_temp;
-- Also drop old index names if they exist (cleanup)
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'IX_mis_temp_Version' AND object_id = OBJECT_ID('mis_temp'))
DROP INDEX IX_mis_temp_Version ON mis_temp;
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'IX_mis_temp_Full' AND object_id = OBJECT_ID('mis_temp'))
DROP INDEX IX_mis_temp_Full ON mis_temp;
-- Create index for version-level joins (MisNumber + ItemNumber + BranchCode + RevID)
CREATE NONCLUSTERED INDEX IX_mis_temp_VersionLookup
ON mis_temp (MIS_IIS_Number, PartNumber, Site, Version)
INCLUDE (Release_Date);
PRINT 'Created index IX_mis_temp_VersionLookup';
-- Create index for row-level joins (includes CharacterNumber)
CREATE NONCLUSTERED INDEX IX_mis_temp_CharLookup
ON mis_temp (MIS_IIS_Number, PartNumber, Site, Version, CharacterNumber)
INCLUDE (OperationNumber, TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions, Release_Date);
PRINT 'Created index IX_mis_temp_CharLookup';
-- =============================================
-- Step 1: Build unified version list from both MisData_Curr and mis_temp
-- Version scope: MisNumber + ItemNumber + BranchCode
-- =============================================
CREATE TABLE #AllVersions (
MisNumber varchar(32),
ItemNumber varchar(32),
BranchCode varchar(32),
RevID varchar(32),
ReleaseDate datetime2,
Source varchar(10),
VersionRank int
);
INSERT INTO #AllVersions (MisNumber, ItemNumber, BranchCode, RevID, ReleaseDate, Source)
SELECT DISTINCT MisNumber, ItemNumber, BranchCode, RevID, ReleaseDate, 'CURR'
FROM MisData_Curr
WHERE Status = 'Current' AND ObsoleteDate IS NULL;
INSERT INTO #AllVersions (MisNumber, ItemNumber, BranchCode, RevID, ReleaseDate, Source)
SELECT DISTINCT
LTRIM(RTRIM(MIS_IIS_Number)),
ISNULL(LTRIM(RTRIM(PartNumber)), '0'),
ISNULL(LTRIM(RTRIM(Site)), ''),
LTRIM(RTRIM(Version)),
Release_Date,
'STAGING'
FROM mis_temp s
WHERE NOT EXISTS (
SELECT 1 FROM #AllVersions a
WHERE a.MisNumber = LTRIM(RTRIM(s.MIS_IIS_Number))
AND a.ItemNumber = ISNULL(LTRIM(RTRIM(s.PartNumber)), '0')
AND a.BranchCode = ISNULL(LTRIM(RTRIM(s.Site)), '')
AND a.RevID = LTRIM(RTRIM(s.Version))
);
;WITH RankedVersions AS (
SELECT MisNumber, ItemNumber, BranchCode, RevID, ReleaseDate, Source,
ROW_NUMBER() OVER (PARTITION BY MisNumber, ItemNumber, BranchCode ORDER BY ReleaseDate, RevID) AS Rnk
FROM #AllVersions
)
UPDATE a
SET VersionRank = r.Rnk
FROM #AllVersions a
INNER JOIN RankedVersions r ON
a.MisNumber = r.MisNumber
AND a.ItemNumber = r.ItemNumber
AND a.BranchCode = r.BranchCode
AND a.RevID = r.RevID;
-- =============================================
-- Step 2: Identify the latest version for each scope
-- =============================================
CREATE TABLE #LatestVersions (
MisNumber varchar(32),
ItemNumber varchar(32),
BranchCode varchar(32),
RevID varchar(32),
ReleaseDate datetime2,
MaxRank int
);
INSERT INTO #LatestVersions
SELECT MisNumber, ItemNumber, BranchCode, RevID, ReleaseDate, VersionRank
FROM #AllVersions a
WHERE VersionRank = (
SELECT MAX(VersionRank) FROM #AllVersions
WHERE MisNumber = a.MisNumber
AND ItemNumber = a.ItemNumber
AND BranchCode = a.BranchCode
);
-- =============================================
-- Step 3: Build version chain with ObsoleteDates
-- =============================================
CREATE TABLE #VersionChain (
MisNumber varchar(32),
ItemNumber varchar(32),
BranchCode varchar(32),
RevID varchar(32),
ReleaseDate datetime2,
ObsoleteDate datetime2,
Source varchar(10),
IsLatest bit
);
INSERT INTO #VersionChain
SELECT
a.MisNumber, a.ItemNumber, a.BranchCode, a.RevID, a.ReleaseDate,
(SELECT MIN(ReleaseDate) FROM #AllVersions
WHERE MisNumber = a.MisNumber
AND ItemNumber = a.ItemNumber
AND BranchCode = a.BranchCode
AND VersionRank = a.VersionRank + 1) AS ObsoleteDate,
a.Source,
CASE WHEN l.MisNumber IS NOT NULL THEN 1 ELSE 0 END AS IsLatest
FROM #AllVersions a
LEFT JOIN #LatestVersions l ON
a.MisNumber = l.MisNumber
AND a.ItemNumber = l.ItemNumber
AND a.BranchCode = l.BranchCode
AND a.RevID = l.RevID;
CREATE NONCLUSTERED INDEX IX_VersionChain_Lookup ON #VersionChain (MisNumber, ItemNumber, BranchCode, RevID);
-- =============================================
-- Step 4: Identify records to move to history (from MisData_Curr)
-- These are current records whose version is superseded by a newer version
-- =============================================
CREATE TABLE #RecordsToObsolete (
ItemNumber varchar(32),
BranchCode varchar(32),
SequenceNumber varchar(32),
MisNumber varchar(32),
RevID varchar(32),
CharNumber varchar(32),
TestDescription varchar(2000),
SamplingType varchar(32),
SamplingValue varchar(32),
ToolsGauges varchar(2000),
WorkInstructions varchar(2000),
Status varchar(32),
ReleaseDate datetime2,
ObsoleteDate datetime2
);
INSERT INTO #RecordsToObsolete
SELECT
c.ItemNumber, c.BranchCode, c.SequenceNumber, c.MisNumber, c.RevID, c.CharNumber,
c.TestDescription, c.SamplingType, c.SamplingValue, c.ToolsGauges, c.WorkInstructions,
c.Status, c.ReleaseDate,
v.ObsoleteDate
FROM MisData_Curr c
INNER JOIN #VersionChain v ON
c.MisNumber = v.MisNumber
AND c.ItemNumber = v.ItemNumber
AND c.BranchCode = v.BranchCode
AND c.RevID = v.RevID
WHERE v.IsLatest = 0;
-- =============================================
-- Step 5: Identify intermediate versions from staging to insert into history
-- These are staging records for versions that are not the latest
-- =============================================
CREATE TABLE #IntermediateToHistory (
ItemNumber varchar(32),
BranchCode varchar(32),
SequenceNumber varchar(32),
MisNumber varchar(32),
RevID varchar(32),
CharNumber varchar(32),
TestDescription varchar(2000),
SamplingType varchar(32),
SamplingValue varchar(32),
ToolsGauges varchar(2000),
WorkInstructions varchar(2000),
ReleaseDate datetime2,
ObsoleteDate datetime2
);
INSERT INTO #IntermediateToHistory
SELECT
ISNULL(LTRIM(RTRIM(s.PartNumber)), '0'),
ISNULL(LTRIM(RTRIM(s.Site)), ''),
ISNULL(LTRIM(RTRIM(s.OperationNumber)), '0'),
LTRIM(RTRIM(s.MIS_IIS_Number)),
LTRIM(RTRIM(s.Version)),
LTRIM(RTRIM(s.CharacterNumber)),
LTRIM(RTRIM(s.TestDescription)),
LTRIM(RTRIM(s.SamplingType)),
LTRIM(RTRIM(s.SamplingValue)),
LTRIM(RTRIM(s.ToolsGauges)),
LTRIM(RTRIM(s.WorkInstructions)),
s.Release_Date,
v.ObsoleteDate
FROM mis_temp s
INNER JOIN #VersionChain v ON
LTRIM(RTRIM(s.MIS_IIS_Number)) = v.MisNumber
AND ISNULL(LTRIM(RTRIM(s.PartNumber)), '0') = v.ItemNumber
AND ISNULL(LTRIM(RTRIM(s.Site)), '') = v.BranchCode
AND LTRIM(RTRIM(s.Version)) = v.RevID
WHERE v.IsLatest = 0 AND v.Source = 'STAGING';
-- =============================================
-- Step 6: Identify records to merge (update existing in MisData_Curr)
-- These are current records where field values have changed in staging
-- =============================================
CREATE TABLE #RecordsToMerge (
MisNumber varchar(32),
ItemNumber varchar(32),
BranchCode varchar(32),
RevID varchar(32),
CharNumber varchar(32),
Curr_TestDescription varchar(2000),
Curr_SamplingType varchar(32),
Curr_SamplingValue varchar(32),
Curr_ToolsGauges varchar(2000),
Curr_WorkInstructions varchar(2000),
New_TestDescription varchar(2000),
New_SamplingType varchar(32),
New_SamplingValue varchar(32),
New_ToolsGauges varchar(2000),
New_WorkInstructions varchar(2000)
);
INSERT INTO #RecordsToMerge
SELECT
c.MisNumber, c.ItemNumber, c.BranchCode, c.RevID, c.CharNumber,
c.TestDescription, c.SamplingType, c.SamplingValue, c.ToolsGauges, c.WorkInstructions,
LTRIM(RTRIM(s.TestDescription)), LTRIM(RTRIM(s.SamplingType)), LTRIM(RTRIM(s.SamplingValue)),
LTRIM(RTRIM(s.ToolsGauges)), LTRIM(RTRIM(s.WorkInstructions))
FROM MisData_Curr c
INNER JOIN mis_temp s ON
c.MisNumber = LTRIM(RTRIM(s.MIS_IIS_Number))
AND c.ItemNumber = ISNULL(LTRIM(RTRIM(s.PartNumber)), '0')
AND c.BranchCode = ISNULL(LTRIM(RTRIM(s.Site)), '')
AND c.RevID = LTRIM(RTRIM(s.Version))
AND c.CharNumber = LTRIM(RTRIM(s.CharacterNumber))
INNER JOIN #VersionChain v ON
c.MisNumber = v.MisNumber
AND c.ItemNumber = v.ItemNumber
AND c.BranchCode = v.BranchCode
AND c.RevID = v.RevID
WHERE v.IsLatest = 1
AND (
ISNULL(c.TestDescription, '') <> ISNULL(LTRIM(RTRIM(s.TestDescription)), '')
OR ISNULL(c.SamplingType, '') <> ISNULL(LTRIM(RTRIM(s.SamplingType)), '')
OR ISNULL(c.SamplingValue, '') <> ISNULL(LTRIM(RTRIM(s.SamplingValue)), '')
OR ISNULL(c.ToolsGauges, '') <> ISNULL(LTRIM(RTRIM(s.ToolsGauges)), '')
OR ISNULL(c.WorkInstructions, '') <> ISNULL(LTRIM(RTRIM(s.WorkInstructions)), '')
);
-- =============================================
-- Step 7: Identify new records to insert into MisData_Curr
-- These are staging records for the latest version that don't exist in current
-- =============================================
CREATE TABLE #RecordsToInsert (
ItemNumber varchar(32),
BranchCode varchar(32),
SequenceNumber varchar(32),
MisNumber varchar(32),
RevID varchar(32),
CharNumber varchar(32),
TestDescription varchar(2000),
SamplingType varchar(32),
SamplingValue varchar(32),
ToolsGauges varchar(2000),
WorkInstructions varchar(2000),
ReleaseDate datetime2
);
INSERT INTO #RecordsToInsert
SELECT
ISNULL(LTRIM(RTRIM(s.PartNumber)), '0'),
ISNULL(LTRIM(RTRIM(s.Site)), ''),
ISNULL(LTRIM(RTRIM(s.OperationNumber)), '0'),
LTRIM(RTRIM(s.MIS_IIS_Number)),
LTRIM(RTRIM(s.Version)),
LTRIM(RTRIM(s.CharacterNumber)),
LTRIM(RTRIM(s.TestDescription)),
LTRIM(RTRIM(s.SamplingType)),
LTRIM(RTRIM(s.SamplingValue)),
LTRIM(RTRIM(s.ToolsGauges)),
LTRIM(RTRIM(s.WorkInstructions)),
s.Release_Date
FROM mis_temp s
INNER JOIN #VersionChain v ON
LTRIM(RTRIM(s.MIS_IIS_Number)) = v.MisNumber
AND ISNULL(LTRIM(RTRIM(s.PartNumber)), '0') = v.ItemNumber
AND ISNULL(LTRIM(RTRIM(s.Site)), '') = v.BranchCode
AND LTRIM(RTRIM(s.Version)) = v.RevID
WHERE v.IsLatest = 1
AND NOT EXISTS (
SELECT 1 FROM MisData_Curr c
WHERE c.MisNumber = LTRIM(RTRIM(s.MIS_IIS_Number))
AND c.ItemNumber = ISNULL(LTRIM(RTRIM(s.PartNumber)), '0')
AND c.BranchCode = ISNULL(LTRIM(RTRIM(s.Site)), '')
AND c.RevID = LTRIM(RTRIM(s.Version))
AND c.CharNumber = LTRIM(RTRIM(s.CharacterNumber))
);
-- =============================================
-- Step 8: Output debug/preview information
-- =============================================
DECLARE @CountToObsolete INT = (SELECT COUNT(*) FROM #RecordsToObsolete);
DECLARE @CountIntermediate INT = (SELECT COUNT(*) FROM #IntermediateToHistory);
DECLARE @CountToMerge INT = (SELECT COUNT(*) FROM #RecordsToMerge);
DECLARE @CountToInsert INT = (SELECT COUNT(*) FROM #RecordsToInsert);
PRINT '=== SUMMARY ===';
PRINT 'Current records to move to history: ' + CAST(@CountToObsolete AS VARCHAR(10));
PRINT 'Intermediate versions to history: ' + CAST(@CountIntermediate AS VARCHAR(10));
PRINT 'Records to merge (update): ' + CAST(@CountToMerge AS VARCHAR(10));
PRINT 'Records to insert (new): ' + CAST(@CountToInsert AS VARCHAR(10));
SELECT 'VERSION_CHAIN' AS Action, MisNumber, ItemNumber, BranchCode, RevID,
ReleaseDate, ObsoleteDate, Source,
CASE WHEN IsLatest = 1 THEN 'YES' ELSE 'NO' END AS IsLatest
FROM #VersionChain
WHERE EXISTS (
SELECT 1 FROM #VersionChain vc
WHERE vc.MisNumber = #VersionChain.MisNumber
AND vc.ItemNumber = #VersionChain.ItemNumber
AND vc.BranchCode = #VersionChain.BranchCode
GROUP BY vc.MisNumber, vc.ItemNumber, vc.BranchCode
HAVING COUNT(*) > 1
)
ORDER BY MisNumber, ItemNumber, BranchCode, ReleaseDate;
SELECT 'MOVE_TO_HIST' AS Action, MisNumber, ItemNumber, BranchCode, RevID, CharNumber, ReleaseDate, ObsoleteDate
FROM #RecordsToObsolete ORDER BY MisNumber, ItemNumber, BranchCode, RevID, CharNumber;
SELECT 'INTERMEDIATE_TO_HIST' AS Action, MisNumber, ItemNumber, BranchCode, RevID, CharNumber, ReleaseDate, ObsoleteDate
FROM #IntermediateToHistory ORDER BY MisNumber, ItemNumber, BranchCode, RevID, CharNumber;
SELECT 'MERGE_UPDATE' AS Action, MisNumber, ItemNumber, BranchCode, RevID, CharNumber,
Curr_TestDescription, New_TestDescription
FROM #RecordsToMerge ORDER BY MisNumber, ItemNumber, BranchCode, CharNumber;
SELECT 'INSERT_NEW' AS Action, MisNumber, ItemNumber, BranchCode, RevID, CharNumber, ReleaseDate
FROM #RecordsToInsert ORDER BY MisNumber, ItemNumber, BranchCode, CharNumber;
-- =============================================
-- Step 9: If SaveChanges = 1, perform the operations
-- =============================================
IF @SaveChanges = 1
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
-- 9a) Update records in MisData_Curr to BackLevel status before moving to history
UPDATE c SET
Status = 'BackLevel',
ObsoleteDate = o.ObsoleteDate
FROM MisData_Curr c
INNER JOIN #RecordsToObsolete o ON
c.MisNumber = o.MisNumber
AND c.ItemNumber = o.ItemNumber
AND c.BranchCode = o.BranchCode
AND c.RevID = o.RevID
AND c.CharNumber = o.CharNumber;
PRINT 'Updated ' + CAST(@@ROWCOUNT AS VARCHAR(10)) + ' records to BackLevel status in MisData_Curr';
-- 9b) Insert BackLevel records into history
INSERT INTO MisData_Hist (
ItemNumber, BranchCode, SequenceNumber, MisNumber, RevID, CharNumber,
TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions,
Status, ReleaseDate, ObsoleteDate
)
SELECT
ItemNumber, BranchCode, SequenceNumber, MisNumber, RevID, CharNumber,
TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions,
'BackLevel', ReleaseDate, ObsoleteDate
FROM #RecordsToObsolete;
PRINT 'Moved ' + CAST(@@ROWCOUNT AS VARCHAR(10)) + ' records to MisData_Hist';
-- 9c) Delete BackLevel records from MisData_Curr
DELETE c FROM MisData_Curr c
INNER JOIN #RecordsToObsolete o ON
c.MisNumber = o.MisNumber
AND c.ItemNumber = o.ItemNumber
AND c.BranchCode = o.BranchCode
AND c.RevID = o.RevID
AND c.CharNumber = o.CharNumber;
PRINT 'Deleted ' + CAST(@@ROWCOUNT AS VARCHAR(10)) + ' BackLevel records from MisData_Curr';
-- 9d) Insert intermediate versions directly to history with BackLevel status
INSERT INTO MisData_Hist (
ItemNumber, BranchCode, SequenceNumber, MisNumber, RevID, CharNumber,
TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions,
Status, ReleaseDate, ObsoleteDate
)
SELECT
ItemNumber, BranchCode, SequenceNumber, MisNumber, RevID, CharNumber,
TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions,
'BackLevel', ReleaseDate, ObsoleteDate
FROM #IntermediateToHistory;
PRINT 'Inserted ' + CAST(@@ROWCOUNT AS VARCHAR(10)) + ' intermediate versions into MisData_Hist';
-- 9e) Merge field changes for existing current records
UPDATE c SET
TestDescription = m.New_TestDescription,
SamplingType = m.New_SamplingType,
SamplingValue = m.New_SamplingValue,
ToolsGauges = m.New_ToolsGauges,
WorkInstructions = m.New_WorkInstructions
FROM MisData_Curr c
INNER JOIN #RecordsToMerge m ON
c.MisNumber = m.MisNumber
AND c.ItemNumber = m.ItemNumber
AND c.BranchCode = m.BranchCode
AND c.RevID = m.RevID
AND c.CharNumber = m.CharNumber;
PRINT 'Merged ' + CAST(@@ROWCOUNT AS VARCHAR(10)) + ' records in MisData_Curr';
-- 9f) Insert new records with Current status
INSERT INTO MisData_Curr (
ItemNumber, BranchCode, SequenceNumber, MisNumber, RevID, CharNumber,
TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions,
Status, ReleaseDate, ObsoleteDate
)
SELECT
ItemNumber, BranchCode, SequenceNumber, MisNumber, RevID, CharNumber,
TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions,
'Current', ReleaseDate, NULL
FROM #RecordsToInsert;
PRINT 'Inserted ' + CAST(@@ROWCOUNT AS VARCHAR(10)) + ' new records into MisData_Curr';
COMMIT TRANSACTION;
PRINT 'Transaction committed successfully';
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
PRINT 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
END
ELSE
BEGIN
PRINT 'Debug mode: No changes saved. Set @SaveChanges = 1 to apply changes.';
END
-- Cleanup temp tables
DROP TABLE #RecordsToObsolete;
DROP TABLE #IntermediateToHistory;
DROP TABLE #VersionChain;
DROP TABLE #LatestVersions;
DROP TABLE #AllVersions;
DROP TABLE #RecordsToMerge;
DROP TABLE #RecordsToInsert;
END
GO