shpmt-PackingCodeRemover/frmMySqlTest.vb

744 lines
28 KiB
VB.net

Imports System.ComponentModel
Imports System.IO.Ports
Imports Microsoft.Office.Core
Imports Excel = Microsoft.Office.Interop.Excel
Public Class frmMySqlTest
Private Enum basic_info
'packing info
packcode
pack_date
pack_note
'order info
ordercode
order_name
phone
ship_date
invoice
order_note
End Enum
Private basic_info_max_index As Integer = [Enum].GetNames(GetType(basic_info)).Length - 1
Private basic_data_select(basic_info_max_index) As String
Structure item_info
Dim item_type As String 'P:Product / C:Component
Dim prod_code As String
Dim sales_packing_cnt_col_nm As String
Dim sales_packing_serial_col_nm As String
Dim cnt As Integer
Dim serial As String
End Structure
Private item_product_list() As item_info
Private item_component_list() As item_info
Public item_product_max_index As Integer
Public item_component_max_index As Integer
Private cmd As String
Private dbcmd As String
Private order_table As String = "jomtOrderDB.jomtOrderTbl"
Private sales_table As String = "jomtTesterDB.jomtSalesPackingTbl"
Private order_test As String = "jomtOrderTestDB.jomtTesterOrderTbl"
Private sales_test As String = "jomtTesterServerDB.jomtSalesPackingTbl"
Private prod_table As String = "jomtTesterDB.jomtProdList"
Private component_table As String = "jomtTesterDB.jomtComponentTbl"
Private order_db As String = order_table
Private sales_db As String = sales_table
Private prod_db As String = prod_table
Private component_db As String = component_table
Private clear_switch As Boolean = False
Public InputCnt As Long
Public InputCntVal As Integer = 10
Public OldSerialNumberLength As Integer = 12
Public NewSerialNumberLength As Integer = 16
Private command_serial As String
Private command_count As String
Private product_serial_type As String
Private all_serial_list As New List(Of String)
Private query_product As String
Private query_component As String
Private Sub SetInputCnt()
InputCnt = InputCntVal
timer_barcode.Enabled = True
End Sub
Private Sub timer_barcode_Tick(sender As Object, e As EventArgs) Handles timer_barcode.Tick
If InputCnt Then
InputCnt -= 1
Else
timer_barcode.Enabled = False
If ckb_barcode.Checked Then
btnReadDB_Click(sender, e)
Else
txbPacking.Focus()
txbPacking.Refresh()
End If
End If
End Sub
Private Sub txb_clear()
If clear_switch = False Then
txbPacking.Clear()
End If
clear_switch = False
txb_pack_code.Clear()
txb_pack_date.Clear()
txb_state_code.Clear()
txb_state_date.Clear()
txb_state_name.Clear()
txb_invoice.Clear()
txbPacking.Refresh()
txb_pack_code.Refresh()
txb_pack_date.Refresh()
txb_state_code.Refresh()
txb_state_date.Refresh()
txb_state_name.Refresh()
txb_invoice.Refresh()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
setItemData()
txb_clear()
' DataGridView를 선택하면 전체 한줄이 선택되게 됩니다.
dgv_pack_item.SelectionMode = DataGridViewSelectionMode.FullRowSelect
txbPacking.Focus()
End Sub
Private Sub setItemData()
dbcmd = "SELECT CAST(MAX(ProdCode) AS CHAR) FROM " & prod_table & ";"
If DBQueryReader(dbcmd) Then
item_product_max_index = sqlDataQuery(0)
ReDim item_product_list(item_product_max_index)
End If
'제품 ProdCode는 1부터 시작하며, ProSet(1),LuxSet(2)는 같은 컬럼을 사용하고 있어 중복되기 때문에 2부터 조회
dbcmd = "SELECT CAST(ProdCode AS CHAR), SalesPackingCntColNm, SalesPackingSerialColNm FROM " & prod_table & " WHERE ProdCode > 1 GROUP BY ProdCode ORDER BY ProdCode ASC;"
If DBQueryReader(dbcmd) Then
Dim RowCount As Int16 = (sqlDataQuery.Length / 3) - 1
Dim dataSetCount As Int32 = 0
Dim item_data As item_info
For row = 0 To RowCount
item_data.item_type = "P"
For col = 0 To 2
If col = 0 Then
item_data.prod_code = sqlDataQuery(dataSetCount)
ElseIf col = 1 Then
item_data.sales_packing_cnt_col_nm = sqlDataQuery(dataSetCount)
ElseIf col = 2 Then
item_data.sales_packing_serial_col_nm = sqlDataQuery(dataSetCount)
End If
dataSetCount += 1
Next
item_product_list(item_data.prod_code) = item_data
Next
End If
dbcmd = "SELECT CAST(MAX(ProdCode) AS CHAR) FROM " & component_table & ";"
If DBQueryReader(dbcmd) Then
item_component_max_index = sqlDataQuery(0)
ReDim item_component_list(item_component_max_index)
End If
dbcmd = "SELECT CAST(ProdCode AS CHAR), SalesPackingCntColNm FROM " & component_table & " GROUP BY ProdCode ORDER BY ProdCode asc;"
If DBQueryReader(dbcmd) Then
Dim RowCount As Int16 = (sqlDataQuery.Length / 2) - 1
Dim dataSetCount As Int32 = 0
Dim item_data As item_info
For row = 0 To RowCount
item_data.item_type = "C"
For col = 0 To 1
If col = 0 Then
item_data.prod_code = sqlDataQuery(dataSetCount)
ElseIf col = 1 Then
item_data.sales_packing_cnt_col_nm = sqlDataQuery(dataSetCount)
End If
dataSetCount += 1
Next
item_component_list(item_data.prod_code) = item_data
Next
End If
'제품 정보 조회 쿼리 생성
query_product = Nothing
For i = 0 To item_product_max_index
If item_product_list(i).sales_packing_cnt_col_nm <> Nothing Then
If query_product = Nothing Then
query_product = "IFNULL(" & item_product_list(i).sales_packing_serial_col_nm & ",'NULL'), IFNULL(" & item_product_list(i).sales_packing_cnt_col_nm & ",'0')"
Else
query_product = query_product & ", IFNULL(" & item_product_list(i).sales_packing_serial_col_nm & ",'NULL'), IFNULL(" & item_product_list(i).sales_packing_cnt_col_nm & ",'0')"
End If
End If
Next
'구성품 정보 조회 쿼리 생성
query_component = Nothing
For i = 0 To item_component_max_index
If item_component_list(i).sales_packing_cnt_col_nm <> Nothing Then
If query_component = Nothing Then
query_component = "IFNULL(" & item_component_list(i).sales_packing_cnt_col_nm & ",'0')"
Else
query_component = query_component & ", IFNULL(" & item_component_list(i).sales_packing_cnt_col_nm & ",'0')"
End If
Else
If query_component = Nothing Then
query_component = "'0'"
Else
query_component = query_component & ", '0'"
End If
End If
Next
End Sub
Private Sub clearVariable()
command_serial = Nothing
command_count = Nothing
product_serial_type = Nothing
all_serial_list.Clear()
clear_switch = True
txb_clear()
dgv_pack_item.Rows.Clear()
dgv_pack_item.Refresh()
For i = 0 To basic_info_max_index
basic_data_select(i) = "NULL"
Next
For i = 0 To item_product_max_index
item_product_list(i).cnt = 0
item_product_list(i).serial = Nothing
Next
For i = 0 To item_component_max_index
item_component_list(i).cnt = 0
Next
End Sub
Private Function select_packingCode(serial As String) As String
Dim modelNum As String = Mid(serial, 1, 1)
Dim typeNum As String = Mid(serial, 2, 1)
If serial.Length = OldSerialNumberLength Then
modelNum = Mid(serial, 1, 1)
typeNum = Mid(serial, 2, 1)
Else
modelNum = Mid(serial, 1, 2)
typeNum = Mid(serial, 15, 1)
End If
dbcmd = "SELECT SalesPackingSerialColNm, SalesPackingCntColNm, CAST(ProdCode AS CHAR) FROM " & prod_table & " WHERE ModelNum = " & modelNum & " AND TypeNum = " & typeNum & " LIMIT 1;"
If DBQueryReader(dbcmd) Then
command_serial = sqlDataQuery(0)
command_count = sqlDataQuery(1)
product_serial_type = sqlDataQuery(2)
dbcmd = "SELECT PackingCode FROM " & sales_table & " WHERE " & command_serial & " LIKE '%" & serial & "%'"
If DBQueryReader(dbcmd) Then
Return sqlDataQuery(0)
End If
End If
Return Nothing
End Function
Private Sub btnReadDB_Click(sender As Object, e As EventArgs) Handles btnReadDB.Click
If txbPacking.Text = "" Then
If ckb_state.Checked = True Then
MsgBox("전표코드를 입력하여 주십시오.", vbExclamation)
Else
MsgBox("패킹코드를 입력하여 주십시오.", vbExclamation)
End If
Else
Dim packing_code As String = txbPacking.Text
clearVariable()
'시리얼번호를 포함하고 있는 패킹코드 검색
If Len(txbPacking.Text) = OldSerialNumberLength Or Len(txbPacking.Text) = NewSerialNumberLength Then
packing_code = select_packingCode(txbPacking.Text)
End If
If packing_code <> Nothing And db_select(packing_code) Then
If item_out() Then
txb_pack_code.Text = basic_data_select(basic_info.packcode)
txb_pack_date.Text = basic_data_select(basic_info.pack_date)
txb_state_code.Text = basic_data_select(basic_info.ordercode)
txb_state_date.Text = basic_data_select(basic_info.ship_date)
txb_state_name.Text = basic_data_select(basic_info.order_name)
txb_invoice.Text = basic_data_select(basic_info.invoice)
End If
If all_serial_list.Count > 1 Then
MsgBox(txbPacking.Text & " 는 패킹코드 " & packing_code & "에 포함된 시리얼번호입니다")
End If
Else
txbPacking.BackColor = Color.Red
MsgBox("등록되지 않은 데이터 입니다. 패킹 코드를 확인하여 주십시오.", vbCritical)
End If
End If
txbPacking.Focus()
End Sub
Private Function db_select(packing_code As String) As Boolean
'패킹, 주문 기본정보 조회
dbcmd = "SELECT IFNULL(sale.PackingCode,'NULL')
, IFNULL(sale.`Data`,'NULL')
, IFNULL(sale.note, '')
, IFNULL(otb.Order_Code,'NULL')
, IFNULL(otb.Orderer_Name,'NULL')
, IFNULL(otb.Phone_Number,'NULL')
, IFNULL(otb.Shipment_Date,'NULL')
, IFNULL(otb.Invoice_Number,'NULL')
, IFNULL(otb.note,'')
FROM " & sales_db & " AS sale LEFT JOIN " & order_db & " AS otb ON sale.PackingCode = otb.Packing_Code
WHERE sale.PackingCode = '" & packing_code & "' GROUP BY sale.PackingCode"
If DBQueryReader(dbcmd) Then
For i = 0 To basic_info_max_index
basic_data_select(i) = sqlDataQuery(i)
Next
Else
Return False
End If
'제품 정보 조회
dbcmd = "SELECT " & query_product & " FROM " & sales_db & " WHERE PackingCode = '" & packing_code & "'"
If DBQueryReader(dbcmd) Then
Dim RowCount As Int16 = (sqlDataQuery.Length / 2)
Dim dataSetCount As Int32 = 0
For row = 2 To RowCount '제품 ProdCode는 1부터 시작하며, ProSet(1),LuxSet(2)는 같은 컬럼을 사용하고 있어 중복되기 때문에 ProdCode 2부터 설정
For col = 0 To 1
If col = 0 Then
item_product_list(row).serial = sqlDataQuery(dataSetCount)
ElseIf col = 1 Then
item_product_list(row).cnt = sqlDataQuery(dataSetCount)
End If
dataSetCount += 1
Next
'모든 제품의 시리얼번호를 검색
If item_product_list(row).serial <> "NULL" Then
Dim serial_array() As String = item_product_list(row).serial.Split("/")
For j = 0 To serial_array.Length - 1
If Len(serial_array(j)) <> 0 Then
all_serial_list.Add(serial_array(j))
End If
Next
End If
Next
End If
'구성품 정보 조회
dbcmd = "SELECT " & query_component & " FROM " & sales_db & " WHERE PackingCode = '" & packing_code & "'"
If DBQueryReader(dbcmd) Then
For i = 0 To sqlDataQuery.Length - 1
item_component_list(i).cnt = sqlDataQuery(i)
Next
End If
Return True
End Function
Private Function item_out() As Boolean
Dim item_name As String
Dim dgv_switch As Boolean
Try
For i = 0 To item_product_max_index
dgv_switch = False
item_name = Nothing
If item_product_list(i).cnt > 0 Then
If i = 1 Or i = 2 Then 'Pro_Set, Lux_Set
If Mid(item_product_list(i).serial, 1, 2) = "10" Then
item_name = "DUALSONIC Pro 1Set (KR)"
Else
item_name = "DUALSONIC Lux 1Set (KR)"
End If
Else
dbcmd = "SELECT ItemName FROM " & prod_db & " WHERE ProdCode = '" & i & "' AND ItemName NOT LIKE '%체험%' LIMIT 1"
If DBQueryReader(dbcmd) Then
item_name = sqlDataQuery(0)
End If
End If
dgv_switch = True
End If
If dgv_switch = True Then
dgv_pack_item.Rows.Add(item_name, item_product_list(i).cnt, item_product_list(i).serial)
End If
Next
For i = 0 To item_component_max_index
dgv_switch = False
item_name = Nothing
If item_component_list(i).cnt > 0 Then
dbcmd = "SELECT ItemName FROM " & component_db & " WHERE ProdCode = '" & i & "' LIMIT 1"
If DBQueryReader(dbcmd) Then
item_name = sqlDataQuery(0)
End If
dgv_switch = True
End If
If dgv_switch = True Then
dgv_pack_item.Rows.Add(item_name, item_component_list(i).cnt, item_component_list(i).serial)
End If
Next
Return True
Catch ex As Exception
MsgBox(Err.Description, vbCritical)
Return False
End Try
End Function
Private Sub txbPacking_Click(sender As Object, e As EventArgs) Handles txbPacking.Click
txbPacking.Text = ""
txbPacking.BackColor = Color.White
End Sub
Private Sub txbPacking_KeyDown(ByVal sender As Object, e As KeyEventArgs) Handles txbPacking.KeyDown
If e.KeyCode = Keys.Return Then
btnReadDB_Click(sender, EventArgs.Empty)
End If
End Sub
Private Sub delete_packingCode()
Dim msg_cnt As Int16
Dim serial_data As String
msg_cnt = MsgBox("해당 패킹 및 전표 데이터를 삭제하시겠습니까?", vbExclamation + vbOKCancel)
If msg_cnt = 1 Then
serial_data = delete_sales()
If txb_pack_code.Text <> "NULL" Then
If pack_delete(serial_data) Then
If txb_state_code.Text <> "NULL" Then
If state_delete(serial_data) Then
txbPacking.BackColor = Color.Green
clear_switch = True
txb_clear()
dgv_pack_item.Rows.Clear()
MsgBox("데이터 삭제가 완료되었습니다.", vbInformation)
Else
txbPacking.BackColor = Color.Red
MsgBox("데이터베이스 안에 전표 데이터가 존재하지 않습니다. 데이터를 확인하여 주십시오.", vbCritical)
End If
Else
txbPacking.BackColor = Color.Green
clear_switch = True
txb_clear()
dgv_pack_item.Rows.Clear()
MsgBox("데이터 삭제가 완료되었습니다.", vbInformation)
End If
Else
txbPacking.BackColor = Color.Red
MsgBox("데이터베이스 안에 패킹 데이터가 존재하지 않습니다. 데이터를 확인하여 주십시오.", vbCritical)
End If
End If
Else
MsgBox("삭제가 취소되었습니다.", vbInformation)
End If
End Sub
Private Sub delete_serial()
Dim msg_cnt As Int16
msg_cnt = MsgBox("패킹에 포함된 시리얼번호를 삭제하시겠습니까?", vbExclamation + vbOKCancel)
If msg_cnt = 1 Then
'STEP_01 : jomtTesterDB.jomtSalesPackingTbl 테이블 시리얼번호 삭제
Dim remain_serial_data() As String = item_product_list(product_serial_type).serial.Replace(txbPacking.Text, "").Split("/")
Dim update_serial_str As String = ""
Dim update_serial_cnt As UInt16 = 0
Dim update_note_str As String = basic_data_select(basic_info.pack_note)
For i = 0 To remain_serial_data.Length - 1
If Len(remain_serial_data(i)) <> 0 Then
If update_serial_str = "" Then
update_serial_str = remain_serial_data(i)
Else
update_serial_str = update_serial_str & "/" & remain_serial_data(i)
End If
update_serial_cnt += 1
End If
Next
If Len(update_note_str) = 0 Then
update_note_str = txbPacking.Text
Else
update_note_str = update_note_str & "," & txbPacking.Text
End If
dbcmd = "UPDATE " & sales_db &
" SET " & command_serial & " = '" & update_serial_str & "'" &
", " & command_count & " = " & update_serial_cnt &
", note = '" & update_note_str & "'" &
" WHERE PackingCode = '" & txb_pack_code.Text & "'"
If DBCommand(dbcmd) Then
'STEP_02 : jomtOrderDB.jomtOrderTbl 테이블 시리얼번호 삭제
If txb_state_code.Text <> "NULL" Then
dbcmd = "SELECT IFNULL(Serial_Number, '') FROM " & order_db &
" WHERE Order_Code = '" & txb_state_code.Text & "' AND Serial_Number LIKE '%" & txbPacking.Text & "%'"
If DBQueryReader(dbcmd) Then
remain_serial_data = sqlDataQuery(0).Replace(txbPacking.Text, "").Split("/")
update_serial_str = ""
update_serial_cnt = 0
update_note_str = basic_data_select(basic_info.order_note)
For i = 0 To remain_serial_data.Length - 1
If Len(remain_serial_data(i)) <> 0 Then
If update_serial_str = "" Then
update_serial_str = remain_serial_data(i)
Else
update_serial_str = update_serial_str & "/" & remain_serial_data(i)
End If
update_serial_cnt += 1
End If
Next
If Len(update_note_str) = 0 Then
update_note_str = txbPacking.Text
Else
update_note_str = update_note_str & "," & txbPacking.Text
End If
'STEP_02-1 : jomtOrderDB.jomtOrderTbl 테이블 시리얼번호, 개수 업데이트
dbcmd = "UPDATE " & order_db &
" SET Serial_Number = '" & update_serial_str & "'" &
", Item_Count = " & update_serial_cnt &
" WHERE Order_Code = '" & txb_state_code.Text & "' AND Serial_Number LIKE '%" & txbPacking.Text & "%'"
If DBCommand(dbcmd) Then
'STEP_02-2 : jomtOrderDB.jomtOrderTbl 테이블 note에 삭제된 시리얼번호 업데이트
dbcmd = "UPDATE " & order_db &
" SET note = '" & update_note_str & "'" &
" WHERE Order_Code = '" & txb_state_code.Text & "'"
If DBCommand(dbcmd) = False Then
txbPacking.BackColor = Color.Red
MsgBox("Order 테이블 시리얼번호 삭제(2) 중 오류가 발생하였습니다.", vbCritical)
Exit Sub
End If
Else
txbPacking.BackColor = Color.Red
MsgBox("Order 테이블 시리얼번호 삭제(1) 중 오류가 발생하였습니다.", vbCritical)
Exit Sub
End If
End If
End If
Else
txbPacking.BackColor = Color.Red
MsgBox("SalesPacking 테이블 시리얼번호 삭제 중 오류가 발생하였습니다.", vbCritical)
Exit Sub
End If
'삭제하는 시리얼번호가 패킹코드이면 패킹코드를 다시 설정
If txbPacking.Text = txb_pack_code.Text Then
all_serial_list.Remove(txbPacking.Text)
all_serial_list.Sort()
dbcmd = "UPDATE " & sales_db &
" SET PackingCode = '" & all_serial_list(0) & "'" &
" WHERE PackingCode = '" & txb_pack_code.Text & "'"
If DBCommand(dbcmd) Then
dbcmd = "UPDATE " & order_db &
" SET Packing_Code = '" & all_serial_list(0) & "'" &
" WHERE Order_Code = '" & txb_state_code.Text & "' AND Packing_Code = '" & txb_pack_code.Text & "'"
If DBCommand(dbcmd) = False Then
txbPacking.BackColor = Color.Red
MsgBox("Order 테이블 패킹코드 업데이트에 오류가 발생하였습니다.", vbCritical)
Exit Sub
End If
Else
txbPacking.BackColor = Color.Red
MsgBox("SalesPacking 테이블 패킹코드 업데이트에 오류가 발생하였습니다.", vbCritical)
Exit Sub
End If
End If
txbPacking.BackColor = Color.Green
clear_switch = True
txb_clear()
dgv_pack_item.Rows.Clear()
MsgBox("데이터 삭제가 완료되었습니다.", vbInformation)
End If
End Sub
Private Sub btn_delete_Click(sender As Object, e As EventArgs) Handles btn_delete.Click
Dim msg_cnt As Int16
Dim serial_data As String
If dgv_pack_item.Rows.Count <> 1 Then
If ckb_state.Checked = True Then
msg_cnt = MsgBox("해당 패킹 번호의 전표 데이터만 삭제하시겠습니까?", vbExclamation + vbOKCancel)
If msg_cnt = 1 Then
serial_data = delete_sales()
If txb_state_code.Text <> "NULL" Then
If state_delete(serial_data) Then
txbPacking.BackColor = Color.Green
clear_switch = True
txb_clear()
dgv_pack_item.Rows.Clear()
MsgBox("데이터 삭제가 완료되었습니다.", vbInformation)
Else
txbPacking.BackColor = Color.Red
MsgBox("데이터베이스 안에 전표 데이터가 존재하지 않습니다. 데이터를 확인하여 주십시오.", vbCritical)
End If
Else
txbPacking.BackColor = Color.Red
MsgBox("데이터베이스 안에 전표 데이터가 존재하지 않습니다. 데이터를 확인하여 주십시오.", vbCritical)
End If
Else
MsgBox("삭제가 취소되었습니다.", vbInformation)
End If
Else
If all_serial_list.Count > 1 Then
delete_serial()
Else
delete_packingCode()
End If
End If
Else
txbPacking.BackColor = Color.Red
MsgBox("삭제할 데이터가 존재하지 않습니다.", vbExclamation)
End If
txbPacking.Focus()
End Sub
Private Function state_delete(serial As String) As Boolean
If txb_invoice.Text <> "NULL" Then
serial = txb_invoice.Text & "," & serial
End If
dbcmd = "UPDATE " & order_db & " SET Invoice_Number = NULL, Packing_Code = NULL, Serial_Number = NULL, Buy_Type = NULL, release_state = NULL, note = '" & serial & "' WHERE Order_Code = '" & txb_state_code.Text & "'"
If DBCommand(dbcmd) Then
Return True
End If
Return False
End Function
Private Function pack_delete(serial As String) As Boolean
dbcmd = "UPDATE " & sales_db &
" SET PackingCode = 'null_" & txb_pack_code.Text & "'
, " & command_serial & " = NULL
, note = '" & serial & "'
WHERE PackingCode = '" & txb_pack_code.Text & "'"
If DBCommand(dbcmd) Then
Return True
End If
Return False
End Function
Private Function delete_sales() As String
Dim serial_data As String = ""
For i = 0 To dgv_pack_item.Rows.Count - 2
If dgv_pack_item.Rows(i).Cells(2).Value IsNot Nothing AndAlso dgv_pack_item.Rows(i).Cells(2).Value.ToString() <> "" Then
If serial_data = "" Then
serial_data = dgv_pack_item.Rows(i).Cells(2).Value
Else
serial_data = serial_data & "," & dgv_pack_item.Rows(i).Cells(2).Value
End If
End If
Next
If Len(basic_data_select(basic_info.pack_note)) > 0 Then
serial_data = basic_data_select(basic_info.pack_note) & "," & serial_data
End If
Return serial_data
End Function
Private Sub txbPacking_TextChanged(sender As Object, e As EventArgs) Handles txbPacking.TextChanged
Dim tmpStr As String
If InputCnt = 0 And ckb_barcode.Checked = True Then
tmpStr = txbPacking.Text
If (Len(tmpStr) > 1) Then
tmpStr = Mid(tmpStr, Len(tmpStr), 1)
txbPacking.Clear()
txbPacking.AppendText(tmpStr)
End If
SetInputCnt()
End If
End Sub
Private Sub txb_pack_code_Click(sender As Object, e As EventArgs) Handles txb_pack_code.Click, txb_invoice.Click, txb_pack_date.Click, txb_state_code.Click, txb_state_date.Click, txb_state_name.Click, dgv_pack_item.Click, ckb_state.CheckedChanged, ckb_barcode.CheckedChanged
txbPacking.Focus()
End Sub
End Class