using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace СУБД_Швейная_фабрика { public partial class FormAddZakaz : Form { public FormAddZakaz() { InitializeComponent(); } public string IdZakazchik = ""; // код авторизовавшегося заказчика string IdTkan = "", IdFur = ""; // код выбранной ткани и фурнитуры public struct Tkani { public string IdTkan, NameTkan, ColorTkan, Width, Length, Description; public Image PhotoTkan; } List LstTkani = new List(); /// /// получить из базы данных сведения о тканях /// void GetTkaniFromDB() { SqlConnection con = new SqlConnection(Properties.Settings.Default.fab2021ConnectionString); con.Open(); SqlCommand Query = new SqlCommand("select * from Tkani where length > 0", con); SqlDataReader Data = Query.ExecuteReader(); while (Data.Read()) { Tkani Tk = new Tkani(); Tk.IdTkan = Data["idtkan"].ToString(); Tk.NameTkan = Data["nametkan"].ToString(); Tk.ColorTkan = Data["color"].ToString(); Tk.Width = Data["width"].ToString(); Tk.Length = Data["length"].ToString(); Tk.Description = Data["description"].ToString(); try { // загрузить из таблицы БД байты фотографии в массив byte[] PhotoByte = (byte[])Data["phototkan"]; ImageConverter ImConverter = new ImageConverter(); // сконвертировать массив байт в изображение Tk.PhotoTkan = (Bitmap)ImConverter.ConvertFrom(PhotoByte); } catch { // в случае ошибки загрузить пустое изображение из ресурсов Tk.PhotoTkan = Properties.Resources.tmp; } LstTkani.Add(Tk); // добавить в список новую ткань } con.Close(); } /// /// заполнение таблицы с фотографиями тканей /// void FillLVTkani() { LVTkani.Items.Clear(); ImageListTkani.Images.Clear(); foreach(Tkani Tk in LstTkani) { // новый элемент для ListView с названием ткани ListViewItem LV = new ListViewItem(Tk.NameTkan); // в ImageList добавить изображение ткани ImageListTkani.Images.Add(Tk.PhotoTkan); // связать последнее добавленное изображение с новым элементом ListView LV.ImageIndex = ImageListTkani.Images.Count - 1; LVTkani.Items.Add(LV); // добавить новый элемент к ListView } } public struct Furnitura { public string IdFur, NameFur, CountFur; public Image PhotoFur; } List LstFurnitura = new List(); /// /// получить данные о фурнитурах из базы данных /// void GetFurnituraFromDB() { SqlConnection con = new SqlConnection(Properties.Settings.Default.fab2021ConnectionString); con.Open(); SqlCommand Query = new SqlCommand("select * from Furnitura where countfur > 0", con); SqlDataReader Data = Query.ExecuteReader(); while (Data.Read()) { Furnitura Fr = new Furnitura(); Fr.IdFur = Data["idfur"].ToString(); Fr.NameFur = Data["namefur"].ToString(); Fr.CountFur = Data["countfur"].ToString(); try { // загрузить из таблицы БД байты фотографии в массив byte[] PhotoByte = (byte[])Data["photo"]; ImageConverter ImConverter = new ImageConverter(); // сконвертировать массив байт в изображение Fr.PhotoFur = (Bitmap)ImConverter.ConvertFrom(PhotoByte); } catch { // в случае ошибки загрузить пустое изображение из ресурсов Fr.PhotoFur = Properties.Resources.tmp; } LstFurnitura.Add(Fr); // добавить в список новую фурнитуру } con.Close(); } /// /// заполнить таблицу с фотографиями фурнитур /// void FillLVFurnitura() { LVFurnitura.Items.Clear(); ImageListFur.Images.Clear(); foreach (Furnitura Fr in LstFurnitura) { // новый элемент для ListView с названием фурнитуры ListViewItem LV = new ListViewItem(Fr.NameFur); // в ImageList добавить изображение фурнитуры ImageListFur.Images.Add(Fr.PhotoFur); // связать последнее добавленное изображение с новым элементом ListView LV.ImageIndex = ImageListFur.Images.Count - 1; LVFurnitura.Items.Add(LV); // добавить новый элемент к ListView } } /// /// Определение длины ткани, которую нужно отрезать от рулона /// для изготовления нужного кол-ва изделий заданного размера /// /// ширина рулона ткани /// ширина изделия /// длина изделия /// кол-во изделий /// длина ткани, которую нужно отрезать от рулона int CutTkan(int WidthTkan, int WidthIzd, int LengthIzd, int CountIzd) { // ЕСЛИ УКЛАДЫВАТЬ ИЗДЕЛИЯ НА ТКАНЬ В РУЛОНЕ ПО ШИРИНЕ ИЗДЕЛИЯ // кол-во изделий, умещающихся в один ряд на рулоне ткани int IzdInRow1 = WidthTkan / WidthIzd; // кол-во рядов, в каждом из которых IzdInRow1 изделий int Row1 = CountIzd / IzdInRow1; // если кол-во изделий в 1 ряду умноженное на кол-во рядов меньше // кол-ва всех изделий, добавить кол-во рядов if (IzdInRow1 * Row1 < CountIzd) Row1++; // длина ткани, которую нужно отрезать от рулона, если укладывать изделия // по ширине int CutTkan1 = LengthIzd * Row1; // ЕСЛИ УКЛАДЫВАТЬ ИЗДЕЛИЯ НА ТКАНЬ В РУЛОНЕ ПО ДЛИНЕ ИЗДЕЛИЯ // кол-во изделий, умещающихся в один ряд на рулоне ткани int IzdInRow2 = WidthTkan / LengthIzd; // кол-во рядов, в каждом из которых IzdInRow2 изделий int Row2 = CountIzd / IzdInRow2; // если перемножить кол-во изделий в 1 ряду на кол-во рядов и полученное // значение меньше кол-ва необходимых изделий, значит нужно использовать // еще один ряд if (IzdInRow2 * Row2 < CountIzd) Row2++; // длина ткани, которую нужно отрезать от рулона, если укладывать изделия // по длине int CutTkan2 = WidthIzd * Row2; // вернуть наименьшую длину return Math.Min(CutTkan1, CutTkan2); } private void FormAddZakaz_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'fab2021DataSet1.Tkani' table. You can move, or remove it, as needed. this.tkaniTableAdapter.Fill(this.fab2021DataSet1.Tkani); // TODO: This line of code loads data into the 'fab2021DataSet1.Izdeliya' table. You can move, or remove it, as needed. this.izdeliyaTableAdapter.Fill(this.fab2021DataSet1.Izdeliya); GetTkaniFromDB(); FillLVTkani(); GetFurnituraFromDB(); FillLVFurnitura(); } private void LVTkani_SelectedIndexChanged(object sender, EventArgs e) { if (LVTkani.SelectedItems.Count > 0) // есть выделенные элементы { int num = LVTkani.SelectedIndices[0]; // номер выделенного элемента NametkanTextBox.Text = LstTkani[num].NameTkan; ColorTextBox.Text = LstTkani[num].ColorTkan; WidthTextBox.Text = LstTkani[num].Width; LengthTextBox.Text = LstTkani[num].Length; DescriptionTextBox.Text = LstTkani[num].Description; IdTkan = LstTkani[num].IdTkan; } else // нет выделенных элементов { NametkanTextBox.Text = ""; ColorTextBox.Text = ""; WidthTextBox.Text = ""; LengthTextBox.Text = ""; DescriptionTextBox.Text = ""; IdTkan = ""; } } private void LVFurnitura_SelectedIndexChanged(object sender, EventArgs e) { if (LVFurnitura.SelectedItems.Count > 0) // есть выделенные элементы { int num = LVFurnitura.SelectedIndices[0]; // номер выделенного элемента TbxNameFur.Text = LstFurnitura[num].NameFur; TbxCountFurSklad.Text = LstFurnitura[num].CountFur; IdFur = LstFurnitura[num].IdFur; } else // нет выделенных элементов { TbxNameFur.Text = ""; TbxCountFurSklad.Text = ""; IdFur = ""; } } private void BtnOK_Click(object sender, EventArgs e) { //int a = CutTkan(430, 150, 200, 4); //this.Text = a.ToString(); //return; // кол-во фурнитур, которое нужно сохранить в БД int NewCountFur = int.Parse(TbxCountFurSklad.Text) - int.Parse(TbxCountFur.Text) * int.Parse(TbxCountIzd.Text); SqlConnection con = new SqlConnection(Properties.Settings.Default.fab2021ConnectionString); con.Open(); string t1 = string.Format(@"update Furnitura set countfur = {0} where idfur = {1}", NewCountFur, IdFur); SqlCommand query = new SqlCommand(t1, con); // выполнить запрос query.ExecuteNonQuery(); con.Close(); int WidthTkan = int.Parse(WidthTextBox.Text); // ширина ткани // ширина изделия int WidthIzd = int.Parse(DgvIzd.CurrentRow.Cells[2].Value.ToString()); // длина изделия int LengthIzd = int.Parse(DgvIzd.CurrentRow.Cells[1].Value.ToString()); int CountIzd = int.Parse(TbxCountIzd.Text); // кол-во изделий // отрезать от рулона ткани кусок нужной длины int NewLengthTkan = int.Parse(LengthTextBox.Text) - CutTkan(WidthTkan, WidthIzd, LengthIzd, CountIzd); // обновить таблицу Ткани (для выделенной ткани сохранить новую длину NewLengthTkan) // код менеджера для обработки нового заказа // нужно заменить на код наименее загруженного менеджера int IdManager = 2; try { con.Open(); // SQL-запрос для добавления нового заказа string t = String.Format("insert into Zakaz (idizd, idzakazchik, idman, idtkan, idfur, countfur, countizd) " + "values ({0}, {1}, {2}, {3}, {4}, {5}, {6})", LblIdIzd.Text, IdZakazchik, IdManager, IdTkan, IdFur, TbxCountFur.Text, TbxCountIzd.Text); SqlCommand query1 = new SqlCommand(t, con); // выполнить запрос query1.ExecuteNonQuery(); con.Close(); MessageBox.Show("Заказ сформирован.", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); // закрыть форму } catch { MessageBox.Show("Ошибка добавления нового заказа.", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }