Public Class Form_合并备料查询 Dim m_Table As New System.Data.DataTable Dim m_InitOver As Boolean = False Dim m_PartNumber As New CPartNumber Dim validBomPnList As New ArrayList Dim validBomBackupCountList As New ArrayList Public Enum COLS_INPUT 序号 料号PN 数量 max End Enum Public Shared m_COLS_NAME_INPUT(,) As String = { {"序号", "0"}, {"料号PN", "1"}, {"数量", "1"} } Public Enum COLS_QUERYINFO 序号 料号PN 物料名称 规格描述 单位 总数量 库存数量 剩余数量 max End Enum Public Shared m_COLS_NAME_QUERYINFO(,) As String = { {"序号", "0"}, {"料号PN", "1"}, {"物料名称", "0"}, {"规格描述", "0"}, {"单位", "0"}, {"总数量", "0"}, {"库存数量", "0"}, {"剩余数量", "0"} } Private Sub Form_合并备料查询_Load(sender As Object, e As EventArgs) Handles MyBase.Load InitGrid_Input() End Sub Private Sub InitGrid_Input() Grid_Input.NewFile() Grid_Input.AllowUserSort = False Grid_Input.DisplayFocusRect = False Grid_Input.ExtendLastCol = True Grid_Input.DisplayRowArrow = True Grid_Input.BoldFixedCell = False Grid_Input.SortIndicatorStyle = FlexCell.SortIndicatorStyleEnum.Light3D Grid_Input.Cols = COLS_INPUT.max For col As Integer = 0 To COLS_INPUT.max - 1 Grid_Input.Cell(0, col).Text = m_COLS_NAME_INPUT(col, 0) Next '调整宽度 Grid_Input.Column(COLS_INPUT.序号).Width = 50 Grid_Input.Column(COLS_INPUT.料号PN).Width = 100 Grid_Input.Column(COLS_INPUT.数量).Width = 50 Grid_Input.AllowUserSort = True Grid_Input.Locked = False Grid_Input.Column(COLS_INPUT.序号).Locked = True Grid_Input.Rows = 500 Application.DoEvents() End Sub Private Sub InitGrid_QueryInfo(ByVal BomPnCount As Integer, ByRef bomArray As ArrayList) Grid_QueryInfo.NewFile() Grid_QueryInfo.AllowUserSort = False Grid_QueryInfo.DisplayFocusRect = False Grid_QueryInfo.ExtendLastCol = True Grid_QueryInfo.DisplayRowArrow = True Grid_QueryInfo.BoldFixedCell = False Grid_QueryInfo.SortIndicatorStyle = FlexCell.SortIndicatorStyleEnum.Light3D Grid_QueryInfo.Cols = COLS_QUERYINFO.max For col As Integer = 0 To COLS_QUERYINFO.max - 1 Grid_QueryInfo.Cell(0, col).Text = m_COLS_NAME_QUERYINFO(col, 0) Next If BomPnCount > 0 Then For i = 0 To BomPnCount - 1 Grid_QueryInfo.Cols += 1 Grid_QueryInfo.Cell(0, Grid_QueryInfo.Cols - 1).Text = bomArray.Item(i) Next End If '调整宽度 Grid_QueryInfo.Column(COLS_QUERYINFO.序号).Width = My.Settings.FORM_合并用料查询_COL_WIDTH_序号 Grid_QueryInfo.Column(COLS_QUERYINFO.料号PN).Width = My.Settings.FORM_合并用料查询_COL_WIDTH_料号PN Grid_QueryInfo.Column(COLS_QUERYINFO.物料名称).Width = My.Settings.FORM_合并用料查询_COL_WIDTH_物料名称 Grid_QueryInfo.Column(COLS_QUERYINFO.规格描述).Width = My.Settings.FORM_合并用料查询_COL_WIDTH_规格描述 Grid_QueryInfo.Column(COLS_QUERYINFO.单位).Width = My.Settings.FORM_合并用料查询_COL_WIDTH_单位 Me.Height = My.Settings.FORM_合并用料查询_HEIGHT Me.Width = My.Settings.FORM_合并用料查询_WIDTH Grid_QueryInfo.AllowUserSort = True Grid_QueryInfo.Locked = True Grid_QueryInfo.Rows = 1 Application.DoEvents() 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 Sub bt_Go_Click(sender As Object, e As EventArgs) Handles bt_Go.Click '检测Input表格是否存在错误 Dim inputSn As String = "" Dim validBomPnCount As Integer = 0 validBomPnList.Clear() validBomBackupCountList.Clear() Dim notEmptyCount As Integer = 0 Dim curRowResult As Boolean = False For row = 1 To Grid_Input.Rows - 1 Grid_Input.Cell(row, COLS_INPUT.序号).Text = "" Grid_Input.Cell(row, COLS_INPUT.料号PN).BackColor = Color.White Grid_Input.Cell(row, COLS_INPUT.数量).BackColor = Color.White Next For row = 1 To Grid_Input.Rows - 1 inputSn = Grid_Input.Cell(row, COLS_INPUT.料号PN).Text If inputSn.Length > 0 Then notEmptyCount += 1 '检查输入料号是否有效 curRowResult = True Dim isExist As Boolean = False If m_PartNumber.CheckPartNumber(inputSn, isExist) = ERROR_CODE.SUCCESS Then If isExist = False Then Grid_Input.Cell(row, COLS_INPUT.料号PN).BackColor = Color.Red curRowResult = False End If Else MsgBox("查询BOM料号错误!") Return End If '检测输入料号的料表是否已经存在 If CheckBomExist(inputSn, isExist) = True Then If isExist = False Then Grid_Input.Cell(row, COLS_INPUT.料号PN).BackColor = Color.Red curRowResult = False End If Else MsgBox("无法查询输入料号对应的料表是否存在,请检查网络连接!") Return End If If curRowResult = True Then Grid_Input.Cell(row, COLS_INPUT.料号PN).BackColor = Color.Green '检查数量是否正确 Dim numStr As String = Grid_Input.Cell(row, COLS_INPUT.数量).Text Dim numNum As Integer = 0 Try numNum = numStr validBomPnCount += 1 validBomPnList.Add(inputSn) validBomBackupCountList.Add(numNum) Grid_Input.Cell(row, COLS_INPUT.数量).BackColor = Color.Green Catch ex As Exception Grid_Input.Cell(row, COLS_INPUT.数量).BackColor = Color.Red End Try Else Grid_Input.Cell(row, COLS_INPUT.料号PN).BackColor = Color.Red End If Grid_Input.Cell(row, COLS_INPUT.序号).Text = validBomPnCount End If Next If notEmptyCount > 0 Then If validBomPnCount <> notEmptyCount Then MsgBox("输入BOM料号列表存在错误") Return End If Else MsgBox("输入不能为空") Return End If '重新设置QueryInfo表格内容 InitGrid_QueryInfo(validBomPnCount, validBomPnList) '逐个机种查询----------------------------- For bomIndex = 0 To validBomPnCount - 1 '查询物料列表 Dim queryBomName As String = validBomPnList.Item(bomIndex) If QueryBom(queryBomName, m_Table) = True Then CompareAndFillToGridByDataTable(bomIndex) End If Next '查询物料其它信息 For rowIndex = 1 To Grid_QueryInfo.Rows - 1 If Grid_QueryInfo.Cell(rowIndex, COLS_QUERYINFO.料号PN).Text.Length > 0 Then If GetPNItemInfo(rowIndex) = False Then Return End If End If Next '查询库存数量 For rowIndex = 1 To Grid_QueryInfo.Rows - 1 Dim strPN As String = Grid_QueryInfo.Cell(rowIndex, COLS_QUERYINFO.料号PN).Text If strPN.Length > 0 Then Dim countInStore As Integer = 0 Dim usageCount As Integer = Grid_QueryInfo.Cell(rowIndex, COLS_QUERYINFO.总数量).Text If QueryStorageCount(strPN, countInStore) = True Then Grid_QueryInfo.Cell(rowIndex, COLS_QUERYINFO.库存数量).Text = countInStore Grid_QueryInfo.Cell(rowIndex, COLS_QUERYINFO.剩余数量).Text = countInStore - usageCount Else Return End If End If Next MsgBox("查询完成.") End Sub Private Function QueryStorageCount(ByVal PartNumber As String, ByRef rCount As Integer) As Boolean Dim strSelect As String = "SELECT SUM(`" & CMaterialInOut.m_COLS_NAME(CMaterialInOut.COLS.数量) & "`) FROM " strSelect &= "`" & CMaterialInOut.cst_TABLE_NAME & "` " strSelect &= " WHERE `" & CMaterialInOut.m_COLS_NAME(CMaterialInOut.COLS.料号PN) & "` COLLATE gbk_chinese_ci = '" & PartNumber & "' " '查询入库数量 Dim result As Boolean = False Dim Count_In As Integer = 0 Dim strSQL As String = strSelect strSQL &= "AND `" & CMaterialInOut.m_COLS_NAME(CMaterialInOut.COLS.入库出库) & "` = '0'" m_Table.Rows.Clear() m_Table.Columns.Clear() If SQL_Query(COL_RIGHTS.原料库存管理, strSQL, m_Table) = True Then Try Count_In = m_Table.Rows(0).Item(0) Catch ex As Exception Count_In = 0 End Try result = True End If '查询出库数量 Dim Count_Out As Integer = 0 strSQL = strSelect strSQL &= "AND `" & CMaterialInOut.m_COLS_NAME(CMaterialInOut.COLS.入库出库) & "` = '1'" If result Then result = False m_Table.Rows.Clear() m_Table.Columns.Clear() If SQL_Query(COL_RIGHTS.原料库存管理, strSQL, m_Table) = True Then Try Count_Out = m_Table.Rows(0).Item(0) Catch ex As Exception Count_Out = 0 End Try result = True End If End If rCount = Count_In - Count_Out Return result End Function Private Sub CompareAndFillToGridByDataTable(ByVal bomIndex As Integer) Dim existRows As Integer = Grid_QueryInfo.Rows Dim insertRow As Integer = 0 Dim queryPn As String = "" Dim queryCount As Integer = 0 Dim curCount As Integer = 0 Dim CountForBackup As Integer = validBomBackupCountList.Item(bomIndex) Dim MultiCount As Integer = 0 If m_Table.Rows.Count > 0 Then For row = 0 To m_Table.Rows.Count - 1 queryPn = m_Table.Rows.Item(row).Item(2) queryCount = m_Table.Rows.Item(row).Item(3) MultiCount = queryCount * CountForBackup Dim findIndex As Integer = -1 For rowIndex = 1 To Grid_QueryInfo.Rows - 1 If Grid_QueryInfo.Cell(rowIndex, COLS_QUERYINFO.料号PN).Text.ToUpper = queryPn.ToUpper Then findIndex = rowIndex Exit For End If Next If findIndex > 0 Then Try curCount = Grid_QueryInfo.Cell(findIndex, COLS_QUERYINFO.总数量).Text Catch ex As Exception curCount = 0 End Try curCount += MultiCount Grid_QueryInfo.Cell(findIndex, COLS_QUERYINFO.总数量).Text = curCount Else Grid_QueryInfo.Rows += 1 findIndex = Grid_QueryInfo.Rows - 1 Grid_QueryInfo.Cell(findIndex, COLS_QUERYINFO.料号PN).Text = queryPn Grid_QueryInfo.Cell(findIndex, COLS_QUERYINFO.总数量).Text = MultiCount End If Grid_QueryInfo.Cell(findIndex, COLS_QUERYINFO.max + bomIndex).Text = MultiCount Next 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 = "" Grid_QueryInfo.Cell(gridRowIndex, COLS_QUERYINFO.物料名称).Text = "" Grid_QueryInfo.Cell(gridRowIndex, COLS_QUERYINFO.规格描述).Text = "" Grid_QueryInfo.Cell(gridRowIndex, COLS_QUERYINFO.单位).Text = "" Dim result As Boolean = False Dim strPn As String = Grid_QueryInfo.Cell(gridRowIndex, COLS_QUERYINFO.料号PN).Text If m_PartNumber.QueryItem(strPn, 物料名称, 规格描述, 单位, 单重, 供应商ID) = ERROR_CODE.SUCCESS Then Grid_QueryInfo.Cell(gridRowIndex, COLS_QUERYINFO.物料名称).Text = 物料名称 Grid_QueryInfo.Cell(gridRowIndex, COLS_QUERYINFO.规格描述).Text = 规格描述 Grid_QueryInfo.Cell(gridRowIndex, COLS_QUERYINFO.单位).Text = 单位 result = True Else MsgBox("查询物料信息错误,料号:" & strPn) End If Return result End Function Private Sub bt_ExportResult_Click(sender As Object, e As EventArgs) Handles bt_ExportResult.Click Dim dlg As New SaveFileDialog() dlg.DefaultExt = "xls" dlg.Filter = "Excel File|*.xls" If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then Return If Grid_QueryInfo.ExportToExcel(dlg.FileName, True, True) Then MsgBox("保存为Excel成功:" & dlg.FileName) Else MsgBox("保存失败!") End If End Sub End Class