C#/C#, mysql POS 만들기

C# WinForms / mysql으로 포스기 만들기 (5)

펭킹 2020. 11. 12. 19:37

이번 시간에는 판매 내역 창에서 DB의 내용을 불러와서 그리드 뷰에 나타내어 DB기능들을 구현하도록 하겠습니다.

내용이 길어 한번에 보기 어려우시면 기능마다 끊어 보시는 걸 추천드립니다. (새로고침/검색/수정/품목삭제)

판매 내역을 위한 새 윈폼 창을 만듭니다.

 

 

 

 

 

Form2.cs 가 만들어 졌습니다. 판매 내역 목업을 참고하여 윈폼 창을 디자인 하겠습니다.

 

 

이것을 상품 판매 윈폼 창과 연결시키겠습니다.

상품 판매 윈폼창의 판매 내역 버튼을 두번 눌러 button click 코드를 생성시킵니다.

 

        //판매내역 창 띄우기
        private void button3_Click(object sender, EventArgs e)
        {
            Form2 dlg = new Form2();
            dlg.ShowDialog();
        }

 

프로그램을 실행하여 결과를 확인합니다.

정상적으로 판매내역창이 열린다면 뒤로가기 버튼을 구현 하겠습니다. 

판매 내역 창에서 뒤로가기 버튼을 두번 눌러 button click 코드를 생성시킵니다.

 

        //뒤로가기
        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

 

정상적으로 판매내역창이 닫히면 그리드 뷰에 테이블의 내용을 불러오겠습니다.

