Imports System.Text
Public Class form_BomManage
Dim m_Table As New System.Data.DataTable
Dim m_InitOver As Boolean = False
Dim m_PartNumber As New CPartNumber
Dim m_BomTemplateName As String = "模板"
Dim m_CurrentBomPN As String = ""
Dim m_BomPath As New ArrayList
Public Enum COLS
序号
工艺流程
料号PN
物料名称
规格描述
单位
用量
使用位置
父料号
图片
备注
单价 'V2.4
单位总价 'V2.4
max
End Enum
Public Shared m_COLS_NAME(,) As String = {
{"序号", "0"},
{"工艺流程", "1"},
{"料号PN", "1"},
{"物料名称", "0"},
{"规格描述", "0"},
{"单位", "0"},
{"用量", "1"},
{"使用位置", "1"},
{"父料号", "1"},
{"图片", "0"},
{"备注", "1"},
{"单价", "1"},
{"单位总价", "1"}
}
Public Shared m_ProcessRoutingTable() As String = {
"Bonding",
"SMT",
"DIP",
"成品组装",
"成品包装",
"线外加工",
"其它-1",
"其它-2",
"其它-3",
"其它-4",
"其它-5"
}
Private Sub FillGridHeaderByDataTable()
Grid1.NewFile()
Grid1.AllowUserSort = False
Grid1.DisplayFocusRect = False
Grid1.ExtendLastCol = True
Grid1.DisplayRowArrow = True
Grid1.BoldFixedCell = False
Grid1.SortIndicatorStyle = FlexCell.SortIndicatorStyleEnum.Light3D
Grid1.Cols = COLS.max
For col As Integer = 0 To COLS.max - 1
Grid1.Cell(0, col).Text = m_COLS_NAME(col, 0)
Next
Grid1.Column(COLS.父料号).CellType = FlexCell.CellTypeEnum.CheckBox
Grid1.Column(COLS.工艺流程).CellType = FlexCell.CellTypeEnum.ComboBox
With Grid1.ComboBox(COLS.工艺流程)
.DataSource = m_ProcessRoutingTable
.Locked = False
.AutoComplete = True
End With
'调整宽度
Grid1.Column(COLS.序号).Width = My.Settings.FORM_BOM_COL_WIDTH_序号
Grid1.Column(COLS.工艺流程).Width = My.Settings.FORM_BOM_COL_WIDTH_工艺流程
Grid1.Column(COLS.料号PN).Width = My.Settings.FORM_BOM_COL_WIDTH_料号PN
Grid1.Column(COLS.物料名称).Width = My.Settings.FORM_BOM_COL_WIDTH_物料名称
Grid1.Column(COLS.规格描述).Width = My.Settings.FORM_BOM_COL_WIDTH_规格描述
Grid1.Column(COLS.单位).Width = My.Settings.FORM_BOM_COL_WIDTH_单位
Grid1.Column(COLS.用量).Width = My.Settings.FORM_BOM_COL_WIDTH_用量
Grid1.Column(COLS.使用位置).Width = My.Settings.FORM_BOM_COL_WIDTH_使用位置
Grid1.Column(COLS.父料号).Width = My.Settings.FORM_BOM_COL_WIDTH_父料号
Grid1.Column(COLS.图片).Width = My.Settings.FORM_BOM_COL_WIDTH_图片
Grid1.Column(COLS.备注).Width = My.Settings.FORM_BOM_COL_WIDTH_备注
Me.Height = My.Settings.FORM_BOM_HEIGHT
Me.Width = My.Settings.FORM_BOM_WIDTH
''Dim row As Integer
'Dim col As Integer
'If m_Table.Columns.Count > 0 Then
' Grid1.Cols = m_Table.Columns.Count
' For col = 0 To m_Table.Columns.Count - 1
' If m_Table.Columns(col).DataType.Name = "Boolean" Then
' Grid1.Column(col).CellType = FlexCell.CellTypeEnum.CheckBox
' End If
' Grid1.Cell(0, col).Text = m_Table.Columns(col).ColumnName
' Next
'End If
'For i As Integer = 1 To Grid1.Rows - 1
' Grid1.Cell(i, 0).Text = i
'Next
Grid1.AllowUserSort = True
Grid1.Locked = False
Grid1.Column(COLS.序号).Locked = True
Grid1.Rows = 500
Application.DoEvents()
End Sub
Private Sub FillGridByDataTable()
Dim row As Integer
Dim col As Integer
'Grid1.AutoRedraw = False
If Grid1.Rows < m_Table.Rows.Count Then
Grid1.Rows = m_Table.Rows.Count + 100
End If
Dim insertRow As Integer = 0
If m_Table.Rows.Count > 0 Then
For row = 0 To m_Table.Rows.Count - 1
insertRow = row + 1
Grid1.Cell(insertRow, COLS.序号).Text = insertRow
'Dim queryCol As Integer = 1
Dim queryCol As Integer = 0
For col = 0 To COLS.max - 1
If m_COLS_NAME(col, 1) = "1" Then
Try
Grid1.Cell(insertRow, col).Text = m_Table.Rows.Item(row).Item(queryCol)
Catch ex As Exception
Grid1.Cell(insertRow, col).Text = ""
End Try
queryCol += 1
End If
Next
Next
End If
'Grid1.AutoRedraw = True
'Grid1.Refresh()
End Sub
Private Function QueryBom(ByVal BomName As String, ByRef dataTable As Data.DataTable) As Boolean
Dim strSelect As String = "SELECT * FROM `" & "bom_" & BomName & "`"
'查询入库数量
Dim result As Boolean = False
Dim strSQL As String = strSelect
dataTable.Rows.Clear()
dataTable.Columns.Clear()
If SQL_Query(COL_RIGHTS.BOM管理, strSQL, dataTable) = True Then
result = True
End If
Return result
End Function
Private Function CheckBomExist(ByVal bomName As String, ByRef isExist As Boolean) As Boolean
Dim strSQL As String = "CHECK TABLE `" & "bom_" & bomName & "`" 'CHECK TABLE `BOM_U01-ATMEGA328P-TQFP32`
Dim result As Boolean = False
m_Table.Rows.Clear()
m_Table.Columns.Clear()
isExist = False
If SQL_Query(COL_RIGHTS.BOM管理, strSQL, m_Table) = True Then
If m_Table.Rows.Count > 0 Then
If m_Table.Rows(0).Item(3) = "OK" Then
isExist = True
End If
End If
result = True
End If
Return result
End Function
Private Function DropBom(ByVal bomName As String) As Boolean
Dim strSQL As String = "DROP TABLE IF EXISTS `" & "bom_" & bomName & "`"
Dim result As Boolean = False
If SQL_ExeCommand(COL_RIGHTS.BOM管理, strSQL) = True Then
result = True
End If
Return result
End Function
Private Function CreateBom(ByVal bomName As String) As Boolean
Dim strSQL As String = "CREATE TABLE IF NOT EXISTS `" & "bom_" & bomName & "` Like `" & "bom_" & m_BomTemplateName & "`"
Dim result As Boolean = False
If SQL_ExeCommand(COL_RIGHTS.BOM管理, strSQL) = True Then
result = True
End If
Return result
End Function
Private Function CreateContextBom(ByVal bomName As String) As Boolean
Dim strSQL As String = "CREATE TABLE IF NOT EXISTS `" & "bom_" & bomName & "` Like `" & "bom_" & m_BomTemplateName & "_context`"
Dim result As Boolean = False
If SQL_ExeCommand(COL_RIGHTS.BOM管理, strSQL) = True Then
result = True
End If
Return result
End Function
Private Function RenameBom(ByVal oldName As String, ByVal newName As String) As Boolean
Dim strSQL As String = "ALTER TABLE `" & "bom_" & oldName & "`" & " RENAME TO `" & "bom_" & newName & "`"
Dim result As Boolean = False
If SQL_ExeCommand(COL_RIGHTS.BOM管理, strSQL) = True Then
result = True
End If
Return result
End Function
Private Sub btNew_Click(sender As Object, e As EventArgs)
Dim inputDlg As New dlg_Input
inputDlg.Text = "请输入新建的料号"
inputDlg.tb_Input.MaxLength = 32
inputDlg.tb_Input.CharacterCasing = CharacterCasing.Upper
If inputDlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then Return
m_CurrentBomPN = ""
If inputDlg.tb_Input.Text.Length = 0 Then
MsgBox("输入料号不能为空")
Return
End If
Dim inputBomSn As String = inputDlg.tb_Input.Text
'检查输入料号是否有效
Dim isExist As Boolean = False
If m_PartNumber.CheckPartNumber(inputBomSn, isExist) = ERROR_CODE.SUCCESS Then
If isExist = False Then
MsgBox("输入料号不存在!")
Return
End If
Else
MsgBox("无法查询输入料号,请检查网络连接!")
Return
End If
'检测输入料号的料表是否已经存在
If CheckBomExist(inputBomSn, isExist) = True Then
If isExist = True Then
MsgBox("输入料号料表已经存在")
Return
End If
Else
MsgBox("无法查询输入料号对应的料表是否存在,请检查网络连接!")
Return
End If
m_CurrentBomPN = inputBomSn
lbl_CurrentPN.Text = "当前料表料号:" & m_CurrentBomPN
'查询料表模板
If QueryBom(m_BomTemplateName, m_Table) = True Then
FillGridHeaderByDataTable()
End If
End Sub
'Private Sub Grid1_LeaveRow(Sender As Object, e As FlexCell.Grid.LeaveRowEventArgs) Handles Grid1.LeaveRow
' If e.Row > 0 Then
' If Grid1.Cell(e.Row, COLS.料号PN).Text.Length > 0 Then
' Grid1.Cell(e.Row, COLS.序号).Text = e.Row
' End If
' End If
'End Sub
Private Sub btSave_Click(sender As Object, e As EventArgs) Handles btSave.Click
If m_CurrentBomPN.Length = 0 Then
MsgBox("未指定当前BOM料号!")
Return
End If
'检查输入料号是否有效
Dim isExist As Boolean = False
If m_PartNumber.CheckPartNumber(m_CurrentBomPN, isExist) = ERROR_CODE.SUCCESS Then
If isExist = False Then
MsgBox("输入料号不存在!")
Return
End If
Else
MsgBox("无法查询输入料号,请检查网络连接!")
Return
End If
'检测内容中的PN字段有效性
If CheckPNValid() = False Then
MsgBox("输入信息存在错误,不能进行保存!")
Return
End If
'创建料号表
If SaveBom(m_CurrentBomPN) = False Then
MsgBox("保存料表失败")
Return
End If
MsgBox("保存料表:" & m_CurrentBomPN & "成功")
End Sub
Private Function CheckPNValid() As Boolean
Dim row As Integer
'清除背景颜色
For row = 1 To Grid1.Rows - 1
Grid1.Cell(row, COLS.料号PN).BackColor = Color.White
Grid1.Cell(row, COLS.用量).BackColor = Color.White
Grid1.Cell(row, COLS.序号).Text = ""
Next
'检测料表输入数据是否有效
Dim strPN As String
Dim isExist As Boolean = False
Dim checkResult As Boolean = True
Dim m_SN As Integer = 1
Dim m_Number As Long
For row = 1 To Grid1.Rows - 1
strPN = Grid1.Cell(row, COLS.料号PN).Text
If strPN.Length > 0 Then
'检测料号有效性
If m_PartNumber.CheckPartNumber(strPN, isExist) = ERROR_CODE.SUCCESS Then
If isExist = True Then
Grid1.Cell(row, COLS.料号PN).BackColor = Color.Green
Else
checkResult = False
Grid1.Cell(row, COLS.料号PN).BackColor = Color.Red
End If
Else
checkResult = False
Grid1.Cell(row, COLS.料号PN).BackColor = Color.Red
End If
'检测“用量”列,是否为数据
Try
m_Number = Grid1.Cell(row, COLS.用量).Text
Grid1.Cell(row, COLS.用量).BackColor = Color.Green
Catch ex As Exception
Grid1.Cell(row, COLS.用量).BackColor = Color.Red
checkResult = False
End Try
Grid1.Cell(row, COLS.序号).Text = m_SN
m_SN += 1
End If
Next
Return checkResult
End Function
Private Function SaveBomItems(ByVal bomName As String) As Boolean
Dim row As Integer
Dim col As Integer
Dim result As Boolean = True
'INSERT INTO table_name(col_name,...) values(expr,...)
Dim strInsert As String = "INSERT INTO `" & "bom_" & bomName & "` "
Dim insertItems As String = ""
For col = 0 To COLS.max - 3
If m_COLS_NAME(col, 1) = "1" Then
If insertItems.Length > 0 Then
insertItems &= ","
End If
insertItems &= "`" & m_COLS_NAME(col, 0) & "`"
End If
Next
For row = 1 To Grid1.Rows - 1
If Grid1.Cell(row, COLS.料号PN).BackColor = Color.Green Then
Dim insertValues As String = ""
For col = 0 To COLS.max - 3
If m_COLS_NAME(col, 1) = "1" Then
If insertValues.Length > 0 Then
insertValues &= ","
End If
If Grid1.Column(col).CellType = FlexCell.CellTypeEnum.CheckBox Then
If Grid1.Cell(row, col).BooleanValue = True Then
insertValues &= "'1'"
Else
insertValues &= "'0'"
End If
Else
insertValues &= "'" & Grid1.Cell(row, col).Text & "'"
End If
End If
Next
Dim strSQL As String = strInsert & "(" & insertItems & ") values(" & insertValues & ")"
If SQL_ExeCommand(COL_RIGHTS.BOM管理, strSQL) = False Then
result = False
Exit For
End If
End If
Next
Return result
End Function
Private Function SaveBom(ByVal bomName As String) As Boolean
'删除原Bom
'If DropBom(bomName) = False Then Return False
'MsgBox("DropBOM OK!")
'创建新Bom
Dim tempBom As String = bomName & "_temp"
If CreateBom(tempBom) = False Then Return False
'MsgBox("CreateBom OK!")
'保存Bom内容
If SaveBomItems(tempBom) = False Then Return False
'MsgBox("SaveBomItems OK!")
'删除原Bom
If DropBom(bomName) = False Then Return False
'重命名新BOM
If RenameBom(tempBom, bomName) = False Then Return False
Return True
End Function
Private Function SaveBomItems2(tempBom) As Boolean
Dim result As Boolean = True
Dim cmdText As New StringBuilder
Dim insertStr As New StringBuilder
insertStr.Append($"INSERT INTO `bom_{tempBom}` ")
insertStr.Append("(")
insertStr.Append($"`{SourceGridCols.使用位置}`,")
insertStr.Append($"`{SourceGridCols.用量}`,")
insertStr.Append($"`{SourceGridCols.工艺流程}`,")
insertStr.Append($"`{SourceGridCols.料号PN}`")
insertStr.Append(")")
insertStr.Append(" values")
For i = 1 To GrdSourceBom.Rows - 1
If String.IsNullOrEmpty(GrdSourceBom.Cell(i, SourceGridCols.注释).Text) Then
If String.IsNullOrEmpty(GrdSourceBom.Cell(i, SourceGridCols.料号PN).Text) Then
Continue For
End If
End If
cmdText.Clear()
cmdText.Append(insertStr.ToString)
cmdText.Append("(")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.使用位置).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.用量).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.工艺流程).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.料号PN).Text}'")
cmdText.Append(")")
If SQL_ExeCommand(COL_RIGHTS.BOM管理, cmdText.ToString) = False Then
result = False
Exit For
End If
Next
Return result
End Function
'''
''' 保存BOM临时表
'''
'''
'''
Private Function SaveBom2(bomName As String) As Boolean
'创建新Bom
Dim tempBom As String = bomName & "_temp"
If CreateBom(tempBom) = False Then Return False
'保存Bom内容
If SaveBomItems2(tempBom) = False Then Return False
'删除原Bom
If DropBom(bomName) = False Then Return False
'重命名新BOM
If RenameBom(tempBom, bomName) = False Then Return False
Return True
End Function
Private Function SaveBomContextItems(tempBom) As Boolean
Dim result As Boolean = True
'INSERT INTO table_name(col_name,...) values(expr,...)
Dim cmdText As New StringBuilder
Dim insertStr As New StringBuilder
insertStr.Append($"INSERT INTO `bom_{tempBom}` ")
insertStr.Append("(")
insertStr.Append($"`{SourceGridCols.注释}`,")
insertStr.Append($"`{SourceGridCols.使用位置}`,")
insertStr.Append($"`{SourceGridCols.型号}`,")
insertStr.Append($"`{SourceGridCols.用量}`,")
insertStr.Append($"`{SourceGridCols.校验}`,")
insertStr.Append($"`{SourceGridCols.工艺流程}`,")
insertStr.Append($"`{SourceGridCols.料号PN}`")
insertStr.Append(")")
insertStr.Append(" values")
For i = 1 To GrdSourceBom.Rows - 1
If String.IsNullOrEmpty(GrdSourceBom.Cell(i, SourceGridCols.注释).Text) Then
If String.IsNullOrEmpty(GrdSourceBom.Cell(i, SourceGridCols.料号PN).Text) Then
Continue For
End If
End If
cmdText.Clear()
cmdText.Append(insertStr.ToString)
cmdText.Append("(")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.注释).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.使用位置).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.型号).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.用量).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.校验).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.工艺流程).Text}',")
cmdText.Append($"'{GrdSourceBom.Cell(i, SourceGridCols.料号PN).Text}'")
cmdText.Append(")")
If SQL_ExeCommand(COL_RIGHTS.BOM管理, cmdText.ToString) = False Then
result = False
Exit For
End If
Next
Return result
End Function
'''
''' 保存BOM临时表
'''
'''
'''
Private Function SaveBomContext(bomName As String) As Boolean
'创建新Bom
Dim oldBom As String = bomName & "_context"
Dim tempBom As String = bomName & "_context" & "_temp"
If CreateContextBom(tempBom) = False Then Return False
'保存Bom内容
If SaveBomContextItems(tempBom) = False Then Return False
'删除原Bom
If DropBom(oldBom) = False Then Return False
'重命名新BOM
If RenameBom(tempBom, oldBom) = False Then Return False
Return True
End Function
Private Sub PushToBomPath(ByVal bomName As String)
m_BomPath.Add(m_CurrentBomPN)
RefreshBomPath()
End Sub
Private Function PopFromBomPath() As String
Dim backBomName As String = ""
If m_BomPath.Count >= 2 Then
m_BomPath.RemoveAt(m_BomPath.Count - 1)
backBomName = m_BomPath.Item(m_BomPath.Count - 1)
m_BomPath.RemoveAt(m_BomPath.Count - 1)
End If
RefreshBomPath()
Return backBomName
End Function
Private Sub RefreshBomPath()
Dim tempPath As String = ""
For Each pItem As String In m_BomPath
If tempPath.Length > 0 Then
tempPath &= "\"
End If
tempPath &= pItem
Next
lblBomPath.Text = tempPath
If m_BomPath.Count >= 2 Then
btOpenBack.Enabled = True
Else
btOpenBack.Enabled = False
End If
btOpenNext.Enabled = False
Application.DoEvents()
End Sub
Private Function OpenBom(ByVal bomName As String) As Boolean
Dim result As Boolean = False
'检查输入料号是否有效
Dim isExist As Boolean = False
If m_PartNumber.CheckPartNumber(bomName, isExist) = ERROR_CODE.SUCCESS Then
If isExist = False Then
MsgBox("输入料号不存在!")
Return False
End If
Else
MsgBox("无法查询输入料号,请检查网络连接!")
Return False
End If
'检测输入料号的料表是否已经存在
If CheckBomExist(bomName, isExist) = True Then
If isExist = True Then
m_CurrentBomPN = bomName
lbl_CurrentPN.Text = "当前料表料号:" & m_CurrentBomPN
'查询料表模板
If QueryBom(m_CurrentBomPN, m_Table) = True Then
PushToBomPath(m_CurrentBomPN)
FillGridHeaderByDataTable()
FillGridByDataTable()
If chk_ShowPnInfo.Checked = True Then
GetAllPNItemInfo()
End If
result = True
End If
Else
If MessageBox.Show("输入料号BOM不存在,是否新建BOM?" & vbNewLine & "选择""是""新建, 否则""取消""", "新建BOM?", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
m_CurrentBomPN = bomName
lbl_CurrentPN.Text = "当前料表料号:" & m_CurrentBomPN
'查询料表模板
If QueryBom(m_BomTemplateName, m_Table) = True Then
PushToBomPath(m_CurrentBomPN)
FillGridHeaderByDataTable()
result = True
End If
End If
End If
Else
MsgBox("无法查询输入料号对应的BOM是否存在,请检查网络连接!")
End If
Return result
End Function
'''
''' 加载临时Bom表
'''
'''
'''
Private Function OpenBomContext(bomName As String) As Boolean
'检查输入料号是否有效
Dim isExist As Boolean = False
If m_PartNumber.CheckPartNumber(bomName, isExist) = ERROR_CODE.SUCCESS Then
If isExist = False Then
MsgBox("输入料号不存在!")
Return False
End If
Else
MsgBox("无法查询输入料号,请检查网络连接!")
Return False
End If
'检测输入料号的料表是否已经存在
If CheckBomExist(bomName, isExist) = False Then
MsgBox("无法查询输入料号对应的BOM是否存在,请检查网络连接!")
Return False
End If
Dim tbName As String '数据表名
If isExist = False Then
If MessageBox.Show($"输入料号BOM不存在,是否新建BOM?{vbNewLine}选择""是""新建, 否则""取消""", "新建BOM?", MessageBoxButtons.YesNo) <> Windows.Forms.DialogResult.Yes Then
Return False
End If
tbName = $"bom_模板_context"
Else
tbName = $"bom_{bomName}_context"
End If
lbl_CurrentPN.Text = "当前料表料号:" & bomName
'查询云端数据
Dim strSQL As String = $"Select * From `{tbName}` order by `ID` asc"
Dim dtTable As New DataTable
If SQL_Query(COL_RIGHTS.BOM管理, strSQL, dtTable) = False Then Return False
'名称有所变化(不明作用)
' PushToBomPath(bomName)
'填充至表格
InitSourceGrid() '初始化表格
GrdSourceBom.AutoRedraw = False
For i = 0 To dtTable.Rows.Count - 1
GrdSourceBom.Cell(i + 1, SourceGridCols.注释).Text = dtTable(i)($"{SourceGridCols.注释}").ToString
GrdSourceBom.Cell(i + 1, SourceGridCols.使用位置).Text = dtTable(i)($"{SourceGridCols.使用位置}").ToString
GrdSourceBom.Cell(i + 1, SourceGridCols.型号).Text = dtTable(i)($"{SourceGridCols.型号}").ToString
GrdSourceBom.Cell(i + 1, SourceGridCols.用量).Text = dtTable(i)($"{SourceGridCols.用量}").ToString
GrdSourceBom.Cell(i + 1, SourceGridCols.校验).Text = dtTable(i)($"{SourceGridCols.校验}").ToString
GrdSourceBom.Cell(i + 1, SourceGridCols.工艺流程).Text = dtTable(i)($"{SourceGridCols.工艺流程}").ToString
GrdSourceBom.Cell(i + 1, SourceGridCols.料号PN).Text = dtTable(i)($"{SourceGridCols.料号PN}").ToString
Next
GrdSourceBom.AutoRedraw = True
GrdSourceBom.Refresh()
If chk_ShowPnInfo.Checked Then
GetAllPnInfo()
End If
Return True
End Function
Private Sub btQueryBom_Click(sender As Object, e As EventArgs) Handles btQueryBom.Click
m_CurrentBomPN = ""
m_BomPath.Clear()
If tbBomPN.Text.Length = 0 Then
MsgBox("输入料号不能为空")
Return
End If
If TabControl1.SelectedIndex = 0 Then
OpenBom(tbBomPN.Text)
ElseIf TabControl1.SelectedIndex = 2 Then
OpenBomContext(tbBomPN.Text) '加载临时BOM
End If
End Sub
Private Function GetPNItemInfo(ByVal gridRowIndex As Integer) As Boolean
Dim 物料名称 As String = ""
Dim 规格描述 As String = ""
Dim 单位 As String = ""
Dim 单重 As Double = 0
Dim 图片(0) As Byte
Dim 供应商ID As String = ""
Dim 用量 As String = Grid1.Cell(gridRowIndex, 6).IntegerValue
'Grid1.Cell(gridRowIndex, COLS.物料名称).Text = ""
'Grid1.Cell(gridRowIndex, COLS.规格描述).Text = ""
'Grid1.Cell(gridRowIndex, COLS.单位).Text = ""
'Grid1.Cell(gridRowIndex, COLS.单价).Text = ""
'Grid1.Cell(gridRowIndex, COLS.单位总价).Text = ""
'Grid1.Cell(gridRowIndex, COLS.图片).Text = ""
Dim result As Boolean = False
Dim strPn As String = Grid1.Cell(gridRowIndex, COLS.料号PN).Text
'If chk_ShowPnImage.Checked = True Then
' If m_PartNumber.QueryItem(strPn, 物料名称, 规格描述, 单位, 单重, 图片, 供应商ID) = ERROR_CODE.SUCCESS Then
' Grid1.Cell(gridRowIndex, COLS.物料名称).Text = 物料名称
' Grid1.Cell(gridRowIndex, COLS.规格描述).Text = 规格描述
' Grid1.Cell(gridRowIndex, COLS.单位).Text = 单位
' Grid1.Cell(gridRowIndex, COLS.单价).Text = 单重
' Grid1.Cell(gridRowIndex, COLS.单位总价).Text = 单重 * 用量
' Grid1.Cell(gridRowIndex, COLS.图片).Text = ""
' Dim mImage As System.Drawing.Image = GetImageFromBytes(图片)
' If Grid1.Images.Count >= gridRowIndex Then
' Grid1.Images.Remove(gridRowIndex.ToString)
' End If
' Grid1.Images.Add(mImage, gridRowIndex.ToString)
' Grid1.Cell(gridRowIndex, COLS.图片).SetImage(gridRowIndex.ToString)
' result = True
' End If
'Else
' If m_PartNumber.QueryItem(strPn, 物料名称, 规格描述, 单位, 单重, 供应商ID) = ERROR_CODE.SUCCESS Then
' Grid1.Cell(gridRowIndex, COLS.物料名称).Text = 物料名称
' Grid1.Cell(gridRowIndex, COLS.规格描述).Text = 规格描述
' Grid1.Cell(gridRowIndex, COLS.单位).Text = 单位
' Grid1.Cell(gridRowIndex, COLS.单价).Text = 单重
' Grid1.Cell(gridRowIndex, COLS.单位总价).Text = 单重 * 用量
' Grid1.Cell(gridRowIndex, COLS.图片).Text = ""
' result = True
' End If
'End If
If chk_ShowPnImage.Checked = True Then
If m_PartNumber.QueryItem(strPn, 物料名称, 规格描述, 单位, 单重, 图片, 供应商ID) = ERROR_CODE.SUCCESS Then
'填充图像
Dim mImage As System.Drawing.Image = GetImageFromBytes(图片)
If Grid1.Images.Count >= gridRowIndex Then
Grid1.Images.Remove(gridRowIndex.ToString)
End If
Grid1.Images.Add(mImage, gridRowIndex.ToString)
Grid1.Cell(gridRowIndex, COLS.图片).SetImage(gridRowIndex.ToString)
result = True
End If
Else
If m_PartNumber.QueryItem(strPn, 物料名称, 规格描述, 单位, 单重, 供应商ID) = ERROR_CODE.SUCCESS Then
result = True
End If
End If
Grid1.Cell(gridRowIndex, COLS.物料名称).Text = 物料名称
Grid1.Cell(gridRowIndex, COLS.规格描述).Text = 规格描述
Grid1.Cell(gridRowIndex, COLS.单位).Text = 单位
Grid1.Cell(gridRowIndex, COLS.单价).Text = 单重
Grid1.Cell(gridRowIndex, COLS.单位总价).Text = 单重 * 用量
Grid1.Cell(gridRowIndex, COLS.图片).Text = ""
Return result
End Function
Private Function GetAllPNItemInfo() As Boolean
Dim TotalCost As Double = 0
Dim AvailabeRows As Integer = 0
For row As Integer = 1 To Grid1.Rows - 1
Grid1.Cell(row, COLS.物料名称).Text = ""
Grid1.Cell(row, COLS.规格描述).Text = ""
Grid1.Cell(row, COLS.单位).Text = ""
Grid1.Cell(row, COLS.单价).Text = ""
Grid1.Cell(row, COLS.单位总价).Text = ""
Grid1.Cell(row, COLS.图片).Text = ""
Next
Grid1.Images.Clear()
Dim result As Boolean = True
For row As Integer = 1 To Grid1.Rows - 1
AvailabeRows = AvailabeRows + 1
If GetPNItemInfo(row) = False Then
result = False
Exit For
End If
TotalCost = TotalCost + Grid1.Cell(row, COLS.单位总价).Text
Next
Grid1.Cell(AvailabeRows, COLS.单位总价 - 1).Text = "Total : "
Grid1.Cell(AvailabeRows, COLS.单位总价).Text = TotalCost
Return result
End Function
Private Sub Grid1_LeaveCell(Sender As Object, e As FlexCell.Grid.LeaveCellEventArgs) Handles Grid1.LeaveCell
If e.Row > 1 AndAlso e.Col = COLS.料号PN Then
If Grid1.Cell(e.Row, e.Col).Text.Length > 0 Then
Dim inputBomPn As String = Grid1.Cell(e.Row, e.Col).Text.ToUpper
Grid1.Cell(e.Row, e.Col).Text = inputBomPn
Dim isExist As Boolean = False
If m_PartNumber.CheckPartNumber(inputBomPn, isExist) = ERROR_CODE.SUCCESS Then
If isExist = True Then
If chk_ShowPnInfo.Checked = True Then
GetPNItemInfo(e.Row)
End If
Else
Grid1.Cell(e.Row, e.Col).BackColor = Color.Red
End If
Else
MsgBox("无法查询输入料号,请检查网络连接!")
Return
End If
End If
End If
End Sub
Private Sub form_BomManage_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
My.Settings.FORM_BOM_COL_WIDTH_序号 = Grid1.Column(COLS.序号).Width
My.Settings.FORM_BOM_COL_WIDTH_工艺流程 = Grid1.Column(COLS.工艺流程).Width
My.Settings.FORM_BOM_COL_WIDTH_料号PN = Grid1.Column(COLS.料号PN).Width
My.Settings.FORM_BOM_COL_WIDTH_物料名称 = Grid1.Column(COLS.物料名称).Width
My.Settings.FORM_BOM_COL_WIDTH_规格描述 = Grid1.Column(COLS.规格描述).Width
My.Settings.FORM_BOM_COL_WIDTH_单位 = Grid1.Column(COLS.单位).Width
My.Settings.FORM_BOM_COL_WIDTH_用量 = Grid1.Column(COLS.用量).Width
My.Settings.FORM_BOM_COL_WIDTH_使用位置 = Grid1.Column(COLS.使用位置).Width
My.Settings.FORM_BOM_COL_WIDTH_父料号 = Grid1.Column(COLS.父料号).Width
My.Settings.FORM_BOM_COL_WIDTH_图片 = Grid1.Column(COLS.图片).Width
My.Settings.FORM_BOM_COL_WIDTH_备注 = Grid1.Column(COLS.备注).Width
My.Settings.FORM_BOM_HEIGHT = Me.Height
My.Settings.FORM_BOM_WIDTH = Me.Width
My.Settings.Save()
End Sub
Private Sub btInsertRow_Click(sender As Object, e As EventArgs) Handles btInsertRow.Click
Grid1.Selection.InsertRows()
End Sub
Private Sub btDeleteRow_Click(sender As Object, e As EventArgs) Handles btDeleteRow.Click
Grid1.Selection.DeleteByRow()
End Sub
Private Sub btUpdate_Click(sender As Object, e As EventArgs) Handles btUpdate.Click
GetAllPNItemInfo()
End Sub
Private Sub btOpenFatherPN_Click(sender As Object, e As EventArgs) Handles btOpenNext.Click
Dim selRow As Integer = Grid1.Selection.FirstRow
If selRow >= 1 Then
If Grid1.Cell(selRow, COLS.父料号).BooleanValue = True Then
tbBomPN.Text = Grid1.Cell(Grid1.Selection.FirstRow, COLS.料号PN).Text
OpenBom(tbBomPN.Text)
Else
MsgBox("选择项不是父料号,无法打开")
End If
End If
End Sub
Private Sub btOpenBack_Click(sender As Object, e As EventArgs) Handles btOpenBack.Click
tbBomPN.Text = PopFromBomPath()
If tbBomPN.Text.Length > 0 Then
OpenBom(tbBomPN.Text)
End If
End Sub
Private Sub form_BomManage_Load(sender As Object, e As EventArgs) Handles MyBase.Load
FillGridHeaderByDataTable()
m_BomPath.Clear()
RefreshBomPath()
btOpenNext.Enabled = False
InitSourceGrid()
End Sub
Private Sub Grid1_MouseClick(sender As Object, e As MouseEventArgs) Handles Grid1.MouseClick
btOpenNext.Enabled = False
If Grid1.Selection.FirstRow >= 1 Then
If Grid1.Cell(Grid1.Selection.FirstRow, COLS.父料号).BooleanValue = True Then
If Grid1.Cell(Grid1.Selection.FirstRow, COLS.料号PN).Text.Length > 0 Then
btOpenNext.Enabled = True
End If
End If
End If
End Sub
Private Sub Grid1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles Grid1.MouseDoubleClick
Dim selRow As Integer = Grid1.Selection.FirstRow
Dim selCol As Integer = Grid1.Selection.FirstCol
If Grid1.Selection.FirstRow >= 1 Then
If Grid1.Selection.FirstCol = COLS.图片 Then
Dim imageKey As String = Grid1.Cell(selRow, selCol).ImageKey
If Not imageKey Is Nothing AndAlso imageKey.Length > 0 Then
Dim mImage As System.Drawing.Image = Grid1.Images.Item(imageKey).Picture
If Not mImage Is Nothing Then
Dim dlgImage As New dlgImage
dlgImage.Text = Grid1.Cell(selRow, COLS.料号PN).Text
dlgImage.BackgroundImage = mImage
dlgImage.ShowDialog()
End If
End If
End If
End If
End Sub
Private Sub tbBomPN_KeyDown(sender As Object, e As KeyEventArgs) Handles tbBomPN.KeyDown
If e.KeyCode = Keys.Enter Then
btQueryBom.PerformClick()
End If
End Sub
Private Sub chk_ShowPnImage_CheckedChanged(sender As Object, e As EventArgs) Handles chk_ShowPnImage.CheckedChanged
If chk_ShowPnImage.Checked = False Then
Grid1.Images.Clear()
End If
End Sub
Private Sub btDelete_Click(sender As Object, e As EventArgs) Handles btDelete.Click
If m_CurrentBomPN.Length = 0 Then
MsgBox("未指定当前BOM料号!")
Return
End If
'检查输入料号是否有效
Dim isExist As Boolean = False
If m_PartNumber.CheckPartNumber(m_CurrentBomPN, isExist) = ERROR_CODE.SUCCESS Then
If isExist = False Then
MsgBox("输入料号不存在!")
Return
End If
Else
MsgBox("无法查询输入料号,请检查网络连接!")
Return
End If
'检测Bom表是否存在
isExist = False
If CheckBomExist(m_CurrentBomPN, isExist) = False Then
MsgBox("指定料号对应BOM不存在!")
Return
End If
If MessageBox.Show("确认删除指定BOM:" & m_CurrentBomPN & ",删除后无法恢复!", "BOM:" & m_CurrentBomPN & "删除确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.OK Then
'删除料号表
If DropBom(m_CurrentBomPN) = False Then
MsgBox("删除料表失败")
Return
End If
MsgBox("删除料表:" & m_CurrentBomPN & "成功")
End If
End Sub
Private Sub bt_Export_Click(sender As Object, e As EventArgs) Handles bt_Export.Click
Dim dlg As New SaveFileDialog()
dlg.DefaultExt = "xls"
dlg.Filter = "Excel File|*.xls"
If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then Return
If Grid1.ExportToExcel(dlg.FileName, True, True) Then
MsgBox("保存为Excel成功:" & dlg.FileName)
Else
MsgBox("保存失败!")
End If
End Sub
'2021/10/06 Qizengbiao修改
#Region "数据查询"
Public Function GetLikeString(ByVal likestr As String) As String
Dim rString As String = ""
Dim ch As Char
For i As Integer = 1 To likestr.Length
ch = Strings.GetChar(likestr, i)
If ch = "%" OrElse ch = "_" OrElse ch = "/" Then
rString &= "/"
End If
rString &= ch
Next
Return rString
End Function
Private Sub QueryData_Quick(partNumber As String, partName As String, partDesc As String, hasInhaos As Boolean, hasJohao As Boolean)
Dim strSQL As String = "SELECT `" &
CPartNumber.m_COLS_NAME(CPartNumber.COLS.料号PN) & "`,`" &
CPartNumber.m_COLS_NAME(CPartNumber.COLS.物料名称) & "`,`" &
CPartNumber.m_COLS_NAME(CPartNumber.COLS.规格描述) & "`,`" &
CPartNumber.m_COLS_NAME(CPartNumber.COLS.单位) & "`,`" &
CPartNumber.m_COLS_NAME(CPartNumber.COLS.单重) & "`,`" &
CPartNumber.m_COLS_NAME(CPartNumber.COLS.供应商ID) & "`, `" &
CPartNumber.m_COLS_NAME(CPartNumber.COLS.序号) & "`"
strSQL &= " FROM `" & CPartNumber.cst_TABLE_NAME & "`"
If partNumber.Length > 0 OrElse
partName.Length > 0 OrElse
partDesc.Length > 0 OrElse
hasInhaos = True OrElse
hasJohao = True Then
strSQL &= " WHERE "
Dim strSplit() As String
Dim firstLike As Boolean = True
If partNumber.Length > 0 Then
strSplit = Split(partNumber, ",")
For i As Integer = 0 To strSplit.Length - 1
If firstLike = True Then
firstLike = False
Else
strSQL &= " AND "
End If
strSQL &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.料号PN) & "`"
strSQL &= " COLLATE gbk_chinese_ci "
strSQL &= " LIKE '%"
strSQL &= GetLikeString(strSplit(i)) & "%'"
strSQL &= " escape '/'"
Next
End If
If partName.Length > 0 Then
strSplit = Split(partName, ",")
For i As Integer = 0 To strSplit.Length - 1
If firstLike = True Then
firstLike = False
Else
strSQL &= " AND "
End If
strSQL &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.物料名称) & "`"
strSQL &= " COLLATE gbk_chinese_ci "
strSQL &= " LIKE '%"
strSQL &= GetLikeString(strSplit(i)) & "%'"
strSQL &= " escape '/'"
Next
End If
If partDesc.Length > 0 Then
strSplit = Split(partDesc, ",")
For i As Integer = 0 To strSplit.Length - 1
Dim tmp As String = GetLikeString(strSplit(i))
If String.IsNullOrEmpty(tmp) Then Continue For
If firstLike = True Then
firstLike = False
Else
strSQL &= " AND "
End If
Select Case tmp(tmp.Length - 1)'查看是否以R或Ω结尾
Case "R"c
strSQL &= "("
strSQL &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.规格描述) & "`"
strSQL &= " COLLATE gbk_chinese_ci "
strSQL &= " LIKE '%"
strSQL &= tmp & "%'"
strSQL &= " escape '/'"
strSQL &= " or "
strSQL &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.规格描述) & "`"
strSQL &= " COLLATE gbk_chinese_ci "
strSQL &= " LIKE '%"
strSQL &= tmp.Replace("R"c, "Ω"c) & "%'"
strSQL &= " escape '/'"
strSQL &= ")"
Case "Ω"c
strSQL &= "("
strSQL &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.规格描述) & "`"
strSQL &= " COLLATE gbk_chinese_ci "
strSQL &= " LIKE '%"
strSQL &= tmp & "%'"
strSQL &= " escape '/'"
strSQL &= " or "
strSQL &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.规格描述) & "`"
strSQL &= " COLLATE gbk_chinese_ci "
strSQL &= " LIKE '%"
strSQL &= tmp.Replace("Ω"c, "R"c) & "%'"
strSQL &= " escape '/'"
strSQL &= ")"
Case Else
strSQL &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.规格描述) & "`"
strSQL &= " COLLATE gbk_chinese_ci "
strSQL &= " LIKE '%"
strSQL &= GetLikeString(strSplit(i)) & "%'"
strSQL &= " escape '/'"
End Select
Next
End If
Dim customStr As String = ""
If hasInhaos Then
customStr &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.供应商ID) & "` = '02'"
End If
If hasJohao Then
If String.IsNullOrEmpty(customStr) = False Then
customStr &= " OR "
customStr &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.供应商ID) & "` ='01'"
customStr = $"({customStr})"
Else
customStr &= "`" & CPartNumber.m_COLS_NAME(CPartNumber.COLS.供应商ID) & "` ='01'"
End If
End If
If firstLike = True Then
firstLike = False
Else
strSQL &= " AND "
End If
strSQL &= customStr
End If
SQL_Query(COL_RIGHTS.料号管理, strSQL, m_Table)
End Sub
#End Region
Enum SourceGridCols
Sn
注释
使用位置
型号
用量
校验
工艺流程
料号PN
物料名称
规格描述
单位
单价
Max
End Enum
Private Sub InitSourceGrid()
GrdSourceBom.NewFile()
GrdSourceBom.Cols = SourceGridCols.Max
GrdSourceBom.Rows = 500
GrdSourceBom.AutoRedraw = False
GrdSourceBom.DisplayRowNumber = True
GrdSourceBom.ExtendLastCol = True
For i = 0 To GrdSourceBom.Cols - 1
GrdSourceBom.Cell(0, i).Text = [Enum].GetName(GetType(SourceGridCols), i)
Next
GrdSourceBom.Column(SourceGridCols.规格描述).Width = 200
GrdSourceBom.Column(SourceGridCols.校验).CellType = FlexCell.CellTypeEnum.CheckBox
GrdSourceBom.Column(SourceGridCols.工艺流程).CellType = FlexCell.CellTypeEnum.ComboBox
With GrdSourceBom.ComboBox(SourceGridCols.工艺流程)
.DataSource = m_ProcessRoutingTable
.Locked = False
.AutoComplete = True
End With
GrdSourceBom.Range(0, SourceGridCols.校验, GrdSourceBom.Rows - 1, SourceGridCols.校验).BackColor = Color.LightBlue
GrdSourceBom.AutoRedraw = True
GrdSourceBom.Refresh()
End Sub
Enum QueueGridCols
Sn
料号PN
物料名称
规格描述
单位
单重
供应商ID
序号
End Enum
Enum DestBomGridCols
序号
工艺流程
料号PN
物料名称
规格描述
单位
用量
使用位置
单价
单位总价
MAX
End Enum
Private Sub 导出ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 导出ToolStripMenuItem.Click
Using fileDialog As New SaveFileDialog
fileDialog.Filter = "Excel文档(*.xls)|*.xls"
fileDialog.AddExtension = True
If String.IsNullOrEmpty(tbBomPN.Text) Then
fileDialog.FileName = tbBomPN.Text
Else
fileDialog.FileName = tbBomPN.Text & "-BOM"
End If
If fileDialog.ShowDialog <> DialogResult.OK Then Return
GrdSourceBom.ExportToExcel(fileDialog.FileName, True, True)
Dim tmpGrid As New FlexCell.Grid
tmpGrid.DisplayRowNumber = True
tmpGrid.Cols = DestBomGridCols.MAX + 1
tmpGrid.Rows = GrdSourceBom.Rows
tmpGrid.BackColorFixed = tmpGrid.BackColor1
tmpGrid.Cell(0, DestBomGridCols.序号).Text = "序号"
tmpGrid.Cell(0, DestBomGridCols.工艺流程).Text = "工艺流程"
tmpGrid.Cell(0, DestBomGridCols.料号PN).Text = "料号PN"
tmpGrid.Cell(0, DestBomGridCols.物料名称).Text = "物料名称"
tmpGrid.Cell(0, DestBomGridCols.规格描述).Text = "规格描述"
tmpGrid.Cell(0, DestBomGridCols.单位).Text = "单位"
tmpGrid.Cell(0, DestBomGridCols.用量).Text = "用量"
tmpGrid.Cell(0, DestBomGridCols.使用位置).Text = "使用位置"
tmpGrid.Cell(0, DestBomGridCols.单价).Text = "单价"
tmpGrid.Cell(0, DestBomGridCols.单位总价).Text = "单位总价"
tmpGrid.Cell(1, DestBomGridCols.序号 + 1).Text = "序号"
tmpGrid.Cell(1, DestBomGridCols.工艺流程 + 1).Text = "工艺流程"
tmpGrid.Cell(1, DestBomGridCols.料号PN + 1).Text = "料号PN"
tmpGrid.Cell(1, DestBomGridCols.物料名称 + 1).Text = "物料名称"
tmpGrid.Cell(1, DestBomGridCols.规格描述 + 1).Text = "规格描述"
tmpGrid.Cell(1, DestBomGridCols.单位 + 1).Text = "单位"
tmpGrid.Cell(1, DestBomGridCols.用量 + 1).Text = "用量"
tmpGrid.Cell(1, DestBomGridCols.使用位置 + 1).Text = "使用位置"
tmpGrid.Cell(1, DestBomGridCols.单价 + 1).Text = "单价"
tmpGrid.Cell(1, DestBomGridCols.单位总价 + 1).Text = "单位总价"
For i = 2 To tmpGrid.Rows - 1
If String.IsNullOrEmpty(GrdSourceBom.Cell(i, SourceGridCols.料号PN).Text) Then
tmpGrid.Cell(i, DestBomGridCols.单价 + 1).Text = "Totel:"
Dim totel As Double = 0
For j = 2 To i - 1
totel += tmpGrid.Cell(j, DestBomGridCols.单位总价 + 1).DoubleValue
Next
tmpGrid.Cell(i, DestBomGridCols.单位总价 + 1).Text = totel
Continue For
End If
tmpGrid.Cell(i, DestBomGridCols.序号 + 1).Text = i - 1
tmpGrid.Cell(i, DestBomGridCols.工艺流程 + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.工艺流程).Text
tmpGrid.Cell(i, DestBomGridCols.料号PN + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.料号PN).Text
tmpGrid.Cell(i, DestBomGridCols.物料名称 + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.物料名称).Text
tmpGrid.Cell(i, DestBomGridCols.规格描述 + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.规格描述).Text
tmpGrid.Cell(i, DestBomGridCols.单位 + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.单位).Text
tmpGrid.Cell(i, DestBomGridCols.用量 + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.用量).Text
tmpGrid.Cell(i, DestBomGridCols.使用位置 + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.使用位置).Text
tmpGrid.Cell(i, DestBomGridCols.单价 + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.单价).Text
tmpGrid.Cell(i, DestBomGridCols.单位总价 + 1).Text = GrdSourceBom.Cell(i - 1, SourceGridCols.用量).IntegerValue * GrdSourceBom.Cell(i - 1, SourceGridCols.单价).DoubleValue
Next
Try
tmpGrid.ExportToExcel(fileDialog.FileName)
MsgBox($"导出BOM至{fileDialog.FileName}完成!")
Catch ex As Exception
MsgBox($"导出BOM至{fileDialog.FileName}失败,{ex.Message}")
End Try
End Using
End Sub
Private Function GetPartFootPrintNum(footPrint As String) As String
Dim result As New StringBuilder
Dim findPoint As Boolean = False
Dim findNum As Boolean = False
If footPrint.Length = 0 Then Return footPrint
For i = footPrint.Length - 1 To 0 Step -1
Select Case footPrint(i)
Case "0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c
If findNum = False Then findNum = True
result.Insert(0, footPrint(i))
Case "."c
If findNum = False Then Continue For '未查找到数字则忽略小数点
If findPoint Then Exit For '已添加小数点则退出搜索
If findPoint = False Then findPoint = True '变更状态为已添加小数点
result.Insert(0, footPrint(i))
Case Else
If findNum = False Then Continue For '未查找到数字则继续寻找数字
Exit For '已找到数字则退出搜索
End Select
Next
If findNum = False Then Return footPrint '未查找到数字则返回原字符串
If result(0) = "."c Then result.Remove(0, 1) '小数点开头则移除小数点
Return result.ToString
End Function
Private Function GetPartFootComment(footPrint As String) As String
If footPrint.Length = 0 Then Return footPrint
Select Case footPrint(footPrint.Length - 1)
Case "R"c
footPrint &= $",{footPrint.Replace("R"c, "Ω"c)}"
Case "Ω"c
footPrint &= $",{footPrint.Replace("Ω"c, "R"c)}"
End Select
Return footPrint
End Function
Private Sub QueuePart(partDesc As String)
' If String.IsNullOrWhiteSpace(partDesc) Then Return
If partDesc.EndsWith(",") Then
partDesc = partDesc.Remove(partDesc.Length - 1)
End If
QueryData_Quick(tb_PartNumber.Text, tb_Name.Text, partDesc, ckb_Pn_Inhaos.Checked, ckb_PnJohao.Checked)
'初始化表格
GrdQueueResult.DisplayRowNumber = True
GrdQueueResult.AllowUserSort = True
GrdQueueResult.DisplayFocusRect = False
GrdQueueResult.ExtendLastCol = True
GrdQueueResult.DisplayRowArrow = True
GrdQueueResult.BoldFixedCell = False
GrdQueueResult.SortIndicatorStyle = FlexCell.SortIndicatorStyleEnum.Light3D
'将查询结果与表格绑定
GrdQueueResult.SetDataBinding(m_Table, "", True, 1)
GrdQueueResult.Column(QueueGridCols.规格描述).Width = 360
End Sub
Private Sub 查询ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 查询ToolStripMenuItem.Click
If GrdSourceBom.ActiveCell Is Nothing Then Return
Dim row As Integer = GrdSourceBom.ActiveCell.Row
If Not m_Table Is Nothing Then
m_Table.Dispose()
End If
m_Table = New DataTable
'从数据库查询指定内容的物料信息
Dim partComment As String = $"{GrdSourceBom.Cell(row, SourceGridCols.注释).Text.Trim}"
Dim partFootPrint As String = $"{GrdSourceBom.Cell(row, SourceGridCols.型号).Text}"
partFootPrint = GetPartFootPrintNum(partFootPrint)
Dim partDesc As String = partComment
If ChkHasPartType.Checked Then
If partDesc.Length = 0 Then
partDesc = partFootPrint
Else
If partFootPrint.Length > 0 Then partDesc &= $",{partFootPrint}"
End If
End If
tb_Desc.Text = partDesc
QueuePart(partDesc)
End Sub
Private Sub GrdSourceBom_DoubleClick(Sender As Object, e As EventArgs) Handles GrdSourceBom.DoubleClick
If GrdSourceBom.ActiveCell Is Nothing Then Return
Dim row As Integer = GrdSourceBom.ActiveCell.Row
If Not m_Table Is Nothing Then
m_Table.Dispose()
End If
m_Table = New DataTable
'从数据库查询指定内容的物料信息
Dim partComment As String = $"{GrdSourceBom.Cell(row, SourceGridCols.注释).Text.Trim.Replace(" "c, ","c).Replace("\", ",").Replace("/", ",")}"
Dim partFootPrint As String = $"{GrdSourceBom.Cell(row, SourceGridCols.型号).Text}"
partFootPrint = GetPartFootPrintNum(partFootPrint)
Dim partDesc As String = partComment
If ChkHasPartType.Checked Then
If partDesc.Length = 0 Then
partDesc = partFootPrint
Else
If partFootPrint.Length > 0 Then partDesc &= $",{partFootPrint}"
End If
End If
tb_Desc.Text = partDesc
QueuePart(partDesc)
End Sub
Private Sub bt_QueryQuick_Click(sender As Object, e As EventArgs) Handles bt_QueryQuick.Click
QueuePart(tb_Desc.Text)
End Sub
Private Sub GrdQueueResult_DoubleClick(Sender As Object, e As EventArgs) Handles GrdQueueResult.DoubleClick
If GrdSourceBom.ActiveCell Is Nothing Then Return
If GrdSourceBom.Cell(GrdSourceBom.ActiveCell.Row, SourceGridCols.校验).BooleanValue Then Return
GrdSourceBom.Cell(GrdSourceBom.ActiveCell.Row, SourceGridCols.校验).Text = ""
GrdSourceBom.Cell(GrdSourceBom.ActiveCell.Row, SourceGridCols.工艺流程).Text = ""
GrdSourceBom.Cell(GrdSourceBom.ActiveCell.Row, SourceGridCols.料号PN).Text = GrdQueueResult.Cell(GrdQueueResult.ActiveCell.Row, QueueGridCols.料号PN).Text
GrdSourceBom.Cell(GrdSourceBom.ActiveCell.Row, SourceGridCols.物料名称).Text = GrdQueueResult.Cell(GrdQueueResult.ActiveCell.Row, QueueGridCols.物料名称).Text
GrdSourceBom.Cell(GrdSourceBom.ActiveCell.Row, SourceGridCols.规格描述).Text = GrdQueueResult.Cell(GrdQueueResult.ActiveCell.Row, QueueGridCols.规格描述).Text
GrdSourceBom.Cell(GrdSourceBom.ActiveCell.Row, SourceGridCols.单位).Text = GrdQueueResult.Cell(GrdQueueResult.ActiveCell.Row, QueueGridCols.单位).Text
GrdSourceBom.Cell(GrdSourceBom.ActiveCell.Row, SourceGridCols.单价).Text = GrdQueueResult.Cell(GrdQueueResult.ActiveCell.Row, QueueGridCols.单重).Text
End Sub
Private Sub GrdSourceBom_CellChange(Sender As Object, e As FlexCell.Grid.CellChangeEventArgs) Handles GrdSourceBom.CellChange
If e.Col = SourceGridCols.校验 Then
If GrdSourceBom.Cell(e.Row, e.Col).BooleanValue = True Then
GrdSourceBom.Range(e.Row, 1, e.Row, GrdSourceBom.Cols - 1).BackColor = Color.LightGreen
GrdSourceBom.Range(e.Row, 1, e.Row, SourceGridCols.校验 - 1).Locked = True
GrdSourceBom.Range(e.Row, SourceGridCols.校验 + 1, e.Row, GrdSourceBom.Cols - 1).Locked = True
Else
GrdSourceBom.Range(e.Row, 1, e.Row, GrdSourceBom.Cols - 1).BackColor = GrdSourceBom.BackColor1
GrdSourceBom.Cell(e.Row, e.Col).BackColor = Color.LightBlue
GrdSourceBom.Range(e.Row, 1, e.Row, SourceGridCols.校验 - 1).Locked = False
GrdSourceBom.Range(e.Row, SourceGridCols.校验 + 1, e.Row, GrdSourceBom.Cols - 1).Locked = False
End If
End If
End Sub
Private Sub 保存至数据库ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 保存至数据库ToolStripMenuItem.Click
If tbBomPN.Text.Length = 0 Then
MsgBox("未指定当前BOM料号!")
Return
End If
'检查输入料号是否有效
Dim isExist As Boolean = False
If m_PartNumber.CheckPartNumber(m_CurrentBomPN, isExist) = ERROR_CODE.SUCCESS Then
If isExist = False Then
MsgBox("输入料号不存在!")
Return
End If
Else
MsgBox("无法查询输入料号,请检查网络连接!")
Return
End If
'检测内容中的PN字段有效性
If CheckPNValid() = False Then
MsgBox("输入信息存在错误,不能进行保存!")
Return
End If
'创建料号表
If SaveBomContext(tbBomPN.Text) = False Then
MsgBox("保存料表失败")
Return
End If
'保存临时表内容至XMl文件
Try
Dim dirPath As String = Application.StartupPath & "\" & "Context"
IO.Directory.CreateDirectory(dirPath)
GrdSourceBom.ExportToXML($"{dirPath}\{m_CurrentBomPN}_context_{Now:yyyyMMdd_HHmmss}.xml")
Catch ex As Exception
End Try
MsgBox("保存料表:" & tbBomPN.Text & "成功")
End Sub
Private Sub 保存至数据库BOM表ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 保存至数据库BOM表ToolStripMenuItem.Click
If tbBomPN.Text.Length = 0 Then
MsgBox("未指定当前BOM料号!")
Return
End If
'检查输入料号是否有效
Dim isExist As Boolean = False
If m_PartNumber.CheckPartNumber(m_CurrentBomPN, isExist) = ERROR_CODE.SUCCESS Then
If isExist = False Then
MsgBox("输入料号不存在!")
Return
End If
Else
MsgBox("无法查询输入料号,请检查网络连接!")
Return
End If
'检测内容中的PN字段有效性
If CheckPNValid() = False Then
MsgBox("输入信息存在错误,不能进行保存!")
Return
End If
'创建料号表
If SaveBom2(tbBomPN.Text) = False Then
MsgBox("保存料表失败")
Return
End If
MsgBox("保存料表:" & tbBomPN.Text & "成功")
End Sub
Private Sub 更新当前物料ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 更新当前物料ToolStripMenuItem.Click
If GrdSourceBom.ActiveCell Is Nothing Then Return
Dim row As Integer = GrdSourceBom.ActiveCell.Row
If row = 0 Then Return
Dim pn As String
'清空内容
GrdSourceBom.Cell(row, SourceGridCols.物料名称).Text = ""
GrdSourceBom.Cell(row, SourceGridCols.规格描述).Text = ""
GrdSourceBom.Cell(row, SourceGridCols.单位).Text = ""
GrdSourceBom.Cell(row, SourceGridCols.单价).Text = ""
'查询指定pn的信息
pn = GrdSourceBom.Cell(row, SourceGridCols.料号PN).Text
If String.IsNullOrEmpty(pn) Then Return
Dim pninfo As New PnInfo With {.PN = pn}
If GetPnInfoByName(pn, pninfo) Then
GrdSourceBom.Cell(row, SourceGridCols.物料名称).Text = pninfo.物料名称
GrdSourceBom.Cell(row, SourceGridCols.规格描述).Text = pninfo.规格描述
GrdSourceBom.Cell(row, SourceGridCols.单位).Text = pninfo.单位
GrdSourceBom.Cell(row, SourceGridCols.单价).Text = pninfo.单重
End If
End Sub
Private Sub 更新物料信息ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 更新物料信息ToolStripMenuItem.Click
GetAllPnInfo()
End Sub
Private Sub GetAllPnInfo()
Dim pn As String
For row = 1 To GrdSourceBom.Rows - 1
'注释为空后面则认为为无效行
If String.IsNullOrEmpty(GrdSourceBom.Cell(row, SourceGridCols.注释).Text) Then
If String.IsNullOrEmpty(GrdSourceBom.Cell(row, SourceGridCols.料号PN).Text) Then
Continue For
End If
End If
'清空内容
GrdSourceBom.Cell(row, SourceGridCols.物料名称).Text = ""
GrdSourceBom.Cell(row, SourceGridCols.规格描述).Text = ""
GrdSourceBom.Cell(row, SourceGridCols.单位).Text = ""
GrdSourceBom.Cell(row, SourceGridCols.单价).Text = ""
'查询指定pn的信息
pn = GrdSourceBom.Cell(row, SourceGridCols.料号PN).Text
If String.IsNullOrEmpty(pn) Then Continue For
Dim pninfo As New PnInfo With {.PN = pn}
If GetPnInfoByName(pn, pninfo) Then
GrdSourceBom.Cell(row, SourceGridCols.物料名称).Text = pninfo.物料名称
GrdSourceBom.Cell(row, SourceGridCols.规格描述).Text = pninfo.规格描述
GrdSourceBom.Cell(row, SourceGridCols.单位).Text = pninfo.单位
GrdSourceBom.Cell(row, SourceGridCols.单价).Text = pninfo.单重
End If
Next
End Sub
Private Function GetPnInfoByName(pn As String, ByRef pnInfo As PnInfo) As Boolean
Return m_PartNumber.QueryItem(pn, pnInfo.物料名称, pnInfo.规格描述, pnInfo.单位, pnInfo.单重, pnInfo.供应商ID) = ERROR_CODE.SUCCESS
End Function
Public Class PnInfo
Public PN As String = ""
Public 物料名称 As String = ""
Public 规格描述 As String = ""
Public 单位 As String = ""
Public 单重 As Double = 0
Public 图片(0) As Byte
Public 供应商ID As String = ""
End Class
Private Sub 插入行ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 插入行ToolStripMenuItem.Click
If GrdSourceBom.Selection Is Nothing Then
GrdSourceBom.AddItem("")
Else
GrdSourceBom.InsertRow(GrdSourceBom.Selection.FirstRow, 1)
End If
End Sub
Private Sub 删除行ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 删除行ToolStripMenuItem.Click
If MsgBox("是否删除选中行?", MsgBoxStyle.OkCancel) <> MsgBoxResult.Ok Then Return
If GrdSourceBom.Selection IsNot Nothing Then
GrdSourceBom.Selection.DeleteByRow()
End If
End Sub
Private Sub 清空表格ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 清空表格ToolStripMenuItem.Click
If MsgBox("是否清空表格?", MsgBoxStyle.OkCancel) <> MsgBoxResult.Ok Then Return
InitSourceGrid()
End Sub
Private Sub 合并相同料号ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 合并相同料号ToolStripMenuItem.Click
Dim snList As New Dictionary(Of String, Integer)
Dim deleteRows As New List(Of Integer)
' 查询所有料号
Dim pn As String
For row = 1 To GrdSourceBom.Rows - 1
pn = GrdSourceBom.Cell(row, SourceGridCols.料号PN).Text
If String.IsNullOrEmpty(pn) Then Continue For
If snList.ContainsKey(pn) Then
deleteRows.Add(row)
GrdSourceBom.Cell(snList(pn), SourceGridCols.用量).Text = GrdSourceBom.Cell(snList(pn), SourceGridCols.用量).IntegerValue + GrdSourceBom.Cell(row, SourceGridCols.用量).IntegerValue
GrdSourceBom.Cell(snList(pn), SourceGridCols.使用位置).Text = GrdSourceBom.Cell(snList(pn), SourceGridCols.使用位置).Text & "," & GrdSourceBom.Cell(row, SourceGridCols.使用位置).Text
Else
snList.Add(pn, row)
End If
Next
For row = 0 To deleteRows.Count - 1
GrdSourceBom.Row(deleteRows(row) - row).Delete()
Next
End Sub
End Class