First implementation of ad item repeat detection for all APC tables. Still need to update comments in inventory and actual sales methods. No testing done as of now.

This commit is contained in:
2016-11-06 22:51:36 -06:00
parent 6e45121c1f
commit f60cc5ab8b
+301 -168
View File
@@ -1673,7 +1673,7 @@ namespace AdvertsingProfitControl
#region APC Table Trimming
private TrimmingOperationResult ConstructCleanedProjectionsTable(int dateId, out DataTable trimmedNewProjectionsTable, out DataTable trimmedUpdateProjectionsTable)
private TrimmingOperationResult ConstructCleanedProjectionsTable(int dateId, out DataTable insertNewTable, out DataTable updateExistingTable)
{
//Create two DataTables one for the new items to be added to the database
//and one for items that have to be updated.
@@ -1681,12 +1681,12 @@ namespace AdvertsingProfitControl
//0:Sold 1:SalePrice 2:TotalSales 3:cost 4:ProfitReturn 5:TotalProfitReturn
//6:FK_AdItemID 7:RowAttribute 8:FK_AdSpecialGroupName (ID) 9:RowPosition (not index based)
//10:FK_DateID
trimmedNewProjectionsTable = new DataTable("Projections");
insertNewTable = new DataTable("Projections");
//Update Sales Table Layout (Based on the Database's Physical Layout)
//0:ID 1:Sold 2:SalePrice 3:TotalSales 4:cost 5:ProfitReturn 6:TotalProfitReturn
//7:FK_AdItemID 8:RowAttribute 9:FK_AdSpecialGroupName (ID) 10:RowPosition (not index based)
//11:FK_DateID
trimmedUpdateProjectionsTable = new DataTable("Projections");
updateExistingTable = new DataTable("Projections");
//Construct a list of column names for the projections/actual sales DataGridViews and the inventory DataGirdView.
string[] saleColumnNames =
{
@@ -1697,12 +1697,12 @@ namespace AdvertsingProfitControl
{
if (columnName == "ID") continue;
var column = new DataColumn(columnName);
trimmedNewProjectionsTable.Columns.Add(column);
insertNewTable.Columns.Add(column);
}
foreach (var columnName in saleColumnNames)
{
var column = new DataColumn(columnName);
trimmedUpdateProjectionsTable.Columns.Add(column);
updateExistingTable.Columns.Add(column);
}
//Create the database interaction objects.
var databaseTracker = new DatabaseTracker();
@@ -1747,8 +1747,8 @@ namespace AdvertsingProfitControl
{
//TODO: Throw an exception, this can not be allowed.
//AdItemInsertionFailedException
trimmedNewProjectionsTable.Rows.Clear(); //Work around for now
trimmedUpdateProjectionsTable.Rows.Clear();
insertNewTable.Rows.Clear(); //Work around for now
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
}
@@ -1769,41 +1769,71 @@ namespace AdvertsingProfitControl
{
//... or the add new items table.
//If the ad item is being used in section one then locate it and update it in the trimmed table.
var foundRow = trimmedNewProjectionsTable.Select("AdItemID = '" + adItemId + "'");
var foundRow = insertNewTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
"Ad item '" + row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue +
"Ad item '" + row.Cells[(int) SalesTableColumns.AdItem].EditedFormattedValue +
"' found in the trimmed new table.");
}
//Else error condition?
else
{
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < insertNewTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != insertNewTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
insertNewTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
else
{
//... the update existing items table
//If the ad item is being used in section two then locate it and update it in the trimmed table.
var foundRow = trimmedUpdateProjectionsTable.Select("AdItemID = '" + adItemId + "'");
var foundRow = updateExistingTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
"Ad item '" + row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue +
"Ad item '" + row.Cells[(int) SalesTableColumns.AdItem].EditedFormattedValue +
"' found in the trimmed update table.");
}
//Else error condition?
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
}
}
else
{
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < updateExistingTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != updateExistingTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
updateExistingTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
}
//If the row is not dirty then it would not be included in any trimmed table just yet.
if ((bool)projectionsDataGridView.Rows[repeatedItemIndex].Cells[(int) SalesTableColumns.IsInDatabase].Value)
{
//If its in the database already then add the row to the update table, including the ad special ID number.
//If the ad item is being used in section two then locate it and update it in the trimmed table.
var foundRow = trimmedUpdateProjectionsTable.Select("AdItemID = '" + adItemId + "'");
var foundRow = updateExistingTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
@@ -1811,53 +1841,32 @@ namespace AdvertsingProfitControl
"' found in the trimmed update table.");
}
//Else error condition?
else
{
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < updateExistingTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != updateExistingTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
updateExistingTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
//else
//{
// //Otherwise add it to the add new item trimmed table (should never happen).
//}
}
LogConsole.WriteToLog(FrmLogConsole.Level.Info, "Repeated ad item '" + row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue + "' found.");
LogConsole.WriteToLog(FrmLogConsole.Level.Info, "Its row index is " + repeatedItemIndex + ".");
}
//if (_usedAdItems[0].Contains(row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue.ToString()))
//{
// //If the ad item is being used in section one then locate it and update it in the trimmed table.
// var foundRow = trimmedTables[tableIndex].Select("AdItemID = '" + adItemId + "'");
// if (foundRow.Length == 1)
// {
// LogConsole.WriteToLog(FrmLogConsole.Level.Info,
// "Ad item '" + row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue +
// "' found in the trimmed table.");
// }
// else
// {
// //TODO: Throw an exception, this can not be allowed.
// //InvalidTrimmedRowCountException
// trimmedTables[0].Rows.Clear(); //Work around for now
// trimmedTables[1].Rows.Clear();
// return TrimmingOperationResult.FailedToTrim;
// }
// //Begin spinning through all the rows to find the one selected above.
// for (var i = 0; i < trimmedTables[tableIndex].Rows.Count; i++)
// {
// //Check to see if the selected row is equal.
// if (foundRow[0] != trimmedTables[tableIndex].Rows[i]) continue;
// //If so then update that row index with the group ID number.
// if (tableIndex == 0)
// {
// trimmedTables[0].Rows[i][8] = adSpecialId;
// }
// else
// {
// trimmedTables[1].Rows[i][9] = adSpecialId;
// }
// }
// //Once ad special ID has been updated jump to the next row.
// continue;
//}
}
//Determine the row's attribute.
var rowAttribute = 0; //Zero (0) means no grouping, its not a header nor a member.
@@ -1869,11 +1878,6 @@ namespace AdvertsingProfitControl
{
rowAttribute = 2;
}
//Since we've made it this far, add the ad item into the dictionary if we're not in the ad special group.
if (_adSpecialIndex != -1 && row.Index > _adSpecialIndex)
{
//usedAdItems.Add(row.Index, "s");
}
//Add the values to their respective data table.
if (rowIdNumber == 0)
{
@@ -1898,7 +1902,7 @@ namespace AdvertsingProfitControl
newRow[9] = row.Index + 1;
}
newRow[10] = dateId;
trimmedNewProjectionsTable.Rows.Add(newRow);
insertNewTable.Rows.Add(newRow);
}
else
{
@@ -1924,7 +1928,7 @@ namespace AdvertsingProfitControl
newRow[10] = row.Index + 1;
}
newRow[11] = dateId;
trimmedUpdateProjectionsTable.Rows.Add(newRow);
updateExistingTable.Rows.Add(newRow);
}
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Row Dump for row number " + (row.Index + 1) + ".");
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "ID : " + rowIdNumber + " Sold: " + row.Cells[(int)SalesTableColumns.Sold].EditedFormattedValue);
@@ -1938,42 +1942,42 @@ namespace AdvertsingProfitControl
return TrimmingOperationResult.CreatedNewInsertionAndUpdateTables;
}
private IEnumerable<DataTable> ConstructCleanedInventoryTable(int dateId)
private TrimmingOperationResult ConstructCleanedInventoryTable(int dateId, out DataTable insertNewTable, out DataTable updateExistingTable)
{
//Create two DataTables one for the new items to be added to the database
//and one for items that have to be updated.
//New Sales Table Layout (Based on the Database's Physical Layout)
//0:BeginingInventory 1:Received 2:TotalInventory 3:EndingInventory 4:AdItemID 5:RowAttribute
//6:FK_AdSpecialGroupName (ID) 7:RowPosition (not index based) 8:DateID
var trimmedNewInventoryTable = new DataTable("Inventory");
//0:Sold 1:SalePrice 2:TotalSales 3:cost 4:ProfitReturn 5:TotalProfitReturn
//6:FK_AdItemID 7:RowAttribute 8:FK_AdSpecialGroupName (ID) 9:RowPosition (not index based)
//10:FK_DateID
insertNewTable = new DataTable("Projections");
//Update Sales Table Layout (Based on the Database's Physical Layout)
//0:ID 1:BeginingInventory 2:Received 3:TotalInventory 4:EndingInventory 5:AdItemID 6:RowAttribute
//7:FK_AdSpecialGroupName (ID) 8:RowPosition (not index based) 9:DateID
var trimmedUpdateInventoryTable = new DataTable("Inventory");
DataTable[] trimmedTables = { trimmedNewInventoryTable, trimmedUpdateInventoryTable };
//0:ID 1:Sold 2:SalePrice 3:TotalSales 4:cost 5:ProfitReturn 6:TotalProfitReturn
//7:FK_AdItemID 8:RowAttribute 9:FK_AdSpecialGroupName (ID) 10:RowPosition (not index based)
//11:FK_DateID
updateExistingTable = new DataTable("Projections");
//Construct a list of column names for the projections/actual sales DataGridViews and the inventory DataGirdView.
string[] saleColumnNames =
{
"ID", "BeginingInventory", "Received", "TotalInventory", "EndingInventory", "AdItemID", "RowAttribute", "AdSpecialID", "RowPosition", "DateID"
"ID", "Sold", "SalePrice", "TotalSales", "Cost", "ProfitReturn",
"TotalProfitReturn", "AdItemID", "RowAttribute", "AdSpecialID", "RowPosition", "DateID"
};
foreach (var columnName in saleColumnNames)
{
if (columnName == "ID") continue;
var column = new DataColumn(columnName);
trimmedTables[0].Columns.Add(column);
insertNewTable.Columns.Add(column);
}
foreach (var columnName in saleColumnNames)
{
var column = new DataColumn(columnName);
trimmedTables[1].Columns.Add(column);
updateExistingTable.Columns.Add(column);
}
//Create the database interaction objects.
var databaseTracker = new DatabaseTracker();
var databaseReader = new DatabaseReader();
var databaseWriter = new DatabaseWriter(databaseTracker.DatabaseConnectionString);
var adSpecialId = 0; //Entries in the database are not allowed to be zero (unique ID wise that is).
//Dictionary<AdItemID, TableID> The table ID is zero (0) for the new table and one (1) for the update table.
var usedAdItems = new Dictionary<int, int>(); //Contains ad items that are used in section one, used for checking for repeats.
//Grab the ad special ID, assuming there is one.
if (_adSpecialIndex != -1)
{
@@ -1993,10 +1997,10 @@ namespace AdvertsingProfitControl
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Ad Special Row found at index " + row.Index + ".");
continue;
}
//Check to see if the row is not dirty.
//Check to see if the row is dirty.
if (!(bool)row.Cells[(int)InventoryTableColumns.IsDirty].Value)
{
//If so simply continue.
//If it is not then continue on to the next row.
continue;
}
//Try grabbing the row's ID number (the number that it is in the database).
@@ -2010,52 +2014,129 @@ namespace AdvertsingProfitControl
adItemId = databaseWriter.InsertNewAdItem(row.Cells[(int)InventoryTableColumns.AdItem].EditedFormattedValue.ToString());
if (adItemId == 0)
{
errorLabel.Text = @"Failed to insert new ad item.";
//TODO: Throw an exception, this can not be allowed.
//AdItemInsertionFailedException
trimmedTables[0].Rows.Clear(); //Work around for now
trimmedTables[1].Rows.Clear();
break;
insertNewTable.Rows.Clear(); //Work around for now
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
}
int tableIndex;
//Check for repeated ad items in the ad special section
if (usedAdItems.TryGetValue(adItemId, out tableIndex))
if (_adSpecialIndex != -1 && row.Index > _adSpecialIndex)
{
//Attempt to grab the index of an ad item, if it is not found then the return value is -1.
var repeatedItemIndex =
_usedAdItems[0].FindIndex(x => x == row.Cells[(int)InventoryTableColumns.AdItem].EditedFormattedValue.ToString());
//Check if a repeat was found.
if (repeatedItemIndex != -1)
{
//A row index has been found so check to see if the row in question has already been added to any of the trimmed tables.
if ((bool)inventoryDataGridView.Rows[repeatedItemIndex].Cells[(int)InventoryTableColumns.IsDirty].Value)
{
//If the row is dirty then its going to be found in either...
if (!(bool)inventoryDataGridView.Rows[repeatedItemIndex].Cells[(int)InventoryTableColumns.IsInDatabase].Value)
{
//... or the add new items table.
//If the ad item is being used in section one then locate it and update it in the trimmed table.
var foundRow = trimmedTables[tableIndex].Select("AdItemID = '" + adItemId + "'");
var foundRow = insertNewTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
"Ad item '" + row.Cells[(int)InventoryTableColumns.AdItem].EditedFormattedValue +
"' found in the trimmed table.");
"' found in the trimmed new table.");
}
//Else error condition?
else
{
//TODO: Throw an exception, this can not be allowed.
//InvalidTrimmedRowCountException
trimmedTables[0].Rows.Clear(); //Work around for now
trimmedTables[1].Rows.Clear();
break;
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < trimmedTables[tableIndex].Rows.Count; i++)
for (var i = 0; i < insertNewTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != trimmedTables[tableIndex].Rows[i]) continue;
if (foundRow[0] != insertNewTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
if (tableIndex == 0)
{
trimmedTables[0].Rows[i][8] = adSpecialId;
}
else
{
trimmedTables[1].Rows[i][9] = adSpecialId;
}
insertNewTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
else
{
//... the update existing items table
//If the ad item is being used in section two then locate it and update it in the trimmed table.
var foundRow = updateExistingTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
"Ad item '" + row.Cells[(int)InventoryTableColumns.AdItem].EditedFormattedValue +
"' found in the trimmed update table.");
}
//Else error condition?
else
{
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < updateExistingTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != updateExistingTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
updateExistingTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
}
//If the row is not dirty then it would not be included in any trimmed table just yet.
if ((bool)inventoryDataGridView.Rows[repeatedItemIndex].Cells[(int)InventoryTableColumns.IsInDatabase].Value)
{
//If its in the database already then add the row to the update table, including the ad special ID number.
//If the ad item is being used in section two then locate it and update it in the trimmed table.
var foundRow = updateExistingTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
"Ad item '" + row.Cells[(int)InventoryTableColumns.AdItem].EditedFormattedValue +
"' found in the trimmed update table.");
}
//Else error condition?
else
{
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < updateExistingTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != updateExistingTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
updateExistingTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
//else
//{
// //Otherwise add it to the add new item trimmed table (should never happen).
//}
LogConsole.WriteToLog(FrmLogConsole.Level.Info, "Repeated ad item '" + row.Cells[(int)InventoryTableColumns.AdItem].EditedFormattedValue + "' found.");
LogConsole.WriteToLog(FrmLogConsole.Level.Info, "Its row index is " + repeatedItemIndex + ".");
}
}
//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)
@@ -2066,20 +2147,15 @@ namespace AdvertsingProfitControl
{
rowAttribute = 2;
}
//Since we've made it this far, add the ad item into the dictionary if we're not in the ad special group.
if (_adSpecialIndex != -1 && row.Index < _adSpecialIndex)
{
usedAdItems.Add(row.Index, adItemId);
}
//Add the values to their respective data table.
if (rowIdNumber == 0)
{
//This table is full of data not in the database so the ID column isn't needed.
var newRow = new object[11];
newRow[0] = row.Cells[(int)InventoryTableColumns.BeginningInventory].EditedFormattedValue.ToString();//Sold, is string
var newRow = new object[9];
newRow[0] = row.Cells[(int)InventoryTableColumns.BeginningInventory].EditedFormattedValue.ToString();//Beginning inventory, is string
newRow[1] = row.Cells[(int)InventoryTableColumns.Recieved].EditedFormattedValue.ToString();//Received, is string
newRow[2] = row.Cells[(int)InventoryTableColumns.Total].EditedFormattedValue.ToString();//Total, is string
newRow[3] = row.Cells[(int)InventoryTableColumns.EndingInventory].EditedFormattedValue.ToString();//EndingInventory, is string
newRow[2] = row.Cells[(int)InventoryTableColumns.Total].EditedFormattedValue.ToString();//Total inventory. is string
newRow[3] = row.Cells[(int)InventoryTableColumns.EndingInventory].EditedFormattedValue.ToString(); //Ending inventory, is string
newRow[4] = adItemId;
newRow[5] = rowAttribute;
if (_adSpecialIndex != -1 && row.Index > _adSpecialIndex)
@@ -2093,18 +2169,17 @@ namespace AdvertsingProfitControl
newRow[7] = row.Index + 1;
}
newRow[8] = dateId;
trimmedTables[0].Rows.Add(newRow);
usedAdItems.Add(adItemId, 0);
insertNewTable.Rows.Add(newRow);
}
else
{
//This table is full of data that is already in the database.
var newRow = new object[12];
var newRow = new object[10];
newRow[0] = rowIdNumber;
newRow[1] = row.Cells[(int)InventoryTableColumns.BeginningInventory].EditedFormattedValue.ToString();//Sold, is string
newRow[1] = row.Cells[(int)InventoryTableColumns.BeginningInventory].EditedFormattedValue.ToString();//Beginning inventory, is string
newRow[2] = row.Cells[(int)InventoryTableColumns.Recieved].EditedFormattedValue.ToString();//Received, is string
newRow[3] = row.Cells[(int)InventoryTableColumns.Total].EditedFormattedValue.ToString();//Total, is string
newRow[4] = row.Cells[(int)InventoryTableColumns.EndingInventory].EditedFormattedValue.ToString();//EndingInventory, is string
newRow[3] = row.Cells[(int)InventoryTableColumns.Total].EditedFormattedValue.ToString();//Total inventory. is string
newRow[4] = row.Cells[(int)InventoryTableColumns.EndingInventory].EditedFormattedValue.ToString(); //Ending inventory, is string
newRow[5] = adItemId;
newRow[6] = rowAttribute;
if (_adSpecialIndex != -1 && row.Index > _adSpecialIndex)
@@ -2118,15 +2193,14 @@ namespace AdvertsingProfitControl
newRow[8] = row.Index + 1;
}
newRow[9] = dateId;
trimmedTables[1].Rows.Add(newRow);
usedAdItems.Add(adItemId, 1);
updateExistingTable.Rows.Add(newRow);
}
}
return trimmedTables;
return TrimmingOperationResult.CreatedNewInsertionAndUpdateTables;
}
private IEnumerable<DataTable> ConstructCleanedActualSalesTable(int dateId)
private TrimmingOperationResult ConstructCleanedActualSalesTable(int dateId, out DataTable insertNewTable, out DataTable updateExistingTable)
{
//Create two DataTables one for the new items to be added to the database
//and one for items that have to be updated.
@@ -2134,13 +2208,12 @@ namespace AdvertsingProfitControl
//0:Sold 1:SalePrice 2:TotalSales 3:cost 4:ProfitReturn 5:TotalProfitReturn
//6:FK_AdItemID 7:RowAttribute 8:FK_AdSpecialGroupName (ID) 9:RowPosition (not index based)
//10:FK_DateID
var trimmedNewProjectionsTable = new DataTable("ACtualSales");
insertNewTable = new DataTable("Projections");
//Update Sales Table Layout (Based on the Database's Physical Layout)
//0:ID 1:Sold 2:SalePrice 3:TotalSales 4:cost 5:ProfitReturn 6:TotalProfitReturn
//7:FK_AdItemID 8:RowAttribute 9:FK_AdSpecialGroupName (ID) 10:RowPosition (not index based)
//11:FK_DateID
var trimmedUpdateProjectionsTable = new DataTable("ActualSales");
DataTable[] trimmedTables = { trimmedNewProjectionsTable, trimmedUpdateProjectionsTable };
updateExistingTable = new DataTable("Projections");
//Construct a list of column names for the projections/actual sales DataGridViews and the inventory DataGirdView.
string[] saleColumnNames =
{
@@ -2151,26 +2224,24 @@ namespace AdvertsingProfitControl
{
if (columnName == "ID") continue;
var column = new DataColumn(columnName);
trimmedTables[0].Columns.Add(column);
insertNewTable.Columns.Add(column);
}
foreach (var columnName in saleColumnNames)
{
var column = new DataColumn(columnName);
trimmedTables[1].Columns.Add(column);
updateExistingTable.Columns.Add(column);
}
//Create the database interaction objects.
var databaseTracker = new DatabaseTracker();
var databaseReader = new DatabaseReader();
var databaseWriter = new DatabaseWriter(databaseTracker.DatabaseConnectionString);
var adSpecialId = 0; //Entries in the database are not allowed to be zero (unique ID wise that is).
//Dictionary<AdItemID, TableID> The table ID is zero (0) for the new table and one (1) for the update table.
var usedAdItems = new Dictionary<int, int>(); //Contains ad items that are used in section one, used for checking for repeats.
//Grab the ad special ID, assuming there is one.
if (_adSpecialIndex != -1)
{
//An ad special does exist so grab its ID from the database.
int.TryParse(databaseReader.RetrieveGroupIdByString(
projectionsDataGridView.Rows[_adSpecialIndex].Cells[(int)SalesTableColumns.AdItem]
actualSalesDataGridView.Rows[_adSpecialIndex].Cells[(int)SalesTableColumns.AdItem]
.EditedFormattedValue.ToString(), databaseTracker.DatabaseConnectionString), out adSpecialId);
}
//Begin spinning through all the rows in the projections table.
@@ -2184,10 +2255,10 @@ namespace AdvertsingProfitControl
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Ad Special Row found at index " + row.Index + ".");
continue;
}
//Check to see if the row is not dirty.
//Check to see if the row is dirty.
if (!(bool)row.Cells[(int)SalesTableColumns.IsDirty].Value)
{
//If so simply continue.
//If it is not then continue on to the next row.
continue;
}
//Try grabbing the row's ID number (the number that it is in the database).
@@ -2201,52 +2272,129 @@ namespace AdvertsingProfitControl
adItemId = databaseWriter.InsertNewAdItem(row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue.ToString());
if (adItemId == 0)
{
errorLabel.Text = @"Failed to insert new ad item.";
//TODO: Throw an exception, this can not be allowed.
//AdItemInsertionFailedException
trimmedTables[0].Rows.Clear(); //Work around for now
trimmedTables[1].Rows.Clear();
break;
insertNewTable.Rows.Clear(); //Work around for now
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
}
int tableIndex;
//Check for repeated ad items in the ad special section
if (usedAdItems.TryGetValue(adItemId, out tableIndex))
if (_adSpecialIndex != -1 && row.Index > _adSpecialIndex)
{
//Attempt to grab the index of an ad item, if it is not found then the return value is -1.
var repeatedItemIndex =
_usedAdItems[0].FindIndex(x => x == row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue.ToString());
//Check if a repeat was found.
if (repeatedItemIndex != -1)
{
//A row index has been found so check to see if the row in question has already been added to any of the trimmed tables.
if ((bool)actualSalesDataGridView.Rows[repeatedItemIndex].Cells[(int)SalesTableColumns.IsDirty].Value)
{
//If the row is dirty then its going to be found in either...
if (!(bool)actualSalesDataGridView.Rows[repeatedItemIndex].Cells[(int)SalesTableColumns.IsInDatabase].Value)
{
//... or the add new items table.
//If the ad item is being used in section one then locate it and update it in the trimmed table.
var foundRow = trimmedTables[tableIndex].Select("AdItemID = '" + adItemId + "'");
var foundRow = insertNewTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
"Ad item '" + row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue +
"' found in the trimmed table.");
"' found in the trimmed new table.");
}
//Else error condition?
else
{
//TODO: Throw an exception, this can not be allowed.
//InvalidTrimmedRowCountException
trimmedTables[0].Rows.Clear(); //Work around for now
trimmedTables[1].Rows.Clear();
break;
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < trimmedTables[tableIndex].Rows.Count; i++)
for (var i = 0; i < insertNewTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != trimmedTables[tableIndex].Rows[i]) continue;
if (foundRow[0] != insertNewTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
if (tableIndex == 0)
{
trimmedTables[0].Rows[i][8] = adSpecialId;
}
else
{
trimmedTables[1].Rows[i][9] = adSpecialId;
}
insertNewTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
else
{
//... the update existing items table
//If the ad item is being used in section two then locate it and update it in the trimmed table.
var foundRow = updateExistingTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
"Ad item '" + row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue +
"' found in the trimmed update table.");
}
//Else error condition?
else
{
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < updateExistingTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != updateExistingTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
updateExistingTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
}
//If the row is not dirty then it would not be included in any trimmed table just yet.
if ((bool)actualSalesDataGridView.Rows[repeatedItemIndex].Cells[(int)SalesTableColumns.IsInDatabase].Value)
{
//If its in the database already then add the row to the update table, including the ad special ID number.
//If the ad item is being used in section two then locate it and update it in the trimmed table.
var foundRow = updateExistingTable.Select("AdItemID = '" + adItemId + "'");
if (foundRow.Length == 1)
{
LogConsole.WriteToLog(FrmLogConsole.Level.Info,
"Ad item '" + row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue +
"' found in the trimmed update table.");
}
//Else error condition?
else
{
insertNewTable.Rows.Clear();
updateExistingTable.Rows.Clear();
return TrimmingOperationResult.FailedToTrim;
}
//With the row found obtain the row's index and modify it in the table to
//include the ad special ID number. No other modifications are required so we can return.
//Begin spinning through all the rows to find the one selected above.
for (var i = 0; i < updateExistingTable.Rows.Count; i++)
{
//Check to see if the selected row is equal.
if (foundRow[0] != updateExistingTable.Rows[i]) continue;
//If so then update that row index with the group ID number.
updateExistingTable.Rows[i][8] = adSpecialId;
}
//Once ad special ID has been updated jump to the next row.
continue;
}
//else
//{
// //Otherwise add it to the add new item trimmed table (should never happen).
//}
LogConsole.WriteToLog(FrmLogConsole.Level.Info, "Repeated ad item '" + row.Cells[(int)SalesTableColumns.AdItem].EditedFormattedValue + "' found.");
LogConsole.WriteToLog(FrmLogConsole.Level.Info, "Its row index is " + repeatedItemIndex + ".");
}
}
//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)
@@ -2257,11 +2405,6 @@ namespace AdvertsingProfitControl
{
rowAttribute = 2;
}
//Since we've made it this far, add the ad item into the dictionary if we're not in the ad special group.
if (_adSpecialIndex != -1 && row.Index < _adSpecialIndex)
{
usedAdItems.Add(row.Index, adItemId);
}
//Add the values to their respective data table.
if (rowIdNumber == 0)
{
@@ -2286,8 +2429,7 @@ namespace AdvertsingProfitControl
newRow[9] = row.Index + 1;
}
newRow[10] = dateId;
trimmedTables[0].Rows.Add(newRow);
usedAdItems.Add(adItemId, 0);
insertNewTable.Rows.Add(newRow);
}
else
{
@@ -2313,19 +2455,10 @@ namespace AdvertsingProfitControl
newRow[10] = row.Index + 1;
}
newRow[11] = dateId;
trimmedTables[1].Rows.Add(newRow);
usedAdItems.Add(adItemId, 1);
updateExistingTable.Rows.Add(newRow);
}
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Row Dump for row number " + (row.Index + 1) + ".");
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "ID : " + rowIdNumber + " Sold: " + row.Cells[(int)SalesTableColumns.Sold].EditedFormattedValue);
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Sale Price : " + row.Cells[(int)SalesTableColumns.SalePrice].EditedFormattedValue + " Total Sales: " + row.Cells[(int)SalesTableColumns.TotalSales].EditedFormattedValue);
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Cost: " + row.Cells[(int)SalesTableColumns.Cost].EditedFormattedValue + " Profit Return: " + row.Cells[(int)SalesTableColumns.ProfitReturn].EditedFormattedValue);
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Total Profit Return: " + row.Cells[(int)SalesTableColumns.TotalProfitReturn].EditedFormattedValue + " Ad Item ID: " + adItemId);
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Row Attribute: " + rowAttribute + " Ad Special ID: " + adSpecialId);
//LogConsole.WriteToLog(FrmLogConsole.Level.Verbose, "Row Position: " + row.Index + (_adSpecialIndex != -1 && row.Index > _adSpecialIndex ? 1 : 0) + " Date ID: " + dateId);
}
return trimmedTables;
return TrimmingOperationResult.CreatedNewInsertionAndUpdateTables;
}
#endregion