using DevExpress.Spreadsheet; using DevExpress.XtraPrinting; using DevExpress.XtraVerticalGrid; using DevExpress.XtraVerticalGrid.Rows; using System; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Reflection; using System.Windows.Forms; using SystemX.Product.ALIS.Interface; using SystemX.Product.TRA.DataManager; using static SystemX.Product.CP.TRA.Commons; using static SystemX.Product.TRA.DataManager.DMTestDetail; namespace SystemX.Product.TRA.UIControl { public partial class UcTRADetailTestResult : UcTRABaseView { public enum eColDataTable { StepNo, Position, Variant, Gate, MO, Function, Min, MeasuredValue, Max, Dimension, Result, Duration } DMTestDetail DataManager { get; set; } DetailTestDataCollection SearchSource { get; set; } DataTable DTTestlistSrc { get; set; } = null; DataTable DTTestLogSrc { get; set; } = null; string TextShowTL { get; } = "Display the Testlist"; string TextShowLOG { get; } = "Display the Test Result"; private string GridViewGetActiveFilterText; public UcTRADetailTestResult() { ContentsType = eContents.TestResult; //this.ContextMenuStrip = base.contextMenuStripTest; InitializeComponent(); } public void SetSQLConnection(eSelectDataView SelectView, IDataBaseController getDBController, DateTime dtStart) { DataManager = new DMTestDetail(SelectView, getDBController, dtStart); } public override void ExportData() { FolderBrowserDialog dlg = new FolderBrowserDialog(); if (dlg.ShowDialog() == DialogResult.OK) { string strFileName = CreateExportFileName(); string strExpPath = dlg.SelectedPath + "\\" + strFileName; XlsxExportOptionsEx option = new XlsxExportOptionsEx(); string strFile = strExpPath + ".xlsx"; option.ShowGridLines = true; option.ExportType = DevExpress.Export.ExportType.WYSIWYG; option.ExportMode = XlsxExportMode.SingleFile; option.SheetName = "Detail Test Data"; gridControlMain.ExportToXlsx(strFile, option); Workbook wbook = new Workbook(); wbook.LoadDocument(strFile); Worksheet worksheetInfo = wbook.Worksheets.Add("Detail Test Info."); int nIdx = 0; foreach (var row in vGridControlInfo.Rows) { if (row is CategoryRow) { worksheetInfo.Cells[nIdx, 0].Value = row.Properties.Caption.ToString(); CellRange cr = worksheetInfo.Range.FromLTRB(0, nIdx, 2, nIdx); worksheetInfo.MergeCells(cr); } else { worksheetInfo.Cells[nIdx, 1].Value = row.Properties.Caption.ToString(); worksheetInfo.Cells[nIdx, 2].Value = row.Properties.Value?.ToString(); } nIdx++; } worksheetInfo.Columns.AutoFit(0, 3); worksheetInfo.AutoOutline(); wbook.SaveDocument(strFile); } } public string CreateExportFileName() { string strFileName = $"{this.ContentsType.ToString()}_{SearchSource.ProductID}_{SearchSource.ProductNo}_{SearchSource.TestCode}_{SearchSource.StationName}_{SearchSource.TestResult}"; strFileName += $"_{SearchSource.StartTime.ToString("yyyyMMddHHmmss")}"; return strFileName; } public void ViewData(DetailTestDataCollection data) { if (data == null) return; SearchSource = data; ShowProperties(data); DTTestLogSrc = DataManager.SearchTestHistory(data); DTTestlistSrc = DataManager.SearchTestlist(data); ShowDetailData(data); } DataTable CombineLogForm() { if (DTTestLogSrc == null || DTTestlistSrc == null) return null; DataTable dtFinal = new DataTable(); foreach(string strCol in Enum.GetNames(typeof(eColDataTable))) { Type typCol = typeof(string); if (strCol == eColDataTable.StepNo.ToString()) typCol = typeof(int); if (strCol == eColDataTable.Position.ToString()) typCol = typeof(int); else if (strCol == eColDataTable.Duration.ToString()) typCol = typeof(double); dtFinal.Columns.Add(strCol, typCol); } foreach (DataRow drLog in DTTestLogSrc.AsEnumerable()) { //DataRow drTL = DTTestlistSrc.AsEnumerable().Where(x => Convert.ToInt32(x[eColTestlist.StepID.ToString()]) == Convert.ToInt32(drLog[eColTestLog.StepID.ToString()])).FirstOrDefault(); //PK 기준 검색 DataRow drTL = DTTestlistSrc.Rows.Find(drLog[eColTestLog.StepID.ToString()]); if (drTL == null) continue; DataRow drDisp = dtFinal.NewRow(); drDisp[eColDataTable.StepNo.ToString()] = Convert.ToInt32(Convert.ToInt32(drLog[eColTestLog.StepID.ToString()])); drDisp[eColDataTable.Position.ToString()] = Convert.ToInt32(Convert.ToInt32(drTL[eColTestlist.Position.ToString()])); drDisp[eColDataTable.Variant.ToString()] = drTL[eColTestlist.Variant.ToString()].ToString(); drDisp[eColDataTable.Gate.ToString()] = drTL[eColTestlist.Gate.ToString()].ToString(); drDisp[eColDataTable.MO.ToString()] = drTL[eColTestlist.StepDesc.ToString()].ToString(); drDisp[eColDataTable.Function.ToString()] = drTL[eColTestlist.UseFunction.ToString()].ToString(); bool bIsGlobal = (Convert.ToInt32(drTL[eColTestlist.IsGlobal.ToString()])) > 0 ? true : false; drDisp[eColDataTable.Min.ToString()] = bIsGlobal ? drLog[eColTestLog.GlobalMin.ToString()].ToString() : drTL[eColTestlist.SpecMin.ToString()].ToString(); drDisp[eColDataTable.Max.ToString()] = bIsGlobal ? drLog[eColTestLog.GlobalMax.ToString()].ToString() : drTL[eColTestlist.SpecMax.ToString()].ToString(); string strMessage = drLog[eColTestLog.Message.ToString()].ToString(); string strMeasValStr = drLog[eColTestLog.MeasValStr.ToString()].ToString(); string strMeasVal = drLog[eColTestLog.MeasVal.ToString()].ToString(); string strMin = drDisp[eColDataTable.Min.ToString()].ToString(); string strMax = drDisp[eColDataTable.Max.ToString()].ToString(); bool bJustCallMacro = false; if (string.IsNullOrWhiteSpace(strMin) && string.IsNullOrWhiteSpace(strMax) && strMeasVal == "0.00000") bJustCallMacro = true; /* string strDispValue = string.IsNullOrWhiteSpace(strMessage) ? (string.IsNullOrWhiteSpace(strMeasValStr) ? strMeasVal : strMeasValStr) : strMessage; */ string strDispValue = string.IsNullOrWhiteSpace(strMessage) ? (string.IsNullOrWhiteSpace(strMeasValStr) ? (bJustCallMacro ? "" : strMeasVal) : strMeasValStr) : strMessage; drDisp[eColDataTable.MeasuredValue.ToString()] = strDispValue; drDisp[eColDataTable.Dimension.ToString()] = drTL[eColTestlist.Dim.ToString()].ToString(); drDisp[eColDataTable.Result.ToString()] = drLog[eColTestLog.Result.ToString()].ToString(); string strValue = drLog[(int)eColTestLog.SpentTime].ToString(); double dVal = string.IsNullOrWhiteSpace(strValue) ? double.NaN : Convert.ToDouble(strValue); drDisp[eColDataTable.Duration.ToString()] = dVal; dtFinal.Rows.Add(drDisp); } return dtFinal; } void ShowDetailData(DetailTestDataCollection data) { DataTable dtResult = CombineLogForm(); GridViewGetActiveFilterText = gridViewMain.ActiveFilterString; gridControlMain.BeginInit(); gridControlMain.DataSource = dtResult; gridControlMain.Update(); gridControlMain.RefreshDataSource(); gridControlMain.ForceInitialize(); gridViewMain.PopulateColumns(dtResult); gridControlMain.EndInit(); gridViewMain.ActiveFilterString = GridViewGetActiveFilterText; } void ShowTestlistData(DetailTestDataCollection data) { DataTable dtResult = DTTestlistSrc; GridViewGetActiveFilterText = gridViewMain.ActiveFilterString; gridControlMain.BeginInit(); gridControlMain.DataSource = dtResult; gridControlMain.Update(); gridControlMain.RefreshDataSource(); gridControlMain.ForceInitialize(); gridViewMain.PopulateColumns(dtResult); foreach (string strColName in Enum.GetNames(typeof(eColHideListTL))) { if (gridViewMain.Columns.ColumnByFieldName(strColName) != null) gridViewMain.Columns[strColName].Visible = false; } gridControlMain.EndInit(); gridViewMain.ActiveFilterString = GridViewGetActiveFilterText; } void ShowProperties(DetailTestDataCollection data) { vGridControlInfo.Rows.Clear(); foreach (PropertyInfo propInf in data.GetType().GetProperties()) { EditorRow dtRow = new EditorRow(); dtRow.Properties.Caption = propInf.Name; dtRow.Properties.Value = propInf.GetValue(data, null)?.ToString(); vGridControlInfo.Rows.Add(dtRow); } OnSizeChanged(vGridControlInfo); if (data.TestResult.ToUpper() == "OK") panelControlResult.Appearance.BackColor = Color.LightGreen; else panelControlResult.Appearance.BackColor = Color.IndianRed; } void OnSizeChanged(VGridControl grid) { int width = grid.ClientSize.Width / (grid.RecordCount + 1); grid.RecordWidth = width; grid.RowHeaderWidth = width; } private void UcTRADetailTestResult_Load(object sender, System.EventArgs e) { simpleButtonTypeConv.Text = TextShowTL; } private void simpleButtonTypeConv_Click(object sender, System.EventArgs e) { if(simpleButtonTypeConv.Text == TextShowLOG) { simpleButtonTypeConv.Text = TextShowTL; ShowDetailData(SearchSource); } else { simpleButtonTypeConv.Text = TextShowLOG; ShowTestlistData(SearchSource); } } } }