K3老单二开 BOM维护中增加原材料的简便计算

由于K3的架构,每个物料在做内协生产工单时,都要维护原材料BOM,用于生成投料单,

我们的物料是从PDM抛转过来的,但原材料在PDM中是没有维护的,需要在BOM单中进行维护

我们以前是用EXCEL表格后来用一个叫"材料重量计算"的小工具计算,使用起来还是较麻烦的,于是在想能不能在BOM单的界面就将这个事办好。

根据以往经验,基本思路是录用所需要的原料规格后,打开一个FORM界面,取规格中的数字,圆料就维护长度,板材维护上宽和长,进行计算,然后将结果返回到"用量"列。

1、在工具栏上增加"重量计算"按钮,并在录入原料代码后,获取相关行号、列号和规格型号等基本信息

代码如下:

vbnet 复制代码
 ''工业老单BOM维护,增加重量计算
'定义插件对象接口. 必须具有的声明, 以此来获得事件
Private WithEvents m_BillTransfer   As k3BillTransfer.Bill
Public Mcol As Long '规格型号所在列号
Public YLcol As Long '用量所在列号
Public CurrentCol As Long '光标所在的列号
Public CurrentRow As Long '光标所在的行号
Public FnoteIN As String '传回重量
Public FnoteOUT As String '传出规格
Private vEntryCtl As Variant '单据体控件,取列号用
 
Public Sub Show(ByVal oBillTransfer As Object)
 
    '接口实现
    '注意: 此方法必须存在, 请勿修改
    Set m_BillTransfer = oBillTransfer
 
''获取规格型号和用量的列号
 vEntryCtl = m_BillTransfer.m_EntryCtl
   
For i = 1 To UBound(vEntryCtl)
 If m_BillTransfer.m_EntryCtl(i).FieldName = "FModel" Then
  Mcol = i
 End If
 If m_BillTransfer.m_EntryCtl(i).FieldName = "FAuxQty" Then
  YLcol = i
 End If
Next

 
End Sub
'''''''''''''''''''''''''''''''''''''''''''
Private Sub Class_Terminate()
 
    '释放接口对象
    '注意: 此方法必须存在, 请勿修改
    Set m_BillTransfer = Nothing

End Sub
'-------------------------------
'增加加按钮
Private Sub m_BillTransfer_LoadBillEnd(ByVal ShowType As Long)
' MsgBox "点击成功"
 On Error Resume Next
    With m_BillTransfer.BillForm.tlbTool.Buttons
    '如果还要加按钮,就增加一行.Add.Count,Count - 1指最后一个图标的前一个位置;最后的数字是图标的编号,可任意。
        .Add .Count - 1, "BtnZL", "重量计算", , 30

    End With
   
End Sub
'''''''''''''''''''''''''''''''''''''''''''

Public Sub m_BillTransfer_GridChange(ByVal col As Long, ByVal row As Long, ByVal Value As Variant, ByVal bNewBill As Boolean, Cancel As Boolean)
'MsgBox "测试GridChange"
CurrentCol = col ' 获取当前操作的列号,用以后面判断
CurrentRow = row '获取当前操作的行号,用以后面对当前行的工艺列进行赋值

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub m_BillTransfer_RetEvents(ByVal Para As KFO.IDictionary)
 
    'TODO: 请在此处添加代码响应事件 RetEvents

Dim objA As New InputSpetialCHAR

 
If Not Para Is Nothing Then
   If Para.GetValue("EventID", 0) = "Bill_ButtonClick" Then
    If Para.GetValue("EventIDprop", 0) = "0" Then
    
      If Para("Para")("Button").Key = "BtnZL" Then  ''计算重量
       
       Call CallForm
      
      End If
    End If
  End If
End If

End Sub

''''''''''''''''''''''''''''''''''''''''''
Private Sub CallForm()
        Dim Form As New Form2
        Set Form.frm_BillTransfer = m_BillTransfer
          FnoteOUT = m_BillTransfer.GetGridText(CurrentRow, Mcol)  '获取原料规格型号

'交互:         这里传值到自定义窗口
        Form.selSourceName = FnoteOUT ''要传的参数
        Form.SourceROW = CurrentRow ''传当前行号
        Form.SourceCOL = YLcol ''传用量的列号
        Form.Show 1
        Set Form = Nothing

End Sub
'------------------------------------------------

2、增加计算界面FORM2

代码如下:

vbnet 复制代码
Public WithEvents frm_BillTransfer   As k3BillTransfer.Bill

Public selSourceName As String '传来的值
Public SourceCOL As Long '传来的列号
Public SourceROW As Long '传来的行号

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1  ' 置顶(始终在其他窗口上方)
Private Const HWND_NOTOPMOST = -2  ' 取消置顶
Private Const SWP_NOMOVE = &H2  ' 忽略 x、y 参数(不改变位置)
Private Const SWP_NOSIZE = &H1  ' 忽略 cx、cy 参数(不改变大小)

'''''''''''''''''''''''''
Private Sub Form_Load()
Dim svalue As String
Dim xPosition As Integer
Dim i As Integer, j As Integer, k As Integer

   '窗口置顶
   '参数说明:窗口句柄、置顶标志、位置和大小(忽略)、操作标志(不移动不改变大小)
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
  

''通过Add方法逐个添加项
    Combox1.Clear '清空
    Combox1.AddItem "钢材"
    Combox1.AddItem "铝材"
    Combox1.AddItem "尼龙"
    Combox1.AddItem "牛筋"
    Combox1.AddItem "其他"
    Combox1.ListIndex = 0 '默认钢材
    Text1.Text = 7.85 ' 密度默认7.85
    Text2.Text = "" '高/直径
    Text3.Text = "" '宽
    Text4.Text = "" '长
    
 '  规格解析
