From 12239bce233aeb2711092ce92abaf4461dafa468 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Sat, 21 Jan 2017 01:39:28 -0600 Subject: [PATCH] Fixed more bugs with the parsing engine, a crash bug in the update inventory method, and a crash bug in the trimming operations. Deleting a row now marks all rows under it as dirty. --- AdvertsingProfitControl/APCDatabase.accdb | Bin 2932736 -> 2932736 bytes .../AdvertisingProfitControlTableHelper.cs | 57 ++++++++- AdvertsingProfitControl/DatabaseWriter.cs | 3 +- AdvertsingProfitControl/NewAddRecord.cs | 11 ++ AdvertsingProfitControl/NewModifyRecord.cs | 116 ++++++++++++++++-- ...AdvertsingProfitControl.vshost.application | 2 +- ...dvertsingProfitControl.vshost.exe.manifest | 4 +- 7 files changed, 172 insertions(+), 21 deletions(-) diff --git a/AdvertsingProfitControl/APCDatabase.accdb b/AdvertsingProfitControl/APCDatabase.accdb index c7a14ac7e8b8d15df795a16066454749c594484a..3d53bc00c133f39f46eb6cea9cbfd633d9db577d 100644 GIT binary patch delta 270 zcmZo@*vtsR8<_YwbCq^7F)=bSGHw>+d(Svofsd_8V4DEr2|m`kx>GVu)6dE=N-`Pz znSM8)L%E$>p0S-o~xZ(p1Yk} zo~NB#p0}M_o^Lz1JpcCvJdxZ!VU9iw3=9m04ATV!SQDnl9pD$AZcrf2vi-mm4o>#= zNyquyCmk1PpLATXebRBE_DRQu+b10tX`gglw0+WXvGz&F#oH$xmuR1KT(W)AajEu6 z$EDjR9hYgJbX>N5(s8-=Nyp{eCmmO4pLATYebRBI_DRQ;+b11YX`gglwSCfYwf0HJ Z)!Qc>*Jz(~T(f=Bajor>j%(-r002eJVVD2_ delta 273 zcmZo@*vtsR8<_Yw1C(|$F)=bSGHw>+d(Svofsd_8V4DEr2|m`a0d5(5&dCqojd9HSDdG2;@ zd7gG|dERzzdA{x3^8DWy@MLoPggN>!FfcG^GE5f`U=5g_cYt4f;s$}~1_jbA+Ye0P z;AC%~bez9^(s6$7S0m9hYmLbX>lD(s70MNyio2CmmO6pLATgebRB2_DRQ8+b11Y cYoByny?xSgjrK{$HQOg0*V;bmxOUzT0QBr*mjD0& diff --git a/AdvertsingProfitControl/AdvertisingProfitControlTableHelper.cs b/AdvertsingProfitControl/AdvertisingProfitControlTableHelper.cs index 43fc6b4..c49b7a8 100644 --- a/AdvertsingProfitControl/AdvertisingProfitControlTableHelper.cs +++ b/AdvertsingProfitControl/AdvertisingProfitControlTableHelper.cs @@ -63,7 +63,7 @@ namespace AdvertsingProfitControl //The start by checking the previous row's status. rowStatus = parser.GetRowAttribute(dataGridView.Rows[i - 1]); //IF the previous row is a header row AND has color coding saying it is a group header, then clear the previous row's color and apply it to this row (i). - if (rowStatus == RowAttribute.HeaderRow && (bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value) + if (rowStatus == RowAttribute.HeaderRow && (bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue) { //Clear the previous row of its attributes. dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; @@ -72,6 +72,16 @@ namespace AdvertsingProfitControl dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = Color.White; + //Check the next row to see if its a member row before declaring the current row a header row. + rowStatus = parser.GetRowAttribute(dataGridView.Rows[i + 1]); + if (rowStatus != RowAttribute.MemberRow) + { + //Clear the coloring from the current row. + dataGridView.Rows[i].Cells[isHeaderColumn].Value = true; + dataGridView.Rows[i].Cells[isMemberColumn].Value = false; + dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White; + return; + } //Set the current row as a header row. dataGridView.Rows[i].Cells[isHeaderColumn].Value = true; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; @@ -122,15 +132,26 @@ namespace AdvertsingProfitControl dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i - 1].Cells[isMemberColumn].Value = false; dataGridView.Rows[i - 1].DefaultCellStyle.BackColor = Color.White; - //Clear the current row of its attributes. + //Check for changes in the current row. + if ((bool) dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) + { + dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; + dataGridView.Rows[i].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + } + //Clear the current row of its attributes. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White; - return; } //IF the previous row is a member row AND it also has color coding suggesting that it is a member of a group, then add the current row (i) as well. - if (rowStatus == RowAttribute.MemberRow && (bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].Value) + else if (rowStatus == RowAttribute.MemberRow && (bool)dataGridView.Rows[i - 1].Cells[isMemberColumn].EditedFormattedValue) { + //Check for changes in the current row. + if (!(bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) + { + dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; + dataGridView.Rows[i].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + } //Set the current row as a member row. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = true; @@ -139,14 +160,19 @@ namespace AdvertsingProfitControl //IF the previous row is simply a member row with no coloring at all, then remove the coloring from the current row (i). else if (rowStatus == RowAttribute.MemberRow || rowStatus == RowAttribute.AdSpecialRow) { + //Check for changes in the current row. + if ((bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) + { + dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; + dataGridView.Rows[i].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + } //Clear the current row of its attributes. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = false; dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.White; - return; } //IF the previous row is a header row, then color it as a group header and color the current row as a member of said group. - else if (rowStatus == RowAttribute.HeaderRow && !(bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value) + else if (rowStatus == RowAttribute.HeaderRow && !(bool)dataGridView.Rows[i - 1].Cells[isHeaderColumn].EditedFormattedValue) { //Set the previous row as a header row. dataGridView.Rows[i - 1].Cells[isHeaderColumn].Value = true; @@ -155,6 +181,25 @@ namespace AdvertsingProfitControl //This condition means the user created a group so the newly made header row will need to be updated in the database as well. dataGridView.Rows[i - 1].Cells[isDirtyColumn].Value = true; dataGridView.Rows[i - 1].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + //Check for changes in the current row. + if ((bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) + { + dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; + dataGridView.Rows[i].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + } + //Set the current row as a member row. + dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; + dataGridView.Rows[i].Cells[isMemberColumn].Value = true; + dataGridView.Rows[i].DefaultCellStyle.BackColor = Color.LightBlue; + } + else if (rowStatus == RowAttribute.HeaderRow) + { + //Check for changes in the current row. + if (!(bool)dataGridView.Rows[i].Cells[isMemberColumn].EditedFormattedValue) + { + dataGridView.Rows[i].Cells[isDirtyColumn].Value = true; + dataGridView.Rows[i].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + } //Set the current row as a member row. dataGridView.Rows[i].Cells[isHeaderColumn].Value = false; dataGridView.Rows[i].Cells[isMemberColumn].Value = true; diff --git a/AdvertsingProfitControl/DatabaseWriter.cs b/AdvertsingProfitControl/DatabaseWriter.cs index c39dabd..bc5d8fe 100644 --- a/AdvertsingProfitControl/DatabaseWriter.cs +++ b/AdvertsingProfitControl/DatabaseWriter.cs @@ -360,7 +360,7 @@ namespace AdvertsingProfitControl oleDbTransaction.Commit(); foreach (DataRow row in table.Rows) { - var rowId = RetrieveRowId(table.TableName, int.Parse(row[4].ToString()), int.Parse(row[8].ToString()), int.Parse(row[7].ToString())); + var rowId = int.Parse(row[0].ToString()); if (int.Parse(row[7].ToString()) != 0) { //Account for the ad special row. @@ -408,7 +408,6 @@ namespace AdvertsingProfitControl return status; } - public DbTableWriterStatus ProccessInvoiceTable(DataGridView table, int dateId, string connectionString) { var status = new DbTableWriterStatus(); diff --git a/AdvertsingProfitControl/NewAddRecord.cs b/AdvertsingProfitControl/NewAddRecord.cs index ed05896..45f389c 100644 --- a/AdvertsingProfitControl/NewAddRecord.cs +++ b/AdvertsingProfitControl/NewAddRecord.cs @@ -683,12 +683,23 @@ namespace AdvertsingProfitControl //Reset the gAdSpecialIndex to -1. _adSpecialIndex = -1; e.Cancel = true; //Prevent the new row from being removed. + return; } else { e.Cancel = true; } } + //Mark all rows under the row that just got deleted as dirty. + for (var index = currentRowIndex; currentRowIndex < dataGridView.Rows.Count; index++) + { + projectionsDataGridView.Rows[index].Cells[(int)SalesTableColumns.IsDirty].Value = true; + projectionsDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + inventoryDataGridView.Rows[index].Cells[(int)InventoryTableColumns.IsDirty].Value = true; + inventoryDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + actualSalesDataGridView.Rows[index].Cells[(int)SalesTableColumns.IsDirty].Value = true; + actualSalesDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + } } private void ChangeAutoCompleteListOnKeyCombo(object sender, KeyEventArgs e) diff --git a/AdvertsingProfitControl/NewModifyRecord.cs b/AdvertsingProfitControl/NewModifyRecord.cs index 50d0c2d..6a02fd8 100644 --- a/AdvertsingProfitControl/NewModifyRecord.cs +++ b/AdvertsingProfitControl/NewModifyRecord.cs @@ -719,12 +719,25 @@ namespace AdvertsingProfitControl //Reset the gAdSpecialIndex to -1. _adSpecialIndex = -1; e.Cancel = true; //Prevent the new row from being removed. + return; } else { e.Cancel = true; } } + //Mark all rows under the row that just got deleted as dirty. + for (var index = currentRowIndex; index < dataGridView.Rows.Count; index++) + { + if (index == _adSpecialIndex + 1) continue; + if (projectionsDataGridView.Rows[index].IsNewRow) continue; + projectionsDataGridView.Rows[index].Cells[(int) SalesTableColumns.IsDirty].Value = true; + projectionsDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + inventoryDataGridView.Rows[index].Cells[(int) InventoryTableColumns.IsDirty].Value = true; + inventoryDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + actualSalesDataGridView.Rows[index].Cells[(int) SalesTableColumns.IsDirty].Value = true; + actualSalesDataGridView.Rows[index].HeaderCell.Style.BackColor = ApplicationColors.PendingEdit; + } } private void ChangeAutoCompleteListOnKeyCombo(object sender, KeyEventArgs e) @@ -2583,8 +2596,8 @@ namespace AdvertsingProfitControl //Check the attribute cell. if (cellIndex == 6) { - var isHeaderCell = new DataGridViewCheckBoxCell(false); - var isMemberCell = new DataGridViewCheckBoxCell(false); + var isHeaderCell = new DataGridViewCheckBoxCell(); + var isMemberCell = new DataGridViewCheckBoxCell(); var rowAttribute = int.Parse(inventoryTable.Rows[rowIndex].ItemArray[cellIndex].ToString()); switch (rowAttribute) { @@ -2598,6 +2611,10 @@ namespace AdvertsingProfitControl isMemberCell.Value = true; newRow.DefaultCellStyle.BackColor = ApplicationColors.MemberRow; break; + default: + isHeaderCell.Value = false; + isMemberCell.Value = false; + break; } newRow.Cells.Add(isHeaderCell); newRow.Cells.Add(isMemberCell); @@ -2683,8 +2700,8 @@ namespace AdvertsingProfitControl //Check the attribute cell. if (cellIndex == 8) { - var isHeaderCell = new DataGridViewCheckBoxCell(false); - var isMemberCell = new DataGridViewCheckBoxCell(false); + var isHeaderCell = new DataGridViewCheckBoxCell(); + var isMemberCell = new DataGridViewCheckBoxCell(); var rowAttribute = int.Parse(actualSales.Rows[rowIndex].ItemArray[cellIndex].ToString()); switch (rowAttribute) { @@ -2698,6 +2715,10 @@ namespace AdvertsingProfitControl isMemberCell.Value = true; newRow.DefaultCellStyle.BackColor = ApplicationColors.MemberRow; break; + default: + isHeaderCell.Value = false; + isMemberCell.Value = false; + break; } newRow.Cells.Add(isHeaderCell); newRow.Cells.Add(isMemberCell); @@ -3103,6 +3124,7 @@ namespace AdvertsingProfitControl MessageBox.Show(@"Failed to get the date ID number.", @"Invalid ID Number", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } + if (displayInformation) informationLabel.Text = ""; //Create the database interaction objects. var dbT = new DatabaseTracker(); var dbW = new DatabaseWriter(dbT.DatabaseConnectionString); @@ -3151,6 +3173,80 @@ namespace AdvertsingProfitControl { errorLabel.Text += @"Failed to process projections." + Environment.NewLine; } + DataTable inventoryNewTable; + DataTable inventoryUpdateTable; + var inventoryTrimmingStatus = ConstructCleanedInventoryTable(dateId, out inventoryNewTable, out inventoryUpdateTable); + if (inventoryTrimmingStatus != TrimmingOperationResult.NoChangesRequired && inventoryTrimmingStatus != TrimmingOperationResult.FailedToTrim) + { + if (inventoryNewTable.Rows.Count > 0) + { + var writerResult = dbW.InsertIntoInventoryTable(inventoryNewTable, dbT.DatabaseConnectionString); + if (writerResult.GetWritingOperationStatus() != WritingOperationStatus.Failed) + { + //Spin through the collection and update the affected rows. + foreach (var rowIndex in writerResult.GetRowCollection()) + { + //Only reset the IsDirty value to false since the updates when through. + inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.Id].Value = rowIndex.Value; + inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false; + inventoryDataGridView.Rows[rowIndex.Key - 1].HeaderCell.Style.BackColor = ApplicationColors.EditingSaved; + } + } + } + //Next check to see if the update table has anything. + if (inventoryUpdateTable.Rows.Count > 0) + { + var writerResult = dbW.UpdateInventoryTable(inventoryUpdateTable, dbT.DatabaseConnectionString); + if (writerResult.GetWritingOperationStatus() != WritingOperationStatus.Failed) + { + //Spin through the collection and update the affected rows. + foreach (var rowIndex in writerResult.GetRowCollection()) + { + //Only reset the IsDirty value to false since the updates when through. + inventoryDataGridView.Rows[rowIndex.Key - 1].Cells[(int)InventoryTableColumns.IsDirty].Value = false; + inventoryDataGridView.Rows[rowIndex.Key - 1].HeaderCell.Style.BackColor = ApplicationColors.EditingSaved; + } + } + } + if (displayInformation) informationLabel.Text += @"Successfully saved inventory." + Environment.NewLine; + } + DataTable actualSalesNewTable; + DataTable actualSalesUpdateTable; + var actualSalesTrimmingStatus = ConstructCleanedSalesTable("ActualSales", dateId, out actualSalesNewTable, out actualSalesUpdateTable); + if (actualSalesTrimmingStatus != TrimmingOperationResult.NoChangesRequired && actualSalesTrimmingStatus != TrimmingOperationResult.FailedToTrim) + { + //Check to see if the insert table has any items. + if (actualSalesNewTable.Rows.Count > 0) + { + var writerResult = dbW.InsertIntoSalesTable(actualSalesNewTable, dbT.DatabaseConnectionString); + if (writerResult.GetWritingOperationStatus() != WritingOperationStatus.Failed) + { + //Spin through the collection and update the affected rows. + foreach (var rowIndex in writerResult.GetRowCollection()) + { + actualSalesDataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.Id].Value = rowIndex.Value; + actualSalesDataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false; + actualSalesDataGridView.Rows[rowIndex.Key - 1].HeaderCell.Style.BackColor = ApplicationColors.EditingSaved; + } + } + } + //Next check to see if the update table has anything. + if (actualSalesUpdateTable.Rows.Count > 0) + { + var writerResult = dbW.UpdateSalesTable(actualSalesUpdateTable, dbT.DatabaseConnectionString); + if (writerResult.GetWritingOperationStatus() != WritingOperationStatus.Failed) + { + //Spin through the collection and update the affected rows. + foreach (var rowIndex in writerResult.GetRowCollection()) + { + //Only reset the IsDirty value to false since the updates when through. + actualSalesDataGridView.Rows[rowIndex.Key - 1].Cells[(int)SalesTableColumns.IsDirty].Value = false; + actualSalesDataGridView.Rows[rowIndex.Key - 1].HeaderCell.Style.BackColor = ApplicationColors.EditingSaved; + } + } + } + if (displayInformation) informationLabel.Text += @"Successfully saved actual sales." + Environment.NewLine; + } return success; } @@ -3242,7 +3338,7 @@ namespace AdvertsingProfitControl continue; } //Check to see if the row is dirty. - if (!(bool)row.Cells[(int)SalesTableColumns.IsDirty].Value) + if (!(bool)row.Cells[(int)SalesTableColumns.IsDirty].EditedFormattedValue) { //If it is not then continue on to the next row. continue; @@ -3268,11 +3364,11 @@ namespace AdvertsingProfitControl } //Determine the row's attribute. var rowAttribute = 0; //Zero (0) means no grouping, its not a header nor a member. - if ((bool)row.Cells[(int)SalesTableColumns.IsHeaderRow].Value && !(bool)row.Cells[(int)SalesTableColumns.IsMemberRow].Value) + if ((bool)row.Cells[(int)SalesTableColumns.IsHeaderRow].EditedFormattedValue && !(bool)row.Cells[(int)SalesTableColumns.IsMemberRow].EditedFormattedValue) { rowAttribute = 1; } - else if ((bool)row.Cells[(int)SalesTableColumns.IsMemberRow].Value && !(bool)row.Cells[(int)SalesTableColumns.IsHeaderRow].Value) + else if ((bool)row.Cells[(int)SalesTableColumns.IsMemberRow].EditedFormattedValue && !(bool)row.Cells[(int)SalesTableColumns.IsHeaderRow].EditedFormattedValue) { rowAttribute = 2; } @@ -3399,7 +3495,7 @@ namespace AdvertsingProfitControl continue; } //Check to see if the row is dirty. - if (!(bool)row.Cells[(int)InventoryTableColumns.IsDirty].Value) + if (!(bool)row.Cells[(int)InventoryTableColumns.IsDirty].EditedFormattedValue) { //If it is not then continue on to the next row. continue; @@ -3424,11 +3520,11 @@ namespace AdvertsingProfitControl } //Determine the row's attribute. var rowAttribute = 0; //Zero (0) means no grouping, its not a header nor a member. - if ((bool)row.Cells[(int)InventoryTableColumns.IsHeaderRow].Value && !(bool)row.Cells[(int)InventoryTableColumns.IsMemberRow].Value) + if ((bool)row.Cells[(int)InventoryTableColumns.IsHeaderRow].EditedFormattedValue && !(bool)row.Cells[(int)InventoryTableColumns.IsMemberRow].EditedFormattedValue) { rowAttribute = 1; } - else if ((bool)row.Cells[(int)InventoryTableColumns.IsMemberRow].Value && !(bool)row.Cells[(int)InventoryTableColumns.IsHeaderRow].Value) + else if ((bool)row.Cells[(int)InventoryTableColumns.IsMemberRow].EditedFormattedValue && !(bool)row.Cells[(int)InventoryTableColumns.IsHeaderRow].EditedFormattedValue) { rowAttribute = 2; } diff --git a/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.application b/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.application index 57deb74..78e560f 100644 --- a/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.application +++ b/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.application @@ -14,7 +14,7 @@ - b7XWNTKdLoveai+Ezig6qhdfRQNnqDFOegZLHdvzxx0= + opU00zIbvKlwE9ETDbcBw3wn43DC9oTiG2Ds1yBbqBA= diff --git a/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.exe.manifest b/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.exe.manifest index 4690085..c203a09 100644 --- a/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.exe.manifest +++ b/AdvertsingProfitControl/bin/Debug/AdvertsingProfitControl.vshost.exe.manifest @@ -43,14 +43,14 @@ - + - JdsSdLXGV6xF3G52D7+6tloy6VbDDJnLshBRhBOm3iQ= + T8dp3gOWrMgWFpeIbwYfpgMQxCEBFP64iXUiGpV4wto=