Add not found positions to target file

This commit is contained in:
Sergey Chebotar 2022-01-28 18:15:13 +03:00
parent 5b4888be12
commit 60006126b9
5 changed files with 114 additions and 21 deletions

View File

@ -21,7 +21,7 @@ namespace RehauSku.PriceListTools
newColumnHeader.Value2 = $"{source.Name}"; newColumnHeader.Value2 = $"{source.Name}";
newColumnHeader.WrapText = true; newColumnHeader.WrapText = true;
FillColumn(source.PositionAmount, TargetFile.amountCell.Column - 1, TargetFile.amountCell.Column); FillColumnsWithDictionary(source.PositionAmount, TargetFile.amountCell.Column - 1, TargetFile.amountCell.Column);
} }
FilterByAmount(); FilterByAmount();

View File

@ -27,7 +27,7 @@ namespace RehauSku.PriceListTools
public void FillTarget() public void FillTarget()
{ {
ExcelApp.ScreenUpdating = false; ExcelApp.ScreenUpdating = false;
FillColumn(Current.PositionAmount, TargetFile.amountCell.Column); FillColumnsWithDictionary(Current.PositionAmount, TargetFile.amountCell.Column);
FilterByAmount(); FilterByAmount();
ExcelApp.ScreenUpdating = true; ExcelApp.ScreenUpdating = true;

View File

@ -13,7 +13,7 @@ namespace RehauSku.PriceListTools
foreach (Source source in SourceFiles) foreach (Source source in SourceFiles)
{ {
FillColumn(source.PositionAmount, TargetFile.amountCell.Column); FillColumnsWithDictionary(source.PositionAmount, TargetFile.amountCell.Column);
} }
FilterByAmount(); FilterByAmount();

View File

@ -2,6 +2,8 @@
using Microsoft.Office.Interop.Excel; using Microsoft.Office.Interop.Excel;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Windows.Forms;
using Application = Microsoft.Office.Interop.Excel.Application;
namespace RehauSku.PriceListTools namespace RehauSku.PriceListTools
{ {
@ -22,48 +24,70 @@ namespace RehauSku.PriceListTools
catch (Exception ex) catch (Exception ex)
{ {
System.Windows.Forms.MessageBox.Show MessageBox.Show
(ex.Message, (ex.Message,
"Ошибка открытия шаблонного прайс-листа", "Ошибка открытия шаблонного прайс-листа",
System.Windows.Forms.MessageBoxButtons.OK, MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Information); MessageBoxIcon.Information);
wb.Close(); wb.Close();
throw ex; throw ex;
} }
} }
protected private void FillColumn(IEnumerable<KeyValuePair<Position, double>> dictionary, params int[] columns) protected private void FillColumnsWithDictionary(IEnumerable<KeyValuePair<Position, double>> dictionary, params int[] columns)
{ {
Missing = new List<KeyValuePair<Position, double>>(); Missing = new List<KeyValuePair<Position, double>>();
foreach (var kvp in dictionary) foreach (var positionAmount in dictionary)
{ {
FillPosition(kvp, columns); FillPositionAmountToColumns(positionAmount, columns);
} }
if (Missing.Count > 0) if (Missing.Count > 0)
{ {
System.Windows.Forms.MessageBox.Show DialogResult result =
MessageBox.Show
($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath} Попробовать найти новый вариант?", ($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath} Попробовать найти новый вариант?",
"Отсутствует позиция в конечной таблице заказов", "Отсутствует позиция в конечной таблице заказов",
System.Windows.Forms.MessageBoxButtons.YesNo, MessageBoxButtons.YesNo,
System.Windows.Forms.MessageBoxIcon.Information); MessageBoxIcon.Information);
if (result == DialogResult.Yes)
{
var lookUp = new List<KeyValuePair<Position, double>>(Missing);
foreach (var missingPosition in lookUp)
{
TryFillVariantlessSkuToColumns(missingPosition, columns);
}
}
}
if (Missing.Count > 0)
{
FillMissing();
MessageBox.Show
($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath}\n" +
$"Под основной таблицей составлен список не найденных артикулов",
"Отсутствует позиция в конечной таблице заказов",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
} }
} }
protected private void FillPosition(KeyValuePair<Position, double> kvp, int[] columns) protected private void FillPositionAmountToColumns(KeyValuePair<Position, double> positionAmount, int[] columns)
{ {
Range foundCell = TargetFile.skuCell.EntireColumn.Find(kvp.Key.Sku); Range foundCell = TargetFile.skuCell.EntireColumn.Find(positionAmount.Key.Sku);
if (foundCell == null) if (foundCell == null)
{ {
Missing.Add(kvp); Missing.Add(positionAmount);
return; return;
} }
string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
while (foundCell != null && foundCellGroup != kvp.Key.Group) while (foundCell != null && foundCellGroup != positionAmount.Key.Group)
{ {
foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell); foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell);
foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
@ -71,7 +95,7 @@ namespace RehauSku.PriceListTools
if (foundCell == null) if (foundCell == null)
{ {
Missing.Add(kvp); Missing.Add(positionAmount);
} }
else else
@ -79,19 +103,87 @@ namespace RehauSku.PriceListTools
foreach (var column in columns) foreach (var column in columns)
{ {
Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column]; Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column];
if (sumCell.Value2 == null) if (sumCell.Value2 == null)
{ {
sumCell.Value2 = kvp.Value; sumCell.Value2 = positionAmount.Value;
} }
else else
{ {
sumCell.Value2 += kvp.Value; sumCell.Value2 += positionAmount.Value;
} }
} }
} }
} }
protected private void TryFillVariantlessSkuToColumns(KeyValuePair<Position, double> positionAmount, int[] columns)
{
string sku = positionAmount.Key.Sku.Substring(1, 6);
Range foundCell = TargetFile.skuCell.EntireColumn.Find(sku);
if (foundCell == null)
{
return;
}
string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
while (foundCell != null && foundCellGroup != positionAmount.Key.Group)
{
foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell);
foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
}
if (foundCell == null)
{
return;
}
foreach (var column in columns)
{
Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column];
if (sumCell.Value2 == null)
{
sumCell.Value2 = positionAmount.Value;
}
else
{
sumCell.Value2 += positionAmount.Value;
}
}
Missing.Remove(positionAmount);
}
protected private void FillMissing()
{
int startRow =
TargetFile.Sheet.AutoFilter.Range.Row +
TargetFile.Sheet.AutoFilter.Range.Rows.Count + 5;
for (int i = 0; i < Missing.Count; i++)
{
Range group = TargetFile.Sheet.Cells[startRow + i, TargetFile.groupCell.Column];
Range sku = TargetFile.Sheet.Cells[startRow + i, TargetFile.skuCell.Column];
Range name = TargetFile.Sheet.Cells[startRow + i, TargetFile.nameCell.Column];
Range amount = TargetFile.Sheet.Cells[startRow + i, TargetFile.amountCell.Column];
group.Value2 = Missing[i].Key.Group;
sku.Value2 = Missing[i].Key.Sku;
name.Value2 = Missing[i].Key.Name;
amount.Value2 = Missing[i].Value;
group.ClearFormats();
sku.ClearFormats();
name.ClearFormats();
amount.ClearFormats();
}
}
protected private void FilterByAmount() protected private void FilterByAmount()
{ {
AutoFilter filter = TargetFile.Sheet.AutoFilter; AutoFilter filter = TargetFile.Sheet.AutoFilter;

View File

@ -13,8 +13,9 @@ namespace RehauSku.PriceListTools
amountCell = Sheet.Cells.Find(amountHeader); amountCell = Sheet.Cells.Find(amountHeader);
skuCell = Sheet.Cells.Find(skuHeader); skuCell = Sheet.Cells.Find(skuHeader);
groupCell = Sheet.Cells.Find(groupHeader); groupCell = Sheet.Cells.Find(groupHeader);
nameCell = Sheet.Cells.Find(nameHeader);
if (amountCell == null || skuCell == null || groupCell == null) if (amountCell == null || skuCell == null || groupCell == null || nameCell == null)
{ {
throw new ArgumentException($"Шаблон { Name } не является прайс-листом"); throw new ArgumentException($"Шаблон { Name } не является прайс-листом");
} }