Вот пример, который берет данные из БД, преобразует их в список, а затем связывает dataGridView с этими данными.
Получить данные и заполнить список.Товар - это 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;
}
Привязать 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, повторенное много раз, и это может привести к ошибкам и неверным данным ... и т. д. (это длинная история, проверьте принцип работы базы данных, нормализацию ...).Это идея реляционных баз данных.