using Microsoft.Data.SqlClient; using Microsoft.Extensions.Logging; using ReportingServices.Shared.Models.PlanningReport; using ReportingServices.Shared.Models.ProductionReport; using System.Data; namespace ReportingServices.Shared.Repositories; public class ScrapeDatabaseRepository : IScrapeDatabaseRepository { private SqlConnection _connection; private readonly string _connectionString; public ScrapeDatabaseRepository(string connectionString) => _connectionString = connectionString; public void OpenConnection() { _connection ??= new SqlConnection(_connectionString); if (_connection.State != ConnectionState.Open) _connection.Open(); } public void CloseConnection() { if (_connection.State != ConnectionState.Closed) _connection.Close(); } public int GetNumberOfPartChanges(string startDate, string endDate) { int result = 0; OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT SUM(PCHANGE) " + " FROM (SELECT REACTOR, " + " COUNT(PROD_SPEC_ID) - 1 AS PCHANGE " + " FROM (SELECT REACTOR, " + " PROD_SPEC_ID, " + " COUNT(WO) AS PSN_COUNT " + " FROM RDS " + " WHERE DATE_OUT BETWEEN @startDate AND @endDate " + " GROUP BY REACTOR, PROD_SPEC_ID) AS t " + " GROUP BY REACTOR) AS l"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@startDate", startDate); _ = cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { _ = reader.Read(); result = int.Parse(reader[0].ToString()); } cmd.Dispose(); CloseConnection(); return result; } public List GetScrapByDay(List outs) { List scrap = new(); string rdsNumbers = ""; foreach (ReactorOutsByRDS rout in outs) rdsNumbers = rdsNumbers + "'" + rout.RDS_NO + "', "; rdsNumbers = rdsNumbers[..^2]; OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT " + " DATE_OUT," + " SUM(CUST_TOT_REJ) AS TOT_REJ_CUST," + " SUM(LSL_TOT_REJ) AS TOT_REJ_MANU," + " SUM(CASE WHEN REACTOR_TYPE <> 'EPP' THEN TW_PROD ELSE 0 END) AS TW_PROD " + "FROM RDS " + "WHERE SEQ IN (" + rdsNumbers + ") " + "GROUP BY DATE_OUT " + "ORDER BY 1 DESC"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read() && reader[0].ToString() != "1/1/1900 12:00:00 AM") { int twProd = string.IsNullOrEmpty(reader[3].ToString()) ? 0 : int.Parse(reader[3].ToString()); int custScrap = string.IsNullOrEmpty(reader[1].ToString()) ? 0 : int.Parse(reader[1].ToString()); int manuScrap = string.IsNullOrEmpty(reader[2].ToString()) ? 0 : int.Parse(reader[2].ToString()); int totScrap = custScrap + manuScrap; scrap.Add(new ScrapByDay { StartDate = reader[0].ToString(), TW_PROD = twProd, TOT_REJ_CUST = custScrap, TOT_REJ_MANU = manuScrap, TOT_REJ_WFRS = totScrap }); } } cmd.Dispose(); CloseConnection(); return scrap; } public List GetReactorPSNWORuns(string startDate, string endDate) { List weeklyPartChanges = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT REACTOR, PROD_SPEC_ID, WO, COUNT(WO) FROM RDS " + " WHERE DATE_OUT BETWEEN @startDate AND @endDate " + "GROUP BY REACTOR, PROD_SPEC_ID, WO " + "ORDER BY 1"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@startDate", startDate); _ = cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) weeklyPartChanges.Add(new ReactorPSNWORuns { REACTOR = reader[0].ToString(), PSN = reader[1].ToString(), WO = reader[2].ToString(), WO_COUNT = int.Parse(reader[3].ToString()) }); } cmd.Dispose(); CloseConnection(); return weeklyPartChanges; } public List GetReactorPartChanges(string startDate, string endDate) { List weeklyPartChanges = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT REACTOR, PROD_SPEC_ID, WO, COUNT(WO) AS WO_COUNT FROM RDS " + " WHERE DATE_OUT BETWEEN @startDate AND @endDate " + " AND REACTOR IN (SELECT REACTOR " + " FROM (SELECT REACTOR, " + " COUNT(PROD_SPEC_ID) - 1 AS PCHANGE " + " FROM (SELECT REACTOR, " + " PROD_SPEC_ID, " + " COUNT(WO) AS PSN_COUNT " + " FROM RDS " + " WHERE DATE_OUT BETWEEN @startDate AND @endDate " + " GROUP BY REACTOR, PROD_SPEC_ID) AS t " + " GROUP BY REACTOR) AS l " + " WHERE l.PCHANGE > 0) " + "GROUP BY REACTOR, PROD_SPEC_ID, WO " + "ORDER BY 1"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@startDate", startDate); _ = cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) weeklyPartChanges.Add(new ReactorPSNWORuns { REACTOR = "R" + reader[0].ToString(), PSN = reader[1].ToString(), WO = reader[2].ToString(), WO_COUNT = int.Parse(reader[3].ToString()) }); } cmd.Dispose(); CloseConnection(); return weeklyPartChanges; } public QuarterlyTargets GetQuarterlyTargets() { Dictionary targets = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT THRU_TARGET, THRU_QTY, THRU_PCNT FROM FISCAL_QTR_TARGETS " + " WHERE THRU_GROUP = 'TOT' " + " AND FISCAL_YR = " + " (SELECT FISCAL_YR FROM FISCAL_QTR " + " WHERE START_DT < SYSDATETIME() " + " AND END_DT > SYSDATETIME()) " + " AND FISCAL_QTR = " + " (SELECT FISCAL_QTR FROM FISCAL_QTR " + " WHERE START_DT < SYSDATETIME() " + " AND END_DT > SYSDATETIME()) " + "UNION " + "SELECT 'PlanWorkingDays' As THRU_TARGET," + " PLAN_WORKING_DAYS AS THRU_QTY," + " NULL AS THRU_PCNT" + " FROM FISCAL_QTR " + " WHERE SYSDATETIME() BETWEEN START_DT AND END_DT"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { if (reader[0].ToString().ToUpper() == "YIELD") targets.Add(reader[0].ToString(), float.Parse(reader[2].ToString())); else if (!string.IsNullOrEmpty(reader[1].ToString())) targets.Add(reader[0].ToString(), int.Parse(reader[1].ToString())); } } cmd.Dispose(); CloseConnection(); QuarterlyTargets quarterlyTargets = new() { Reactor_Outs = (int)targets["Reactor_Outs"], Yield_Outs = (int)targets["Yield_Outs"], IFX_Scrap = (int)targets["IFX_Scrap"], Yield = targets["Yield"], PlanWorkingDays = (int)targets["PlanWorkingDays"] }; return quarterlyTargets; } public QuarterlyTargets GetPreviousQuarterlyTargets() { Dictionary targets = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT THRU_TARGET, THRU_QTY, THRU_PCNT FROM FISCAL_QTR_TARGETS " + " WHERE THRU_GROUP = 'TOT' " + " AND FISCAL_YR = " + " (SELECT CASE WHEN ls.FISCAL_QTR - 1 = 0 THEN ls.FISCAL_YR - 1 ELSE ls.FISCAL_YR END " + " FROM(SELECT * FROM FISCAL_QTR WHERE START_DT < SYSDATETIME() AND END_DT > SYSDATETIME()) AS ls) " + " AND FISCAL_QTR = " + " (SELECT CASE WHEN ls.FISCAL_QTR - 1 = 0 THEN 4 ELSE ls.FISCAL_QTR - 1 END " + " FROM(SELECT * FROM FISCAL_QTR WHERE START_DT < SYSDATETIME() AND END_DT > SYSDATETIME()) AS ls) " + "UNION " + "SELECT 'PlanWorkingDays' As THRU_TARGET, " + " PLAN_WORKING_DAYS AS THRU_QTY, " + " NULL AS THRU_PCNT " + " FROM FISCAL_QTR " + " WHERE SYSDATETIME() BETWEEN START_DT AND END_DT"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { if (reader[0].ToString().ToUpper() == "YIELD") targets.Add(reader[0].ToString(), float.Parse(reader[2].ToString())); else if (!string.IsNullOrEmpty(reader[1].ToString())) targets.Add(reader[0].ToString(), int.Parse(reader[1].ToString())); } } cmd.Dispose(); CloseConnection(); QuarterlyTargets quarterlyTargets = new() { Reactor_Outs = (int)targets["Reactor_Outs"], Yield_Outs = (int)targets["Yield_Outs"], IFX_Scrap = (int)targets["IFX_Scrap"], Yield = targets["Yield"], PlanWorkingDays = (int)targets["PlanWorkingDays"] }; return quarterlyTargets; } public List GetReactors() { List reactors = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT " + " REACT_NO, REACT_TYPE, SUSC_POCKET_SIZE, CASE WHEN ACTIVE_LL_DISABLED <> '' THEN 'TRUE' ELSE 'FALSE' END AS \"LL_DISABLED\" " + " FROM REACTOR " + " WHERE REACT_ASSIGNMENT IS NOT NULL " + " AND REACT_ASSIGNMENT <> 'Out of Service' " + " AND REACT_ASSIGNMENT <> '' " + " AND CURR_MODE_KEY = ''"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) reactors.Add(new Reactor { ReactorNumber = int.Parse(reader[0].ToString()), Type = reader[1].ToString(), PocketSize = reader[2].ToString(), HasDisabledLoadlock = bool.Parse(reader[3].ToString()) }); } cmd.Dispose(); CloseConnection(); return reactors; } public List GetRDSForLastDay(string date) { List rdsList = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT rds.REACTOR, rds.REACTOR_TYPE, rds.DATE_OUT, " + "CASE WHEN lay.UL_TEMP IS NULL THEN '1000' ELSE lay.UL_TEMP END, psn.LAYER_TYPE FROM RDS " + "INNER JOIN RDS_LAYER lay ON lay.RDS_NO = SEQ " + "INNER JOIN PROD_SPEC psn ON rds.PROD_SPEC_ID = psn.SEQ " + "WHERE DATE_OUT >= @date"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@date", date); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) rdsList.Add(new RDS { Reactor = int.Parse(reader[0].ToString()), ReactorType = reader[1].ToString(), DateOut = DateTime.Parse(reader[2].ToString()), UnloadTemp = int.Parse(reader[3].ToString()), LayerType = reader[4].ToString() }); } cmd.Dispose(); CloseConnection(); return rdsList; } public List GetRDSRunBetweenDates(string startDate, string endDate) { List outs = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT SEQ, WFRS_OUT, DATE_OUT " + " FROM RDS " + " WHERE DATE_OUT >= @startDate " + " AND DATE_OUT < @endDate " + "ORDER BY DATE_OUT ASC"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@startDate", startDate); _ = cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) outs.Add(new ReactorOutsByRDS { RDS_NO = reader[0].ToString(), Units = reader[1].ToString(), EndProcessTime = reader[2].ToString() }); } cmd.Dispose(); CloseConnection(); return outs; } public List GetReactorEvents(string startDate, string endDate, string reactorNumber) { List events = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT " + " REACT_NO, " + " START_DTM, " + " START_NOTE AS REASON, " + " MODE, " + " (SELECT TOP 1 NOTES " + " FROM REACTOR_LOG_NOTES rnote " + " WHERE rmode.START_RL_ID = rnote.SEQ " + " ORDER BY MV_NO DESC) AS COMMENT, " + " (SELECT TOP 1 CONCAT(PROB_CAT_ID, ' - ', PROB_CAT_DESC) " + " FROM REACT_MODE_SERV_INFO srv " + " WHERE rmode.REACT_NO = srv.REACT_NO " + " AND rmode.START_DTM = srv.START_DTM " + " ORDER BY MV_NO DESC) AS CATEGORY " + " FROM REACT_MODE rmode " + " WHERE START_DTM > @startDate " + " AND START_DTM < @endDate" + " AND REACT_NO = @reactorNumber " + "UNION ALL " + "SELECT * " + " FROM " + " (SELECT TOP 1 " + " REACT_NO, " + " START_DTM, START_NOTE AS REASON, " + " MODE, " + " (SELECT TOP 1 NOTES " + " FROM REACTOR_LOG_NOTES rnote " + " WHERE rmode.START_RL_ID = rnote.SEQ " + " ORDER BY MV_NO DESC) AS COMMENT, " + " (SELECT TOP 1 CONCAT(PROB_CAT_ID, ' - ', PROB_CAT_DESC) " + " FROM REACT_MODE_SERV_INFO srv " + " WHERE rmode.REACT_NO = srv.REACT_NO " + " AND rmode.START_DTM = srv.START_DTM " + " ORDER BY MV_NO DESC) AS CATEGORY " + " FROM REACT_MODE rmode " + " WHERE START_DTM < @startDate" + " AND REACT_NO = @reactorNumber " + " ORDER BY START_DTM DESC) AS tbl1 " + "ORDER BY START_DTM ASC"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@startDate", startDate); _ = cmd.Parameters.AddWithValue("@endDate", endDate); _ = cmd.Parameters.AddWithValue("@reactorNumber", reactorNumber); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) events.Add(new ReactorEvent { REACT_NO = reader[0].ToString(), EVENT_DTM = reader[1].ToString(), REASON = reader[2].ToString(), REACT_MODE = reader[3].ToString(), COMMENT = reader[4].ToString(), CAT_PROB_DESC = reader[5].ToString() }); } cmd.Dispose(); CloseConnection(); return events; } public ToolEvent GetLatestToolEvent(string toolID) { ToolEvent evnt = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT TOP 1 " + " TOOL_ID, " + " START_DTM, " + " TOOL_MODE, " + " TOOL_MODE_DESC " + " FROM TOOL_LOG " + " WHERE TOOL_ID = @toolID " + "ORDER BY START_DTM DESC"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@toolID", toolID); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) evnt = new ToolEvent { TOOL_ID = reader[0].ToString(), START_DTM = reader[1].ToString(), TOOL_MODE = reader[2].ToString(), TOOL_MODE_DESC = reader[3].ToString() }; } cmd.Dispose(); CloseConnection(); return evnt; } public int GetLastUpTransaction(string reactorNumber) { int lastTransaction = 0; OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT TOP 1 DATEDIFF(MINUTE,STOP_DTM,SYSDATETIME()) " + " FROM REACT_MODE " + " WHERE REACT_NO = @reactorNumber " + " AND (MODE = 'UP' OR MODE LIKE '%UP_WITH_INCREASED_SAMPLING%') " + "ORDER BY START_DTM DESC"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@reactorNumber", reactorNumber); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) lastTransaction = int.Parse(reader[0].ToString()); } cmd.Dispose(); CloseConnection(); return lastTransaction; } public OutsAndScrapTotal GetOutsAndScrapTotals(string startDate, string endDate) { OutsAndScrapTotal totals = new() { Outs = 0, CustomerScrap = 0, ManufacturingScrap = 0, ProductionScrap = 0 }; if (startDate == endDate) return totals; OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT SUM(WFRS_OUT) AS OUTS, " + " SUM(CUST_TOT_REJ) AS CUST, " + " SUM(LSL_TOT_REJ) AS MANU, " + " SUM(CASE WHEN REACTOR_TYPE <> 'EPP' THEN TW_PROD ELSE 0 END) AS PROD " + " FROM RDS " + " WHERE DATE_OUT >= @startDate " + " AND DATE_OUT < @endDate"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@startDate", startDate); _ = cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) totals = new() { Outs = int.Parse(reader[0].ToString()), CustomerScrap = int.Parse(reader[1].ToString()), ManufacturingScrap = int.Parse(reader[2].ToString()), ProductionScrap = int.Parse(reader[3].ToString()), }; } cmd.Dispose(); CloseConnection(); return totals; } public DateTime GetQuarterStartDate() { DateTime date = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT START_DT " + " FROM FISCAL_QTR " + " WHERE START_DT < SYSDATETIME() " + " AND END_DT > SYSDATETIME()"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) date = DateTime.Parse(reader[0].ToString()); } cmd.Dispose(); CloseConnection(); return date; } public DateTime GetPreviousQuarterStartDate() { DateTime date = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT START_DT FROM FISCAL_QTR " + " WHERE FISCAL_QTR = " + " (SELECT CASE WHEN ls.FISCAL_QTR - 1 = 0 THEN 4 ELSE ls.FISCAL_QTR - 1 END " + " FROM (SELECT * FROM FISCAL_QTR WHERE START_DT < SYSDATETIME() AND END_DT > SYSDATETIME()) AS ls) " + " AND FISCAL_YR = " + " (SELECT CASE WHEN ls.FISCAL_QTR - 1 = 0 THEN ls.FISCAL_YR - 1 ELSE ls.FISCAL_YR END " + " FROM (SELECT * FROM FISCAL_QTR WHERE START_DT < SYSDATETIME() AND END_DT > SYSDATETIME()) AS ls)"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) date = DateTime.Parse(reader[0].ToString()); } cmd.Dispose(); CloseConnection(); return date; } public List GetCurrentHoldLots() { List lots = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT WO_NO, " + " HOLD_START_DTM, " + " HOLD_START_USER, " + " HOLD_START_REASON, " + " SEQ, " + " REACTOR " + " FROM WO_MAT_HOLD_HISTORY, RDS " + " WHERE HOLD_STOP_DTM = '1/1/1900' " + " AND HOLD_START_DTM > '1/1/2022' " + " AND HOLD_ENTITY_ID = SEQ " + " AND HOLD_ENTITY = 'RDS' " + "ORDER BY HOLD_START_DTM ASC"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) lots.Add(new HoldLot { WO_NO = reader[0].ToString(), HOLD_DATE = DateTime.Parse(reader[1].ToString()), HOLD_USER = reader[2].ToString(), HOLD_REASON = reader[3].ToString(), RDS_NO = reader[4].ToString(), REACTOR = reader[5].ToString(), }); } cmd.Dispose(); CloseConnection(); return lots; } public List GetCurrentHotWORunning() { List lots = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT DISTINCT(REACT_NO) " + " FROM SCHED_DET_NG schd " + "INNER JOIN WO_LOG wlog ON WO = WO_NO " + " WHERE STOP_DTM > SYSDATETIME() " + " AND START_DTM < SYSDATETIME() " + " AND HOT_FLAG = 1 " + "ORDER BY REACT_NO"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) lots.Add("R" + reader[0].ToString()); } cmd.Dispose(); CloseConnection(); return lots; } public List GetScheduledEvents(string startDate, string endDate) { List events = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT REACT_NO, " + " schd.WO_NO, " + " PROC_SPEC_ID, " + " START_DTM, " + " STOP_DTM, " + " BLOCKOUT, " + " BLOCK_OUT_TYPE " + " FROM SCHED_DET_NG schd " + "FULL OUTER JOIN WO_STEP step " + " ON step.WO_NO = schd.WO_NO " + " WHERE ((STOP_DTM > @startDate AND STOP_DTM < @endDate) " + " OR (START_DTM > @startDate AND START_DTM < @endDate)) " + "ORDER BY REACT_NO, START_DTM ASC"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@startDate", startDate); _ = cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) events.Add(new ScheduledEvent { REACT_NO = reader[0].ToString(), WO_NO = reader[1].ToString(), PROD_SPEC_ID = reader[2].ToString(), START_DTM = DateTime.Parse(reader[3].ToString()), STOP_DTM = DateTime.Parse(reader[4].ToString()), BLOCKOUT = reader[5].ToString(), BLOCKOUT_TYPE = reader[6].ToString() }); } cmd.Dispose(); CloseConnection(); return events; } public List GetProjectedPartChanges(string startDate, string endDate) { List events = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT REACT_NO, " + " PROC_SPEC_ID, " + " schd.WO_NO " + " FROM SCHED_DET_NG schd " + "FULL OUTER JOIN WO_STEP step " + " ON step.WO_NO = schd.WO_NO " + " WHERE ((STOP_DTM > @startDate AND STOP_DTM < @endDate) " + " OR (START_DTM > @startDate AND START_DTM < @endDate)) " + " AND BLOCKOUT IS NULL " + " AND REACT_NO IN (SELECT REACT_NO " + " FROM (SELECT REACT_NO, " + " COUNT(PROC_SPEC_ID) - 1 AS PCHANGE " + " FROM (SELECT REACT_NO, " + " PROC_SPEC_ID, " + " COUNT(schd.WO_NO) AS WO_COUNT " + " FROM SCHED_DET_NG schd " + " FULL OUTER JOIN WO_STEP step " + " ON step.WO_NO = schd.WO_NO " + " WHERE ((STOP_DTM > @startDate AND STOP_DTM < @endDate) " + " OR (START_DTM > @startDate AND START_DTM < @endDate)) " + " AND BLOCKOUT IS NULL GROUP BY REACT_NO, PROC_SPEC_ID) AS l " + " GROUP BY REACT_NO) AS p " + " WHERE PCHANGE > 0) " + "ORDER BY REACT_NO"; cmd.CommandText = query; _ = cmd.Parameters.AddWithValue("@startDate", startDate); _ = cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) events.Add(new ReactorPSNWORuns { REACTOR = "R" + reader[0].ToString(), PSN = reader[1].ToString(), WO = reader[2].ToString(), WO_COUNT = 0 }); } cmd.Dispose(); CloseConnection(); return events; } public List GetCurrentNCRs() { List ncrs = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT l.ENTRY_DATE, " + " l.SHIFT, " + " l.REACTOR, " + " r.RDS_ID AS RDS_NO, " + " l.TOT_REJ, " + " n.LOSS_COMMENTS " + " FROM [NCR List] l, NCR n, NCR_RDS r " + " WHERE l.STATUS = 'Open' " + " AND n.SEQ = l.SEQ " + " AND n.SEQ = r.SEQ"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) ncrs.Add(new NCR { ENTRY_DATE = DateTime.Parse(reader[0].ToString()), SHIFT = reader[1].ToString(), REACTOR = reader[2].ToString(), RDS_NO = reader[3].ToString(), TOT_REJ = string.IsNullOrEmpty(reader[4].ToString()) ? 0 : int.Parse(reader[4].ToString()), LOSS_COMMENTS = reader[5].ToString() }); } cmd.Dispose(); CloseConnection(); return ncrs; } }