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