241 lines
10 KiB
C#
241 lines
10 KiB
C#
using MySql.Data.MySqlClient;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
|
||
namespace Dem2
|
||
{
|
||
using System;
|
||
using System.Data;
|
||
using System.Windows.Forms;
|
||
using MySql.Data.MySqlClient; // Убедись, что установлен пакет MySql.Data
|
||
|
||
public partial class MaterialEditForm : Form
|
||
{
|
||
private int? materialIdToEdit = null;
|
||
|
||
public MaterialEditForm()
|
||
{
|
||
InitializeComponent();
|
||
LoadMaterialTypes(); // Загрузка типов при открытии формы
|
||
button1.Click += buttonSave_Click;
|
||
}
|
||
|
||
// Конструктор для редактирования
|
||
public MaterialEditForm(int materialId) : this()
|
||
{
|
||
materialIdToEdit = materialId;
|
||
}
|
||
|
||
private void MaterialEditForm_Load(object sender, EventArgs e)
|
||
{
|
||
if (materialIdToEdit.HasValue)
|
||
{
|
||
LoadMaterialData(); // Загрузка данных для редактирования
|
||
}
|
||
}
|
||
|
||
private void LoadMaterialTypes()
|
||
{
|
||
try
|
||
{
|
||
using (var conn = DataBase.GetConnection())
|
||
{
|
||
conn.Open();
|
||
string sql = "SELECT id, type_name FROM material_types ORDER BY type_name";
|
||
MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn);
|
||
DataTable dt = new DataTable();
|
||
adapter.Fill(dt);
|
||
|
||
comboBoxMaterialType.DataSource = dt;
|
||
comboBoxMaterialType.DisplayMember = "type_name";
|
||
comboBoxMaterialType.ValueMember = "id";
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("Ошибка загрузки типов материалов: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
// Лучше не закрывать форму, если типы не загрузились, но можно и Close();
|
||
}
|
||
}
|
||
|
||
private void LoadMaterialData()
|
||
{
|
||
try
|
||
{
|
||
using (var conn = DataBase.GetConnection())
|
||
{
|
||
conn.Open();
|
||
string sql = @"
|
||
SELECT material_name, material_type_id, current_stock, unit, pack_size, min_stock, price_per_unit
|
||
FROM materials
|
||
WHERE id = @id";
|
||
|
||
using (var cmd = new MySqlCommand(sql, conn))
|
||
{
|
||
cmd.Parameters.AddWithValue("@id", materialIdToEdit);
|
||
using (var reader = cmd.ExecuteReader())
|
||
{
|
||
if (reader.Read())
|
||
{
|
||
textBoxName.Text = reader["material_name"].ToString();
|
||
// Обработка возможного NULL в material_type_id
|
||
if (reader["material_type_id"] != DBNull.Value)
|
||
{
|
||
comboBoxMaterialType.SelectedValue = Convert.ToInt32(reader["material_type_id"]);
|
||
}
|
||
else
|
||
{
|
||
comboBoxMaterialType.SelectedIndex = -1; // или установить первый элемент
|
||
}
|
||
|
||
numericUpDownCurrentStock.Value = reader["current_stock"] != DBNull.Value ? Convert.ToDecimal(reader["current_stock"]) : 0;
|
||
textBoxUnit.Text = reader["unit"].ToString(); // может быть NULL -> ""
|
||
numericUpDownPackSize.Value = reader["pack_size"] != DBNull.Value ? Convert.ToDecimal(reader["pack_size"]) : 1; // по умолчанию 1
|
||
numericUpDownMinStock.Value = reader["min_stock"] != DBNull.Value ? Convert.ToDecimal(reader["min_stock"]) : 0;
|
||
numericUpDownPricePerUnit.Value = reader["price_per_unit"] != DBNull.Value ? Convert.ToDecimal(reader["price_per_unit"]) : 0;
|
||
}
|
||
else
|
||
{
|
||
MessageBox.Show("Материал с указанным ID не найден.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||
this.DialogResult = DialogResult.Abort;
|
||
this.Close();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("Ошибка загрузки данных материала: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
}
|
||
|
||
private void buttonSave_Click(object sender, EventArgs e)
|
||
{
|
||
// 1. Валидация
|
||
if (string.IsNullOrWhiteSpace(textBoxName.Text))
|
||
{
|
||
MessageBox.Show("Введите наименование материала.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||
textBoxName.Focus();
|
||
return;
|
||
}
|
||
|
||
if (numericUpDownPricePerUnit.Value < 0)
|
||
{
|
||
MessageBox.Show("Цена не может быть отрицательной.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||
numericUpDownPricePerUnit.Focus();
|
||
return;
|
||
}
|
||
|
||
if (numericUpDownMinStock.Value < 0)
|
||
{
|
||
MessageBox.Show("Минимальное количество не может быть отрицательным.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||
numericUpDownMinStock.Focus();
|
||
return;
|
||
}
|
||
|
||
// 2. Подготовка данных
|
||
string name = textBoxName.Text.Trim();
|
||
int? typeId = null;
|
||
if (comboBoxMaterialType.SelectedValue != null && comboBoxMaterialType.SelectedValue != DBNull.Value)
|
||
{
|
||
typeId = Convert.ToInt32(comboBoxMaterialType.SelectedValue);
|
||
}
|
||
decimal currentStock = numericUpDownCurrentStock.Value;
|
||
string unit = textBoxUnit.Text.Trim();
|
||
decimal packSize = numericUpDownPackSize.Value;
|
||
decimal minStock = numericUpDownMinStock.Value;
|
||
decimal price = numericUpDownPricePerUnit.Value;
|
||
|
||
// 3. SQL
|
||
string sql;
|
||
if (materialIdToEdit.HasValue)
|
||
{
|
||
sql = @"
|
||
UPDATE materials
|
||
SET material_name = @name,
|
||
material_type_id = @typeId,
|
||
current_stock = @currentStock,
|
||
unit = @unit,
|
||
pack_size = @packSize,
|
||
min_stock = @minStock,
|
||
price_per_unit = @price
|
||
WHERE id = @id";
|
||
}
|
||
else
|
||
{
|
||
sql = @"
|
||
INSERT INTO materials (material_name, material_type_id, current_stock, unit, pack_size, min_stock, price_per_unit)
|
||
VALUES (@name, @typeId, @currentStock, @unit, @packSize, @minStock, @price)";
|
||
}
|
||
|
||
// 4. Выполнение
|
||
try
|
||
{
|
||
using (var conn = DataBase.GetConnection())
|
||
{
|
||
conn.Open();
|
||
using (var cmd = new MySqlCommand(sql, conn))
|
||
{
|
||
// Обязательно проверяй на DBNull.Value для nullable полей
|
||
cmd.Parameters.AddWithValue("@name", name);
|
||
cmd.Parameters.AddWithValue("@typeId", typeId.HasValue ? (object)typeId.Value : DBNull.Value);
|
||
cmd.Parameters.AddWithValue("@currentStock", currentStock);
|
||
cmd.Parameters.AddWithValue("@unit", string.IsNullOrEmpty(unit) ? (object)DBNull.Value : unit);
|
||
cmd.Parameters.AddWithValue("@packSize", packSize);
|
||
cmd.Parameters.AddWithValue("@minStock", minStock);
|
||
cmd.Parameters.AddWithValue("@price", price);
|
||
|
||
if (materialIdToEdit.HasValue)
|
||
{
|
||
cmd.Parameters.AddWithValue("@id", materialIdToEdit.Value);
|
||
}
|
||
|
||
int rowsAffected = cmd.ExecuteNonQuery();
|
||
|
||
if (rowsAffected > 0)
|
||
{
|
||
MessageBox.Show("Материал успешно сохранён.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||
this.DialogResult = DialogResult.OK;
|
||
this.Close();
|
||
}
|
||
else
|
||
{
|
||
MessageBox.Show("Не удалось сохранить материал. Проверьте данные.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (MySqlException sqlEx)
|
||
{
|
||
// Конкретная ошибка MySQL (например, нарушение уникальности, тип данных)
|
||
MessageBox.Show("Ошибка базы данных: " + sqlEx.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
// Любая другая ошибка
|
||
MessageBox.Show("Ошибка сохранения: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
}
|
||
|
||
private void buttonCancel_Click(object sender, EventArgs e)
|
||
{
|
||
this.DialogResult = DialogResult.Cancel;
|
||
this.Close();
|
||
}
|
||
|
||
private void button1_Click(object sender, EventArgs e)
|
||
{
|
||
|
||
}
|
||
}
|
||
}
|
||
|