<#@ 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; <# } #> /