Загрузка данных


using System.Data;
using Microsoft.Data.SqlClient;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        private string connStr = @"Server=USERS\SQLEXPRESS;Database=demo;Trusted_Connection=True;TrustServerCertificate=True;";
        private string imagesPath = Path.Combine(Application.StartupPath, "Images");

        public Form1()
        {
            InitializeComponent();
            try
            {
                LoadProducts();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка загрузки данных: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void LoadProducts()
        {
            DateTime monthStart = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
            DateTime prevMonthStart = monthStart.AddMonths(-1);

            string sql = @"
SELECT p.id,
       p.[Наименование товара] AS Name,
       p.Изображение AS Image,
       p.Состав AS Composition,
       p.Цена AS Price,
       c.Категория AS Category,
       m.Производство AS Manufacturer,
       ISNULL((SELECT SUM(s.[count]) FROM Stock_items s WHERE s.id_tovar = p.id), 0) AS TotalCount,
       (SELECT COUNT(*) FROM Order_stock os
        JOIN Stock_items s ON s.id = os.id_stock_item
        JOIN Orders_import o ON o.id = os.id_order
        WHERE s.id_tovar = p.id
          AND o.[Дата заказа] >= @from
          AND o.[Дата заказа] < @to) AS OrdersLastMonth
FROM Products p
JOIN Categories c ON c.id = p.id_category
JOIN Manufactures m ON m.id = p.id_manufactures";

            var table = new DataTable();
            using (var conn = new SqlConnection(connStr))
            {
                var adapter = new SqlDataAdapter(sql, conn);
                adapter.SelectCommand.Parameters.AddWithValue("@from", prevMonthStart);
                adapter.SelectCommand.Parameters.AddWithValue("@to", monthStart);
                adapter.Fill(table);
            }

            flpProducts.Controls.Clear();
            foreach (DataRow row in table.Rows)
            {
                flpProducts.Controls.Add(CreateCard(row));
            }
        }

        private decimal CalculatePrice(decimal price, int ordersLastMonth)
        {
            if (ordersLastMonth == 0)
            {
                return Math.Round(price * 0.75m, 2);
            }
            return price;
        }

        private Image LoadImage(string fileName)
        {
            string path = Path.Combine(imagesPath, fileName);
            if (string.IsNullOrWhiteSpace(fileName) || !File.Exists(path))
            {
                path = Path.Combine(imagesPath, "picture.png");
            }
            return Image.FromFile(path);
        }

        private ProductCard CreateCard(DataRow row)
        {
            int totalCount = Convert.ToInt32(row["TotalCount"]);
            int ordersLastMonth = Convert.ToInt32(row["OrdersLastMonth"]);
            decimal price = Convert.ToDecimal(row["Price"]);
            decimal finalPrice = CalculatePrice(price, ordersLastMonth);

            var card = new ProductCard();
            card.Width = flpProducts.ClientSize.Width - 30;
            if (totalCount <= 3)
            {
                card.BackColor = Color.FromArgb(255, 204, 204);
            }

            card.SetData(
                row["Manufacturer"] + " | " + row["Name"],
                row["Category"].ToString(),
                totalCount > 5 ? "много" : "мало",
                row["Composition"].ToString(),
                finalPrice.ToString("0.00") + " ₽",
                LoadImage(row["Image"].ToString().Trim()));

            return card;
        }
    }
}