Практична робота №5. Семестр 1

         Метою даної практичної роботи буде написання інтерфейсу видачі книжок бібліотекарем – клієнту.

         В нашій базі за це відповідає таблиця inuse в якій містяться ідентифікатори бібліотекаря, читача, книги (хто, кому, і що видав) та дати видачі і повернення книги читачем. Якщо у вашій таблиці відсутнє одне або декілька полів із списку – створіть їх.

         Отже для реалізації задуманого нам потрібно буде дві форми – перша буде відображати видані книги (а також видавати нові та редагувати вже видані), друга буде слугувати для вибору читачів, бібліотекарів та книжок для додання нового запису в таблицю inuse. Ми не можемо використовувати випадаючі списки так як книжок, як і клієнтів у бібліотеці, зазвичай, досить багато, тому потрібно реалізувати більш зручний інтерфейс вибору.

         Перша форма матиме вигляд

         Та вкладка редагувати

         Друга форма матиме вигляд

         Нам потрібно щоб друга форма виконувала запит на відображення, виконувала пошук записів та повертала нам два поля ідентифікатор запису і текст який буде відображатися в полі вводу (назва книги, ім’я людини і т.д.), щоб оператор знав що додає, поля мають бути не доступні для редагування.

         Зверніть увагу, в даному полі для пошуку використовується одне поле, але пошук відбувається по всіх потрібних нам полях одночасно, зверніть увагу на пошуковий запит.

         Приступимо до програмного коду. Форма перша:

(не забуваємо підключити простір імен «using MySql.Data.MySqlClient;» та додати до проекту «MySql.Data» в посиланнях)

