V4.1 with excel stats changes
This commit is contained in:
@@ -8,40 +8,36 @@ namespace AiQ_GUI
|
||||
{
|
||||
private const string exportPath = @"G:\Shared drives\MAV Production GUI's\AiQ\GUI's\AiQ_Test_Stats.xlsx";
|
||||
|
||||
private readonly string exportPath =
|
||||
@"C:\Users\BradleyBorn\OneDrive - MAV Systems Ltd\Desktop\AiQ_Test_Stats.xlsx";
|
||||
|
||||
public void ExportDatabaseToExcel()
|
||||
{
|
||||
try
|
||||
{
|
||||
MainForm.Instance.AddToActionsList("=== ExportDatabaseToExcel START ===");
|
||||
|
||||
using (OleDbConnection conn = new(Access.connString))
|
||||
using OleDbConnection conn = new(Access.connString);
|
||||
conn.Open();
|
||||
MainForm.Instance.AddToActionsList("Connected to Access database.");
|
||||
DateTime now = DateTime.Now;
|
||||
|
||||
// Read LastStatsRun from UniversalData (if any)
|
||||
DateTime? lastStatsRun = null;
|
||||
try
|
||||
{
|
||||
conn.Open();
|
||||
MainForm.Instance.AddToActionsList("Connected to Access database.");
|
||||
DateTime now = DateTime.Now;
|
||||
|
||||
// Read LastStatsRun from UniversalData (if any)
|
||||
DateTime? lastStatsRun = null;
|
||||
try
|
||||
using (var cmdPeriod = new OleDbCommand("SELECT LastStatsRun FROM UniversalData", conn))
|
||||
{
|
||||
using (var cmdPeriod = new OleDbCommand("SELECT LastStatsRun FROM UniversalData", conn))
|
||||
{
|
||||
object res = cmdPeriod.ExecuteScalar();
|
||||
if (res != null && res != DBNull.Value)
|
||||
lastStatsRun = (DateTime)res;
|
||||
}
|
||||
MainForm.Instance.AddToActionsList($"Fetched LastStatsRun: {(lastStatsRun.HasValue ? lastStatsRun.Value.ToString("yyyy-MM-dd HH:mm:ss") : "none")}");
|
||||
}
|
||||
catch (Exception periodEx)
|
||||
{
|
||||
MainForm.Instance.AddToActionsList($"Warning: could not read LastStatsRun. Details: {periodEx.Message}");
|
||||
object res = cmdPeriod.ExecuteScalar();
|
||||
if (res != null && res != DBNull.Value)
|
||||
lastStatsRun = (DateTime)res;
|
||||
}
|
||||
MainForm.Instance.AddToActionsList($"Fetched LastStatsRun: {(lastStatsRun.HasValue ? lastStatsRun.Value.ToString("yyyy-MM-dd HH:mm:ss") : "none")}");
|
||||
}
|
||||
catch (Exception periodEx)
|
||||
{
|
||||
MainForm.Instance.AddToActionsList($"Warning: could not read LastStatsRun. Details: {periodEx.Message}");
|
||||
}
|
||||
|
||||
// ==================== MAIN STATS EXPORT ====================
|
||||
string selectColumns = @"
|
||||
// ==================== MAIN STATS EXPORT ====================
|
||||
string selectColumns = @"
|
||||
ModelNumber,
|
||||
[Total Tests Run],
|
||||
[Pre Tests Passed],
|
||||
@@ -65,71 +61,71 @@ namespace AiQ_GUI
|
||||
[Visual Test Fail - Not All Rear Screws Fitted],
|
||||
[Visual Test Fail - Unit rattles]";
|
||||
|
||||
string query = $@"
|
||||
string query = $@"
|
||||
SELECT
|
||||
{selectColumns}
|
||||
FROM AiQ";
|
||||
|
||||
OleDbDataAdapter adapter = new(query, conn);
|
||||
DataTable dataTable = new();
|
||||
adapter.Fill(dataTable);
|
||||
OleDbDataAdapter adapter = new(query, conn);
|
||||
DataTable dataTable = new();
|
||||
adapter.Fill(dataTable);
|
||||
|
||||
if (dataTable.Rows.Count == 0)
|
||||
{
|
||||
MainForm.Instance.AddToActionsList("No data found in AiQ table.");
|
||||
return;
|
||||
}
|
||||
if (dataTable.Rows.Count == 0)
|
||||
{
|
||||
MainForm.Instance.AddToActionsList("No data found in AiQ table.");
|
||||
return;
|
||||
}
|
||||
|
||||
string monthName = now.ToString("MMMM");
|
||||
string sheetName = $"{monthName} Stats";
|
||||
string monthName = now.ToString("MMMM");
|
||||
string sheetName = $"{monthName} Stats";
|
||||
|
||||
MainForm.Instance.AddToActionsList($"Adding sheet: {sheetName}");
|
||||
MainForm.Instance.AddToActionsList($"Adding sheet: {sheetName}");
|
||||
|
||||
XLWorkbook workbook;
|
||||
if (File.Exists(exportPath))
|
||||
{
|
||||
workbook = new XLWorkbook(exportPath);
|
||||
MainForm.Instance.AddToActionsList("Opened existing workbook.");
|
||||
}
|
||||
else
|
||||
{
|
||||
workbook = new XLWorkbook();
|
||||
MainForm.Instance.AddToActionsList("Created new workbook (file not found).");
|
||||
}
|
||||
XLWorkbook workbook;
|
||||
if (File.Exists(exportPath))
|
||||
{
|
||||
workbook = new XLWorkbook(exportPath);
|
||||
MainForm.Instance.AddToActionsList("Opened existing workbook.");
|
||||
}
|
||||
else
|
||||
{
|
||||
workbook = new XLWorkbook();
|
||||
MainForm.Instance.AddToActionsList("Created new workbook (file not found).");
|
||||
}
|
||||
|
||||
if (workbook.Worksheets.Contains(sheetName))
|
||||
{
|
||||
workbook.Worksheet(sheetName).Delete();
|
||||
MainForm.Instance.AddToActionsList($"Deleted old sheet: {sheetName}");
|
||||
}
|
||||
if (workbook.Worksheets.Contains(sheetName))
|
||||
{
|
||||
workbook.Worksheet(sheetName).Delete();
|
||||
MainForm.Instance.AddToActionsList($"Deleted old sheet: {sheetName}");
|
||||
}
|
||||
|
||||
IXLWorksheet ws = workbook.Worksheets.Add(sheetName);
|
||||
ws.Cell(1, 1).InsertTable(dataTable, "AiQ_Stats", true);
|
||||
ws.Columns().AdjustToContents();
|
||||
IXLWorksheet ws = workbook.Worksheets.Add(sheetName);
|
||||
ws.Cell(1, 1).InsertTable(dataTable, "AiQ_Stats", true);
|
||||
ws.Columns().AdjustToContents();
|
||||
|
||||
// Write Data Period label and computed period string to the right of the table
|
||||
int infoCol = dataTable.Columns.Count + 2;
|
||||
ws.Cell(1, infoCol).Value = "Data Period";
|
||||
// Write Data Period label and computed period string to the right of the table
|
||||
int infoCol = dataTable.Columns.Count + 2;
|
||||
ws.Cell(1, infoCol).Value = "Data Period";
|
||||
|
||||
string periodText;
|
||||
if (lastStatsRun.HasValue)
|
||||
{
|
||||
periodText = $"{lastStatsRun.Value:yyyy-MM-dd HH:mm:ss} - {now:yyyy-MM-dd HH:mm:ss}";
|
||||
}
|
||||
else
|
||||
{
|
||||
periodText = $"Up to {now:yyyy-MM-dd HH:mm:ss}";
|
||||
}
|
||||
string periodText;
|
||||
if (lastStatsRun.HasValue)
|
||||
{
|
||||
periodText = $"{lastStatsRun.Value:yyyy-MM-dd HH:mm:ss} - {now:yyyy-MM-dd HH:mm:ss}";
|
||||
}
|
||||
else
|
||||
{
|
||||
periodText = $"Up to {now:yyyy-MM-dd HH:mm:ss}";
|
||||
}
|
||||
|
||||
ws.Cell(2, infoCol).Value = periodText;
|
||||
ws.Cell(2, infoCol).Value = periodText;
|
||||
|
||||
// ==================== DIAGS STATS EXPORT (CURRENT MONTH ONLY) ====================
|
||||
MainForm.Instance.AddToActionsList("Exporting DiagsStats for current month...");
|
||||
// ==================== DIAGS STATS EXPORT (CURRENT MONTH ONLY) ====================
|
||||
MainForm.Instance.AddToActionsList("Exporting DiagsStats for current month...");
|
||||
|
||||
DateTime monthStart = new(now.Year, now.Month, 1);
|
||||
DateTime nextMonth = monthStart.AddMonths(1);
|
||||
DateTime monthStart = new(now.Year, now.Month, 1);
|
||||
DateTime nextMonth = monthStart.AddMonths(1);
|
||||
|
||||
string diagsQuery = @"
|
||||
string diagsQuery = @"
|
||||
SELECT
|
||||
[Date],
|
||||
[Model],
|
||||
@@ -140,70 +136,70 @@ namespace AiQ_GUI
|
||||
FROM DiagsStats
|
||||
WHERE [Date] >= ? AND [Date] < ?";
|
||||
|
||||
using (var diagsCmd = new OleDbCommand(diagsQuery, conn))
|
||||
using (var diagsCmd = new OleDbCommand(diagsQuery, conn))
|
||||
{
|
||||
diagsCmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = monthStart });
|
||||
diagsCmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = nextMonth });
|
||||
|
||||
using (var diagsAdapter = new OleDbDataAdapter(diagsCmd))
|
||||
{
|
||||
diagsCmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = monthStart });
|
||||
diagsCmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = nextMonth });
|
||||
DataTable diagsTable = new();
|
||||
diagsAdapter.Fill(diagsTable);
|
||||
|
||||
using (var diagsAdapter = new OleDbDataAdapter(diagsCmd))
|
||||
if (diagsTable.Rows.Count > 0)
|
||||
{
|
||||
DataTable diagsTable = new();
|
||||
diagsAdapter.Fill(diagsTable);
|
||||
int startRow = (ws.LastRowUsed()?.RowNumber() ?? 0) + 3;
|
||||
|
||||
if (diagsTable.Rows.Count > 0)
|
||||
{
|
||||
int startRow = (ws.LastRowUsed()?.RowNumber() ?? 0) + 3;
|
||||
ws.Cell(startRow, 1).Value = "Diags Stats (Current Month)";
|
||||
ws.Cell(startRow, 1).Style.Font.Bold = true;
|
||||
ws.Cell(startRow, 1).Style.Font.FontSize = 12;
|
||||
|
||||
ws.Cell(startRow, 1).Value = "Diags Stats (Current Month)";
|
||||
ws.Cell(startRow, 1).Style.Font.Bold = true;
|
||||
ws.Cell(startRow, 1).Style.Font.FontSize = 12;
|
||||
ws.Cell(startRow + 1, 1).InsertTable(diagsTable, "Diags_Stats", true);
|
||||
ws.Columns().AdjustToContents();
|
||||
|
||||
ws.Cell(startRow + 1, 1).InsertTable(diagsTable, "Diags_Stats", true);
|
||||
ws.Columns().AdjustToContents();
|
||||
|
||||
MainForm.Instance.AddToActionsList($"Added DiagsStats ({diagsTable.Rows.Count} rows) starting at row {startRow}.");
|
||||
}
|
||||
MainForm.Instance.AddToActionsList($"Added DiagsStats ({diagsTable.Rows.Count} rows) starting at row {startRow}.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== SAVE MAIN SHEET ====================
|
||||
workbook.SaveAs(exportPath);
|
||||
MainForm.Instance.AddToActionsList($"Added {sheetName} to workbook: {exportPath}");
|
||||
// ==================== SAVE MAIN SHEET ====================
|
||||
workbook.SaveAs(exportPath);
|
||||
MainForm.Instance.AddToActionsList($"Added {sheetName} to workbook: {exportPath}");
|
||||
|
||||
workbook.Dispose();
|
||||
workbook.Dispose();
|
||||
|
||||
// ==================== BACKUP TABLE (ALWAYS, BEFORE RESET) ====================
|
||||
string ts = now.ToString("yyyyMMdd_HHmmss");
|
||||
string backupTableName = $"Ztats_{ts}";
|
||||
// ==================== BACKUP TABLE (ALWAYS, BEFORE RESET) ====================
|
||||
string ts = now.ToString("yyyyMMdd_HHmmss");
|
||||
string backupTableName = $"Ztats_{ts}";
|
||||
|
||||
if (backupTableName.Length > 64)
|
||||
backupTableName = backupTableName.Substring(0, 64);
|
||||
if (backupTableName.Length > 64)
|
||||
backupTableName = backupTableName.Substring(0, 64);
|
||||
|
||||
string backupSql = $@"
|
||||
string backupSql = $@"
|
||||
SELECT
|
||||
{selectColumns}
|
||||
INTO [{backupTableName}]
|
||||
FROM AiQ";
|
||||
try
|
||||
{
|
||||
using (OleDbCommand cmdBackup = new(backupSql, conn))
|
||||
{
|
||||
cmdBackup.ExecuteNonQuery();
|
||||
}
|
||||
MainForm.Instance.AddToActionsList($"Created backup table: [{backupTableName}]");
|
||||
}
|
||||
catch (Exception backupEx)
|
||||
{
|
||||
MainForm.Instance.AddToActionsList($"ERROR creating backup table [{backupTableName}]. Aborting reset to protect data. Details: {backupEx.Message}");
|
||||
MainForm.Instance.AddToActionsList("=== ExportDatabaseToExcel END (backup failed, no reset) ===");
|
||||
return;
|
||||
}
|
||||
|
||||
using (var tx = conn.BeginTransaction())
|
||||
{
|
||||
try
|
||||
{
|
||||
using (OleDbCommand cmdBackup = new(backupSql, conn))
|
||||
{
|
||||
cmdBackup.ExecuteNonQuery();
|
||||
}
|
||||
MainForm.Instance.AddToActionsList($"Created backup table: [{backupTableName}]");
|
||||
}
|
||||
catch (Exception backupEx)
|
||||
{
|
||||
MainForm.Instance.AddToActionsList($"ERROR creating backup table [{backupTableName}]. Aborting reset to protect data. Details: {backupEx.Message}");
|
||||
MainForm.Instance.AddToActionsList("=== ExportDatabaseToExcel END (backup failed, no reset) ===");
|
||||
return;
|
||||
}
|
||||
|
||||
using (var tx = conn.BeginTransaction())
|
||||
{
|
||||
try
|
||||
{
|
||||
string resetSql = @"
|
||||
string resetSql = @"
|
||||
UPDATE AiQ SET
|
||||
[Total Tests Run] = 0,
|
||||
[Pre Tests Passed] = 0,
|
||||
|
||||
Reference in New Issue
Block a user