K/3Wise插件开发和配置9197发表于2016-12-2010:57:17BOS开发复制链接只看楼主查看全部开发环境:K/3Wise13.0、K/3Bos开发平台、VisualBasic6.0目录一、二次开发插件编程二、代码演示三、配置插件四、测试插件五、插件事件附录一、二次开发插件编程打开VisualBasic6.0,新建工程ActiveXDLL:命名为FirstPlugin.class:引用类库如下:已安装K/3Wise,在VB6.0菜单栏上会多出一个金蝶开发插件:打开金蝶开发向导,创建工业单据客户端插件(工业单据俗称“老单”):点击“确定”,选择类“FirstPlugin”:点击“下一步”,这里我们自定义一个菜单项“插件工具”:点击“下一步”,选择事件“UserMenuClick”:完成向导。二、代码演示代码编写如下:'配置路径:供应链-外购入库单'函数功能:插件工具--根据“长、宽、厚”自动计算批号'定义插件对象接口.必须具有的声明,以此来获得事件PrivateWithEventsm_BillTransferAsK3BillTransfer.BillDimF55AsLong,F55TextAsString'长DimF56AsLong,F56TextAsString'宽DimF57AsLong,F57TextAsString'高DimFDateAsLong,FDateTextAsString'日期DimFBatchNoAsString'批号DimFItemIDAsLong,FNumberAsString'物料编码DimFBatchManagerAsBoolean'是否采用业务批号管理DimstrAsStringPublicSubShow(ByValoBillTransferAsObject)'接口实现'注意:此方法必须存在,请勿修改Setm_BillTransfer=oBillTransferEndSubPrivateSubClass_Terminate()'释放接口对象'注意:此方法必须存在,请勿修改Setm_BillTransfer=NothingEndSubPrivateSubm_BillTransfer_BillInitialize()'***************开始设置菜单***************m_BillTransfer.AddUserMenuItem自动批号,插件工具'***************结束设置菜单***************'TODO:请在此处添加代码响应事件BillInitializeF55=GetCtlIndexByFld(FEntrySelfA0155,True)F56=GetCtlIndexByFld(FEntrySelfA0156,True)F57=GetCtlIndexByFld(FEntrySelfA0157,True)FBatchNo=GetCtlIndexByFld(FBatchNo,True)FDate=GetCtlIndexByFld(FDate,False)FItemID=GetCtlIndexByFld(FItemID,True)EndSubPrivateSubm_BillTransfer_UserMenuClick(ByValIndexAsLong,ByValCaptionAsString)'TODO:请在此处添加代码响应事件UserMenuClickSelectCaseCaptionCase自动批号'此处添加处理批号生成菜单对象的Click事件Withm_BillTransferFori=1To1000If.GetGridText(i,FItemID)=ThenExitForEndIf'从物料表检测是否采用业务批次管理DimstrSQLAsString'用于执行SQLDimrsAsADODB.RecordsetFNumber=FNumber=.GetGridText(i,FItemID)strSQL=strSQL=SELECTFBatchManagerFROMt_ICItemWHEREFNumber='&FNumber&'Setrs=SQLHelper.ExecuteSQL(strSQL,)Ifrs.EOF=FalseThenFBatchManager=rs.Fields(FBatchManager)EndIfSetrs=NothingF55Text=.GetGridText(i,F55)F56Text=.GetGridText(i,F56)F57Text=.GetGridText(i,F57)IfF55Text=ThenF55Text=0IfF56Text=ThenF56Text=0IfF57Text=ThenF57Text=0FDateText=Replace(.GetHeadText(FDate),-,)If(FBatchManager=True)Then.SetGridTexti,FBatchNo,F55Text&-&F56Text&-&F57Text&-&FDateTextEndIfNextEndWithCaseElseEndSelectEndSub'*****************************************'获取分录行数'*****************************************PublicFunctionGetEntryMax()AsLongDimkAsLongDimiFItemIDAsLongDimoEntryCtlAsVariantDimmaxrowAsLong'最大行'Fork=LBound(m_BillTransfer.EntryCtl)ToUBound(m_BillTransfer.EntryCtl)IfUCase(m_BillTransfer.EntryCtl(k).FieldName)=UCase(FItemID)Then'物料代码所在列iFItemID=kExitForEndIfNextkoEntryCtl=m_BillTransfer.EntryCtlmaxrow=UBound(oEntryCtl(iFItemID).DInterID)'获取表体最大行GetEntryMax=maxrowEndFunction'**********************************'返回单据字段顺序(isEntryTrue是表体)'**********************************PublicFunctionGetCtlIndexByFld(ByValfldNameAsString,OptionalByValisEntryAsBoolean=False)AsLongDimctlIdxAsLongDimiAsIntegerDimisFindAsBooleanDimvValueAsVariantfldName=UCase(fldName)isFind=FalseWithm_BillTransferIfisEntryThenFori=LBound(.EntryCtl)ToUBound(.EntryCtl)IfUCase(.EntryCtl(i).FieldName)=fldNameThenctlIdx=.EntryCtl(i).FCtlOrderisFind=TrueExitForEndIfNextiElseFori=LBound(.HeadCtl)ToUBound(.HeadCtl)IfUCase(.HeadCtl(i).FieldName)=fldNameThenctlIdx=.HeadCtl(i).FCtlIndexisFind=TrueExitForEndIfNextiEndIfEndWithIfisFind=TrueThenGetCtlIndexByFld=ctlIdxElseGetCtlIndexByFld=0EndIfEndFunction[url=][/url]三、配置插件在VisualBasic6.0生成DLL:启动K/3WiseBOS开发平台,打开外购入库单,并进行插件配置:点击“插件配置管理”,配置客户端插件:点击“浏览”,找到插件并勾选:点击“确定”,并保存外购入库单。四、测试插件启动K/3Wise,打开“供应链-仓存管理-外购入库单-新增”:至此,插件开发和配置完成!五、插件配置后未生效1.在插件配置管理提示“没有找到文件,或文件没有正确注册”解决方法:插件dll名称命名要和工程名称一致。比如工程名称“aaaa”,其中有一个类“bbb”,dll命名为“aaa”,配置插件后,显示完整名称“aaa.bbb”,提示aaaa“没有找到文件,或文件没有正确注册”。修改dll名称“aaa”为“aaaa”,重新配置插件,即可修复问题。六、插件事件附录附上K/3Wise工业单据开发事件说明:序号事件函数描述1BillTerminatePublicEventBillTerminate()单据卸载完成时激发该事件2UserMenuClickPublicEventUserMenuClick(ByValIndexAsLong,ByValCaptionAsString)当点击用户自定义的菜单时激发这个事件。参数:Index:表示第几个菜单、由添加菜单的先后顺序决定,Caption:菜单项的标题3LeveCellPublicEventLeveCell(ByValColAsLong,ByValRowAsLong,ByValNewColAsLong,ByValNewRowAsLong,CancelAsBoolean)当离开分录的一个单元格的时候激发这个事件参数:Col分录的要离开列Row分录的要离开行NewCol新的列NewRow新的行Cancel是否取消4HeadChangePublicEventHeadChange(ByValCtlIndexAsLong,ByValValueAsVariant,当表头的一个项目改变时激发这个事件ByValbNewBillAsBoolean,CancelAsBoolean)参数:ctlIndex表头字段索引Value当前值bNewBill是否是新增单据Cancel是否取消5GridChangePublicEventGridChange(ByValColAsLong,ByValRowAsLong,ByValValueAsVariant,ByValbNewBillAsBoolean,CancelAsBoolean)当表体的一个项目改变时激发这个事件参数:Col分录的当前列Row分录的当前行Value当前值bNewBill是否是新增单据Cancel是否取消6BeforGridLookUpPublicEventBeforGridLookUp(ByValRowAsLong,ByValColAsLong,ByValnLookUpClsIDAsLong,CancelAsBoolean)在分录执行查找功能之前激发这个事件参数:Col分录的当前列Row分录的当前行nLookUpClsID当前查询的资料类型,Cancel是否取消7EndGridLookUpPublicEventEndGridLookUp(ByValRowAsLong,ByValColAsLong,ByValnLookUpClsIDAsLong)在分录完成查找功能之后激发这个事件参数:Col分录的当前列Row分录的当前行nLookUpClsID当前查询的资料类型8BeforHeadLookUpPublicEventBeforHeadLookUp(ByValCtlIndexAsLong,ByValnLookUpClsIDAsLong,CancelAsBoolean)在表头的一个项目执行查找功能之前激发这个事件参数:ctlIndex表头字段索引nLookUpClsID当前查询的资料类型Cancel是否取消9EndHeadLookUpPublicEventEndHeadLo