public partial class Form1 : Form

    {

        static string cs = new MySqlConnectionStringBuilder() //Створюємо рядок підключення

        {

            UserID = "root",

            Password = "fjrud7sg",

            Database = "cs_test",

            Server = "127.0.0.1"

        }.ConnectionString;

 

        public static MySqlConnection con = new MySqlConnection(cs); //Оголошуємо підключення

 

        private void fill_grid(string q, DataGridView d)

        { //Виконуємо запит і відображаємо результат на сітці

            DataTable dt = new DataTable();

            if (con.State.ToString() != "Open") con.Open();

            MySqlCommand com = new MySqlCommand(q, con);

            MySqlDataReader dr = com.ExecuteReader(); //Виконання із поверненням кузультатів запиту

            dt.Load(dr);

            d.DataSource = dt;

            dr.Close();

        }

 

        private void run_query(string q)

        {

            if (con.State.ToString() != "Open") con.Open();

            MySqlCommand com = new MySqlCommand(q, con);

            com.ExecuteNonQuery(); //Виконання без повернення результатів запиту

        }

 

        public Form1() //створення (конструктор) форми

        {

            InitializeComponent();

            fill_grid(  "SELECT `inuse`.`id`,`books`.`name` as 'book', `books`.`aughthor`, "+ // заповнюємо сітку

                        "`clients`.`name` as 'client',`clients`.`phone`,`users`.`name` as 'personal', "+

                        "`inuse`.`get_date`,`inuse`.`return_date`,`users`.`id` as 'uid',`books`.`id` as 'bid', "+

                        "`clients`.`id` as 'cid'  FROM `inuse` "+

                        "JOIN `books` on `books`.`id`=`inuse`.`book_id` "+

                        "JOIN `clients` on `clients`.`id`=`inuse`.`id_client` "+

                        "JOIN `users` on `users`.`id`=`inuse`.`id_user`;",dataGridView1);

            // в переліку полів оператор as переіменовує поля для того, щоб у нас не було

            // полів типу name_1

            tabControl1.SelectedIndex = 0;// перемикаємося на вкладку додати

        }

 

        private void видалитиToolStripMenuItem_Click(object sender, EventArgs e)

        {

            string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value + ""; // беремо ід з сітки

            if (id != "") // якщо вдалося взяти значення

            {

                run_query("DELETE FROM `inuse` WHERE `id`=" + id + ";");//видаляємо

                fill_grid("SELECT `inuse`.`id`,`books`.`name` as 'book', `books`.`aughthor`, " +

                            "`clients`.`name` as 'client',`clients`.`phone`,`users`.`name` as 'personal', " +

                            "`inuse`.`get_date`,`inuse`.`return_date`,`users`.`id` as 'uid',`books`.`id` as 'bid', " +

                            "`clients`.`id` as 'cid'  FROM `inuse` " +

                            "JOIN `books` on `books`.`id`=`inuse`.`book_id` " +

                            "JOIN `clients` on `clients`.`id`=`inuse`.`id_client` " +

                            "JOIN `users` on `users`.`id`=`inuse`.`id_user`;", dataGridView1);

                //оновлюємо сітку

                tabControl1.SelectedIndex = 0;//показуємо вкладку додати

            }

        }

 

        private void button1_Click(object sender, EventArgs e) //вибір книжки

        {

            string select_query = "SELECT * FROM `books`;";//запит який буде відображатися на сітці форми 2

            string search_query = "SELECT * FROM `books` WHERE CONCAT(`name`,`aughthor`) LIKE '%{0}%';"; //запит для пошуку

            // замість {0} буде підставлений текст поля вводу для пошуку

            Form2 f2 = new Form2(con,select_query,search_query,"id","name");// створюємо другу форму

            //"id" - поле ідентифікатору яке повертається "name" - поле яке буде відображено в полі вводу

            if (f2.ShowDialog() == DialogResult.OK) //якщо користувач здійснив вибір

            {

                textBox1.Text = f2.name_field; //показуємо що вибрав

                textBox1.Tag = f2.id_field;//запамятовуємо ідентифікатор обраного запису

            }

        }

 

        private void button2_Click(object sender, EventArgs e)// вибір бібліотекаря

            //див. вибір книги

            //обробника різняться лише запитами

        {

            string select_query = "SELECT * FROM `users`;";

            string search_query = "SELECT * FROM `users` WHERE CONCAT(`name`,`phone`) LIKE '%{0}%';";

            Form2 f2 = new Form2(con,select_query,search_query,"id","name");

            if (f2.ShowDialog() == DialogResult.OK)

            {

                textBox2.Text = f2.name_field;

                textBox2.Tag = f2.id_field;

            }

        }

 

        private void button3_Click(object sender, EventArgs e)// вибір бібліотекаря

            //див. вибір книги

            //обробника різняться лише запитами

        {

            string select_query = "SELECT * FROM `clients`;";

            string search_query = "SELECT * FROM `clients` WHERE CONCAT(`name`,`phone`) LIKE '%{0}%';";

            Form2 f2 = new Form2(con,select_query,search_query,"id","name");

            if (f2.ShowDialog() == DialogResult.OK)

            {

                textBox3.Text = f2.name_field;

                textBox3.Tag = f2.id_field;

            }

        }

 

        private void button4_Click(object sender, EventArgs e) //видача книги

        {

            string get_d = dateTimePicker1.Value.ToString("yyyy-MM-dd");//дати приведені до формату mySQL

            string ret_d = dateTimePicker2.Value.ToString("yyyy-MM-dd");

            if (get_d!=ret_d){// введені дати не мають співпадати

                run_query(String.Format("INSERT INTO `inuse` VALUES(NULL,{0},{1},{2},'{3}','{4}');", //запит на додання

                    textBox2.Tag, textBox3.Tag, textBox1.Tag, get_d, ret_d));//{0},{1},{2},'{3}','{4}' - заміняться цими значеннями

                fill_grid("SELECT `inuse`.`id`,`books`.`name` as 'book', `books`.`aughthor`, " +

                            "`clients`.`name` as 'client',`clients`.`phone`,`users`.`name` as 'personal', " +

                            "`inuse`.`get_date`,`inuse`.`return_date`,`users`.`id` as 'uid',`books`.`id` as 'bid', " +

                            "`clients`.`id` as 'cid'  FROM `inuse` " +

                            "JOIN `books` on `books`.`id`=`inuse`.`book_id` " +

                            "JOIN `clients` on `clients`.`id`=`inuse`.`id_client` " +

                            "JOIN `users` on `users`.`id`=`inuse`.`id_user`;", dataGridView1); //оновлюємо сітку

                textBox1.Text = ""; textBox2.Text = "";//очищаємо введені данні

                textBox3.Text = ""; textBox4.Text = "";

                dateTimePicker1.Value = DateTime.Now;

                dateTimePicker2.Value = DateTime.Now;

            }

            else { MessageBox.Show("Дати співпадають!"); }

        }

 

        private void textBox4_TextChanged(object sender, EventArgs e)//пошук

        {

            fill_grid("SELECT `inuse`.`id`,`books`.`name` as 'book', `books`.`aughthor`, " +

                    "`clients`.`name` as 'client',`clients`.`phone`,`users`.`name` as 'personal', " +

                    "`inuse`.`get_date`,`inuse`.`return_date`,`users`.`id` as 'uid',`books`.`id` as 'bid', "+

                    "`clients`.`id` as 'cid' FROM `inuse` " +

                    "JOIN `books` on `books`.`id`=`inuse`.`book_id` " +

                    "JOIN `clients` on `clients`.`id`=`inuse`.`id_client` " +

                    "JOIN `users` on `users`.`id`=`inuse`.`id_user` "+

                    // використовується функція для обєднання значень полів, а потім

                    //шукається співпадання вже з обєднаним полем

                    "WHERE CONCAT(`books`.`name`,`books`.`aughthor`,`clients`.`name`,`clients`.`phone`,`users`.`name`) LIKE '%"+textBox4.Text+"%';", dataGridView1);

        }

 

        private void button5_Click(object sender, EventArgs e)//очищення пошуку

        {

            textBox4.Text = "";

        }

 

        private void редагуватиToolStripMenuItem_Click(object sender, EventArgs e)//редагування

        {

            tabControl1.SelectedIndex = 1;//показуємо вкладку редагувати

            //переносимо дані рядка сітки в поля редагування

            textBox7.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["book"].Value + "";

            textBox7.Tag = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["bid"].Value + "";

            textBox6.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["personal"].Value + "";

            textBox6.Tag = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["uid"].Value + "";

            textBox5.Text=dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["client"].Value + "";

            textBox5.Tag = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["cid"].Value + "";

            dateTimePicker4.Value = DateTime.Parse(dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["get_date"].Value+"");

            dateTimePicker3.Value = DateTime.Parse(dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["return_date"].Value + "");

        }

 

        private void button8_Click(object sender, EventArgs e)// вибір книги

            //процедура аналогічна іншим викликам другої форми

            //див. вище

        {

            string select_query = "SELECT * FROM `books`;";

            string search_query = "SELECT * FROM `books` WHERE CONCAT(`name`,`aughthor`) LIKE '%{0}%';";

            Form2 f2 = new Form2(con, select_query, search_query, "id", "name");

            if (f2.ShowDialog() == DialogResult.OK)

            {

                textBox7.Text = f2.name_field;

                textBox7.Tag = f2.id_field;

            }

        }

 

        private void button7_Click(object sender, EventArgs e)// вибір бібліотекаря

        //процедура аналогічна іншим викликам другої форми

        //див. вище

        {

            string select_query = "SELECT * FROM `users`;";

            string search_query = "SELECT * FROM `users` WHERE CONCAT(`name`,`phone`) LIKE '%{0}%';";

            Form2 f2 = new Form2(con, select_query, search_query, "id", "name");

            if (f2.ShowDialog() == DialogResult.OK)

            {

                textBox6.Text = f2.name_field;

                textBox6.Tag = f2.id_field;

            }

        }

 

        private void button6_Click(object sender, EventArgs e)// вибір читача

        //процедура аналогічна іншим викликам другої форми

        //див. вище

        {

            string select_query = "SELECT * FROM `clients`;";

            string search_query = "SELECT * FROM `clients` WHERE CONCAT(`name`,`phone`) LIKE '%{0}%';";

            Form2 f2 = new Form2(con, select_query, search_query, "id", "name");

            if (f2.ShowDialog() == DialogResult.OK)

            {

                textBox5.Text = f2.name_field;

                textBox5.Tag = f2.id_field;

            }

        }

 

        private void button10_Click(object sender, EventArgs e)// очищення полів вводу після редагування

        {

            textBox5.Text = ""; textBox6.Text = "";

            textBox7.Text = "";

            dateTimePicker3.Value = DateTime.Now;

            dateTimePicker4.Value = DateTime.Now;

            tabControl1.SelectedIndex =0;

        }

 

        private void button9_Click(object sender, EventArgs e)//редагування рядка

        {

            string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value + "";

            if (id != "")//якщо вдалося визначити ідентифікатор запису

            {

                string cid = textBox5.Tag+"";//ід. читача

                string uid = textBox6.Tag + "";//ід. бібліотекаря

                string bid = textBox7.Tag + "";//ід.книги

                string gd=dateTimePicker4.Value.ToString("yyyy-MM-dd");//дата видачі

                string rd = dateTimePicker3.Value.ToString("yyyy-MM-dd");//тата повернення

                //запит на редагування

                run_query("UPDATE `inuse` SET `id_user`="+uid+",`id_client`="+cid+",`book_id`="+bid+",`get_date`='"+gd+"',`return_date`='"+rd+"' WHERE `id`=" + id + ";");

                //оновлення сітки

                fill_grid("SELECT `inuse`.`id`,`books`.`name` as 'book', `books`.`aughthor`, " +

                            "`clients`.`name` as 'client',`clients`.`phone`,`users`.`name` as 'personal', " +

                            "`inuse`.`get_date`,`inuse`.`return_date`,`users`.`id` as 'uid',`books`.`id` as 'bid', " +

                            "`clients`.`id` as 'cid'  FROM `inuse` " +

                            "JOIN `books` on `books`.`id`=`inuse`.`book_id` " +

                            "JOIN `clients` on `clients`.`id`=`inuse`.`id_client` " +

                            "JOIN `users` on `users`.`id`=`inuse`.`id_user`;", dataGridView1);

                tabControl1.SelectedIndex = 0;//перемикаємося на вкладку додати

            }

        }

    }

         Форма друга

    public partial class Form2 : Form

    {

        private static MySqlConnection con;

 

        private void fill_grid(string q, DataGridView d)

        { //Виконуємо запит і відображаємо результат на сітці

            DataTable dt = new DataTable();

            if (con.State.ToString() != "Open") con.Open();

            MySqlCommand com = new MySqlCommand(q, con);

            MySqlDataReader dr = com.ExecuteReader(); //Виконання із поверненням кузультатів запиту

            dt.Load(dr);

            d.DataSource = dt;

            dr.Close();

        }

 

        private void run_query(string q)

        {

            if (con.State.ToString() != "Open") con.Open();

            MySqlCommand com = new MySqlCommand(q, con);

            com.ExecuteNonQuery(); //Виконання без повернення результатів запиту

        }

 

        public string id_field { get; set; } //зберігаємо ід. запису для повернення

        public string name_field { get; set; }//зберігаємо назву запису для повернення

        private string sel_q;//зберігаємо запит який потрібно відобразити на сітці

        private string srch_q;//зберігаємо запит пошуку по таблиці

        private string id_name;//назва поля фдентифікатору запису

        private string name_name;//назва поле фмені яке повертається для відображення

 

        public Form2(MySqlConnection c,string sel_q,string sq,string id,string name)//конструктор форми

        //c зєднання,sel_q - запит для відображення,sq - запит для пошуку,id - поле ідентифікатору,name - поле назви

        {

            InitializeComponent();

            con = c;//зберігаємо підключення

            run_select(sel_q, sq,id,name);//процедура ініціалізації даних форми

        }

 

        public void run_select(string select_query,string search_query,string id_,string name_)

        {

            sel_q = select_query;//зберігаємо запит на відображення

            srch_q = search_query;//зберігаємо запит для пошуку

            id_name = id_;// зберігаємо поле ідентифікатору

            name_name = name_;//зберігаємо поле імені

            fill_grid(sel_q, dataGridView1);//заповнюємо сітку форми

            label2.Text = "Нічого не вибрано";//мітка для відображення вибору

        }

 

        private void textBox1_TextChanged(object sender, EventArgs e)//зміна поля пошуку

        {

            fill_grid(String.Format(srch_q, textBox1.Text), dataGridView1);//форматуємо запит для пошуку - підставляємо значення поля в потрібне місце

        }

 

        private void button2_Click(object sender, EventArgs e)//користувач відмовився від вибору

        {

            this.DialogResult = DialogResult.Cancel;//форма закриваєтья, статус відмінено

        }

 

        private void button1_Click(object sender, EventArgs e)//вибір запису

        {

            id_field = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[id_name].Value+"";//беремо значення ідентифікатору

            name_field = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[name_name].Value + "";//беремо значення поля імені

            if ((id_field != "") && (name_field != ""))//якщо значення не порожні

            { this.DialogResult = DialogResult.OK; }//форма закривається, статус - ОК

            else { MessageBox.Show("Потрібно щось обрати!"); }//повідомлення про помилку

        }

 

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)//змінилася вибрана клітинка на сітці

        {

            label2.Text="Обрано: ("+//пишемо на мітці поточний вибір

                dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[id_name].Value+") "+

                dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[name_name].Value + "";

        }

    }