이때 이 기능을 함수로 만들어서 새로고침 기능이 필요할때(데이터가 갱신 될 때) 마다 사용할 수 있게 구현 하겠습니다.

 

    public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
        }

        //DB에서 데이터 불러온 후 텍스트 박스 초기화 (데이터 갱신 함수)
        public void LoadData()
        {
            string sql = "Server=localhost;Port=3306;Database=pos_dataset;Uid=root;Pwd=*****";
            MySqlConnection con = new MySqlConnection(sql);
            MySqlCommand cmd_db = new MySqlCommand("SELECT * FROM sales_tb;", con);

            try
            {
                MySqlDataAdapter sda = new MySqlDataAdapter();
                sda.SelectCommand = cmd_db;
                DataTable dbdataset = new DataTable();
                sda.Fill(dbdataset);
                BindingSource bSource = new BindingSource();

                bSource.DataSource = dbdataset;
                dataGridView1.DataSource = bSource;
                sda.Update(dbdataset);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            //텍스트 박스 초기화
            textBox1.Text = "";
            textBox6.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
        }
        
        .
        .
        .
        
        //DB 불러오기(새로고침)
        private void button5_Click(object sender, EventArgs e)
        {
            LoadData();
        }
        
        .
        .
        .
        

 

실행 할 때 오류가 난다면 선언문에 MySQL선언 여부를 확인하면 됩니다.

새로고침 버튼은LoadData()함수를 사용하여 간단히 구현했습니다.

 

 

 

 

새로고침을 통해 sales_tb의 데이터를 그리드 뷰에 가져왔습니다. 

이제 순서대로 검색(Search), 수정(Update), 삭제(Delete) 기능을 구현해보겠습니다.

먼저 검색기능을 구현 하겠습니다.

 

namespace POS_build
{
    public partial class Form2 : Form
    {
        //서버 사용 선언
        MySqlConnection connection = new MySqlConnection("Server=localhost;Port=3306;Database=pos_dataset;Uid=root;Pwd=****");
        MySqlCommand command;
        MySqlDataAdapter adapter;
        DataTable table = new DataTable();

        public Form2()
        {
            InitializeComponent();
        }
        
        .
        .
        .
        
        //데이터 조회 함수
        public void searchData(string valueToSearch)
        {
            string query = "SELECT * FROM sales_tb WHERE CONCAT(`name`, `price`, `count`, `total`) like '%" + valueToSearch + "%'";
            command = new MySqlCommand(query, connection);
            adapter = new MySqlDataAdapter(command);
            table = new DataTable();
            adapter.Fill(table);
            dataGridView1.DataSource = table;
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            searchData("");
        }
        
        .
        .
        .
        
        //검색기능
        private void button2_Click_1(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                MessageBox.Show("검색 정보를 입력해주세요");
            }
            else
            {
                string valueToSearch = textBox1.Text.ToString();
                searchData(valueToSearch);
                //텍스트 박스 초기화
                textBox1.Text = "";
            }
        }
        
        .
        .
        .
        

 

이제 검색창에 물품에 대한 정보 검색 시 해당되는 품목을 모두 보여줍니다.

 

 

다음으로 수정 기능을 구현 하겠습니다. 수정기능을 구현하기전 열을 선택하면 열의 정보가

텍스트 박스에 삽입되도록 하겠습니다.

 

namespace POS_build
{
    public partial class Form2 : Form
    {
    
        .
        .
        .
        
        int selectedRow;
        
        .
        .
        .
        
        //셀 클릭시 해당 행의 정보를 텍스트박스에 채움
        private void dataGridView1_CellClick_1(object sender, DataGridViewCellEventArgs e)
        {
            selectedRow = e.RowIndex;
            DataGridViewRow row = dataGridView1.Rows[selectedRow];
            textBox6.Text = row.Cells[0].Value.ToString();
            textBox2.Text = row.Cells[1].Value.ToString();
            textBox3.Text = row.Cells[2].Value.ToString();
            textBox4.Text = row.Cells[3].Value.ToString();
            textBox5.Text = row.Cells[4].Value.ToString();
        }
        
        .
        .
        .
        

 

 

셀의 정보는 [ no(0), name(1), price(2), count(3), total(4)] 입니다.

여러분이 판매 내역 폼에서 textBox를 설정한 순서를 잘 확인해서 코딩해야 됩니다. 

 

 

다음으로 수정 기능을 구현하겠습니다.

MySQL쿼리문 중 데이터를 수정하는 UPDATE SET을 사용하여 테이블의 내용을 수정 합니다.

 

        //수정기능
        private void button3_Click_1(object sender, EventArgs e)
        {
            string constring = "Server=localhost;Port=3306;Database=pos_data;Uid=root;Pwd=*****";

            if (textBox2.Text == "" || textBox3.Text == "" || textBox4.Text == "")
            {
                MessageBox.Show("항목을 정확히 입력해주세요");
                textBox2.Clear();
                textBox3.Clear();
                textBox4.Clear();
            }
            else
            {
                decimal price = decimal.Parse(textBox3.Text);
                decimal count = decimal.Parse(textBox4.Text);
                decimal total = price * count;

                textBox5.Text = total.ToString();

                //업데이트를 통해 DB로 수정된 데이터 전송 - 기본키 기준으로 수정위치 탐색
                string Query = "update pos_dataset.sales_tb set no ='" + this.textBox6.Text + "',name='" + this.textBox2.Text + "',price='" + this.textBox3.Text + "'," +
                    "count='" + this.textBox4.Text + "',total='" + this.textBox5.Text + "' where no ='" + this.textBox6.Text + "'";
                MySqlConnection conDataBase = new MySqlConnection(constring);
                MySqlCommand cmdDatabase = new MySqlCommand(Query, conDataBase);
                MySqlDataReader myReader;

                try
                {
                    conDataBase.Open();
                    myReader = cmdDatabase.ExecuteReader();
                    MessageBox.Show("수정완료");

                    while (myReader.Read())
                    {

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            LoadData();
        }

 

total은 price나 count의 수정에 따라 자동으로 계산되도록 코딩했습니다.

LoadData() 함수를 사용하여 수정과 동시에 갱신된 데이터를 그리드 뷰에 반영합니다.

banana를 검색하여 가격을 1800원으로 인상하고 개수를 10개로 수정하겠습니다.

 

 

 

banana 항목이 수정 된 것을 확인 할 수 있습니다. 

마지막으로 품목 삭제 기능을 구현하고 이번 시간을 마무리 하겠습니다.

MySQL쿼리문 중 데이터를 수정하는 DELETE FROM 을 사용하여 테이블의 내용을 삭제 합니다.

 

        //행 삭제
        private void button4_Click(object sender, EventArgs e)
        {
            string constring = "Server=localhost;Port=3306;Database=pos_dataset;Uid=root;Pwd=*****";
            if (textBox6.Text == "")
            {
                MessageBox.Show("삭제 할 항목을 찾지 못했습니다.");
            }
            else
            {
                //delete를 통해 DB로 삭제된 데이터 전송 - 기본키 기준으로 삭제위치 탐색
                string Query = "delete from pos_dataset.sales_tb where no ='" + this.textBox6.Text + "';";
                MySqlConnection conDataBase = new MySqlConnection(constring);
                MySqlCommand cmdDatabase = new MySqlCommand(Query, conDataBase);
                MySqlDataReader myReader;

                try
                {
                    conDataBase.Open();
                    myReader = cmdDatabase.ExecuteReader();
                    MessageBox.Show("삭제완료");

                    while (myReader.Read())
                    {

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

                LoadData();
            }
        }

 

apple 항목을 삭제해보겠습니다.

 

 

apple 항목이 삭제 된 것을 확인 할 수 있습니다. 

이번 시간에는 판매 내역 창에서 DB의 내용을 불러와서 그리드 뷰에 나타내어 DB기능들을 구현했습니다.

DB의 기본 기능인 CRUD(Create, Read, Update, Delete)를 C#에서 제어하여 MySql로 반영했습니다.

한 호흡이 길었지만 끊고가기 애매해서 한번에 모든 내용을 다뤘습니다. 

다음 시간에는 재고현황 창에서 DB의 내용을 불러와서 그리드 뷰에 나타내어 DB기능들을 구현하고,

물품이 판매 될 때, 재고에서 수량이 감소 되는 것을 반영하는 방법을 배워보겠습니다.