最新K-3开发积累.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateK-3开发积累1、删除已发布的功能1. 删除已发布的功能Delete from t_DataFlowDetailFunc where fSubfuncid in (select FSubFuncID from t_DataFlowSubFunc where fFuncName='子功能名称') Delete t_DataFlowSubFunc where fFuncName='子功能名称' Update t_DataFlowTimeStamp set FName=FName 2. 计算公式Select * from icTemplate where fID = s01修改其中的fAction其中的 fDefaultCtrl为1时不能改,为0时可以修改公式。3. 在基础资料中增加列3.1增加相应的表结构如(物料、客户等),增加自己列(fOperCode)3.2往表 ItemPropDesc 中增加相应数据3.3在t_IcItemCustom中增加相应列(t_Item)3.4更新t_IcItemCustom中数据,如:Update t_ICItemCustom SetfOperCode = b.fOperCodeFromt_ICItemCustom a , t_Item bwhere a.fItemID = b.fItemID3.5执行exec SP_CREATE_ICItem_VIEWexec SP_CREATE_ICItem_TRIGGER-Select * from t_ItemClass-客户Alter Table t_Organization Add fOperCode varchar(30)INSERT INTO t_ItemPropDesc (FItemClassID,FPropID,FName,FName_en,FName_cht,FSQLColumnName,FDataType,FPrecision,FScale,FActualType,FActualSize,FBehavior,FSearch,FSrcTable,FSrcField,FDisplayField,FDefaultValue,FPageName,FPageName_en,FPageName_cht,FComCall,FIsShownList,FViewMask) VALUES (1, 102, '业务系统代码', '业务系统代码', '业务系统代码', 'fOperCode', 200, 30, 0, 200, 30, NULL, 0, NULL, NULL, NULL, NULL, '1.基本资料', '1. Basic Data', '1.基本資料', NULL, 0, 0)-部门Alter Table t_Department Add fOperCode varchar(30)INSERT INTO t_ItemPropDesc (FItemClassID,FPropID,FName,FName_en,FName_cht,FSQLColumnName,FDataType,FPrecision,FScale,FActualType,FActualSize,FBehavior,FSearch,FSrcTable,FSrcField,FDisplayField,FDefaultValue,FPageName,FPageName_en,FPageName_cht,FComCall,FIsShownList,FViewMask) VALUES (2, 102, '业务系统代码', '业务系统代码', '业务系统代码', 'fOperCode', 200, 30, 0, 200, 30, NULL, 0, NULL, NULL, NULL, NULL, '1.基本资料', '1. Basic Data', '1.基本資料', NULL, 0, 0)-职员Alter Table t_Emp Add fOperCode varchar(30)INSERT INTO t_ItemPropDesc (FItemClassID,FPropID,FName,FName_en,FName_cht,FSQLColumnName,FDataType,FPrecision,FScale,FActualType,FActualSize,FBehavior,FSearch,FSrcTable,FSrcField,FDisplayField,FDefaultValue,FPageName,FPageName_en,FPageName_cht,FComCall,FIsShownList,FViewMask) VALUES (3, 102, '业务系统代码', '业务系统代码', '业务系统代码', 'fOperCode', 200, 30, 0, 200, 30, NULL, 0, NULL, NULL, NULL, NULL, '1.基本资料', '1. Basic Data', '1.基本資料', NULL, 0, 0)-物料Alter Table t_Item Add fOperCode varchar(30)INSERT INTO t_ItemPropDesc (FItemClassID,FPropID,FName,FName_en,FName_cht,FSQLColumnName,FDataType,FPrecision,FScale,FActualType,FActualSize,FBehavior,FSearch,FSrcTable,FSrcField,FDisplayField,FDefaultValue,FPageName,FPageName_en,FPageName_cht,FComCall,FIsShownList,FViewMask) VALUES (4, 102, '业务系统代码', '业务系统代码', '业务系统代码', 'fOperCode', 200, 30, 0, 200, 30, NULL, 0, NULL, NULL, NULL, NULL, '1.基本资料', '1. Basic Data', '1.基本資料', NULL, 0, 0)exec SP_CREATE_ICItem_VIEWexec SP_CREATE_ICItem_TRIGGER4. 客户希望在销售订单的审核事件中加入一些控制条件,由于是老单据,在插件中抓不到审核事件,请高手指教!审核需要在中间层插件去做。做一个中间层Dll,如MidSample.dll,有一个类如clsMid.cls。在这个类中加入下面的代码:Public Function HookInvoke(ByVal pEventID As Long, Para As KFO.Dictionary) As Boolean On Error GoTo e If pEventID = 200003 Then '200004取自t_ThirdPartyComponent表FtypedetailID字段 '增加自己的代码 If Para("OperateCode") = 1 Then '1审核 2反审核 If Para("TranType") = 81 Then '销售订单 If (CanCheck = False) Then CanCheck可以是自己判断审核条件的函数 Para("ErrCode") = 33 '可以自定义 Para("ErrSource") = "XX审核判断组件" Para("ErrDescription") = "XX提示:不能审核" HookInvoke = False Exit Function Else HookInvoke = True Exit Function End If End If End If End If HookInvoke = True Exit Functione: HookInvoke = FalseEnd Function这个类要在t_ThirdPartyComponent中注册,注册的SQL如下:insert t_ThirdPartyComponent (FTypeID,FTypeDetailID,FIndex,FComponentName,FComponentSrv,FDescription) values ( 2,200003,-2,'', MidSample.clsMid','')5. 辅助属性Select * from t_ItemClass where fType in (3, 4)Select FAuxClassID from t_IcItem where FAuxClassID > 06. 老单插件SQL-有关老单的插件注册-FTypeDetailID为单据类型21是销售出库单-有关fTypeDetailID 在ICTransactionType表中查询Delete FROM t_ThirdPartyComponent WHERE (FTypeDetailID = 21)insert t_ThirdPartyComponent (FTypeID,FTypeDetailID,FIndex,FComponentName,FComponentSrv,FDescription) values ( 0,21,-2,'K3Serial.CSerialInput','K3MSerial.WriteData','单据序列号客户端组件')insert t_ThirdPartyComponent (FTypeID,FTypeDetailID,FIndex,FComponentName,FComponentSrv,FDescription) values ( 0,21,-1,'SettlePlugInForICBill.RetailSettles','POSORMapping.RetailBillWSvr','销售出库单多种结算方式')insert t_ThirdPartyComponent (FTypeID,FTypeDetailID,FIndex,FComponentName,FComponentSrv,FDescription) values ( 0,21,-3,'OutPlus.clsOut','','南通港口销售出库单插件(提取装卸作业单相关成本)')insert t_ThirdPartyComponent (FTypeID,FTypeDetailID,FIndex,FComponentName,FComponentSrv,FDescription) values ( 0,21,0,' ',' ',' ')GoCode1. 插件引用 位置: D:Kingdee项目保华集团OrdComponentsClienta) K3BBI.tlbb) K3BillTransfer.dllc) KFO10.dll2. 引用相关的类文件7. 如何在工业单据中添加自定义的工具栏按钮及相应相关操作? 在为客户进行二次开发的过程中有时会遇到需要在在工业单据中添加自定义的工具栏按钮及相应相关操作的问题,以下将以一个实例来讲解如何进行达到这个目标。 例如,我希望在生产任务单的工具栏中增加一个名称为“测试”的按钮,点击此按钮后弹出消息框显示“Hello,World!”的信息,下面我们一步一步来实现。 1.首先需要为生产任务单增加一个新的二次开发插件,因此需要在VB中新建一个ActiveX DLL工程,我们在这为此工程命名为:MyTester,然后在此工程中增加一个类,我们命名为MyButton。 2.为了让K/3识别此工程编译的组件是生产任务单的二次开发插件,必须在帐套中执行以下SQL语句: Insert t_ThirdPartyComponent(FTypeid,FTypeDetailID,FIndex,FComponentName) Values(0,85,1,'MyTester.MyButton') 3.在工程中增加以下必须或常用的引用: 4.在类MyButton中增加一个私有对象: Private WithEvents m_BillTransfer As k3BillTransfer.Bill 此对象是单据的事务代理对象,后续所有单据事件或单据数据都将从此对象中获得。 5.在类MyButton中增加一个公开方法: Public Sub Show(ByVal o As Object) Set m_BillTransfer = o End Sub 此方法将被单据调用,并对m_BillTransfer对象进行初始化。 6.在m_BillTransfer对象的LoadBillEnd事件中增加一个按钮: Private Sub m_BillTransfer_LoadBillEnd(ByVal ShowType As Long) With m_BillTransfer.BillForm.tlbTool.Buttons .Add .Count + 1, "mnuTest", "测试", , 21 End With End Sub 这样当单据加载完成时将在工具栏的最后位置增加一个名称为“测试”的按钮。 7.下面我们还要能够相应此按钮的动作,在m_BillTransfer对象的RetEvents事件中进行处理: Private Sub m_BillTransfer_RetEvents(ByVal Para As KFO.IDictionary) If Para("EventID") = "Bill_ButtonClick" And Para("EventIDProp") = 1 Then If Para("Para")("Button").Key = "mnuTest" Then MsgBox "Hello,World!" End If End If End Sub 现在我们已经完成了所有的编码,编译后注册即可在生产任务单中看到结果。如果希望获得单据界面上更多的数据可以访问m_BillTransfer对象来获得,具体说明可以参见设计部发放的二次开发说明书,如果你已经感兴趣了就赶快动手试一试吧:) 运行结果: 8. 如何在工业单据插件中控制工具条、单据头、单据体的Enable、Visible、Lock等属性? 有珠海分公司的同事询问如何在工业单据插件中控制工具条、单据头、单据体的enable、visible、lock等属性?具体实现有如下方式: '单据体锁住 With m_BillTransfer.Grid .Col = AAA .Row = 2 .Lock = False End With '单据头锁住和禁用 With m_BillTransfer.Head(BBB) .Enabled = False .Locked = True End With '工具条按钮隐藏或禁用 With m_BillTransfer.BillForm.tlbTool .Buttons("CCC").Visible = False .Buttons("DDD").Enabled = False End With '菜单按钮隐藏或禁用 With m_BillTransfer.BillForm .mnuEEE.Visible = False .mnuFFF.Enabled = False End With 其中AAA、BBB是单据模版中具体字段的FCtlOrder字段的值;CCC,DDD是工具栏按钮的Key,可以监视m_BillTransfer.BillForm.tlbTool.Buttons并找到需要的按钮Key;mnuEEE、mnuFFF是菜单按钮对象的Name,可以监视m_BillTransfer.BillForm并找到需要的菜单按钮Name。 9. 如何在工业单据中调用报表进行查询? 上一篇文章中介绍了在工业单据中添加自定义的工具栏按钮的方法(参见如何在工业单据中添加自定义的工具栏按钮及相应相关操作?),这次我们在这个基础上来学习如何在工业单据中调用报表进行查询。 我们准备在生产任务单新增加的“测试”按钮点击时调用显示“生产任务单执行明细表”。 首先在MyButton类中增加一个私有方法CallRpt: Private Function CallRpt() Dim objReport As Object Dim objRptView As Object On Error GoTo HErr '创建"生产任务单执行明细表" Set objReport = CreateObject("K3ShopRpt.Rpt401") objReport.ExtFirter = "401" '显示过滤界面 objReport.ShowFilter '取数 objReport.GetReportData If Not objReport.Result("OK") Then If objReport.Result("Error") <> "" Then MsgBox "报表调用错误:" & objReport.Result("Error"), vbOKOnly + vbInformation, "金蝶提示" End If Screen.MousePointer = 0 GoTo HExit End If '显示报表 Set objRptView = CreateObject("k3VRpt.View") objRptView.Show objReport, 401 GoTo HExit HErr: MsgBox "报表调用错误:" & Err.Description, vbOKOnly + vbInformation, "金蝶提示" HExit: Set objRptView = Nothing Set objReport = Nothing End Function 然后在m_BillTransfer对象的RetEvents事件中添加调用这个方法的代码: Private Sub m_BillTransfer_RetEvents(ByVal Para As KFO.IDictionary) If Para("EventID") = "Bill_ButtonClick" And Para("EventIDProp") = 1 Then If Para("Para")("Button").Key = "mnuTest" Then CallRpt End If End If End Sub 现在重编译组件后就可以正常使用了。 顺便说一句,所有的工业报表的组件和编号可以通过以下SQL语句查询: Select * From ICReport 在我们这个例子中,调用“生产任务单执行明细表”前需要先调用过滤界面来设置查询条件,因为“生产任务单执行明细表”没有开放直接传递过滤参数的接口,因此必须在调用取数前显示过滤界面。 有些报表开放了直接传递过滤参数的接口,因此可以简单的将objReport.ShowFilter语句替换为objReport.Filter = dctFilter即可,这样可以实现将单据编号等过滤信息直接传递生成报表的方式。对于要调用的报表是否支持.Filter接口,二次开发人员需要向总部相关的开发人员咨询,并获得dctFilter数据包相应的结构才能运行正常。 10. 如何在工业单据中修改一个表体K3值字段? 刚刚接到上海分公司二次开发同事的电话,询问如何在BOM插件中修改子项的内码和显示值,这是一个常见的工序工业单据中修改一个表体3值字段的问题,只要进行如下编写即可: Private Const OperNo = 22 'FOperID的FCtlOrder Private Sub SetOperID(ByVal Row As Long, ByRef dctResult As KFO.Dictionary) On Error GoTo HErr Dim EntryCtl As Variant EntryCtl = m_BillTransfer.EntryCtl EntryCtl(OperNo).DInterID(Row) = dctResult.GetValue("FOperID") EntryCtl(OperNo).DNumber(Row) = dctResult.GetValue("FID") EntryCtl(OperNo).DName(Row) = dctResult.GetValue("FName") m_BillTransfer.EntryCtl = EntryCtl m_BillTransfer.SetGridText Row, OperNo, dctResult.GetValue("FName") HErr: . End Sub 其中OperNo是单据模版中FOperID的FCtlOrder字段的值,m_BillTransfer对象参见如何在工业单据中添加自定义的工具栏按钮及相应相关操作? 11. 如何在工业单据中填充多行自定义数据? 刚刚接到重庆分公司二次开发同事的电话,询问如何在工业单据插件中填充多行自定义数据,这行数据来源于一个通过SQL获取的记录集,结合前面几篇文章可以进行如下编写实现:Private Sub FillDataToEntry(ByVal bClearFirst As Boolean) Dim objSrv As Object Dim rs As ADODB.Recordset On Error GoTo HErr '访问中间层取数,返回要填充的记录集 Set objSrv = CreateObject("XXX.XXX") Set rs = objSrv.GetYYY(MMTS.PropsString) If Not rs Is Nothing Then If rs.RecordCount > 0 Then rs.MoveFirst If bClearFirst Then m_BillTransfer.BillFunc.ClearFillData '由于K3BILLS清除后没有修改MaxEntry,需要手动修改为1(默认1行) m_BillTransfer.BillFunc.MaxEntry = 1 End If m_BillTransfer.BillFunc.FillBillDataExt rs, "Z11", "FBomInterID", "", "" End If End If GoTo HExitHErr:HExit: Set objSrv = Nothing Set rs = Nothing End Sub其中m_BillTransfer.BillFunc.FillBillDataExt是填充的方法,将rs的内容填充到表体中,第一个参数是需要填充的记录集,第二个参数为单据模版的FTemplateID,第三个参数是内码字段,后面2个参数可以不填。m_BillTransfer对象参见如何在工业单据中添加自定义的工具栏按钮及相应相关操作?另外要注意中间层方法GetYYY返回的rs中字段的名称要按照单据模版的字段定义,这样才能正确将数据对应到相应的表体列上显示。12. 菜单设置 -一级菜单Select * from t_DataFlowTopClass where fTopClassName Like '供应链%'-二级菜单Select * from t_DataFlowSubSystem where fName Like '%采购管理%'-三级菜单Select * from t_DataFlowSubFunc where fFuncName Like '%订单处理%'-四级菜单Select * from t_DataFlowDetailFunc where fFuncName Like '%采购订单%'13. 有关核算项目与辅助资料的表说明a) 核算项目Select * from t_Item where fItemClassID in (Select fItemClassID from t_ItemClass where fName Like '%门店%')b) 辅助资料Select * from t_SubMessage where fName Like '%门店%'相应的自定义字段在 t_Item_ + 相应的字段名 如: t_Item_3001-自定义的字段自动产生的字段名在此表Select * from t_ItemPropDesc-物料表的自定义字段(所有的物料的自定义字段在此表) Select * from t_icItemCustom14. 程序外挂程序外挂方式分为以下两种:a) 挂程序以外的Exe在K3的系统菜单中可以设置相关的外挂程序的设置b) 与K3结合密切的DLL-外挂程序要引用K3BBI.tlb 和KDVBF.dllDelete FROM t_DataFlowTimeStampDelete FROM t_DataFlowSubFunc WHERE (FSubSysID = 23) And FSubFuncID=600200insert t_DataFlowSubFunc (FSubFuncID,FSubSysID,FIndex,FFuncName,FFuncName_CHT,FFuncName_EN,FClassName,FClassParam,FVisible,FAcctType,FFuncType,FRefresh,FSetEnable,FSubID,FIsEdit) values ( 600200,23,30,'某某项目','某某项目','某某项目','','',1,'',-1,0,0,'xs',1)GoDelete FROM t_DataFlowDetailFunc WHERE (FSubFuncID = 600200)insert t_DataFlowDetailFunc (FDetailFuncID,FFuncName,FFuncName_CHT,FFuncName_EN,FSubFuncID,FIndex,FClassName,FClassParam,FIsNormal,FHelpCode,FVisible,FAcctType,FFuncType,FEnable,FShowName,FShowName_CHT,FShowName_EN,FIsEdit) values ( 160020107,'功能调用','功能调用','功能调用',600200,1,'XXX.Applation','160020107',0,'',1,'',-1,1,'','','',1)Go其中的fSubSysID 为Select * from t_DataFlowSubSystem中的fSubSysID 程序相关15. 自定义工业单据1、在t_FieldDescription 中修改相应的fFieldName 2、修改ICTemplate, ICTemplateEntry, GLNoteCitation, ICChatBillTitle表中相应的值。相应的Table 的内码在icTransactionType 中查询3、修改相应Table的列名,先 Drop 再,Addalter Table PORequest Drop column FHeadSelfP0126if not exists (select * from syscolumns where id=object_id('POrequest') and name='fPlanType ') alter table POrequest add fPlanType varchar(255) NULL16. 更改系统单据,以便可编辑UPdate icClassType Set fControl = 2483 Where Fname_CHS like '价格明细维护'17. 老单推新单,设置选单条件-采购申请推分单时选单条件Update icClassLink Set fCondition = ' v1.fStatus <>3 and u1.fMRPClosed <> 1 ' where fDestClassTypeID = '200000012'18. 修改供应链中的计算公式-收料通知中FEntrySelfP0338, FEntrySelfP0339, FEntrySelfP0340,分别为分摊运费、分摊关税、分摊增值税Update icTemplateEntry Set fRelationID = 'FAuxQty,FAuxPrice,FQty,FEntrySelfP0338, FEntrySelfP0339, FEntrySelfP0340',fAction = '!,FAuxPrice,*,FAuxQty,+,FEntrySelfP0338,+,FEntrySelfP0339,+,FEntrySelfP0340'where fID = 'p03' and fHeadCaption = '金额'19. 新老单单据相关信息-老单表描述Select * from icTransactionType-新单表描述Select * from icClassType-老单表头Select * from icTemplate where fID = 'S01'-老单表体Select * from icTemplateEntry where fID = 'S01'-新单Select * from icClassTableInfo where fClassTypeID = '200000002'20. 新增核算项目/*新增核算项目K3 9.41中测试通过*/if not Exists(Select 1 from t_ItemClass where fItemClassID = 3020)Insert Into t_ItemClass(fItemClassID, fNumber, fName, fSQLTablename, fVersion, fImport, fBrNo, fUserDefilast, fType, fGrType)Select '3020', 'HPrice', '物料价格', 't_ItemPrice', 0, 0, 0, 100, 1, 0-Drop table t_ItemPriceif Not Exists(Select 1 from sysObjects where Name = 't_ItemPrice')CREATE TABLE t_ItemPrice(FItemID int NOT NULL,fSysItemID int,fItemPrice money, fItemLowPrice money,FModifyTime TIMESTAMP , CONSTRAINT pk_t_Item_3020 PRIMARY KEY (FItemID)Delete t_ItemPropDesc where fItemClassID = 3020 INSERT INTO t_ItemPropDesc (FItemClassID,FPropID,FName,FSQLColumnName,FDataType,FPrecision,FScale,FActualType,FActualSize,FBehavior,FSearch,FSrcTable,FSrcField,FDisplayField,FDefaultValue,FPageName,FComCall,FIsShownList)