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:
@@ -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
|
||||
Reference in New Issue
Block a user