由于K3的架构,每个物料在做内协生产工单时,都要维护原材料BOM,用于生成投料单,
我们的物料是从PDM抛转过来的,但原材料在PDM中是没有维护的,需要在BOM单中进行维护
我们以前是用EXCEL表格后来用一个叫“材料重量计算”的小工具计算,使用起来还是较麻烦的,于是在想能不能在BOM单的界面就将这个事办好。
根据以往经验,基本思路是录用所需要的原料规格后,打开一个FORM界面,取规格中的数字,圆料就维护长度,板材维护上宽和长,进行计算,然后将结果返回到“用量”列。
1、在工具栏上增加“重量计算”按钮,并在录入原料代码后,获取相关行号、列号和规格型号等基本信息
代码如下:
''工业老单BOM维护,增加重量计算'定义插件对象接口. 必须具有的声明, 以此来获得事件PrivateWithEventsm_BillTransferAsk3BillTransfer.BillPublicMcolAsLong'规格型号所在列号PublicYLcolAsLong'用量所在列号PublicCurrentColAsLong'光标所在的列号PublicCurrentRowAsLong'光标所在的行号PublicFnoteINAsString'传回重量PublicFnoteOUTAsString'传出规格PrivatevEntryCtlAsVariant'单据体控件,取列号用PublicSubShow(ByValoBillTransferAsObject)'接口实现'注意: 此方法必须存在, 请勿修改Setm_BillTransfer=oBillTransfer''获取规格型号和用量的列号vEntryCtl=m_BillTransfer.m_EntryCtlFori=1ToUBound(vEntryCtl)Ifm_BillTransfer.m_EntryCtl(i).FieldName="FModel"ThenMcol=iEndIfIfm_BillTransfer.m_EntryCtl(i).FieldName="FAuxQty"ThenYLcol=iEndIfNextEndSub'''''''''''''''''''''''''''''''''''''''''''PrivateSubClass_Terminate()'释放接口对象'注意: 此方法必须存在, 请勿修改Setm_BillTransfer=NothingEndSub'-------------------------------'增加加按钮PrivateSubm_BillTransfer_LoadBillEnd(ByValShowTypeAsLong)' MsgBox "点击成功"On ErrorResumeNextWithm_BillTransfer.BillForm.tlbTool.Buttons'如果还要加按钮,就增加一行.Add.Count,Count - 1指最后一个图标的前一个位置;最后的数字是图标的编号,可任意。.Add .Count-1,"BtnZL","重量计算",,30EndWithEndSub'''''''''''''''''''''''''''''''''''''''''''PublicSubm_BillTransfer_GridChange(ByValcolAsLong,ByValrowAsLong,ByValValueAsVariant,ByValbNewBillAsBoolean,CancelAsBoolean)'MsgBox "测试GridChange"CurrentCol=col' 获取当前操作的列号,用以后面判断CurrentRow=row'获取当前操作的行号,用以后面对当前行的工艺列进行赋值EndSub''''''''''''''''''''''''''''''''''''''''''''''''''''''''PrivateSubm_BillTransfer_RetEvents(ByValParaAsKFO.IDictionary)'TODO: 请在此处添加代码响应事件 RetEventsDimobjAAsNewInputSpetialCHARIfNotParaIsNothingThenIfPara.GetValue("EventID",0)="Bill_ButtonClick"ThenIfPara.GetValue("EventIDprop",0)="0"ThenIfPara("Para")("Button").Key="BtnZL"Then''计算重量CallCallFormEndIfEndIfEndIfEndIfEndSub''''''''''''''''''''''''''''''''''''''''''PrivateSubCallForm()DimFormAsNewForm2SetForm.frm_BillTransfer=m_BillTransfer FnoteOUT=m_BillTransfer.GetGridText(CurrentRow,Mcol)'获取原料规格型号'交互: 这里传值到自定义窗口Form.selSourceName=FnoteOUT''要传的参数Form.SourceROW=CurrentRow''传当前行号Form.SourceCOL=YLcol''传用量的列号Form.Show1SetForm=NothingEndSub'————————————————2、增加计算界面FORM2
代码如下:
PublicWithEventsfrm_BillTransferAsk3BillTransfer.BillPublicselSourceNameAsString'传来的值PublicSourceCOLAsLong'传来的列号PublicSourceROWAsLong'传来的行号PrivateDeclareFunctionSetWindowPosLib"user32"(ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValXAsLong,ByValYAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLongPrivateConstHWND_TOPMOST=-1' 置顶(始终在其他窗口上方)PrivateConstHWND_NOTOPMOST=-2' 取消置顶PrivateConstSWP_NOMOVE=&H2' 忽略 x、y 参数(不改变位置)PrivateConstSWP_NOSIZE=&H1' 忽略 cx、cy 参数(不改变大小)'''''''''''''''''''''''''PrivateSubForm_Load()DimsvalueAsStringDimxPositionAsIntegerDimiAsInteger,jAsInteger,kAsInteger'窗口置顶'参数说明:窗口句柄、置顶标志、位置和大小(忽略)、操作标志(不移动不改变大小)SetWindowPosMe.hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVEOrSWP_NOSIZE''通过Add方法逐个添加项Combox1.Clear'清空Combox1.AddItem"钢材"Combox1.AddItem"铝材"Combox1.AddItem"尼龙"Combox1.AddItem"牛筋"Combox1.AddItem"其他"Combox1.ListIndex=0'默认钢材Text1.Text=7.85' 密度默认7.85Text2.Text=""'高/直径Text3.Text=""'宽Text4.Text=""'长' 规格解析IfselSourceName<>""Then' 传来的值不为空'' 遍历字符,统计 × 和 Φ 的数量i=0j=0k=0Fori=1ToLen(selSourceName)Char=Mid(selSourceName,i,1)IfChar="×"Thenk=k+1EndIfIfChar="Φ"OrChar="φ"OrChar="Ф"Thenj=j+1EndIfNextiIfk=0Then' 无 × → 圆钢/圆棒,只提取直径Fori=1ToLen(selSourceName)'用于获取字符串中的数字IfAsc(Mid(selSourceName,i,1))>=48AndAsc(Mid(selSourceName,i,1))<=57Thensvalue=svalue&Mid(selSourceName,i,1)EndIfNexti Text2.Text=svalueIfj>0ThenText3.Enabled=FalseEndIfElseIfk=1Then'Q235的板材/方料,自动拆分高×宽xPosition=InStr(1,selSourceName,"×")'判断×的位置Text2.Text=Mid(selSourceName,1,xPosition-1)Text3.Text=Mid(selSourceName,xPosition+1,Len(selSourceName))Text3.Enabled=TrueEndIfEndIfEndSub''''''''''''''''''''''''''''''''''''''''''''''PrivateSubCombox1_Click()IfCombox1.Text="钢材"ThenText1.Text=7.85ElseIfCombox1.Text="铝材"ThenText1.Text=2.7ElseIfCombox1.Text="尼龙"ThenText1.Text=1.13ElseIfCombox1.Text="牛筋"ThenText1.Text=1.4ElseIfCombox1.Text="其他"ThenText1.Text=""Text1.Enabled=TrueEndIfEndSub''''''''''''''''''''''''''''''''''''''''''''PrivateSubCommand1_Click()DimHAsLong,WAsLong,LAsLongDimMDAsDouble,ZLAsDoubleH=0W=0L=0MD=CDbl(Text1.Text)'密度H=Val(Text2.Text)'高/直径W=Val(Text3.Text)'宽L=Val(Text4.Text)'长IfL<=0ThenMsgBox"长度不能为空且必须大于0!",vbExclamation Text4.SetFocusExitSubEndIfIfW=0ThenZL=3.14*MD*(H/2)^2*L/1000000ElseZL=MD*H*W*L/1000000EndIf''' 保留1位小数,并向上取整IfZL<>Round(ZL,1)Then'保留1位后相等就取原值IfZL<>0ThenZL=Int((ZL+0.1)*10)/10EndIfEndIfText5.Text=ZL Command2.SetFocus'计算完成后焦点在确认按钮上EndSub'''''''''''''''''''''''''''''''''''''PrivateSubForm_Activate()'如果宽为空焦点在宽上否则在长上IfText3.Enabled=TrueAndText3.Text=""ThenText3.SetFocusElseText4.SetFocusEndIfEndSub'''''''''''''''''''''''''''''''''''''PrivateSubText4_KeyDown(KeyCodeAsInteger,ShiftAsInteger)IfKeyCode=13Then' 录入长度后回车直接调用按钮的Click事件处理程序Command1_Click KeyCode=0' 阻止事件冒泡,避免触发其他默认行为EndIfEndSub''''''''''''''''''''''''''''''''''''''''PrivateSubCommand2_Click()'计算后的传到“用量”列SetInfo frm_BillTransfer,Text5.Text,SourceCOL,SourceROW'关闭弹窗UnloadMeEndSub效果
圆料时:
板料时:
型材时
还有不完美的地方,材质上是默认钢材,其他材质只能手工选择,这个是需要在物料基本信息维护时就要维护好的,但工作量太大,加上主要还是使用钢材,且只是一个估计值,所以做得灵活度大点。