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