Files
jdescopingtool/OLD/TestApp/Templates/QueryTemplate2.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

381 lines
16 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" #>
<# if(AddData){ #>
DELETE FROM WORKORDER_FILTER;
DELETE FROM COMPONENT_LOT_FILTER;
DELETE FROM PROFIT_CENTER_FILTER;
DELETE FROM WORK_CENTER_FILTER;
DELETE FROM ITEM_NUMBER_FILTER;
DELETE FROM OPERATOR_FILTER;
DELETE FROM PART_OPERATIONS_FILTER;
DELETE FROM TEMP_WO;
DELETE FROM TEMP_MIS;
/* Add filter criteria to temp tables */
<# } #>
<# if(Model.WorkOrderFilterEnabled) { #>
<# if(AddData){ #>
INSERT ALL
<# foreach(var woNumber in Model.WorkOrderFilter.Select(wo=>wo.WorkOrderNumber)) { #>
INTO WORKORDER_FILTER(WORKORDERNUMBER) VALUES(<#= woNumber #>)
<# } #>
SELECT 1 FROM DUAL;
<# }#>
/* Add manually specified work orders to flagged work orders */
MERGE INTO TEMP_WO TARGET
USING
(
SELECT DISTINCT WADOCO, COALESCE(WALOTN, CAST(WADOCO AS CHAR(8))) WALOTN, WAMMCU, WAITM
FROM F4801_WO wo INNER JOIN
WORKORDER_FILTER p_wo ON (wo.WADOCO = p_wo.WORKORDERNUMBER)
) SOURCE ON (TARGET.WORKORDERNUMBER = SOURCE.WADOCO)
WHEN NOT MATCHED THEN
INSERT (WORKORDERNUMBER, LOTNUMBER, BRANCHCODE, SHORTITEMNUMBER, MANUALLYSPECIFIED)
VALUES (SOURCE.WADOCO, SOURCE.WALOTN, SOURCE.WAMMCU, SOURCE.WAITM, 'T');
<# } #>
<# if(Model.ItemNumberFilterEnabled) { #>
<# if(AddData){ #>
INSERT ALL
<# foreach(var item in Model.ItemNumberFilter) { #>
INTO ITEM_NUMBER_FILTER(ITEMNUMBER) VALUES('<#= item.ItemNumber #>')
<# } #>
SELECT 1 FROM DUAL;
<# } #>
<# } #>
<# if(Model.ProfitCenterFilterEnabled) { #>
<# if(AddData){ #>
INSERT ALL
<# foreach(var profitCenter in Model.ProfitCenterFilter) { #>
INTO PROFIT_CENTER_FILTER(CODE) VALUES('<#= profitCenter.Code #>')
<# } #>
SELECT 1 FROM DUAL;
/* Add work centers in specified profit centers to work center filter */
INSERT INTO WORK_CENTER_FILTER(CODE)
SELECT DISTINCT TRIM(IWMCU)
FROM F30006_GIW91 oh INNER JOIN
PROFIT_CENTER_FILTER p_pc ON (TRIM(oh.IWMCUW) = TRIM(p_pc.CODE));
<# } #>
<# } #>
<# if(Model.WorkCenterFilterEnabled) { #>
<# if(AddData){ #>
INSERT ALL
<# foreach(var workCenter in Model.WorkCenterFilter) { #>
INTO WORK_CENTER_FILTER(CODE) VALUES('<#= workCenter.Code #>')
<# } #>
SELECT 1 FROM DUAL;
<# } #>
<# } #>
<# if(Model.ComponentLotFilterEnabled) { #>
<# if(AddData){ #>
INSERT ALL
<# foreach(var componentLot in Model.ComponentLotFilter) { #>
INTO COMPONENT_LOT_FILTER(LOTNUMBER, ITEMNUMBER) VALUES('<#= componentLot.LotNumber #>', '<#= componentLot.ItemNumber #>')
<# } #>
SELECT 1 FROM DUAL;
<# } #>
/* Add downstream product for manually specified component lots */
MERGE INTO TEMP_WO TARGET
USING
(
SELECT DISTINCT WADOCO, COALESCE(WALOTN, CAST(WADOCO AS CHAR(8))) WALOTN, WAMMCU, WAITM
FROM COMPONENT_LOT_FILTER p_clf INNER JOIN
F4108_LOT lot ON (p_clf.LOTNUMBER = lot.IOLOTN and p_clf.ITEMNUMBER = lot.IOLITM) INNER JOIN
F3111_WOC woc ON (lot.IOLOTN = woc.WMLOTN AND lot.IOITM = woc.WMCPIT ) INNER JOIN
F4801_WO wo ON (woc.WMDOCO = wo.WADOCO)
) SOURCE ON (TARGET.WORKORDERNUMBER = SOURCE.WADOCO)
WHEN MATCHED THEN
UPDATE SET PARTSLIST = 'T'
WHEN NOT MATCHED THEN
INSERT (WORKORDERNUMBER, LOTNUMBER, BRANCHCODE, SHORTITEMNUMBER, PARTSLIST)
VALUES (SOURCE.WADOCO, SOURCE.WALOTN, SOURCE.WAMMCU, SOURCE.WAITM, 'T');
MERGE INTO TEMP_WO TARGET
USING
(
SELECT DISTINCT WADOCO, COALESCE(WALOTN, CAST(WADOCO AS CHAR(8))) WALOTN, WAMMCU, WAITM
FROM COMPONENT_LOT_FILTER p_clf INNER JOIN
F4108_LOT lot ON (p_clf.LOTNUMBER = lot.IOLOTN and p_clf.ITEMNUMBER = lot.IOLITM) INNER JOIN
F4111_CARDEX lu ON (lot.IOLOTN = lu.ILLOTN AND lot.IOITM = lu.ILITM ) INNER JOIN
F4801_WO wo ON (lu.ILDOCO = wo.WADOCO)
) SOURCE ON (TARGET.WORKORDERNUMBER = SOURCE.WADOCO)
WHEN MATCHED THEN
UPDATE SET CARDEX = 'T'
WHEN NOT MATCHED THEN
INSERT (WORKORDERNUMBER, LOTNUMBER, BRANCHCODE, SHORTITEMNUMBER, CARDEX)
VALUES (SOURCE.WADOCO, SOURCE.WALOTN, SOURCE.WAMMCU, SOURCE.WAITM, 'T');
<# } #>
<# if(Model.OperatorFilterEnabled) { #>
<# if(AddData){ #>
INSERT ALL
<# foreach(var oper in Model.OperatorFilter) { #>
INTO OPERATOR_FILTER(ADDRESSNUMBER) VALUES('<#= oper.AddressNumber #>')
<# } #>
SELECT 1 FROM DUAL;
<# } #>
<# } #>
<# if(Model.ItemOperationMisFilterEnabled) { #>
<# if(AddData){ #>
INSERT ALL
<# foreach(var itemOp in Model.ItemOperationMisFilter) { #>
INTO PART_OPERATIONS_FILTER(ITEMNUMBER, OPERATIONNUMBER, MISNUMBER, MISREVISION) VALUES('<#= itemOp.ItemNumber #>', '<#= itemOp.OperationNumber #>', '<#= itemOp.MisNumber #>', '<#= itemOp.MisRevision #>')
<# } #>
SELECT 1 FROM DUAL;
<# } #>
<# } #>
<# if(Model.ShouldSearchSteps()) { #>
/* Find work orders matching filter criteria and add to flagged work orders */
MERGE INTO TEMP_WO TARGET
USING (
SELECT DISTINCT WADOCO, WALOTN, WAMMCU, WAITM FROM (
SELECT wo.WADOCO, COALESCE(wo.WALOTN, to_char(wo.WADOCO)) AS WALOTN, wo.WAMMCU, wo.WAITM
FROM F4801_WO wo <# if(Model.ItemNumberFilterEnabled) { #> INNER JOIN
ITEM_NUMBER_FILTER p_in ON (wo.WALITM = p_in.ITEMNUMBER)<# } #> INNER JOIN
F3112_WOS wos ON (wo.WADOCO = wos.WLDOCO) <# if(Model.ProfitCenterFilterEnabled || Model.WorkCenterFilterEnabled) { #>INNER JOIN
WORK_CENTER_FILTER p_wc ON (wos.WLMCU = p_wc.CODE)<# } #> LEFT OUTER JOIN
F31122_WOT wot ON (wos.WLDOCO = wot.WTDOCO and wos.WLOPSQ = wot.WTOPSQ) <# if(Model.OperatorFilterEnabled) { #>INNER JOIN
OPERATOR_FILTER p_o ON (wot.WTAN8 = p_o.ADDRESSNUMBER)<# } #><# if(Model.ItemOperationMisFilterEnabled) {#> INNER JOIN
MIS m ON (wos.WLDOCO = m.WORKORDERNUMBER and wos.WLOPSQ/10 = m.SEQUENCENUMBER and wos.WLMMCU = m.BRANCHCODE ) INNER JOIN
PART_OPERATIONS_FILTER p_po ON (m.ITEMNUMBER = p_po.ITEMNUMBER and m.SEQUENCENUMBER = p_po.OPERATIONNUMBER and m.MISNUMBER = p_po.MISNUMBER and m.REVID = p_po.MISREVISION)
<# } #>
WHERE <#= $"(wos.WLSTRX between 1{Model.MinimumDT:yy}{Model.MinimumDT.Value.DayOfYear:000} and 1{Model.MaximumDT:yy}{Model.MaximumDT.Value.DayOfYear:000})" #> OR
<#= $"(wot.WTDGL between 1{Model.MinimumDT:yy}{Model.MinimumDT.Value.DayOfYear:000} and 1{Model.MaximumDT:yy}{Model.MaximumDT.Value.DayOfYear:000})" #>
<#if(!Model.ItemOperationMisFilterEnabled) { #>UNION
SELECT wo.WADOCO, COALESCE(wo.WALOTN, to_char(wo.WADOCO)) AS WALOTN, wo.WAMMCU, wo.WAITM
FROM F4801_WO wo<# if(Model.ItemNumberFilterEnabled) { #> INNER JOIN
ITEM_NUMBER_FILTER p_in ON (wo.WALITM = p_in.ITEMNUMBER)<# } #> INNER JOIN
F31122_WOT wot ON (wo.WADOCO = wot.WTDOCO)<# if(Model.ProfitCenterFilterEnabled || Model.WorkCenterFilterEnabled) { #> INNER JOIN
WORK_CENTER_FILTER p_wc ON (wot.WTMCU = p_wc.CODE)<# } #><# if(Model.OperatorFilterEnabled) { #>INNER JOIN
OPERATOR_FILTER p_o ON (wot.WTAN8 = p_o.ADDRESSNUMBER)<# } #>
WHERE <#= $"(wot.WTDGL between 1{Model.MinimumDT:yy}{Model.MinimumDT.Value.DayOfYear:000} and 1{Model.MaximumDT:yy}{Model.MaximumDT.Value.DayOfYear:000})" #>
<# } #>)
) SOURCE ON (TARGET.WORKORDERNUMBER = SOURCE.WADOCO)
WHEN NOT MATCHED THEN
INSERT(WORKORDERNUMBER, LOTNUMBER, BRANCHCODE, SHORTITEMNUMBER, FLAGGED)
VALUES(SOURCE.WADOCO, SOURCE.WALOTN, SOURCE.WAMMCU, SOURCE.WAITM, 'T');
<# } #>
/* Add downstream product */
DECLARE
v_NumWO NUMBER := -1;
v_NewNumWO NUMBER := 0;
v_NumRuns NUMBER := 0;
BEGIN
WHILE (1 = 1) LOOP
/* Search parts list */
MERGE INTO TEMP_WO TARGET
USING
(
SELECT DISTINCT WADOCO, COALESCE(WALOTN, CAST(WADOCO AS CHAR(8))) WALOTN, WAMMCU, WAITM
FROM TEMP_WO t_wo INNER JOIN
F4108_LOT lot ON (t_wo.LOTNUMBER = lot.IOLOTN and t_wo.SHORTITEMNUMBER = lot.IOITM) INNER JOIN
F3111_WOC woc ON (lot.IOLOTN = woc.WMLOTN AND lot.IOITM = woc.WMCPIT ) INNER JOIN
F4801_WO wo ON (woc.WMDOCO = wo.WADOCO)
) SOURCE ON (TARGET.WORKORDERNUMBER = SOURCE.WADOCO)
WHEN MATCHED THEN
UPDATE SET PARTSLIST = 'T'
WHEN NOT MATCHED THEN
INSERT (WORKORDERNUMBER, LOTNUMBER, BRANCHCODE, SHORTITEMNUMBER, PARTSLIST)
VALUES (SOURCE.WADOCO, SOURCE.WALOTN, SOURCE.WAMMCU, SOURCE.WAITM, 'T');
/* Search CARDEX */
MERGE INTO TEMP_WO TARGET
USING
(
SELECT DISTINCT WADOCO, COALESCE(WALOTN, CAST(WADOCO AS CHAR(8))) WALOTN, WAMMCU, WAITM
FROM TEMP_WO t_wo INNER JOIN
F4108_LOT lot ON (t_wo.LOTNUMBER = lot.IOLOTN and t_wo.SHORTITEMNUMBER = lot.IOITM) INNER JOIN
F4111_CARDEX lu ON (lot.IOLOTN = lu.ILLOTN AND lot.IOITM = lu.ILITM ) INNER JOIN
F4801_WO wo ON (lu.ILDOCO = wo.WADOCO)
) SOURCE ON (TARGET.WORKORDERNUMBER = SOURCE.WADOCO)
WHEN MATCHED THEN
UPDATE SET CARDEX = 'T'
WHEN NOT MATCHED THEN
INSERT (WORKORDERNUMBER, LOTNUMBER, BRANCHCODE, SHORTITEMNUMBER, CARDEX)
VALUES (SOURCE.WADOCO, SOURCE.WALOTN, SOURCE.WAMMCU, SOURCE.WAITM, 'T');
/* Add any work orders split from flagged work orders */
MERGE INTO TEMP_WO TARGET
USING
(
SELECT DISTINCT WADOCO, COALESCE(WALOTN, CAST(WADOCO AS CHAR(8))) WALOTN, WAMMCU, WAITM
FROM F4801_WO wo INNER JOIN
TEMP_WO t_wo ON wo.WAPARS = CAST(t_wo.WORKORDERNUMBER AS char(8))
) SOURCE ON (TARGET.WORKORDERNUMBER = SOURCE.WADOCO)
WHEN MATCHED THEN
UPDATE SET SPLITORDER = 'T'
WHEN NOT MATCHED THEN
INSERT (WORKORDERNUMBER, LOTNUMBER, BRANCHCODE, SHORTITEMNUMBER, SPLITORDER)
VALUES (SOURCE.WADOCO, SOURCE.WALOTN, SOURCE.WAMMCU, SOURCE.WAITM, 'T');
/* Increment run counter and check updated number of flagged work orders */
v_NumRuns := v_NumRuns + 1;
SELECT COUNT(*) INTO v_NewNumWO FROM TEMP_WO;
/* Stop when no new flagged work orders were found OR when max recursion counter reached */
IF v_NumWO = v_NewNumWO OR v_NumRuns >= 20 THEN
EXIT;
END IF;
END LOOP;
END;
/* Lookup flagged work order details */
SELECT t_wo.WORKORDERNUMBER,
t_wo.BRANCHCODE,
t_wo.LOTNUMBER,
COALESCE(item.IMLITM, wo.WALITM) ItemNumber,
item.IMPRP4 PlanningFamily,
item.IMSTKT StockingType,
wo.WAUORG / 100 OrderQuantity,
wo.WASOBK / 100 HeldQuantity,
(SELECT COALESCE(sum(WLSOCN), 0) / 100
FROM F3112_SCRAP scrap
WHERE scrap.WLDOCO = t_wo.WORKORDERNUMBER AND
MOD(scrap.WLOPSQ, 1) = 0) ScrappedQuantity,
wo.WASOQS / 100 ShippedQuantity,
last_step.WLMMCU OperationStepBranchCode,
last_step.WLOPSQ / 10 OperationStep,
last_step.WLDSC1 OperationStepDescription,
last_step.CFDS80 FunctionOperationDescription,
last_step.LASTUPDATEDT OperationStepUpdateTimestamp,
wo.WASRST StatusCode,
sc.DRDL01 StatusDescription,
TO_DATE(wo.WADCG + 1900000, 'YYYYDDD') StatusUpdateTimestamp,
CASE
WHEN t_wo.MANUALLYSPECIFIED = 'T' THEN 'ManuallySpecified'
WHEN t_wo.FLAGGED = 'T' THEN 'Flagged'
WHEN t_wo.SPLITORDER = 'T' THEN 'Split'
WHEN t_wo.CARDEX = 'T' AND t_wo.PARTSLIST = 'F' THEN 'ComponentUsage (CARDEX)'
WHEN (t_wo.CARDEX = 'F' AND t_wo.PARTSLIST = 'T') THEN 'ComponentUsage (Parts List)'
WHEN (t_wo.CARDEX = 'T' AND t_wo.PARTSLIST = 'T') THEN 'ComponentUsage (CARDEX + Parts List)'
ELSE ''
END InclusionReason
FROM TEMP_WO t_wo INNER JOIN
F4801_WO wo ON (t_wo.WORKORDERNUMBER = wo.WADOCO) LEFT OUTER JOIN
F4101_ITEM item ON (t_wo.SHORTITEMNUMBER = item.IMITM) LEFT OUTER JOIN
(SELECT wos.WLDOCO, wos.WLMMCU, wos.WLOPSQ, wos.WLDSC1, wos.CFDS80, wos.LASTUPDATEDT,
ROW_NUMBER() OVER (PARTITION BY wos.WLDOCO ORDER BY WLSTRX DESC, WLOPSQ DESC) RN
FROM F3112_WOS wos) last_step ON (t_wo.WORKORDERNUMBER = last_step.WLDOCO and last_step.RN = 1) LEFT OUTER JOIN
F0005_SC sc ON (sc.DRKY = wo.WASRST);
<# if(Model.ExtractMisData) { #>
/* Extract MIS data */
INSERT INTO TEMP_MIS
(
WorkOrderNumber,
ItemNumber,
ItemDescription,
BranchCode,
WorkCenterCode,
StepTimestamp,
SequenceNumber,
FunctionCode,
FunctionOperationDescription,
MatchedSequenceNumber,
RoutingMatch,
MasterMatch,
MisNumber,
RevID,
CharNumber,
MisSequenceNumber,
TestDescription,
SamplingType,
SamplingValue,
ToolsGauges,
WorkInstructions,
Status,
ReleaseDate
)
SELECT m.*
FROM F4801_WO wo<# if(Model.ItemNumberFilterEnabled) { #> INNER JOIN
ITEM_NUMBER_FILTER p_in ON (wo.WALITM = p_in.ITEMNUMBER)<# } #> INNER JOIN
F3112_WOS wos ON (wo.WADOCO = wos.WLDOCO)<# if(Model.ProfitCenterFilterEnabled || Model.WorkCenterFilterEnabled) { #> INNER JOIN
WORK_CENTER_FILTER p_wc ON (wos.WLMCU = p_wc.CODE)<# } #> LEFT OUTER JOIN
F31122_WOT wot ON (wos.WLDOCO = wot.WTDOCO and wos.WLOPSQ = wot.WTOPSQ)<# if(Model.OperatorFilterEnabled) { #> INNER JOIN
OPERATOR_FILTER p_o ON (wot.WTAN8 = p_o.ADDRESSNUMBER)<# } #> INNER JOIN
MIS m ON (wos.WLDOCO = m.WORKORDERNUMBER AND wos.WLOPSQ/10 = m.SEQUENCENUMBER)
WHERE <#= $"(wos.WLSTRX between 1{Model.MinimumDT:yy}{Model.MinimumDT.Value.DayOfYear:000} and 1{Model.MaximumDT:yy}{Model.MaximumDT.Value.DayOfYear:000})" #> OR
<#= $"(wot.WTDGL between 1{Model.MinimumDT:yy}{Model.MinimumDT.Value.DayOfYear:000} and 1{Model.MaximumDT:yy}{Model.MaximumDT.Value.DayOfYear:000})" #>
/* Get MIS search results */
SELECT DISTINCT tmd.ItemNumber,
tmd.ItemDescription,
tmd.BranchCode,
tmd.MisSequenceNumber SequenceNumber,
tmd.FunctionCode,
tmd.FunctionOperationDescription,
tmd.SequenceNumber 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 TEMP_MIS tmd
ORDER BY tmd.ItemNumber,
tmd.BranchCode,
tmd.SequenceNumber,
tmd.MatchedSequenceNumber;
/* Get no-match MIS search results */
SELECT DISTINCT tmd.WorkCenterCode,
tmd.WorkOrderNumber,
TO_DATE(wo.WATRDJ + 1900000, 'YYYYDDD') WorkOrderStartDate,
tmd.SequenceNumber JobStepNumber,
tmd.FunctionOperationDescription JobStepDescription,
tmd.StepTimestamp JobStepEndDate,
CASE
WHEN wo.WATRT='NMR' OR
NOT EXISTS(SELECT *
FROM F3112Z1_WOR wor
WHERE tmd.WorkOrderNumber = wor.SZDOCO AND
tmd.SequenceNumber = wor.SZOPSQ
) THEN 1
ELSE 0
END AS WasJobStepAdded,
CASE
WHEN wo.WATRT='NMR' THEN NULL
ELSE (SELECT TOP 1 wor.SZOPSQ
FROM F3112Z1_WOR wor
WHERE (tmd.WorkOrderNumber = wor.SZDOCO AND
tmd.WorkCenterCode = wor.SZMCU AND
tmd.FunctionCode = wor.SZURRF) AND
tmd.SequenceNumber <> wor.SZOPSQ
)
END AS MatchedJobStepNumber,
tmd.FunctionCode,
tmd.ItemNumber,
tmd.ItemDescription,
wo.WATRT AS RoutingType
FROM TEMP_MIS tmd INNER JOIN
F4801_WO wo ON (tmd.WorkOrderNumber = wo.WADOCO) INNER JOIN
F4101_ITEM item ON (wo.WAITM = item.IMITM)
WHERE (tmd.RoutingMatch = 'F' AND tmd.MasterMatch = 'F') OR
tmd.MisNumber IS NULL
ORDER BY tmd.WorkOrderNumber,
tmd.SequenceNumber;
<# } #>
/