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:
Joseph Doherty
2026-01-02 07:43:29 -05:00
commit 26ff8d9b4f
1761 changed files with 596509 additions and 0 deletions
+44
View File
@@ -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>
+295
View File
@@ -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; }
}
}
+35
View File
@@ -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
View File
@@ -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
View File
@@ -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');
File diff suppressed because it is too large Load Diff
+480
View File
@@ -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;
<# } #>
File diff suppressed because it is too large Load Diff
+381
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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');
+108
View File
@@ -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>
+7
View File
@@ -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>