Вычитание повторяющихся значений из Datagrid - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть следующие Datagrids, как показано на рисунке ниже.

У меня есть продажи 3 одинаковых Товаров, имеющих одинаковый Код товара в Своде Продаж, сумма которых равна 4.

Текущий запас этого конкретного предмета - 20.

Когда я нажимаю кнопку подтверждения, я использую следующий запрос для вычитания продаж из текущего запаса и, следовательно, обновляю таблицу данных истории транзакций.

Запрос:

var changes = (from dr1 in dtItemSales.AsEnumerable()
               from dr2 in dtItemStock.AsEnumerable()
               where dr1.Field<string>("ItemCode") == dr2.Field<string>("ItemCode")
                       select new
                       {
                           Name = dr2.Field<string>("ItemCode"),
                           Remarks = dr2.Field<int>("Qty") - dr1.Field<int>("Quantity")
                       }).Distinct().ToList();


//Updating the Transaction History DataGrid.
dgTransactionHistory.ItemsSource = changes;

enter image description here

Моя проблема здесь в том, что, когда я вычитаю продажи из текущих Stock Я получаю 2 записи с одинаковым ItemCode с 2 разными значениями 19 и 18 .

Я должен получить только 1 запись со значением 16 в данном конкретном случае. (20 - 2 - 1 - 1)

Любая помощь по этому запросу будет принята с благодарностью. Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я должен получить только 1 запись со значением 16 в данном конкретном случае. (20 - 2 - 1 - 1)

Сначала попытайтесь получить сумму Quantity от dtItemSales с конкретным ItemCode, который соответствует элементу dtItemStockcode.

А затем вычтите указанную сумму с помощью dtItemStock s Qty столбца, например

Таким образом, ваш окончательный запрос будет выглядеть как

var changes = (from dr1 in dtItemSales.AsEnumerable()
               from dr2 in dtItemStock.AsEnumerable()
               where dr1.Field<string>("ItemCode") == dr2.Field<string>("ItemCode")
               let sum = dtItemSales.AsEnumerable().Where(x => x.Field<string>("ItemCode") == dr2.Field<string>("ItemCode")).Sum(dr => dr.Field<int>("Quantity"))
               select new
               {
                   Name = dr2.Field<string>("ItemCode"),
                   Remarks = dr2.Field<int>("Qty") - sum
               }).GroupBy(x => x.Name).Select(x => x.First()).ToList();

Вывод изОтладчик:

enter image description here

0 голосов
/ 19 ноября 2018

Для выделенного пункта в вашем вопросе, результаты будут 18 и 19 (2 результата). Зачем? Потому что Stock имеет 1 запись со значением 20. В предложении Where на вашем LINQ

Вы получаете 3 различия, когда вы делаете Stock - Sales:

20 - 2, 20 -1 и еще 20 - 1 (для 3-х продаж)

=> 18, 19, 19

Теперь в конце у вас есть Различение - вот почему бросается один 19, а вы получаете 18 и 19.

Почему бы вам НЕ СУМЕРИТЬ все группы продаж в ItemId? Затем вычтите из запаса.

...