Files
jdescopingtool/OLD/TestApp/Templates/QueryTemplate.tt
T
Joseph Doherty 26ff8d9b4f Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
2026-01-02 07:43:29 -05:00

480 lines
17 KiB
Plaintext
Executable File

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="WorkerService.Models.Reporting" #>
<#@ import namespace="WorkerService.Helpers" #>
--Setup flagged work order temp table
IF OBJECT_ID('tempdb.dbo.#Temp_WO', 'U') IS NOT NULL
BEGIN
DROP TABLE #Temp_WO;
END
CREATE TABLE #Temp_WO (
WorkOrderNumber BIGINT NOT NULL,
LotNumber VARCHAR(30) NULL,
BranchCode VARCHAR(12) NULL,
ShortItemNumber BIGINT NOT NULL,
ManuallySpecified BIT NOT NULL DEFAULT 0,
SplitOrder BIT NOT NULL DEFAULT 0,
CARDEX BIT NOT NULL DEFAULT 0,
PartsList BIT NOT NULL DEFAULT 0,
Flagged BIT NOT NULL DEFAULT 0,
PRIMARY KEY CLUSTERED(WorkOrderNumber)
);
CREATE INDEX TIX_Temp_WO_Lookup ON #Temp_WO(LotNumber, BranchCode, ShortItemNumber);
<# if(Model.WorkOrderFilterEnabled) { #>
--Add manually specified work order numbers to flagged list
WITH WOP_CTE AS(
SELECT DISTINCT wo.WorkOrderNumber,
wo.LotNumber,
wo.BranchCode,
wo.ShortItemNumber
FROM dbo.WorkOrder AS wo INNER JOIN
@p_WorkOrderFilter AS pwof ON (wo.WorkOrderNumber = pwof.WorkOrderNumber)
)
MERGE #Temp_WO AS TARGET
USING WOP_CTE AS SOURCE
ON (TARGET.WorkOrderNumber = SOURCE.WorkOrderNumber)
WHEN MATCHED THEN
UPDATE SET TARGET.ManuallySpecified = 1
WHEN NOT MATCHED BY TARGET THEN
INSERT(WorkOrderNumber, LotNumber, BranchCode, ShortItemNumber, ManuallySpecified)
VALUES(SOURCE.WorkOrderNumber, SOURCE.LotNumber, SOURCE.BranchCode, SOURCE.ShortItemNumber, 1);
<#@ include file="SplitWorkOrderQuery.txt" #>
<# } #>
<# if(Model.ItemNumberFilterEnabled) { #>
--Setup item number filter temp table
IF OBJECT_ID('tempdb.dbo.#P_ItemNumbers', 'U') IS NOT NULL
BEGIN
DROP TABLE #P_ItemNumbers;
END
CREATE TABLE #P_ItemNumbers (
ItemNumber VARCHAR(25) NOT NULL,
PRIMARY KEY CLUSTERED(ItemNumber)
);
INSERT INTO #P_ItemNumbers(ItemNumber)
SELECT DISTINCT LTRIM(RTRIM(pinf.ItemNumber))
FROM @p_ItemNumberFilter AS pinf
WHERE LTRIM(RTRIM(pinf.ItemNumber)) IS NOT NULL;
<# } #>
<# if(Model.ProfitCenterFilterEnabled || Model.WorkCenterFilterEnabled) { #>
--Setup profit center / work center filter temp table
IF OBJECT_ID('tempdb.dbo.#P_WorkCenters', 'U') IS NOT NULL
BEGIN
DROP TABLE #P_WorkCenters;
END
CREATE TABLE #P_WorkCenters (
Code VARCHAR(12) NOT NULL,
PRIMARY KEY CLUSTERED(Code)
);
<# } #>
<# if(Model.ProfitCenterFilterEnabled) { #>
WITH WCF_CTE AS(
SELECT LTRIM(RTRIM(oh.WorkCenterCode)) AS Code
FROM @p_ProfitCenterFilter AS ppcf INNER JOIN
dbo.OrgHierarchy AS oh ON (LTRIM(RTRIM(ppcf.Code)) = oh.ProfitCenterCode)
)
MERGE INTO #P_WorkCenters AS TARGET
USING WCF_CTE AS SOURCE
ON (TARGET.Code = SOURCE.Code)
WHEN NOT MATCHED BY TARGET THEN
INSERT(Code)
VALUES(SOURCE.Code);
<# } #>
<# if(Model.WorkCenterFilterEnabled) { #>
WITH WCF_CTE AS(
SELECT DISTINCT pwcf.Code
FROM @p_WorkCenterFilter AS pwcf
WHERE LTRIM(RTRIM(pwcf.Code)) IS NOT NULL
)
MERGE INTO #P_WorkCenters AS TARGET
USING WCF_CTE AS SOURCE
ON (TARGET.Code = SOURCE.Code)
WHEN NOT MATCHED BY TARGET THEN
INSERT(Code)
VALUES(SOURCE.Code);
<# } #>
<# if(Model.ComponentLotFilterEnabled) { #>
--Add downstream product for manually specified component lots
WITH CLN_CTE AS(
SELECT DISTINCT l.LotNumber,
l.ShortItemNumber,
l.BranchCode
FROM @p_ComponentLotFilter AS pclf INNER JOIN
dbo.Lot AS l ON (LTRIM(RTRIM(pclf.ComponentLotNumber)) = l.LotNumber AND LTRIM(RTRIM(pclf.ItemNumber)) = l.ItemNumber)
),
CLN_WO AS(
SELECT wo.WorkOrderNumber,
wo.BranchCode,
wo.LotNumber,
wo.ShortItemNumber
FROM CLN_CTE cln INNER JOIN
dbo.WorkOrderComponent AS woc ON (cln.LotNumber = woc.LotNumber AND cln.ShortItemNumber = woc.ShortItemNumber AND cln.BranchCode = woc.BranchCode) INNER JOIN
dbo.WorkOrder AS wo ON (woc.WorkOrderNumber = wo.WorkOrderNumber)
UNION ALL
SELECT wo.WorkOrderNumber,
wo.BranchCode,
wo.LotNumber,
wo.ShortItemNumber
FROM CLN_CTE cln INNER JOIN
dbo.LotUsage AS lu ON(cln.LotNumber = lu.LotNumber AND cln.ShortItemNumber = lu.ShortItemNumber AND cln.BranchCode = lu.BranchCode) INNER JOIN
dbo.WorkOrder AS wo ON(lu.WorkOrderNumber = wo.WorkOrderNumber)
),
CLN_FILTERED_WO AS(
SELECT DISTINCT cln.WorkOrderNumber,
cln.BranchCode,
cln.LotNumber,
cln.ShortItemNumber
FROM CLN_WO cln
)
MERGE INTO #Temp_WO AS TARGET
USING CLN_FILTERED_WO AS SOURCE
ON (TARGET.WorkOrderNumber = SOURCE.WorkOrderNumber)
WHEN MATCHED THEN
UPDATE SET TARGET.CARDEX = 1
WHEN NOT MATCHED BY TARGET THEN
INSERT (WorkOrderNumber, LotNumber, BranchCode, ShortItemNumber, CARDEX)
VALUES (SOURCE.WorkOrderNumber, COALESCE(SOURCE.LotNumber, CAST(SOURCE.WorkOrderNumber AS VARCHAR(8))), SOURCE.BranchCode, SOURCE.ShortItemNumber, 1);
<#@ include file="SplitWorkOrderQuery.txt" #>
<# } #>
<# if(Model.OperatorFilterEnabled) { #>
--Setup operator filter temp table
IF OBJECT_ID('tempdb.dbo.#P_OperatorIDs', 'U') IS NOT NULL
BEGIN
DROP TABLE #P_OperatorIDs;
END
CREATE TABLE #P_OperatorIDs(
AddressNumber BIGINT NOT NULL,
UserID VARCHAR(10) NOT NULL,
PRIMARY KEY CLUSTERED(AddressNumber)
);
WITH O_CTE AS(
SELECT ju.AddressNumber,
ju.UserID,
ROW_NUMBER() OVER(PARTITION BY ju.AddressNumber ORDER BY ju.UserID DESC) RN
FROM @p_OperatorFilter AS pof INNER JOIN
dbo.JdeUser AS ju ON (LTRIM(RTRIM(pof.UserName)) = ju.UserID)
)
INSERT INTO #P_OperatorIDs(AddressNumber, UserID)
SELECT o.AddressNumber,
o.UserID
FROM O_CTE o
WHERE o.RN = 1;
<# } #>
<# if(Model.ItemOperationMisFilterEnabled) { #>
--Setup item/operation/mis filter temp table
IF OBJECT_ID('tempdb.dbo.#P_PartOperations', 'U') IS NOT NULL
BEGIN
DROP TABLE #P_PartOperations;
END
CREATE TABLE #P_PartOperations(
ItemNumber VARCHAR(32) NOT NULL,
OperationNumber VARCHAR(32) NOT NULL,
MisNumber VARCHAR(32) NOT NULL,
MisRevision VARCHAR(32) NOT NULL,
PRIMARY KEY CLUSTERED(ItemNumber,OperationNumber, MisNumber, MisRevision)
);
INSERT INTO #P_PartOperations(ItemNumber, OperationNumber, MisNumber, MisRevision)
SELECT DISTINCT LTRIM(RTRIM(piomf.ItemNumber)),
LTRIM(RTRIM(piomf.OperationNumber)),
LTRIM(RTRIM(piomf.MisNumber)),
LTRIM(RTRIM(piomf.MisRevision))
FROM @p_ItemOperationMisFilter AS piomf
WHERE LTRIM(RTRIM(piomf.ItemNumber)) IS NOT NULL AND
LTRIM(RTRIM(piomf.OperationNumber)) IS NOT NULL AND
LTRIM(RTRIM(piomf.MisNumber)) IS NOT NULL AND
LTRIM(RTRIM(piomf.MisRevision)) IS NOT NULL;
<# } #>
<# if(Model.ExtractMisData) { #>
IF OBJECT_ID('tempdb.dbo.#TempMisData', 'U') IS NOT NULL
BEGIN
DROP TABLE #TempMisData;
END
CREATE TABLE #TempMisData (
WorkOrderNumber BIGINT,
ItemNumber VARCHAR(25),
ItemDescription VARCHAR(30),
BranchCode VARCHAR(12),
WorkCenterCode VARCHAR(12),
StepTimestamp DATETIME,
SequenceNumber DECIMAL(7, 2),
FunctionCode VARCHAR(15),
FunctionOperationDescription VARCHAR(80),
MatchedSequenceNumber DECIMAL(7, 2),
RoutingMatch BIT,
MasterMatch BIT,
MisNumber VARCHAR(32),
RevID VARCHAR(32),
CharNumber VARCHAR(32),
MisSequenceNumber VARCHAR(32),
TestDescription VARCHAR(2000),
SamplingType VARCHAR(32),
SamplingValue VARCHAR(32),
ToolsGauges VARCHAR(2000),
WorkInstructions VARCHAR(2000),
Status VARCHAR(32),
ReleaseDate DATETIME
);
<# } #>
<# if(Model.ShouldSearchSteps()) { #>
--Query data
WITH LU_WO AS(
SELECT DISTINCT
step.WorkOrderNumber,
step.LotNumber,
step.BranchCode,
step.ShortItemNumber
FROM (
SELECT DISTINCT
wo.WorkOrderNumber,
COALESCE(wo.LotNumber, CAST(wo.WorkOrderNumber AS VARCHAR(8))) AS LotNumber,
wo.BranchCode,
wo.ShortItemNumber
FROM dbo.WorkOrder wo INNER JOIN <# if(Model.ItemNumberFilterEnabled) { #>
#P_ItemNumbers p_in ON (wo.ItemNumber = p_in.ItemNumber) INNER JOIN<# } #>
dbo.WorkOrderStep wos ON (wo.WorkOrderNumber = wos.WorkOrderNumber) LEFT OUTER JOIN
dbo.WorkOrderTime wot ON (wos.WorkOrderNumber = wot.WorkOrderNumber AND wos.StepNumber = wot.StepNumber)<# if(Model.ProfitCenterFilterEnabled || Model.WorkCenterFilterEnabled) { #> INNER JOIN
#P_WorkCenters p_wc ON (wos.WorkCenterCode = p_wc.Code)<# } if(Model.OperatorFilterEnabled) { #> INNER JOIN
#P_OperatorIDs p_oi ON (wot.AddressNumber = p_oi.AddressNumber)<# } if(Model.ItemOperationMisFilterEnabled) { #> CROSS APPLY
dbo.MatchMIS(wo.WorkOrderNumber, wo.ItemNumber, wo.BranchCode, wo.RoutingType, wo.IssueDate, wos.WorkCenterCode,
wos.StepNumber, wos.EndDT, wos.FunctionCode, wos.FunctionOperationDescription) AS mm INNER JOIN
#P_PartOperations p_po on (mm.ItemNumber = p_po.ItemNumber AND mm.MisSequenceNumber = p_po.OperationNumber AND mm.MisNumber = p_po.MisNumber AND mm.RevID = p_po.MisRevision) <# } #>
<# this.Write("\r\n");
if(Model.TimespanFilterEnabled) { #>
WHERE (wos.EndDT <= @p_MaximumDT AND wos.EndDT >= @p_MinimumDT) OR
(wot.GlDate <= @p_MaximumDT AND wot.GlDate >= @p_MinimumDT)
<# } if(!Model.ItemOperationMisFilterEnabled) { #>
UNION
SELECT DISTINCT
wo.WorkOrderNumber,
COALESCE(wo.LotNumber, CAST(wo.WorkOrderNumber AS VARCHAR(8))) AS LotNumber,
wo.BranchCode,
wo.ShortItemNumber
FROM dbo.WorkOrder wo INNER JOIN <# if(Model.ItemNumberFilterEnabled) { #>
#P_ItemNumbers p_in ON (wo.ItemNumber = p_in.ItemNumber) INNER JOIN<# } #>
dbo.WorkOrderTime wot ON (wo.WorkOrderNumber = wot.WorkOrderNumber)<# if(Model.ProfitCenterFilterEnabled || Model.WorkCenterFilterEnabled) { #> INNER JOIN
#P_WorkCenters p_wc ON (wot.WorkCenterCode = p_wc.Code)<# } if(Model.OperatorFilterEnabled) { #> INNER JOIN
#P_OperatorIDs p_oi ON (wot.AddressNumber = p_oi.AddressNumber)<# } #>
<# this.Write("\r\n");
if(Model.MinimumDT.HasValue && Model.MaximumDT.HasValue) { #>
WHERE (wot.GlDate <= @p_MaximumDT AND wot.GlDate >= @p_MinimumDT)
<# } } #>
) step
)
MERGE INTO #Temp_WO AS TARGET
USING LU_WO AS SOURCE
ON (TARGET.WorkOrderNumber = SOURCE.WorkOrderNumber)
WHEN MATCHED THEN
UPDATE SET TARGET.Flagged = 1
WHEN NOT MATCHED BY TARGET THEN
INSERT(WorkOrderNumber, LotNumber, BranchCode, ShortItemNumber, Flagged)
VALUES(SOURCE.WorkOrderNumber, SOURCE.LotNumber, SOURCE.BranchCode, SOURCE.ShortItemNumber, 1);
<# } #>
--Add downlevel work orders that were issued material from flagged work orders
DECLARE @c_MAX_RUNS INT = 20;
DECLARE @v_NumWO INT = -1;
DECLARE @v_NewNumWO INT;
DECLARE @v_NumRuns INT = 0;
WHILE(1 = 1) BEGIN
SET @v_NumWO = @v_NewNumWO;
<# this.PushIndent(" "); #>
<#@ include file="ComponentUsageQuery.txt" #>
<#@ include file="SplitWorkOrderQuery.txt" #>
<# this.PopIndent(); #>
SELECT @v_NewNumWO = COUNT(*) FROM #Temp_WO;
SET @v_NumRuns = @v_NumRuns + 1;
IF(@v_NumWO = @v_NewNumWO OR @v_NumRuns = @c_MAX_RUNS) BEGIN
BREAK;
END
END;
--Lookup flagged work order details
WITH LAST_WOS AS
(
SELECT wos.WorkOrderNumber,
wos.BranchCode,
wos.StepNumber,
wos.StepDescription,
wos.FunctionOperationDescription,
wos.LastUpdateDT,
ROW_NUMBER() OVER (PARTITION BY wos.WorkOrderNumber ORDER BY wos.EndDT DESC, wos.StepNumber DESC) AS RN
FROM dbo.WorkOrderStep AS wos LEFT OUTER JOIN
#Temp_WO t_wo ON (wos.WorkOrderNumber = t_wo.WorkOrderNumber)
)
SELECT wo.WorkOrderNumber,
wo.BranchCode AS WorkOrderBranchCode,
wo.LotNumber,
wo.ItemNumber,
i.PlanningFamily,
t_wo.ManuallySpecified,
t_wo.SplitOrder,
t_wo.CARDEX,
t_wo.PartsList,
t_wo.Flagged,
wo.OrderQuantity,
wo.HeldQuantity,
COALESCE(wots.TotalScrappedQuantity, 0) AS ScrappedQuantity,
wo.ShippedQuantity,
LTRIM(RTRIM(lwos.BranchCode)) AS StepBranchCode,
lwos.StepNumber,
lwos.StepDescription,
lwos.FunctionOperationDescription,
lwos.LastUpdateDT AS StepUpdateDT,
wo.StatusCode,
sc.Description AS StatusDescription,
wo.StatusCodeUpdateDT AS StatusUpdateDT
FROM dbo.WorkOrder AS wo INNER JOIN
#Temp_WO AS t_wo ON (t_wo.WorkOrderNumber = wo.WorkOrderNumber) LEFT OUTER JOIN
dbo.Item i on (wo.ShortItemNumber = i.ShortItemNumber) INNER JOIN
dbo.StatusCode AS sc ON (sc.Code = wo.StatusCode) LEFT OUTER JOIN
LAST_WOS lwos ON (wo.WorkOrderNumber = lwos.WorkOrderNumber) LEFT OUTER JOIN
dbo.WorkOrderTotalScrap wots ON (wo.WorkOrderNumber = wots.WorkOrderNumber)
WHERE lwos.RN IS NULL OR
lwos.RN = 1;
<# if(Model.ExtractMisData) { #>
WITH MIS_CTE AS(
SELECT DISTINCT wo.WorkOrderNumber,
wo.ItemNumber,
wo.BranchCode,
wo.RoutingType,
wo.IssueDate,
wos.WorkCenterCode,
wos.StepNumber,
wos.EndDT,
wos.FunctionCode,
wos.FunctionOperationDescription
FROM dbo.WorkOrderStep AS wos INNER JOIN
dbo.WorkOrder AS wo ON (wos.WorkOrderNumber = wo.WorkOrderNumber) LEFT OUTER JOIN
dbo.WorkOrderTime AS wot ON (wos.WorkOrderNumber = wot.WorkOrderNumber AND LTRIM(wos.BranchCode) = wot.BranchCode AND wos.StepNumber = wot.StepNumber) <# if(Model.ItemNumberFilterEnabled) { #> INNER JOIN
#P_ItemNumbers p_in ON (wo.ItemNumber = p_in.ItemNumber)<# } if(Model.ProfitCenterFilterEnabled || Model.WorkCenterFilterEnabled) { #> INNER JOIN
#P_WorkCenters p_wc ON (wos.WorkCenterCode = p_wc.Code)<# } if(Model.OperatorFilterEnabled) { #> INNER JOIN
#P_OperatorIDs p_oi ON (wot.AddressNumber = p_oi.AddressNumber)<# } #>
<# if(Model.MinimumDT.HasValue && Model.MaximumDT.HasValue) { #>
WHERE (((wos.EndDT <= @p_MaximumDT) AND (wos.EndDT >= @p_MinimumDT)) OR
((wot.GlDate <= @p_MaximumDT) AND (wot.GlDate >= @p_MinimumDT)))
<# } else if(Model.MinimumDT.HasValue && !Model.MaximumDT.HasValue) { #>
WHERE (wos.EndDT >= @p_MinimumDT OR wot.GlDate >= @p_MinimumDT)
<# } else if(!Model.MinimumDT.HasValue && Model.MaximumDT.HasValue) { #>
WHERE (wos.EndDT <= @p_MaximumDT OR wot.GlDate <= @p_MaximumDT))
<# } #>
)
INSERT INTO #TempMISData
(
WorkOrderNumber,
ItemNumber,
ItemDescription,
BranchCode,
WorkCenterCode,
StepTimestamp,
SequenceNumber,
FunctionCode,
FunctionOperationDescription,
MatchedSequenceNumber,
RoutingMatch,
MasterMatch,
MisNumber,
RevID,
CharNumber,
MisSequenceNumber,
TestDescription,
SamplingType,
SamplingValue,
ToolsGauges,
WorkInstructions,
Status,
ReleaseDate
)
SELECT mm.WorkOrderNumber,
mm.ItemNumber,
mm.ItemDescription,
mm.BranchCode,
mm.WorkCenterCode,
mm.StepTimestamp,
mm.SequenceNumber,
mm.FunctionCode,
mm.FunctionOperationDescription,
mm.MatchedSequenceNumber,
mm.RoutingMatch,
mm.MasterMatch,
mm.MisNumber,
mm.RevID,
mm.CharNumber,
mm.MisSequenceNumber,
mm.TestDescription,
mm.SamplingType,
mm.SamplingValue,
mm.ToolsGauges,
mm.WorkInstructions,
mm.Status,
mm.ReleaseDate
FROM MIS_CTE c CROSS APPLY
dbo.MatchMIS(c.WorkOrderNumber, c.ItemNumber, c.BranchCode, c.RoutingType,
c.IssueDate, c.WorkCenterCode, c.StepNumber, c.EndDT,
c.FunctionCode, c.FunctionOperationDescription) AS mm;
--Get MIS search results
SELECT DISTINCT tmd.ItemNumber,
tmd.ItemDescription,
tmd.BranchCode,
tmd.MisSequenceNumber AS SequenceNumber,
tmd.FunctionCode,
tmd.FunctionOperationDescription,
tmd.SequenceNumber AS JobStepSequenceNumber,
tmd.MatchedSequenceNumber,
tmd.RoutingMatch,
tmd.MasterMatch,
tmd.MisNumber,
tmd.RevID,
tmd.CharNumber,
tmd.TestDescription,
tmd.SamplingType,
tmd.SamplingValue,
tmd.ToolsGauges,
tmd.WorkInstructions,
tmd.Status,
tmd.ReleaseDate
FROM #TempMisData AS tmd
ORDER BY tmd.ItemNumber,
tmd.BranchCode,
tmd.SequenceNumber,
tmd.MatchedSequenceNumber;
--Get no-match MIS search results
SELECT DISTINCT tmd.WorkCenterCode,
tmd.WorkOrderNumber,
wo.IssueDate AS WorkOrderStartDate,
tmd.SequenceNumber AS JobStepNumber,
tmd.FunctionOperationDescription AS JobStepDescription,
tmd.StepTimestamp AS JobStepEndDate,
tmd.FunctionCode,
tmd.ItemNumber,
i.Description AS ItemDescription,
wo.RoutingType
FROM #TempMisData AS tmd INNER JOIN
dbo.WorkOrder AS wo ON (tmd.WorkOrderNumber = wo.WorkOrderNumber) LEFT OUTER JOIN
dbo.Item AS i ON (wo.ShortItemNumber = i.ShortItemNumber)
WHERE (tmd.RoutingMatch = 0 AND
tmd.MasterMatch = 0) OR
tmd.MisNumber IS NULL
ORDER BY tmd.WorkOrderNumber,
tmd.SequenceNumber;
<# } #>