본문 바로가기

C#

C# WinForm - PDA 프로그램 개발 (비주얼 스튜디오 2008 코드 포함)

반응형

감귤 물류센터 선과 입고증 리딩을 위한 PDA 프로그램을 만들어 보았다 .

실제 개발은 비주얼 스튜디오 2008 버전에서 Window CE 장치에서 진행하였으나 

코딩 기록을 위해서 비주얼 스튜디오 2019버전에 다시 작성하였다. 

 

실제 화면은 이와 같이 진행되며 로그인 화면을 Panel로 만들어 로그인 접속시 

visible - false 상태로 전환 시켰다. 

 

우선 로그인 클릭 이벤트는 이와 같이 작성하였다 .

 

 

try 문에서 디비를 오픈해주고 실행 여부를 점검할 수 있는 불형 변수를 if문에 넣어 실행시 Panel을 Visible을 false로 바꾸었다. 

 

 

seGride 메서드

*완료된 선과 작업에 대한 정보를 디비 프로시저에 추가 한다.

*해당 데이터를 데이터 그리드 뷰에 담아 준다. 

PDA가 리딩한 바코드 값 =string ord  

해당 정보를  디비 프로시저에 넣어 준다. 

 

여기서는 트랜잭션을 사용하여  커밋과 롤백 기능을 사용 하였다 . 

 

이건 데이터 테이블을 저장하는 메서드이다.

 

 

 

 

바코드 값이 들어오면 해당 데이터 값이 널값인지 확인 하는 이벤트 코딩 

 

 

 

 

 

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;


