diff --git a/.gitignore b/.gitignore index 9b7bb67..7ab5808 100644 --- a/.gitignore +++ b/.gitignore @@ -242,3 +242,11 @@ ModelManifest.xml .fake/ .vscode +020_DIRECT_Framework/Direct_Framework/Direct_Framework.jfm +*.jfm +*.jfm +*.jfm +020_DIRECT_Framework/Direct_Framework/Direct_Framework.jfm +*.jfm +*.jfm +020_DIRECT_Framework/Direct_Framework/Direct_Framework.jfm diff --git a/020_DIRECT_Framework/Direct_Framework/Direct_Framework.jfm b/020_DIRECT_Framework/Direct_Framework/Direct_Framework.jfm index 8de0a25..bade894 100644 Binary files a/020_DIRECT_Framework/Direct_Framework/Direct_Framework.jfm and b/020_DIRECT_Framework/Direct_Framework/Direct_Framework.jfm differ diff --git a/020_DIRECT_Framework/Direct_Framework/Direct_Framework.sqlproj b/020_DIRECT_Framework/Direct_Framework/Direct_Framework.sqlproj index 3b5f016..64f0214 100644 --- a/020_DIRECT_Framework/Direct_Framework/Direct_Framework.sqlproj +++ b/020_DIRECT_Framework/Direct_Framework/Direct_Framework.sqlproj @@ -141,6 +141,8 @@ + + diff --git a/020_DIRECT_Framework/Direct_Framework/Functions/GetModuleAreaByModuleId.sql b/020_DIRECT_Framework/Direct_Framework/Functions/GetModuleAreaByModuleId.sql new file mode 100644 index 0000000..5ddc560 --- /dev/null +++ b/020_DIRECT_Framework/Direct_Framework/Functions/GetModuleAreaByModuleId.sql @@ -0,0 +1,26 @@ +CREATE FUNCTION omd.GetModuleAreaByModuleId +( + @ModuleId INT -- The identifier of the Module (PK). +) +RETURNS VARCHAR(255) AS + +-- ============================================= +-- Function: Get Module Area (by Id) +-- Description: Takes the module id as input and returns the area code as registered in the framework +-- ============================================= + +BEGIN + -- Declare ouput variable + + DECLARE @ModuleArea VARCHAR(255) = + ( + SELECT module.AREA_CODE + FROM omd.MODULE module + WHERE MODULE_ID = @ModuleId + ) + + SET @ModuleArea = COALESCE(@ModuleArea,'N/A') + + -- Return the result of the function + RETURN @ModuleArea +END \ No newline at end of file diff --git a/020_DIRECT_Framework/Direct_Framework/Functions/omd.GetLoadWindowDateTimes.sql b/020_DIRECT_Framework/Direct_Framework/Functions/omd.GetLoadWindowDateTimes.sql index 24e70e6..40a37fe 100644 --- a/020_DIRECT_Framework/Direct_Framework/Functions/omd.GetLoadWindowDateTimes.sql +++ b/020_DIRECT_Framework/Direct_Framework/Functions/omd.GetLoadWindowDateTimes.sql @@ -1,4 +1,4 @@ -CREATE FUNCTION [omd].[GetLoadWindowDateTimes] ( @module_code VARCHAR(255), @start_or_end tinyint) +CREATE FUNCTION [omd].[GetLoadWindowDateTimes] ( @ModuleId INT, @start_or_end tinyint) RETURNS DATETIME2(7) AS BEGIN DECLARE @result DATETIME2(7) @@ -15,7 +15,7 @@ BEGIN ROW_NUMBER() OVER (PARTITION BY MODULE_ID ORDER BY INSERT_DATETIME DESC) AS ROW_NR FROM omd.SOURCE_CONTROL sct JOIN omd.MODULE_INSTANCE modinst ON sct.MODULE_INSTANCE_ID = modinst.MODULE_INSTANCE_ID - WHERE MODULE_ID = (SELECT MODULE_ID FROM omd.MODULE WHERE MODULE_CODE=@module_code) + WHERE MODULE_ID = @ModuleId ) ranksub WHERE ROW_NR=1 END @@ -31,10 +31,9 @@ BEGIN ROW_NUMBER() OVER (PARTITION BY MODULE_ID ORDER BY INSERT_DATETIME DESC) AS ROW_NR FROM omd.SOURCE_CONTROL sct JOIN omd.MODULE_INSTANCE modinst ON sct.MODULE_INSTANCE_ID = modinst.MODULE_INSTANCE_ID - WHERE MODULE_ID = (SELECT MODULE_ID FROM omd.MODULE WHERE MODULE_CODE = @module_code) + WHERE MODULE_ID = @ModuleId ) ranksub WHERE ROW_NR=1 END return @result -END - +END \ No newline at end of file diff --git a/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateBatchInstance.sql b/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateBatchInstance.sql index 59cf91a..c3ca6dc 100644 --- a/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateBatchInstance.sql +++ b/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateBatchInstance.sql @@ -1,5 +1,4 @@ - -/* +/* Process: Create Batch Instance Input: - Batch Code @@ -16,7 +15,7 @@ Usage: */ CREATE PROCEDURE [omd].[CreateBatchInstance] - @BatchCode VARCHAR(255), -- The name of the module, as identified in the BATCH_CODE attribute in the BATCH table. + @BatchCode VARCHAR(255), -- The name of the Batch, as identified in the BATCH_CODE attribute in the BATCH table. @Debug VARCHAR(1) = 'N', @ExecutionRuntimeId VARCHAR(255) = 'N/A', @BatchInstanceId INT = NULL OUTPUT diff --git a/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateLoadWindow.sql b/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateLoadWindow.sql new file mode 100644 index 0000000..8dcf036 --- /dev/null +++ b/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateLoadWindow.sql @@ -0,0 +1,127 @@ +CREATE PROCEDURE [omd].[CreateLoadWindow] + @ModuleInstanceId INT, -- The currently running Module Instance Id + @Debug VARCHAR(1) = 'N', + @LoadWindowStartDateTime DATETIME2(7) = NULL OUTPUT, + @LoadWindowEndDateTime DATETIME2(7) = NULL OUTPUT +AS +BEGIN + +/* +Process: Create Load Window +Input: + - Module Instance Id + - Debug flag Y/N +Returns: + - Load Window Start Date/Time + - Load Window End Date/Time +Usage: + DECLARE + @LoadWindowStartDateTime datetime2(7), + @LoadWindowEndDateTime datetime2(7) + + EXEC [omd].[CreateLoadWindow] + @ModuleInstanceId = '', + @Debug = N'Y', + @LoadWindowStartDateTime = @LoadWindowStartDateTime OUTPUT, + @LoadWindowEndDateTime = @LoadWindowEndDateTime OUTPUT + + SELECT @LoadWindowStartDateTime as N'@LoadWindowStartDateTime', + @LoadWindowEndDateTime as N'@LoadWindowEndDateTime' +*/ + + -- Local variables (Module Id and source Data Object) + DECLARE @ModuleId INT = [omd].[GetModuleIdByModuleInstanceId](@ModuleInstanceId); + DECLARE @TableCode VARCHAR(255); + SELECT @TableCode = DATA_OBJECT_SOURCE FROM omd.MODULE WHERE MODULE_ID = @ModuleId; + + IF @Debug = 'Y' + BEGIN + PRINT 'For Module Instance Id '+CONVERT(VARCHAR(10),@ModuleInstanceId)+' the following Module Id was found in omd.MODULE: '+CONVERT(VARCHAR(10),@ModuleId)+'.'; + PRINT 'For Module Id '+CONVERT(VARCHAR(10),@ModuleId)+' the Source Data Object is '+@TableCode+'.'; + END + + DECLARE @PreviousModuleInstanceOutcome VARCHAR(MAX); + DECLARE @SqlStatement VARCHAR(MAX); + + -- Exception handling + IF @ModuleId = NULL OR @ModuleId = 0 + THROW 50000,'The Module Id could not be retrieved based on the Module Instance Id.',1 + + + + SELECT @PreviousModuleInstanceOutcome = + COALESCE + ( + ( + SELECT TOP 1 + NEXT_RUN_INDICATOR + FROM omd.MODULE_INSTANCE main + WHERE + main.MODULE_ID = @ModuleId + AND main.MODULE_INSTANCE_ID != @ModuleInstanceId + ORDER BY main.MODULE_INSTANCE_ID DESC + ) + , 'S') -- If there is no Module Instance Id, the process will resolve to succeeded. + + IF @Debug = 'Y' + PRINT 'The previous Module Instance Id was evaluated as: '+@PreviousModuleInstanceOutcome+'.'; + + -- If the most recent run prior to the active Instance Id (now) is not failed, continue. + IF @PreviousModuleInstanceOutcome = 'R' + BEGIN + IF @Debug = 'Y' + PRINT 'The previous Module Instance was a failure, so no new load window is set until this is resolved - end of procedure.'; + GOTO EndOfProcedure + END + ELSE + BEGIN + BEGIN TRY + + SET @SqlStatement = ' + INSERT INTO omd.[SOURCE_CONTROL] + ( + [MODULE_INSTANCE_ID] + ,[INSERT_DATETIME] + ,[INTERVAL_START_DATETIME] + ,[INTERVAL_END_DATETIME] + ,[INTERVAL_START_IDENTIFIER] + ,[INTERVAL_END_IDENTIFIER] + ) + VALUES + ( + '+CONVERT(VARCHAR(10),@ModuleInstanceId)+' + ,SYSDATETIME() + ,( + SELECT CONVERT(varchar,ISNULL(MAX(INTERVAL_END_DATETIME),''1900-01-01''),121) AS INTERVAL_START_DATETIME + FROM omd.SOURCE_CONTROL A + JOIN omd.MODULE_INSTANCE B ON (A.MODULE_INSTANCE_ID=B.MODULE_INSTANCE_ID) + WHERE B.MODULE_ID = '+CONVERT(VARCHAR(10),@ModuleId)+' + ) -- Maps to INTERVAL_START_DATETIME which is the last datetime of the previous window. + , ( + SELECT COALESCE(MAX(LOAD_DATETIME),''1900-01-01'') + FROM '+@TableCode+' sdo + JOIN omd.MODULE_INSTANCE modinst ON sdo.ETL_INSERT_RUN_ID=modinst.MODULE_INSTANCE_ID + WHERE modinst.EXECUTION_STATUS_CODE=''S'' + ) -- Maps to INTERVAL_END_DATETIME + ,NULL --INTERVAL_START_IDENTIFIER + ,NULL --INTERVAL_END_IDENTIFIER + )' + + IF @Debug='Y' + PRINT 'Load Window SQL statement is: '+@SqlStatement; + + EXEC (@SqlStatement); + + -- Retrieve values for return + SELECT @LoadWindowStartDateTime = [omd].[GetLoadWindowDateTimes](@ModuleId,1); + SELECT @LoadWindowEndDateTime = [omd].[GetLoadWindowDateTimes](@ModuleId,2); + + END TRY + BEGIN CATCH + THROW + END CATCH + END + + EndOfProcedure: + -- End label +END \ No newline at end of file diff --git a/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateModuleInstance.sql b/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateModuleInstance.sql index 2145ce1..cb94655 100644 --- a/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateModuleInstance.sql +++ b/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.CreateModuleInstance.sql @@ -16,7 +16,7 @@ Usage: */ CREATE PROCEDURE omd.CreateModuleInstance - @ModuleCode VARCHAR(255), -- The name of the module, as identified in the MODULE_CODE attribute in the MODULE table. + @ModuleCode VARCHAR(255), -- The name of the Module, as identified in the MODULE_CODE attribute in the MODULE table. @Debug VARCHAR(1) = 'N', @ExecutionRuntimeId VARCHAR(255) = 'N/A', @BatchInstanceId INT = 0, -- The Batch Instance Id, if the Module is run from a Batch. diff --git a/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.UpdateModuleInstance.sql b/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.UpdateModuleInstance.sql index c3b741f..07f9c73 100644 --- a/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.UpdateModuleInstance.sql +++ b/020_DIRECT_Framework/Direct_Framework/Stored Procedures/omd.UpdateModuleInstance.sql @@ -16,6 +16,8 @@ Usage: CREATE PROCEDURE [omd].[UpdateModuleInstance] @ModuleInstanceId INT, @EventCode VARCHAR(10) = 'None', + @RowCountSelect INT = 0, + @RowCountInsert INT = 0, @Debug VARCHAR(1) = 'Y' AS @@ -56,9 +58,9 @@ BEGIN BEGIN BEGIN TRY IF @Debug='Y' - PRINT 'Setting Module Instance '+CONVERT(VARCHAR(10),@ModuleInstanceId)+' to '+@EventCode+'.'; + PRINT 'Setting Module Instance '+CONVERT(VARCHAR(10),@ModuleInstanceId)+' to '+@EventCode+' and row count '+CONVERT(VARCHAR(10),@RowCountInsert)+'.'; - UPDATE omd.MODULE_INSTANCE SET EXECUTION_STATUS_CODE = 'S', NEXT_RUN_INDICATOR = 'P', END_DATETIME=GETDATE() WHERE MODULE_INSTANCE_ID = @ModuleInstanceId + UPDATE omd.MODULE_INSTANCE SET EXECUTION_STATUS_CODE = 'S', NEXT_RUN_INDICATOR = 'P', END_DATETIME=GETDATE(), ROWS_INPUT = @RowCountSelect, ROWS_INSERTED = @RowCountInsert WHERE MODULE_INSTANCE_ID = @ModuleInstanceId END TRY BEGIN CATCH THROW