Практична робота 4. Семестр 2

 

Метою даної практичної роботи буде навчитися формувати звіти, та відображати їх за допомогою діаграм. Для прикладу ми візьмемо гістограму та секторну діаграму. Відповідно, для зручності, будемо використовувати дві різні компоненти.

Самі дані для звіту будуть формуватися запитом до БД, із допомогою агрегатних функцій та групування, отже, якщо забули, прочитайте лекції з функціями MySQL за минулий семестр (зробіть наголос на математичних функціях, та функціях роботи з датою та часом). Компонента для роботи з діаграмами Chart була вивчена Вами на другому курсі, і, також представлена на сайті в розділі C# програмування.

Почнемо. Нам потрібно буде модифікувати нашу головну форму, а саме, в рядку меню форми додати елемент «Звіти», з такими елементами:

В підменю буде три звіти (один із них ми детально розберемо) це:

Середній термін перебування книги на руках читача (з періодом, тобто можливістю вибору проміжку, за який формувати звіт). Тут буде форма із трьома варіантами формування звіту (поквартально, помісячно, потижнево)

Кількість виданих книг за місяць, квартал, потижнево (з періодом, тобто можливістю вибору проміжку за який формувати звіт). Це робите самі по наведеному прикладу.

Кількість виданих книг бібліотекарем за місяць, квартал, потижнево (з періодом, тобто можливістю вибору проміжку за який формувати звіт). І цей звіт Ви також робите самостійно.

У кожного звіту буде своя форма, по вигляду вони будуть подібні. Розберемо компоненти із яких складається форма по вкладках:

Вкладка «Поквартально»

Вкладка «Помісячно»

Вкладка «Потижнево»

Вкладки «Діаграма» - «Секторна»

Вкладки «Діаграма» - «Гістограма»

Важливим є те, що компоненти діаграм потребують попереднього налаштування, все детально розписано в лекції другого курсу, зараз же, виберемо в кожному компоненті діаграми її вигляд, це можна візуально зробити у властивостях компоненти:

Властивості компоненти Chart

Вибір типу діаграми компоненти Chart

Потрібно одній компоненті задати вид гістограми, а іншій секторної діаграми, інші налаштування вигляду діаграм – змінюйте на свій смак – вони не будуть впливати на роботу програмного коду.

Наведемо програмний код другої форми:

using chrt=System.Windows.Forms.DataVisualization.Charting; //створюємо аліас для компоненти діаграм, щоб було зручно

 

namespace WindowsFormsApplication1//простір імен додатку, у Вас може відрізнятися

{

 public partial class Form2 : Form

  {

   private void fill_chart(chrt.Chart ch, DataGridView dg,string col_v,string name_v)

            //Процедура заповнення діаграми (одновимірної)

            //ch - діаграма яку потрібно заповнити

            //dg - сітка з даними для заповнення

            //col_v - стовпець зі значеннями

            //name_v - стовпець із підписами

   {

    ch.Series[0].Points.Clear();//очищуємо старі значення

    foreach (DataGridViewRow rw in dg.Rows) //перебираємо рядки сітки через змінну rw

     {

      if (!rw.IsNewRow) //якщо рядок не порожній тоді беремо значення

       {

        string vn = "0"; string n = ""; double v=0;//ініціалізуємо змінні для зручності

        if (rw.Cells[col_v].Value != null)// якщо клітинка містить значення

         {

          vn = rw.Cells[col_v].Value.ToString();//текстове значення точки діаграми

          v = Convert.ToDouble(vn);//числове значення точки діаграми

         }

        if (rw.Cells[name_v].Value != null)// якщо клітинка містить значення

         n = rw.Cells[name_v].Value.ToString();//підпис точки діаграми

        chrt.DataPoint p;//створюємо точку для додання до діаграми

        p = ch.Series[0].Points.Add(v);// додаємо до точки значення

        p.Label = vn;//додаємо мітку (значення точки)

        p.AxisLabel = n;//текстовий підпис точки

        p.LegendText = n;//текстовий підпис легенти

       }

      }

     }

 

/* Блок функцій MySQL нічого нового тут немає, просто механізм підключення та виконання запитів до БД, + конструктор, який теж Вам відомий з попередніх практичних */

 

    private 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 fill_grid(string q, DataGridView d, string[] f, string[] wn, string[] nn)

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

       //та перейменовуємо стовпці wn в nn

      fill_grid(q, d, f);

      for (int i = 0; i <= wn.Length - 1; i++)

       {

        d.Columns[wn[i]].HeaderText = nn[i];

       }

      }

 

    private void fill_grid(string q, DataGridView d, string[] f)

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

      fill_grid(q, d);

      foreach (string fn in f)

       {

        d.Columns[fn].Visible = false;//ховаємо відповідний стовпець

       }

     }

 

    private void run_query(string q)

     {

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

      MySqlCommand com = new MySqlCommand(q, con);

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

     }

 

    public Form2(MySqlConnection c)

     {

      InitializeComponent();

      con = c;//зберігаємо з’єднання передане першою формою

     }

 

