/
DaNN26
/
SQLProvider
Обзор
Документация
Войти
/
DaNN26
/
SQLProvider
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
OrderEditForm.cs
269 строк
9 KB
DaNN
Добавьте файлы проекта.
27 май 2026, 12:50
27 май 2026, 12:50
4fe37b9
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.Text; using System.Windows.Forms; namespace Demo { internal partial class OrderEditForm : Form { private int orderId; private bool isEdit; public OrderEditForm(int selectedOrderId) { orderId = selectedOrderId; isEdit = orderId > 0; InitializeComponent(); AppHelper.SetAppIcon(this); LoadLookups(); if (isEdit) { LoadOrder(); } else { Text = "Добавление заказа"; idLabel.Visible = false; idTextBox.Visible = false; } } private void LoadLookups() { FillCombo(statusComboBox, "SELECT StatusId, StatusName FROM dbo.OrderStatuses ORDER BY StatusName", "StatusId", "StatusName"); FillCombo(pickupPointComboBox, "SELECT PickupPointId, Address FROM dbo.PickupPoints ORDER BY PickupPointId", "PickupPointId", "Address"); } private void FillCombo(ComboBox comboBox, string sql, string idColumn, string nameColumn) { var table = DatabaseHelper.GetData(sql); comboBox.Items.Clear(); foreach (DataRow row in table.Rows) { comboBox.Items.Add(new ComboItem(Convert.ToInt32(row[idColumn]), row[nameColumn].ToString())); } if (comboBox.Items.Count > 0) { comboBox.SelectedIndex = 0; } } private void LoadOrder() { var table = DatabaseHelper.GetData(GetOrderSql()); if (table.Rows.Count == 0) { AppHelper.ShowError("Заказ не найден."); DialogResult = DialogResult.Cancel; Close(); return; } FillOrderFields(table.Rows[0]); } private string GetOrderSql() { return "SELECT o.OrderId, o.StatusId, o.PickupPointId, o.OrderDate, o.DeliveryDate, " + "STUFF((SELECT N', ' + p.Article + N', ' + CAST(oi.Quantity AS NVARCHAR(10)) " + "FROM dbo.OrderItems oi INNER JOIN dbo.Products p ON p.ProductId = oi.ProductId " + "WHERE oi.OrderId = o.OrderId FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS Articles " + "FROM dbo.Orders o WHERE o.OrderId = " + orderId; } private void FillOrderFields(DataRow row) { idTextBox.Text = row["OrderId"].ToString(); articlesTextBox.Text = row["Articles"].ToString(); SelectCombo(statusComboBox, Convert.ToInt32(row["StatusId"])); SelectCombo(pickupPointComboBox, Convert.ToInt32(row["PickupPointId"])); SetDate(orderDatePicker, row["OrderDate"]); SetDate(deliveryDatePicker, row["DeliveryDate"]); } private void SetDate(DateTimePicker picker, object value) { if (value != DBNull.Value) { picker.Value = Convert.ToDateTime(value); } } private void SelectCombo(ComboBox comboBox, int id) { foreach (object item in comboBox.Items) { var comboItem = item as ComboItem; if (comboItem != null && comboItem.Id == id) { comboBox.SelectedItem = comboItem; return; } } } private int GetSelectedId(ComboBox comboBox) { var item = comboBox.SelectedItem as ComboItem; return item == null ? 0 : item.Id; } private void SaveButton_Click(object sender, EventArgs e) { var products = ParseProducts(); if (products == null) { return; } try { SaveOrder(products); DialogResult = DialogResult.OK; Close(); } catch (Exception ex) { AppHelper.ShowError("Не удалось сохранить заказ.\n" + ex.Message); } } private void SaveOrder(List<OrderProduct> products) { if (isEdit) { DatabaseHelper.ExecuteCommand(BuildUpdateOrderSql(products)); return; } var result = DatabaseHelper.ExecuteScalar(BuildInsertOrderSql()); var newOrderId = Convert.ToInt32(result); DatabaseHelper.ExecuteCommand(BuildInsertItemsSql(newOrderId, products)); } private string BuildUpdateOrderSql(List<OrderProduct> products) { return "UPDATE dbo.Orders SET " + "StatusId = " + GetSelectedId(statusComboBox) + ", " + "PickupPointId = " + GetSelectedId(pickupPointComboBox) + ", " + "OrderDate = '" + SqlDate(orderDatePicker) + "', " + "DeliveryDate = '" + SqlDate(deliveryDatePicker) + "' " + "WHERE OrderId = " + orderId + "; " + "DELETE FROM dbo.OrderItems WHERE OrderId = " + orderId + "; " + BuildInsertItemsSql(orderId, products); } private string BuildInsertOrderSql() { return "INSERT INTO dbo.Orders (StatusId, PickupPointId, CustomerUserId, OrderDate, DeliveryDate, ReceiptCode) VALUES (" + GetSelectedId(statusComboBox) + ", " + GetSelectedId(pickupPointComboBox) + ", " + "NULL, " + "'" + SqlDate(orderDatePicker) + "', " + "'" + SqlDate(deliveryDatePicker) + "', " + "NULL); SELECT CAST(SCOPE_IDENTITY() AS INT);"; } private string SqlDate(DateTimePicker picker) { return picker.Value.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); } private List<OrderProduct> ParseProducts() { var text = articlesTextBox.Text.Trim(); if (text.Length == 0) { AppHelper.ShowError("Введите артикул заказа."); return null; } var parts = text.Split(','); if (parts.Length % 2 != 0) { AppHelper.ShowError("Артикул заказа должен быть записан парами: артикул, количество."); return null; } var products = new List<OrderProduct>(); for (int i = 0; i < parts.Length; i += 2) { var article = parts[i].Trim(); int quantity; if (article.Length == 0 || !int.TryParse(parts[i + 1].Trim(), out quantity) || quantity <= 0) { AppHelper.ShowError("Проверьте артикул и количество товара."); return null; } var table = FindProduct(article); if (table.Rows.Count == 0) { AppHelper.ShowError("Товар с артикулом " + article + " не найден."); return null; } var product = new OrderProduct(); product.ProductId = Convert.ToInt32(table.Rows[0]["ProductId"]); product.Quantity = quantity; products.Add(product); } return products; } private DataTable FindProduct(string article) { return DatabaseHelper.GetData( "SELECT ProductId FROM dbo.Products WHERE Article = N'" + AppHelper.Escape(article) + "'"); } private string BuildInsertItemsSql(int currentOrderId, List<OrderProduct> products) { var builder = new StringBuilder(); foreach (var product in products) { builder.Append("INSERT INTO dbo.OrderItems (OrderId, ProductId, Quantity) VALUES ("); builder.Append(currentOrderId); builder.Append(", "); builder.Append(product.ProductId); builder.Append(", "); builder.Append(product.Quantity); builder.Append("); "); } return builder.ToString(); } private void CancelButton_Click(object sender, EventArgs e) { DialogResult = DialogResult.Cancel; Close(); } private class OrderProduct { public int ProductId { get; set; } public int Quantity { get; set; } } } }