FormAddZakaz.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace СУБД_Швейная_фабрика
  12. {
  13. public partial class FormAddZakaz : Form
  14. {
  15. public FormAddZakaz()
  16. {
  17. InitializeComponent();
  18. }
  19. public string IdZakazchik = ""; // код авторизовавшегося заказчика
  20. string IdTkan = "", IdFur = ""; // код выбранной ткани и фурнитуры
  21. public struct Tkani
  22. {
  23. public string IdTkan, NameTkan, ColorTkan, Width, Length, Description;
  24. public Image PhotoTkan;
  25. }
  26. List<Tkani> LstTkani = new List<Tkani>();
  27. /// <summary>
  28. /// получить из базы данных сведения о тканях
  29. /// </summary>
  30. void GetTkaniFromDB()
  31. {
  32. SqlConnection con = new SqlConnection(Properties.Settings.Default.fab2021ConnectionString);
  33. con.Open();
  34. SqlCommand Query = new SqlCommand("select * from Tkani where length > 0", con);
  35. SqlDataReader Data = Query.ExecuteReader();
  36. while (Data.Read())
  37. {
  38. Tkani Tk = new Tkani();
  39. Tk.IdTkan = Data["idtkan"].ToString();
  40. Tk.NameTkan = Data["nametkan"].ToString();
  41. Tk.ColorTkan = Data["color"].ToString();
  42. Tk.Width = Data["width"].ToString();
  43. Tk.Length = Data["length"].ToString();
  44. Tk.Description = Data["description"].ToString();
  45. try
  46. {
  47. // загрузить из таблицы БД байты фотографии в массив
  48. byte[] PhotoByte = (byte[])Data["phototkan"];
  49. ImageConverter ImConverter = new ImageConverter();
  50. // сконвертировать массив байт в изображение
  51. Tk.PhotoTkan = (Bitmap)ImConverter.ConvertFrom(PhotoByte);
  52. }
  53. catch
  54. {
  55. // в случае ошибки загрузить пустое изображение из ресурсов
  56. Tk.PhotoTkan = Properties.Resources.tmp;
  57. }
  58. LstTkani.Add(Tk); // добавить в список новую ткань
  59. }
  60. con.Close();
  61. }
  62. /// <summary>
  63. /// заполнение таблицы с фотографиями тканей
  64. /// </summary>
  65. void FillLVTkani()
  66. {
  67. LVTkani.Items.Clear();
  68. ImageListTkani.Images.Clear();
  69. foreach(Tkani Tk in LstTkani)
  70. {
  71. // новый элемент для ListView с названием ткани
  72. ListViewItem LV = new ListViewItem(Tk.NameTkan);
  73. // в ImageList добавить изображение ткани
  74. ImageListTkani.Images.Add(Tk.PhotoTkan);
  75. // связать последнее добавленное изображение с новым элементом ListView
  76. LV.ImageIndex = ImageListTkani.Images.Count - 1;
  77. LVTkani.Items.Add(LV); // добавить новый элемент к ListView
  78. }
  79. }
  80. public struct Furnitura
  81. {
  82. public string IdFur, NameFur, CountFur;
  83. public Image PhotoFur;
  84. }
  85. List<Furnitura> LstFurnitura = new List<Furnitura>();
  86. /// <summary>
  87. /// получить данные о фурнитурах из базы данных
  88. /// </summary>
  89. void GetFurnituraFromDB()
  90. {
  91. SqlConnection con = new SqlConnection(Properties.Settings.Default.fab2021ConnectionString);
  92. con.Open();
  93. SqlCommand Query = new SqlCommand("select * from Furnitura where countfur > 0", con);
  94. SqlDataReader Data = Query.ExecuteReader();
  95. while (Data.Read())
  96. {
  97. Furnitura Fr = new Furnitura();
  98. Fr.IdFur = Data["idfur"].ToString();
  99. Fr.NameFur = Data["namefur"].ToString();
  100. Fr.CountFur = Data["countfur"].ToString();
  101. try
  102. {
  103. // загрузить из таблицы БД байты фотографии в массив
  104. byte[] PhotoByte = (byte[])Data["photo"];
  105. ImageConverter ImConverter = new ImageConverter();
  106. // сконвертировать массив байт в изображение
  107. Fr.PhotoFur = (Bitmap)ImConverter.ConvertFrom(PhotoByte);
  108. }
  109. catch
  110. {
  111. // в случае ошибки загрузить пустое изображение из ресурсов
  112. Fr.PhotoFur = Properties.Resources.tmp;
  113. }
  114. LstFurnitura.Add(Fr); // добавить в список новую фурнитуру
  115. }
  116. con.Close();
  117. }
  118. /// <summary>
  119. /// заполнить таблицу с фотографиями фурнитур
  120. /// </summary>
  121. void FillLVFurnitura()
  122. {
  123. LVFurnitura.Items.Clear();
  124. ImageListFur.Images.Clear();
  125. foreach (Furnitura Fr in LstFurnitura)
  126. {
  127. // новый элемент для ListView с названием фурнитуры
  128. ListViewItem LV = new ListViewItem(Fr.NameFur);
  129. // в ImageList добавить изображение фурнитуры
  130. ImageListFur.Images.Add(Fr.PhotoFur);
  131. // связать последнее добавленное изображение с новым элементом ListView
  132. LV.ImageIndex = ImageListFur.Images.Count - 1;
  133. LVFurnitura.Items.Add(LV); // добавить новый элемент к ListView
  134. }
  135. }
  136. /// <summary>
  137. /// Определение длины ткани, которую нужно отрезать от рулона
  138. /// для изготовления нужного кол-ва изделий заданного размера
  139. /// </summary>
  140. /// <param name="WidthTkan">ширина рулона ткани</param>
  141. /// <param name="WidthIzd">ширина изделия</param>
  142. /// <param name="LengthIzd">длина изделия</param>
  143. /// <param name="CountIzd">кол-во изделий</param>
  144. /// <returns>длина ткани, которую нужно отрезать от рулона</returns>
  145. int CutTkan(int WidthTkan, int WidthIzd, int LengthIzd, int CountIzd)
  146. {
  147. // ЕСЛИ УКЛАДЫВАТЬ ИЗДЕЛИЯ НА ТКАНЬ В РУЛОНЕ ПО ШИРИНЕ ИЗДЕЛИЯ
  148. // кол-во изделий, умещающихся в один ряд на рулоне ткани
  149. int IzdInRow1 = WidthTkan / WidthIzd;
  150. // кол-во рядов, в каждом из которых IzdInRow1 изделий
  151. int Row1 = CountIzd / IzdInRow1;
  152. // если кол-во изделий в 1 ряду умноженное на кол-во рядов меньше
  153. // кол-ва всех изделий, добавить кол-во рядов
  154. if (IzdInRow1 * Row1 < CountIzd)
  155. Row1++;
  156. // длина ткани, которую нужно отрезать от рулона, если укладывать изделия
  157. // по ширине
  158. int CutTkan1 = LengthIzd * Row1;
  159. // ЕСЛИ УКЛАДЫВАТЬ ИЗДЕЛИЯ НА ТКАНЬ В РУЛОНЕ ПО ДЛИНЕ ИЗДЕЛИЯ
  160. // кол-во изделий, умещающихся в один ряд на рулоне ткани
  161. int IzdInRow2 = WidthTkan / LengthIzd;
  162. // кол-во рядов, в каждом из которых IzdInRow2 изделий
  163. int Row2 = CountIzd / IzdInRow2;
  164. // если перемножить кол-во изделий в 1 ряду на кол-во рядов и полученное
  165. // значение меньше кол-ва необходимых изделий, значит нужно использовать
  166. // еще один ряд
  167. if (IzdInRow2 * Row2 < CountIzd)
  168. Row2++;
  169. // длина ткани, которую нужно отрезать от рулона, если укладывать изделия
  170. // по длине
  171. int CutTkan2 = WidthIzd * Row2;
  172. // вернуть наименьшую длину
  173. return Math.Min(CutTkan1, CutTkan2);
  174. }
  175. private void FormAddZakaz_Load(object sender, EventArgs e)
  176. {
  177. // TODO: This line of code loads data into the 'fab2021DataSet1.Tkani' table. You can move, or remove it, as needed.
  178. this.tkaniTableAdapter.Fill(this.fab2021DataSet1.Tkani);
  179. // TODO: This line of code loads data into the 'fab2021DataSet1.Izdeliya' table. You can move, or remove it, as needed.
  180. this.izdeliyaTableAdapter.Fill(this.fab2021DataSet1.Izdeliya);
  181. GetTkaniFromDB();
  182. FillLVTkani();
  183. GetFurnituraFromDB();
  184. FillLVFurnitura();
  185. }
  186. private void LVTkani_SelectedIndexChanged(object sender, EventArgs e)
  187. {
  188. if (LVTkani.SelectedItems.Count > 0) // есть выделенные элементы
  189. {
  190. int num = LVTkani.SelectedIndices[0]; // номер выделенного элемента
  191. NametkanTextBox.Text = LstTkani[num].NameTkan;
  192. ColorTextBox.Text = LstTkani[num].ColorTkan;
  193. WidthTextBox.Text = LstTkani[num].Width;
  194. LengthTextBox.Text = LstTkani[num].Length;
  195. DescriptionTextBox.Text = LstTkani[num].Description;
  196. IdTkan = LstTkani[num].IdTkan;
  197. }
  198. else // нет выделенных элементов
  199. {
  200. NametkanTextBox.Text = "";
  201. ColorTextBox.Text = "";
  202. WidthTextBox.Text = "";
  203. LengthTextBox.Text = "";
  204. DescriptionTextBox.Text = "";
  205. IdTkan = "";
  206. }
  207. }
  208. private void LVFurnitura_SelectedIndexChanged(object sender, EventArgs e)
  209. {
  210. if (LVFurnitura.SelectedItems.Count > 0) // есть выделенные элементы
  211. {
  212. int num = LVFurnitura.SelectedIndices[0]; // номер выделенного элемента
  213. TbxNameFur.Text = LstFurnitura[num].NameFur;
  214. TbxCountFurSklad.Text = LstFurnitura[num].CountFur;
  215. IdFur = LstFurnitura[num].IdFur;
  216. }
  217. else // нет выделенных элементов
  218. {
  219. TbxNameFur.Text = "";
  220. TbxCountFurSklad.Text = "";
  221. IdFur = "";
  222. }
  223. }
  224. private void BtnOK_Click(object sender, EventArgs e)
  225. {
  226. //int a = CutTkan(430, 150, 200, 4);
  227. //this.Text = a.ToString();
  228. //return;
  229. // кол-во фурнитур, которое нужно сохранить в БД
  230. int NewCountFur = int.Parse(TbxCountFurSklad.Text) -
  231. int.Parse(TbxCountFur.Text) * int.Parse(TbxCountIzd.Text);
  232. SqlConnection con = new SqlConnection(Properties.Settings.Default.fab2021ConnectionString);
  233. con.Open();
  234. string t1 = string.Format(@"update Furnitura
  235. set countfur = {0}
  236. where idfur = {1}", NewCountFur, IdFur);
  237. SqlCommand query = new SqlCommand(t1, con);
  238. // выполнить запрос
  239. query.ExecuteNonQuery();
  240. con.Close();
  241. int WidthTkan = int.Parse(WidthTextBox.Text); // ширина ткани
  242. // ширина изделия
  243. int WidthIzd = int.Parse(DgvIzd.CurrentRow.Cells[2].Value.ToString());
  244. // длина изделия
  245. int LengthIzd = int.Parse(DgvIzd.CurrentRow.Cells[1].Value.ToString());
  246. int CountIzd = int.Parse(TbxCountIzd.Text); // кол-во изделий
  247. // отрезать от рулона ткани кусок нужной длины
  248. int NewLengthTkan = int.Parse(LengthTextBox.Text) -
  249. CutTkan(WidthTkan, WidthIzd, LengthIzd, CountIzd);
  250. // обновить таблицу Ткани (для выделенной ткани сохранить новую длину NewLengthTkan)
  251. // код менеджера для обработки нового заказа
  252. // нужно заменить на код наименее загруженного менеджера
  253. int IdManager = 2;
  254. try
  255. {
  256. con.Open();
  257. // SQL-запрос для добавления нового заказа
  258. string t = String.Format("insert into Zakaz (idizd, idzakazchik, idman, idtkan, idfur, countfur, countizd) " +
  259. "values ({0}, {1}, {2}, {3}, {4}, {5}, {6})",
  260. LblIdIzd.Text, IdZakazchik, IdManager, IdTkan, IdFur, TbxCountFur.Text, TbxCountIzd.Text);
  261. SqlCommand query1 = new SqlCommand(t, con);
  262. // выполнить запрос
  263. query1.ExecuteNonQuery();
  264. con.Close();
  265. MessageBox.Show("Заказ сформирован.", "Внимание!",
  266. MessageBoxButtons.OK, MessageBoxIcon.Information);
  267. this.Close(); // закрыть форму
  268. }
  269. catch
  270. {
  271. MessageBox.Show("Ошибка добавления нового заказа.", "Внимание!",
  272. MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  273. }
  274. }
  275. }
  276. }