If selSourceName <> "" Then    ' 传来的值不为空
   '' 遍历字符,统计 × 和 Φ 的数量
        i = 0
        j = 0
        k = 0
        For i = 1 To Len(selSourceName)
           Char = Mid(selSourceName, i, 1)
           If Char = "×" Then
            k = k + 1
           End If
           If Char = "Φ" Or Char = "φ" Or Char = "Ф" Then
           j = j + 1
           End If
        Next i
        
        
 If k = 0 Then ' 无 × → 圆钢/圆棒,只提取直径
     For i = 1 To Len(selSourceName) '用于获取字符串中的数字
     If Asc(Mid(selSourceName, i, 1)) >= 48 And Asc(Mid(selSourceName, i, 1)) <= 57 Then
         svalue = svalue & Mid(selSourceName, i, 1)
     End If
    Next i
    Text2.Text = svalue
    If j > 0 Then
    Text3.Enabled = False
    End If
ElseIf k = 1 Then 'Q235的板材/方料,自动拆分高×宽
        xPosition = InStr(1, selSourceName, "×") '判断×的位置
        Text2.Text = Mid(selSourceName, 1, xPosition - 1)
        Text3.Text = Mid(selSourceName, xPosition + 1, Len(selSourceName))
        Text3.Enabled = True
    
 End If

End If


End Sub

''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Combox1_Click()
    If Combox1.Text = "钢材" Then
    Text1.Text = 7.85
   ElseIf Combox1.Text = "铝材" Then
    Text1.Text = 2.7
   ElseIf Combox1.Text = "尼龙" Then
    Text1.Text = 1.13
   ElseIf Combox1.Text = "牛筋" Then
    Text1.Text = 1.4
   ElseIf Combox1.Text = "其他" Then
    Text1.Text = ""
    Text1.Enabled = True
   End If
End Sub
''''''''''''''''''''''''''''''''''''''''''''
Private Sub Command1_Click()
Dim H As Long, W As Long, L As Long
Dim MD As Double, ZL As Double



H = 0
W = 0
L = 0
MD = CDbl(Text1.Text) '密度



H = Val(Text2.Text) '高/直径
W = Val(Text3.Text) '宽
L = Val(Text4.Text) '长

If L <= 0 Then
MsgBox "长度不能为空且必须大于0!", vbExclamation
Text4.SetFocus
Exit Sub
End If

If W = 0 Then

ZL = 3.14 * MD * (H / 2) ^ 2 * L / 1000000

Else

ZL = MD * H * W * L / 1000000

End If

''' 保留1位小数,并向上取整
 If ZL <> Round(ZL, 1) Then '保留1位后相等就取原值
   If ZL <> 0 Then
    ZL = Int((ZL + 0.1) * 10) / 10
   End If
 End If
Text5.Text = ZL

Command2.SetFocus '计算完成后焦点在确认按钮上
End Sub
'''''''''''''''''''''''''''''''''''''
Private Sub Form_Activate()
'如果宽为空焦点在宽上否则在长上
  If Text3.Enabled = True And Text3.Text = "" Then
  Text3.SetFocus
  Else
  Text4.SetFocus
  End If
End Sub


'''''''''''''''''''''''''''''''''''''
Private Sub Text4_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 13 Then
        ' 录入长度后回车直接调用按钮的Click事件处理程序
        Command1_Click
        KeyCode = 0 ' 阻止事件冒泡,避免触发其他默认行为
    End If
End Sub
''''''''''''''''''''''''''''''''''''''''
Private Sub Command2_Click()
    '计算后的传到"用量"列
    SetInfo frm_BillTransfer, Text5.Text, SourceCOL, SourceROW
    '关闭弹窗
    Unload Me
End Sub

效果

圆料时:


板料时:


型材时


还有不完美的地方,材质上是默认钢材,其他材质只能手工选择,这个是需要在物料基本信息维护时就要维护好的,但工作量太大,加上主要还是使用钢材,且只是一个估计值,所以做得灵活度大点。

相关推荐
万岳科技程序员小赵1 天前
互联网医院系统开发全流程详解:从需求分析到正式上线
需求分析·互联网医院系统开发·互联网医院系统搭建·互联网医院app/小程序·ai智能问诊
ふり1 天前
测试的“三重境界”:黑盒、白盒、灰盒的对比与实践
网络·python·测试工具·需求分析
韦胖漫谈IT3 天前
如何区分真问题还是伪需求
需求分析·软件需求
张彦峰ZYF6 天前
需求洞察与决策指南:三钻模型的实战解析
需求分析·产品经理 #产品方法论·需求管理 #三钻模型·产品决策 #需求优先级·kano模型 #rice模型·产品战略 #互联网产品
阿狸猿9 天前
论软件需求管理
需求分析
2603_9547083112 天前
协调控制柜在微电网中的核心地位:数据枢纽、控制核心、安全屏障
分布式·安全·架构·能源·需求分析
战神vs帝皇13 天前
需求分析-产品经理(自用)
产品经理·需求分析
中小企业实战军师刘孙亮16 天前
家居建材营销新趋势:数字化、体验式与可持续方向-佛山鼎策创局破局增长咨询有限公司
职场和发展·产品运营·创业创新·需求分析·学习方法
测试修炼手册18 天前
[测试工具] 用 Codex 做测试实战:从需求分析到自动化用例落地
运维·自动化·需求分析
_codemonster18 天前
(案例)(第十一章)软考系统分析师「软件需求工程」核心知识梳理
需求分析