반응형
감귤 물류센터 선과 입고증 리딩을 위한 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);
}
}
}
반응형
'C#' 카테고리의 다른 글
C# 기초 문법 진법 boolen형, 형변환, .ReadLine() , .Parse ,연산자 (0) | 2023.06.13 |
---|---|
C# 개발 - Devexpress Gridcontrol 사용하여 데이터 출력하기 (0) | 2023.06.12 |
C# 개발 - 라즈베리 파이에서 온습도 데이터베이스 C# 차트로 표현 가능! (0) | 2023.05.23 |
C# - Visual Studio 2008 PDA 개발 하는 방법 (0) | 2023.05.08 |
C# 문법 데이터 형변환과 프로퍼티에 대하여... (0) | 2023.03.27 |
C#- 객체(OOP), CLASS, 구조체, 배열 어떻게 사용할까 (1) | 2023.03.27 |