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