/* Кінець блоку */

 

    private void button1_Click(object sender, EventArgs e)

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

     {

      string d1 = dateTimePicker1.Value.ToString("yyyy-MM-dd");//початкова дата

      string d2 = dateTimePicker2.Value.ToString("yyyy-MM-dd");//кінцева дата

      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', "+                              "CONCAT(YEAR(`inuse`.`return_date`),'Q',QUARTER(`inuse`.`return_date`)) as 'group_date', " + //вираховуємо рік і квартал

                "ROUND(AVG(TO_DAYS(`inuse`.`return_date`)-TO_DAYS(`inuse`.`get_date`)),2) as 'avg_use_days'" + // вираховуємо середнє арифметичне днів на скільки була взята книга

                "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 `inuse`.`return_date` BETWEEN '"+d1+"' AND '"+d2+"' "+//виставляємо діапазон дат

                "GROUP BY `group_date` "+//групуємо по сформованій даті

                "ORDER BY `group_date`;", //сортуємо по сформованій даті

                dataGridView1, new string[] { "bid", "uid", "cid", "id" },//перелічуємо назви стовпців, які потрібно приховати

                new string[] { "book", "aughthor", "client", "phone", "personal", "get_date", "return_date", "group_date", "avg_use_days" },//перелічуємо назви стовпців транслітом

                new string[] { "Книга", "Автор", "Читач", "Телефон", "Бібліотекар", "Видано", "Повернення", "Квартал", "В користуванні" }); //нові зрозумілі користувачу назви стовпців

   }

 

   private void button2_Click(object sender, EventArgs e)

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

   {

    fill_chart(chart1, dataGridView1, "avg_use_days", "group_date");//заповнюємо секторну діаграму

    fill_chart(chart2, dataGridView1, "avg_use_days", "group_date");//заповнюємо гістограму

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

   }

 

   private void button3_Click(object sender, EventArgs e)

        //подія кнопки сформувати помісячно

   {

    string d1 = dateTimePicker3.Value.ToString("yyyy-MM-dd");//початкова дата

    string d2 = dateTimePicker4.Value.ToString("yyyy-MM-dd");//кінцева дата

    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', " +

                        "CONCAT(YEAR(`inuse`.`return_date`),'/',MONTH(`inuse`.`return_date`)) as 'group_date', " + //вираховуємо рік і місяць

    "ROUND(AVG(TO_DAYS(`inuse`.`return_date`)-TO_DAYS(`inuse`.`get_date`)),2) as 'avg_use_days'" + // вираховуємо середнє арифметичне днів на скільки була взята книга

    "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 `inuse`.`return_date` BETWEEN '" + d1 + "' AND '" + d2 + "' " +//виставляємо діапазон дат

    "GROUP BY `group_date` " +//групуємо по сформованій даті

    "ORDER BY `group_date`;",//сортуємо по сформованій даті

    dataGridView2, new string[] { "bid", "uid", "cid", "id" },//перелічуємо назви стовпців, які потрібно приховати

    new string[] { "book", "aughthor", "client", "phone", "personal", "get_date", "return_date", "group_date", "avg_use_days" },//перелічуємо назви стовпців транслітом

    new string[] { "Книга", "Автор", "Читач", "Телефон", "Бібліотекар", "Видано", "Повернення", "Місяць", "В користуванні" }); //нові зрозумілі користувачу назви стовпців

   }

 

   private void button4_Click(object sender, EventArgs e)

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

   {

    fill_chart(chart1, dataGridView2, "avg_use_days", "group_date");//заповнюємо секторну діаграму

    fill_chart(chart2, dataGridView2, "avg_use_days", "group_date");//заповнюємо гістограму

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

   }

 

   private void button5_Click(object sender, EventArgs e)

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

   {

    string d1 = dateTimePicker5.Value.ToString("yyyy-MM-dd");//початкова дата

    string d2 = dateTimePicker6.Value.ToString("yyyy-MM-dd");//кінцева дата

    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', " +

                        "CONCAT(YEAR(`inuse`.`return_date`),'W',WEEK(`inuse`.`return_date`)) as 'group_date', " + //вираховуємо рік і тиждень

    "ROUND(AVG(TO_DAYS(`inuse`.`return_date`)-TO_DAYS(`inuse`.`get_date`)),2) as 'avg_use_days'" + // вираховуємо середнє арифметичне днів на скільки була взята книга

    "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 `inuse`.`return_date` BETWEEN '" + d1 + "' AND '" + d2 + "' " +//виставляємо діапазон дат

    "GROUP BY `group_date` " +//групуємо по сформованій даті

    "ORDER BY `group_date`;",//сортуємо по сформованій даті

    dataGridView3, new string[] { "bid", "uid", "cid", "id" },//перелічуємо назви стовпців, які потрібно приховати

    new string[] { "book", "aughthor", "client", "phone", "personal", "get_date", "return_date", "group_date", "avg_use_days" },//перелічуємо назви стовпців транслітом

    new string[] { "Книга", "Автор", "Читач", "Телефон", "Бібліотекар", "Видано", "Повернення", "Тиждень", "В користуванні" }); //нові зрозумілі користувачу назви стовпців

   }

 

   private void button6_Click(object sender, EventArgs e)

        //переносимо дані потижневого звіту на діаграми

   {

    fill_chart(chart1, dataGridView3, "avg_use_days", "group_date");//заповнюємо секторну діаграму

    fill_chart(chart2, dataGridView3, "avg_use_days", "group_date");//заповнюємо гістограму

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

   }

  }

}

         Ось і закінчено опис подій форми звіту. Пам’ятайте, що для успішної здачі лабораторної роботи вам потрібно самим доробити ще два звіти описаних на початку.