namespace PDA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Login_Click(object sender, EventArgs e)
        {                                                                                                                                                                                                                                       
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = new SqlConnection(common.commonDB);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "USP_PDA_CHK_LOGIN";

            object loginid = this.textBox_ID.Text.Trim();
            object loginpw = this.textBox_PW.Text.Trim();

            cmd.Parameters.Add(new SqlParameter("@LOGINID", loginid));
            cmd.Parameters.Add(new SqlParameter("@PASSWORD", loginpw));

            try
            {
                cmd.Connection.Open();
                bool isUser = Convert.ToBoolean(cmd.ExecuteScalar());
                //디비 sql이 실행되면 첫 행의 첫 열이 반환되니까 이걸 불값으로 변경하면 트루 
                if (isUser)
                {
                    this.panel1.Visible = false;
                }
                else
                {
                    MessageBox.Show("사용자 정보가 올바르지 않습니다.");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                
            }
            finally
            {
                cmd.Connection.Close();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            setGride();
        }
        #region user method
        /// <summary>
        /// 메서드
        /// </summary>
        private void setGride()
        {
            object isComplete = false;
            if (radioButton_Done.Checked)
            {
                isComplete = true;
            }
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = new SqlConnection(common.commonDB);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "USP_PDA_GET_LIST_MGR_SUNGUAPROCESS";
            cmd.Parameters.Add(new SqlParameter("@ISCOMPLETE", isComplete));
            DataTable dt = new DataTable();

            try
            {
                Cursor.Current = Cursors.WaitCursor;
                cmd.Connection.Open();
                SqlDataAdapter sqlData = new SqlDataAdapter(cmd);
                sqlData.Fill(dt);
                this.dataGridView1.DataSource = dt;
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
            finally
            {
                cmd.Connection.Close();
                Cursor.Current = Cursors.Default;
            }
        }
        // string ord = textbox_barcode.text.trim()
        // 바코드 번호를 디비에 연결해서 확인하는 메서드
        private void StartORd(string ord)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = new SqlConnection(common.commonDB);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "USP_PDA_SET_MGR_SUNGUAPROCESS_START";
            cmd.Parameters.Add(new SqlParameter("@ORDCD", ord));
            SqlTransaction sqltrans = null;
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                cmd.Connection.Open();
                cmd.Transaction = sqltrans.Connection.BeginTransaction();
                cmd.ExecuteNonQuery();
                sqltrans.Commit();
            }
            catch (Exception ex)
            {

                sqltrans.Rollback();
                MessageBox.Show(ex.Message);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
                cmd.Connection.Close();

            }
        }
        /// <summary>
        ///  
        /// </summary>
        /// <param name="dt"></param>
        private void SaveORnot(DataTable dt)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = new SqlConnection(common.commonDB);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "USP_PDA_SET_REG_MGR_SUNGUAPROCESSORD_ORDNO";
           
            SqlTransaction tran = null;
            int cnt = 0;
            try
            {
                cmd.Connection.Open();
                cmd.Transaction = tran.Connection.BeginTransaction();
                foreach (DataRow dr in dt.Rows)
                {
                    cmd.Parameters.Clear();
                    
                    cmd.Parameters.Add(new SqlParameter("@SUNGUAPROCESSORDCD", Convert.ToString(dr["지시"]).Trim()));
                    cmd.Parameters.Add(new SqlParameter("@ORDNO",cnt++));
                    cmd.ExecuteNonQuery();
                }
                tran.Commit();

            }
            catch (Exception ex)
            {
                tran.Rollback();
                MessageBox.Show(ex.Message);
            }
            finally
            {
                cmd.Connection.Close();
            }
        }

        #endregion

        private void button_refresh_Click(object sender, EventArgs e)
        {
            setGride();
        }

        private void radioButton_ing_Click(object sender, EventArgs e)
        {
            setGride();
        }

        private void radioButton_Done_Click(object sender, EventArgs e)
        {
            setGride();
        }
        //keydown을 쓰는지 모르겠다 . 바코드 삑하고 읽히는 작업인디....
        private void textBox_barcode_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData!=Keys.Enter)
            {
                return;
            }
            string ord = textBox_barcode.Text.Trim();
            if (ord.Equals(null))
            {
                return;
            }
            setGride();

            DataTable dt = this.dataGridView1.DataSource as DataTable;

            if (dt.Rows.Count<1)
            {
                return;
            }
            string gridordcd = Convert.ToString(dataGridView1[0, 1]).Trim();
            //접수증 번호 한번 걸러주기 
            if (ord!=gridordcd)
            {
                MessageBox.Show("현재순번의 접수증이 아닙니다.");
                this.textBox_barcode.Text = "";
                return;
            }
            StartORd(ord);
            setGride();
        }

        private void button_up_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            //지시 라디오버튼에 안되어 있으면 리턴
            if (!radioButton_ing.Checked)
            {
                return;
            }
            //하나의 장치 (데이터 그리드에 값이 하나도 없으면 안되니까 )
            int prevINDEX = dataGridView1.CurrentRow.Index - 1;
            if (prevINDEX<0)
            {
                return;
            }
            //데이터 그리드 뷰의 특정 좌표의 값을 string으로 변수 선언 ;
            string statusNum = Convert.ToString(this.dataGridView1[this.dataGridView1.CurrentRow.Index - 1, 0]).Trim();

            // 해당 데이터 그리드 상에 있는 좌표 값이 작업이면 리턴?
            // 작업 상태 데이터를 최 상단에 놓을라고 하는 코딩 ? 
            if (statusNum.Equals("작업")) 
            {
                return;
            }
            DataTable dt = this.dataGridView1.DataSource as DataTable;
            //기존에 있던 데이터에 데이터 한줄을 더 추가 해 줄때 이렇게 코딩 하면 된다.
            DataRow dr = dt.NewRow();
            dr[0] = dt.Rows[this.dataGridView1.CurrentRow.Index - 1][0];
            dr[1] = dt.Rows[this.dataGridView1.CurrentRow.Index - 1][1];
            dr[2] = dt.Rows[this.dataGridView1.CurrentRow.Index - 1][2];
            dr[3] = dt.Rows[this.dataGridView1.CurrentRow.Index - 1][3];
            dt.Rows.InsertAt(dr, dataGridView1.CurrentRow.Index + 1);
            dt.Rows.RemoveAt(dataGridView1.CurrentRow.Index - 1);
            //마지막 시간 이후 모든 테이블의 변경 사항을 커밋
            dt.AcceptChanges();
            this.SaveORnot(dt);

        }

        private void button_down_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            if (!radioButton_Done.Checked)
            {
                return;
            }
            int prevINDEX = this.dataGridView1.CurrentRow.Index - 1;
            if (prevINDEX < 0)
            {
                return;
            }
            string statuNum = Convert.ToString(this.dataGridView1[this.dataGridView1.CurrentRow.Index - 1, 0]).Trim();
            if (statuNum.Equals("작업"))
            {
                return;
            }
            DataTable dt = this.dataGridView1.DataSource as DataTable;
            //마지막 열 데이터 값을 못 넘어가게 
            if (dt.Rows.Count == this.dataGridView1.CurrentRow.Index+1)
            {
                return;
            }
            DataRow dr = dt.NewRow();
            dr[0] = dt.Rows[dataGridView1.CurrentRow.Index ][0];
            dr[1] = dt.Rows[dataGridView1.CurrentRow.Index ][1];
            dr[2] = dt.Rows[dataGridView1.CurrentRow.Index ][2];
            dr[3] = dt.Rows[dataGridView1.CurrentRow.Index ][3];
            dt.Rows.InsertAt(dr,this.dataGridView1.CurrentRow.Index + 2);
            dt.Rows.RemoveAt(this.dataGridView1.CurrentRow.Index);
            dt.AcceptChanges();
            //단순 저장 메서드    
            this.SaveORnot(dt);


        }

      
    }



}

       
    

반응형