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.
This commit is contained in:
Executable
+44
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
</configSections>
|
||||
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
|
||||
</startup>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<publisherPolicy apply="no"/>
|
||||
<assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="4.122.0.0 - 4.65535.65535.65535" newVersion="4.122.18.3"/>
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
<connectionStrings>
|
||||
<add name="JDE" connectionString="HOST=sbracqa01-scan.nam.zimmer.com;Service Name=GIWQA1_USER;Fetch Array Size=1280000;Port=1521;User ID=JDE_SCOPING;Password=r39Pw67AmLxsmjBgob0d3g==;"/>
|
||||
<add name="CMS" connectionString="HOST=sbracqa01-scan.nam.zimmer.com;Service Name=GIWQA1_USER;Fetch Array Size=1280000;Port=1521;User ID=JDE_SCOPING;Password=r39Pw67AmLxsmjBgob0d3g==;"/>
|
||||
<add name="LotFinderDB" connectionString="Server=JDESCP-SQL-VQ01;Database=ScopingTool;User Id=ScopingTool;Password=wIk7KexO9sIEO+b+ILpfcA==;" providerName="System.Data.SqlClient"/>
|
||||
<!--<add name="LotFinderDB" connectionString="Server=(local)\MSSQL2014;Database=ScopingTool;User Id=sa;Password=4DacH/qWG7DGGCGpZ1XnJw==;" providerName="System.Data.SqlClient" />!-->
|
||||
</connectionStrings>
|
||||
<appSettings>
|
||||
<add key="HubHost" value="http://localhost:39148"/>
|
||||
<add key="querytimeout" value="600"/>
|
||||
</appSettings>
|
||||
<system.web>
|
||||
<membership defaultProvider="ClientAuthenticationMembershipProvider">
|
||||
<providers>
|
||||
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri=""/>
|
||||
</providers>
|
||||
</membership>
|
||||
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
|
||||
<providers>
|
||||
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400"/>
|
||||
</providers>
|
||||
</roleManager>
|
||||
</system.web>
|
||||
</configuration>
|
||||
Executable
+295
@@ -0,0 +1,295 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using DataModel.Models;
|
||||
using DataModel.Process;
|
||||
using OfficeOpenXml;
|
||||
using TestApp.Templates;
|
||||
using WorkerService.Helpers;
|
||||
using WorkerService.Models.Reporting;
|
||||
|
||||
namespace TestApp
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
List<Val> vals = new List<Val>();
|
||||
using (ExcelPackage package = new ExcelPackage(new FileInfo(@"D:\OneDrive\OneDrive - Zimmer Biomet\scoping_tool_v4_queries.xlsx")))
|
||||
{
|
||||
ExcelWorksheet ws = package.Workbook.Worksheets.First();
|
||||
|
||||
for (int row = 2; row <= ws.Dimension.Rows; ++row)
|
||||
{
|
||||
Val val = new Val()
|
||||
{
|
||||
Name = ws.Cells[row, 1].GetValue<string>(),
|
||||
TicketNumber = ws.Cells[row, 2].GetValue<string>(),
|
||||
SearchID = ws.Cells[row, 3].GetValue<int>(),
|
||||
IndependentShortSQL = ws.Cells[row, 4].GetValue<string>(),
|
||||
IndependentLongSQL = ws.Cells[row, 5].GetValue<string>(),
|
||||
ScopingToolSQL = ws.Cells[row, 6].GetValue<string>(),
|
||||
IndependentReport = ws.Cells[row, 7].GetValue<string>(),
|
||||
ScopingToolReport = ws.Cells[row, 8].GetValue<string>(),
|
||||
MergeReport = ws.Cells[row, 9].GetValue<string>(),
|
||||
};
|
||||
|
||||
val.Search = LotFinderDB.GetSearch(val.SearchID);
|
||||
val.SearchModel = val.Search.ToSearchModel();
|
||||
|
||||
vals.Add(val);
|
||||
}
|
||||
}
|
||||
|
||||
if (false)
|
||||
{
|
||||
foreach (Val val in vals)
|
||||
{
|
||||
Search search = LotFinderDB.GetSearch(val.SearchID);
|
||||
SearchModel searchModel = search.ToSearchModel();
|
||||
|
||||
string longSQL = new QueryTemplate2(searchModel, true).TransformText().TrimStart();
|
||||
string shortSQL = new QueryTemplate2(searchModel, false).TransformText().TrimStart();
|
||||
|
||||
File.WriteAllText(val.IndependentLongSQL, longSQL);
|
||||
File.WriteAllText(val.IndependentShortSQL, shortSQL);
|
||||
}
|
||||
}
|
||||
|
||||
if (true)
|
||||
{
|
||||
foreach (Val val in vals)
|
||||
{
|
||||
if (File.Exists(val.MergeReport)) { File.Delete(val.MergeReport); }
|
||||
|
||||
Console.WriteLine(val.Name);
|
||||
|
||||
using (ExcelPackage package = new ExcelPackage(new FileInfo(val.MergeReport)))
|
||||
{
|
||||
WriteInstructions(val, package);
|
||||
|
||||
|
||||
using (ExcelPackage stPackage = new ExcelPackage(new FileInfo(val.ScopingToolReport)))
|
||||
{
|
||||
using (ExcelPackage iPackage = new ExcelPackage(new FileInfo(val.IndependentReport)))
|
||||
{
|
||||
WriteSearchResults(val, package, stPackage.Workbook.Worksheets["Search Results"], iPackage.Workbook.Worksheets["Search Results"]);
|
||||
|
||||
if (val.SearchModel.ExtractMisData)
|
||||
{
|
||||
WriteMIS(val, package, stPackage.Workbook.Worksheets["MIS Info"], iPackage.Workbook.Worksheets["MIS Info"]);
|
||||
WriteInvestigation(val, package, stPackage.Workbook.Worksheets["Investigation"], iPackage.Workbook.Worksheets["Investigation"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
package.Save();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Console.WriteLine("\r\nDONE\r\n");
|
||||
}
|
||||
|
||||
private static void WriteInstructions(Val val, ExcelPackage package)
|
||||
{
|
||||
int row = 0;
|
||||
|
||||
ExcelWorksheet ws = package.Workbook.Worksheets.Add("Instructions");
|
||||
|
||||
//Write steps
|
||||
ws.Cells[++row, 1].Value = "Step #";
|
||||
ws.Cells[row, 2].Value = "Instruction";
|
||||
|
||||
ws.Cells[++row, 1].Value = "1";
|
||||
ws.Cells[row, 2].Value = $"Copy data from 'Search Results' worksheet in '{val.Name}.xlsx' to 'SearchResults_ScopingToolOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "2";
|
||||
ws.Cells[row, 2].Value = $"Copy data from 'Search Results' worksheet in '{val.Name}_Independent.xlsx' to 'SearchResults_IndQueryOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "3";
|
||||
ws.Cells[row, 2].Value = "Verify the number of rows in 'SearchResults_ScopingToolOutput' worksheet matches the number of rows in 'SearchResults_IndQueryOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "4";
|
||||
ws.Cells[row, 2].Value = "Verify the no cells show 'No Match' in 'SearchResults_Merge' worksheet.";
|
||||
|
||||
if (val.SearchModel.ExtractMisData)
|
||||
{
|
||||
ws.Cells[++row, 1].Value = "5";
|
||||
ws.Cells[row, 2].Value = $"Copy data from 'MIS Info' worksheet in '{val.Name}.xlsx' to 'MISInfo_ScopingToolOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "6";
|
||||
ws.Cells[row, 2].Value = $"Copy data from 'MIS Info' worksheet in '{val.Name}_Independent.xlsx' to 'MISInfo_IndQueryOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "7";
|
||||
ws.Cells[row, 2].Value = "Verify the number of rows in 'MISInfo_ScopingToolOutput' worksheet matches the number of rows in 'MISInfo_IndQueryOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "8";
|
||||
ws.Cells[row, 2].Value = "Verify the no cells show 'No Match' in 'MISInfo_Merge' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "9";
|
||||
ws.Cells[row, 2].Value = $"Copy data from 'Investigation' worksheet in '{val.Name}.xlsx' to 'Investigation_ScopingToolOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "10";
|
||||
ws.Cells[row, 2].Value = $"Copy data from 'Investigation' worksheet in '{val.Name}_Independent.xlsx' to 'Investigation_IndQueryOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "11";
|
||||
ws.Cells[row, 2].Value = "Verify the number of rows in 'Investigation_ScopingToolOutput' worksheet matches the number of rows in 'Investigation_IndQueryOutput' worksheet.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "12";
|
||||
ws.Cells[row, 2].Value = "Verify the no cells show 'No Match' in 'Investigation_Merge' worksheet.";
|
||||
}
|
||||
|
||||
//Write definitions
|
||||
++row;
|
||||
ws.Cells[++row, 1].Value = "Index";
|
||||
ws.Cells[row, 2].Value = "Index is an Excel function that looks for a position of a cell in an Excel document and returns with the value of the cell at that position.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "Match";
|
||||
ws.Cells[row, 2].Value = "Match is an Excel function that looks for a value in a cell (user determines where to look) and returns with the position of that cell.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "If";
|
||||
ws.Cells[row, 2].Value = "If is an Excel function that performs a logical test, and if that test is true it will return a value. If the logic test is false it will return another value.";
|
||||
|
||||
ws.Cells[++row, 1].Value = "Hyperlink";
|
||||
ws.Cells[row, 2].Value = "Hyperlink is an Excel function that connects a cell to a different location.";
|
||||
|
||||
//Write tab info
|
||||
++row;
|
||||
ws.Cells[++row, 2].Value = "For the SearchResults_Merge tab, the first column (Column A) is conducting a hyperlink function. This is looking in the SearchResults_ScopingToolOutput tab for the row number that corresponds with the associated row number from the SearchResults_Merge tab and outputting the corresponding row number.";
|
||||
ws.Cells[row, 2].Style.WrapText = true;
|
||||
|
||||
ws.Cells[++row, 2].Value = "For the SearchResults_Merge tab, the second column (Column B) is conducting a hyperlink function after conducting an index + match function. The index match function looks in the SearchResults_IndQueryOutput tab for the Work Order Number that corresponds with the work order from the row returned in column A. It then outputs the row number from SearchResults_IndQueryOutput tab that has that corresponding work order number.";
|
||||
ws.Cells[row, 2].Style.WrapText = true;
|
||||
|
||||
if (val.SearchModel.ExtractMisData)
|
||||
{
|
||||
ws.Cells[++row, 2].Value = "For all other cells in the SearchResults_Merge tab as well as the MISInfo_Merge & Investigation_Merge tabs an If function is used. The If function compares the output values of the corresponding cells from the JDE Scoping Tool output and the Independent Query Output.";
|
||||
ws.Cells[row, 2].Style.WrapText = true;
|
||||
}
|
||||
|
||||
ws.Column(1).Width = 10;
|
||||
ws.Column(2).Width = 200;
|
||||
}
|
||||
|
||||
private static void WriteSearchResults(Val val, ExcelPackage package, ExcelWorksheet stWS, ExcelWorksheet iWS)
|
||||
{
|
||||
string stWSName = "SearchResults_ScopingToolOutput";
|
||||
string iWSName = "SearchResults_IndQueryOutput";
|
||||
string mergeWSName = "SearchResults_Merge";
|
||||
|
||||
package.Workbook.Worksheets.Add(stWSName, stWS);
|
||||
package.Workbook.Worksheets.Add(iWSName, iWS);
|
||||
ExcelWorksheet ws = package.Workbook.Worksheets.Add(mergeWSName);
|
||||
|
||||
//Write header
|
||||
ws.Cells[1, 1].Value = "Scoping Tool";
|
||||
ws.Cells[1, 2].Value = "Independent Query";
|
||||
for (int col = 1; col <= stWS.Dimension.Columns; col++)
|
||||
{
|
||||
ws.Cells[1, 2 + col].Value = stWS.Cells[1, col].Value;
|
||||
}
|
||||
|
||||
int numRows = stWS.Dimension.Rows;
|
||||
int numCols = stWS.Dimension.Columns;
|
||||
|
||||
ws.Cells[2, 1, numRows, 1].Formula = $"HYPERLINK(\"#{stWSName}!A\"&ROW(),ROW())";
|
||||
ws.Cells[2, 2, numRows, 2].Formula = $"HYPERLINK(\"#{iWSName}!A\"&MATCH(INDEX({stWSName}!$A$1:$A${numRows},$A2),{iWSName}!$A$1:$A${numRows},0),MATCH(INDEX({stWSName}!$A$1:$A${numRows},$A2),{iWSName}!$A$1:$A${numRows},0))";
|
||||
|
||||
for (int col = 0; col < numCols; col++)
|
||||
{
|
||||
char colLetter = (char)(65 + col);
|
||||
ws.Cells[2, col + 3, numRows, col + 3].Formula = $"IF(INDEX({stWSName}!${colLetter}$1:${colLetter}${numRows},$A2)=INDEX({iWSName}!${colLetter}$1:${colLetter}${numRows},$B2),\"Match\",\"No Match\")";
|
||||
}
|
||||
|
||||
for (int col = 1; col <= ws.Dimension.Columns; col++)
|
||||
{
|
||||
ws.Column(col).AutoFit();
|
||||
ws.Column(col).Width *= 1.15;
|
||||
}
|
||||
}
|
||||
|
||||
private static void WriteMIS(Val val, ExcelPackage package, ExcelWorksheet stWS, ExcelWorksheet iWS)
|
||||
{
|
||||
string stWSName = "MISInfo_ScopingToolOutput";
|
||||
string iWSName = "MISInfo_IndQueryOutput";
|
||||
string mergeWSName = "MISInfo_Merge";
|
||||
|
||||
package.Workbook.Worksheets.Add(stWSName, stWS);
|
||||
package.Workbook.Worksheets.Add(iWSName, iWS);
|
||||
ExcelWorksheet ws = package.Workbook.Worksheets.Add(mergeWSName);
|
||||
|
||||
//Write header
|
||||
for (int col = 1; col <= stWS.Dimension.Columns; col++)
|
||||
{
|
||||
ws.Cells[1,col].Value = stWS.Cells[1, col].Value;
|
||||
}
|
||||
|
||||
int numRows = stWS.Dimension.Rows;
|
||||
int numCols = stWS.Dimension.Columns;
|
||||
|
||||
for (int col = 1; col <= numCols; col++)
|
||||
{
|
||||
char colLetter = (char)(65 + col);
|
||||
ws.Cells[2, col, numRows, col].Formula = $"IF({stWSName}!{colLetter}2={iWSName}!{colLetter}2,\"Match\",\"No Match\")";
|
||||
}
|
||||
|
||||
for (int col = 1; col <= ws.Dimension.Columns; col++)
|
||||
{
|
||||
ws.Column(col).AutoFit();
|
||||
ws.Column(col).Width *= 1.15;
|
||||
}
|
||||
}
|
||||
|
||||
private static void WriteInvestigation(Val val, ExcelPackage package, ExcelWorksheet stWS, ExcelWorksheet iWS)
|
||||
{
|
||||
string stWSName = "Investigation_ScopingToolOutput";
|
||||
string iWSName = "Investigation_IndQueryOutput";
|
||||
string mergeWSName = "Investigation_Merge";
|
||||
|
||||
package.Workbook.Worksheets.Add(stWSName, stWS);
|
||||
package.Workbook.Worksheets.Add(iWSName, iWS);
|
||||
ExcelWorksheet ws = package.Workbook.Worksheets.Add(mergeWSName);
|
||||
|
||||
//Write header
|
||||
for (int col = 1; col <= stWS.Dimension.Columns; col++)
|
||||
{
|
||||
ws.Cells[1, col].Value = stWS.Cells[1, col].Value;
|
||||
}
|
||||
|
||||
int numRows = stWS.Dimension.Rows;
|
||||
int numCols = stWS.Dimension.Columns;
|
||||
|
||||
for (int col = 1; col <= numCols; col++)
|
||||
{
|
||||
char colLetter = (char)(65 + col);
|
||||
ws.Cells[2, col, numRows, col].Formula = $"IF({stWSName}!{colLetter}2={iWSName}!{colLetter}2,\"Match\",\"No Match\")";
|
||||
}
|
||||
|
||||
for (int col = 1; col <= ws.Dimension.Columns; col++)
|
||||
{
|
||||
ws.Column(col).AutoFit();
|
||||
ws.Column(col).Width *= 1.15;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Val
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string TicketNumber { get; set; }
|
||||
public int SearchID { get; set; }
|
||||
public Search Search { get; set; }
|
||||
public SearchModel SearchModel { get; set; }
|
||||
|
||||
public string IndependentLongSQL { get; set; }
|
||||
public string IndependentShortSQL { get; set; }
|
||||
public string ScopingToolSQL { get; set; }
|
||||
|
||||
public string IndependentReport { get; set; }
|
||||
public string ScopingToolReport { get; set; }
|
||||
public string MergeReport { get; set; }
|
||||
}
|
||||
}
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestApp")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TestApp")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2018")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("ea3db6d1-f080-4bb4-a222-3eeded34d9f5")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
--Add any work orders issued material from flagged work orders
|
||||
WITH CWO_D AS(
|
||||
SELECT DISTINCT wo.WorkOrderNumber,
|
||||
wo.LotNumber,
|
||||
wo.BranchCode,
|
||||
wo.ShortItemNumber
|
||||
FROM dbo.WorkOrderComponent AS woc INNER JOIN
|
||||
dbo.WorkOrder AS wo ON (woc.WorkOrderNumber = wo.WorkOrderNumber) INNER JOIN
|
||||
#Temp_WO AS t_wo ON (woc.LotNumber = t_wo.LotNumber AND woc.ShortItemNumber = t_wo.ShortItemNumber)
|
||||
)
|
||||
MERGE #Temp_WO AS TARGET
|
||||
USING CWO_D AS SOURCE
|
||||
ON (TARGET.WorkOrderNumber = SOURCE.WorkOrderNumber)
|
||||
WHEN MATCHED THEN
|
||||
UPDATE SET TARGET.PartsList = 1
|
||||
WHEN NOT MATCHED THEN
|
||||
INSERT (WorkOrderNumber, LotNumber, BranchCode, ShortItemNumber, PartsList)
|
||||
VALUES (SOURCE.WorkOrderNumber, COALESCE(SOURCE.LotNumber, CAST(SOURCE.WorkOrderNumber AS VARCHAR(8))), SOURCE.BranchCode, SOURCE.ShortItemNumber, 1);
|
||||
|
||||
WITH CWO_D AS(
|
||||
SELECT DISTINCT wo.WorkOrderNumber,
|
||||
wo.LotNumber,
|
||||
wo.BranchCode,
|
||||
wo.ShortItemNumber
|
||||
FROM dbo.LotUsage AS lu INNER JOIN
|
||||
dbo.WorkOrder AS wo ON (lu.WorkOrderNumber = wo.WorkOrderNumber) INNER JOIN
|
||||
#Temp_WO AS t_wo ON (lu.LotNumber = t_wo.LotNumber AND lu.ShortItemNumber = t_wo.ShortItemNumber)
|
||||
)
|
||||
MERGE #Temp_WO AS TARGET
|
||||
USING CWO_D AS SOURCE
|
||||
ON (TARGET.WorkOrderNumber = SOURCE.WorkOrderNumber)
|
||||
WHEN MATCHED THEN
|
||||
UPDATE SET TARGET.CARDEX = 1
|
||||
WHEN NOT MATCHED THEN
|
||||
INSERT (WorkOrderNumber, LotNumber, BranchCode, ShortItemNumber, CARDEX)
|
||||
VALUES (SOURCE.WorkOrderNumber, COALESCE(SOURCE.LotNumber, CAST(SOURCE.WorkOrderNumber AS VARCHAR(8))), SOURCE.BranchCode, SOURCE.ShortItemNumber, 1);
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
/* Add downlevel work orders that were issued material from flagged work orders */
|
||||
MERGE INTO TEMP_WO TARGET
|
||||
USING
|
||||
(
|
||||
select distinct WADOCO, COALESCE(WALOTN, CAST(WADOCO AS CHAR(8))) WALOTN, WAMMCU, WAITM
|
||||
from F3111_WOC woc inner join
|
||||
F4801_WO wo on (woc.WMDOCO = wo.WADOCO) inner join
|
||||
TEMP_WO t_wo on (woc.WMLOTN = t_wo.LOTNUMBER and woc.WMCPIT = t_wo.SHORTITEMNUMBER)
|
||||
) 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 F4111_CARDEX lu inner join
|
||||
F4801_WO wo on (lu.ILDOCO = wo.WADOCO) inner join
|
||||
TEMP_WO t_wo on (lu.ILLOTN = t_wo.LOTNUMBER and lu.ILITM = t_wo.SHORTITEMNUMBER)
|
||||
) 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');
|
||||
Executable
+1007
File diff suppressed because it is too large
Load Diff
Executable
+480
@@ -0,0 +1,480 @@
|
||||
<#@ 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;
|
||||
<# } #>
|
||||
Executable
+1091
File diff suppressed because it is too large
Load Diff
Executable
+381
@@ -0,0 +1,381 @@
|
||||
<#@ 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;
|
||||
<# } #>
|
||||
/
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
using WorkerService.Models.Reporting;
|
||||
|
||||
namespace TestApp.Templates
|
||||
{
|
||||
/// <summary>
|
||||
/// Query template extensions
|
||||
/// </summary>
|
||||
public partial class QueryTemplate2
|
||||
{
|
||||
/// <summary>
|
||||
/// Template data model
|
||||
/// </summary>
|
||||
public SearchModel Model { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Whether or not to write data inserts
|
||||
/// </summary>
|
||||
public bool AddData { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="model">Template data model</param>
|
||||
/// <param name="addData">Whether or not to write data inserts</param>
|
||||
public QueryTemplate2(SearchModel model = null, bool addData = false)
|
||||
{
|
||||
Model = model ?? new SearchModel();
|
||||
AddData = addData;
|
||||
}
|
||||
}
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
using WorkerService.Models.Reporting;
|
||||
|
||||
namespace TestApp.Templates
|
||||
{
|
||||
/// <summary>
|
||||
/// Query template extensions
|
||||
/// </summary>
|
||||
public partial class QueryTemplate
|
||||
{
|
||||
/// <summary>
|
||||
/// Template data model
|
||||
/// </summary>
|
||||
public SearchModel Model { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="model">Template data model</param>
|
||||
public QueryTemplate(SearchModel model = null)
|
||||
{
|
||||
Model = model ?? new SearchModel();
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
--Add any work orders split from flagged work orders
|
||||
WITH SP_WO AS
|
||||
(
|
||||
SELECT DISTINCT wo.WorkOrderNumber,
|
||||
wo.LotNumber,
|
||||
wo.BranchCode,
|
||||
wo.ShortItemNumber
|
||||
FROM dbo.WorkOrder AS wo INNER JOIN
|
||||
#Temp_WO AS tw_o ON (wo.ParentWorkOrderNumber = CAST(tw_o.WorkOrderNumber AS VARCHAR(8)))
|
||||
)
|
||||
MERGE #Temp_WO AS TARGET
|
||||
USING SP_WO AS SOURCE
|
||||
ON (TARGET.WorkOrderNumber = SOURCE.WorkOrderNumber)
|
||||
WHEN MATCHED THEN
|
||||
UPDATE SET TARGET.SplitOrder = 1
|
||||
WHEN NOT MATCHED BY TARGET THEN
|
||||
INSERT (WorkOrderNumber, LotNumber, BranchCode, ShortItemNumber, SplitOrder)
|
||||
VALUES (SOURCE.WorkOrderNumber, SOURCE.LotNumber, SOURCE.BranchCode, SOURCE.ShortItemNumber, 1);
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
/* 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');
|
||||
Executable
+108
@@ -0,0 +1,108 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{EA3DB6D1-F080-4BB4-A222-3EEDED34D9F5}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>TestApp</RootNamespace>
|
||||
<AssemblyName>TestApp</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Dapper, Version=1.50.2.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Dapper.1.50.2\lib\net451\Dapper.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="EPPlus, Version=4.1.0.0, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Oracle.ManagedDataAccess, Version=4.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Oracle.ManagedDataAccess.18.3.0\lib\net40\Oracle.ManagedDataAccess.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Templates\QueryTemplate2.cs">
|
||||
<DependentUpon>QueryTemplate2.tt</DependentUpon>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<Compile Include="Templates\QueryTemplate.cs">
|
||||
<DependentUpon>QueryTemplate.tt</DependentUpon>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<Compile Include="Templates\QueryTemplate2Extension.cs" />
|
||||
<Compile Include="Templates\QueryTemplateExtension.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config">
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\DataModel\Commons.csproj">
|
||||
<Project>{aec46648-af1b-4eed-8580-1cf7afe3adcd}</Project>
|
||||
<Name>Commons</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\WorkerService\WorkerService.csproj">
|
||||
<Project>{cd1dcd5b-5d89-445d-a8ed-9d8bada0e36d}</Project>
|
||||
<Name>WorkerService</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Templates\ComponentUsageQuery2.txt" />
|
||||
<Content Include="Templates\ComponentUsageQuery.txt" />
|
||||
<Content Include="Templates\QueryTemplate2.tt">
|
||||
<Generator>TextTemplatingFilePreprocessor</Generator>
|
||||
<LastGenOutput>QueryTemplate2.cs</LastGenOutput>
|
||||
</Content>
|
||||
<Content Include="Templates\QueryTemplate.tt">
|
||||
<Generator>TextTemplatingFilePreprocessor</Generator>
|
||||
<LastGenOutput>QueryTemplate.cs</LastGenOutput>
|
||||
</Content>
|
||||
<Content Include="Templates\SplitWorkOrderQuery2.txt" />
|
||||
<Content Include="Templates\SplitWorkOrderQuery.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Dapper" version="1.50.2" targetFramework="net452" />
|
||||
<package id="EPPlus" version="4.1.0" targetFramework="net452" />
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
|
||||
<package id="Oracle.ManagedDataAccess" version="18.3.0" targetFramework="net452" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user