Внутренний результат присоединения запроса к datagridview как запас продуктов C # MS Access - PullRequest
0 голосов
/ 19 мая 2018

У меня есть 2 выигрышных формы, одна для покупок и одна для продаж, обе идут в 2 базы данных Access.

Я хочу создать страницу со складами, чтобы показать, что есть в наличии, вычитая продажи товаров из покупок товаровзакажите это по серийному номеру продукта, а затем отправьте результат в DataGridView или список, что бы ни работало

Я не уверен, как это можно сделать

Вот моя попытка

    OleDbCommand command = new OleDbCommand("SELECT Purchase.InvoiceDate, Purchase.Pname, (Purchase.Pqty - Sales.Pqty) AS I, Purchase.Bcode, Sales.InvoiceDate, Sales.Pname, Sales.Bcode FROM Purchase INNER JOIN Sales ON Purchase.Bcode = Sales.Bcode GROUP By Purchase.Bcode;");
    command.Connection = cn;
    OleDbDataReader dr = null;
    cn.Open();
    dr = command.ExecuteReader();
    while (dr.Read())
    {
        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            dataGridView1.Rows[i].Cells[0].Value = (dr["Bcode"].ToString());
            dataGridView1.Rows[i].Cells[1].Value = (dr["Pname"].ToString());
            dataGridView1.Rows[i].Cells[2].Value = (dr["Sales.Pqty"].ToString());
            dataGridView1.Rows[i].Cells[3].Value = (dr["Purchase.Pqty"].ToString());
            dataGridView1.Rows[i].Cells[4].Value = (dr["I"].ToString());
        }

    }
    cn.Close();

но это ничего не показывает, без ошибок, без данных ничего

, поэтому я пытаюсь вычесть таблицу Pqty of Sales из Pqty из таблицы покупок и показать результат в виде сетки данных, сгруппировав их по bcode, так чтоон не будет разделен на несколько строк

вот как сортируются мои таблицы

Таблица продаж

enter image description here Таблица закупок

enter image description here

Результат SQL-запроса

enter image description here

Используемый запрос

SELECT 

Last(Purchase.InvoiceDate) as LatestPurchaseInvoiceDate, 

Purchase.Pname, 

SUM(Purchase.Pqty) - SUM(Sales.Pqty) AS RemainingQty, 

Purchase.Bcode, 

Last(Sales.InvoiceDate) as LatestSalesInvoiceDate,  

Sales.Pname, 

Sales.Bcode FROM Purchase 

INNER JOIN Sales ON Purchase.Bcode = Sales.Bcode 


GROUP By Sales.Bcode, Sales.Pname, Purchase.Pname, Purchase.Bcode;

1 Ответ

0 голосов
/ 19 мая 2018

Вот пример, который берет данные из БД, преобразует их в список, а затем связывает dataGridView с этими данными.

  1. Получить данные и заполнить список.Товар - это DTO, который содержит все столбцы, которые вам нужны в вашей DataGrid:

    public List<Goods> GetGoods()
        {
            var result = new List<Goods>();
           var queryString = "SELECT * FROM.... ORDER BY ...";
    
            using (OleDbConnection connection = new OleDbConnection(connString))
            {
                OleDbDataReader reader = FillReader(connection, queryString);
    
                while (reader.Read())
                {
                    var goods = new Goods();
    
                    goods.GoodsName     = reader["name"].ToString();
                    goods.NumberCode    = reader["number"].ToString();
    
                    result.Add(goods);
                }
    
                reader.Close();
            }
    
            return result;
        }
    private OleDbDataReader FillReader(OleDbConnection connection, string queryString)
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
    
        OleDbDataReader reader = command.ExecuteReader();
    
        return reader;
    }
    
  2. Привязать dataGridView:

    gridGoods.DataSource = null;// каждый раз устанавливаем значение null, чтобы он мог получать новые исходные данные gridGoods.DataSource = new BindingSource (goods, null);

В вашем случае вы должны убедиться, чтозапрос возвращает именно те строки, которые вам нужно показать.В противном случае в цикле вы можете выполнять проверки и фильтровать список в соответствии с вашими потребностями.Если вам нужна помощь в фильтрации коллекции или в том, как написать SQL с Group By для вашего случая, спросите.

Вот пример SQL, когда вам нужны вычисления, которые включают SUM из 2 разных таблиц:

    SELECT 
Last(Purchase.InvoiceDate) AS LatestPurchaseInvoiceDate, 

Purchase.Pname, 

Sum(Purchase.Pqty)-(SELECT SUM(Sales.Pqty) as SalesQty FROM Sales WHERE Pname = Purchase.Pname  GROUP BY Pname) AS Expr1, 

Last(Sales.InvoiceDate) AS LatestSalesInvoiceDate, 

Sales.Pname

    FROM Purchase INNER JOIN Sales ON Purchase.Pname = Sales.Pname
    GROUP BY Purchase.Pname, Sales.Pname;

Правило таково: если у вас есть группировка по каждому столбцу, который вы запрашиваете, он должен быть частью агрегатной функции.Таким образом, все должны быть перечислены в заявлении Group By ниже, кроме тех, которые нуждаются в агрегации другого типа.В вашем случае вам нужно знать, какое количество продуктов доступно.Это ваша покупка. Кол-во. Продажи.Если у вас есть только одна запись в Закупке и 1 в Продаже для продукта, а PQty обновлен, вы можете удалить функцию Count (), которую я разместил.

Но я полагаю, что в каждой продаже есть Продукти у каждой покупки есть продукт, так что Count () - правильный путь.

Еще одно предложение - создать таблицу Products, где у вас есть: ProductId ProductName

, а в разделе «Продажи и покупки» у вас есть ProductIdвместо Pname, потому что теперь у вас есть Pname, повторенное много раз, и это может привести к ошибкам и неверным данным ... и т. д. (это длинная история, проверьте принцип работы базы данных, нормализацию ...).Это идея реляционных баз данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...