K_3开发积累

更新时间:2024-05-19 12:18:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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 Set

fOperCode = b.fOperCode From

t_ICItemCustom a , t_Item b where

a.fItemID = b.fItemID

3.5执行

exec SP_CREATE_ICItem_VIEW exec 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_VIEW

exec SP_CREATE_ICItem_TRIGGER

4. 客户希望在销售订单的审核事件中加入一些控制条件,由于是老单据,在插件中抓不到审核事件,请高手指教!

审核需要在中间层插件去做。做一个中间层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(\审核 2反审核 If Para(\销售订单

If (CanCheck = False) Then ‘CanCheck可以是自己判断审核条件的函数 Para(\可以自定义 Para(\审核判断组件\ Para(\提示:不能审核\ HookInvoke = False Exit Function Else

HookInvoke = True Exit Function End If End If End If End If

HookInvoke = True Exit Function e:

HookInvoke = False End 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 > 0

6. 老单插件

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,' ',' ',' ') Go

Code

1. 插件引用

位置: D:\\Kingdee\\项目\\保华集团\\Ord\\Components\\Client a) K3BBI.tlb

b) K3BillTransfer.dll c) KFO10.dll

2. 引用相关的类文件

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, \测试\ End With End Sub

这样当单据加载完成时将在工具栏的最后位置增加一个名称为“测试”的按钮。

7.下面我们还要能够相应此按钮的动作,在m_BillTransfer对象的RetEvents事件中进行处理:

Private Sub m_BillTransfer_RetEvents(ByVal Para As KFO.IDictionary) If Para(\ If Para(\ MsgBox \ 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(\ .Buttons(\ 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(\

objReport.ExtFirter = \ '显示过滤界面

objReport.ShowFilter '取数

objReport.GetReportData

If Not objReport.Result(\ If objReport.Result(\

MsgBox \报表调用错误:\vbInformation, \金蝶提示\ End If

Screen.MousePointer = 0 GoTo HExit End If

'显示报表

Set objRptView = CreateObject(\ objRptView.Show objReport, 401 GoTo HExit HErr:

MsgBox \报表调用错误:\金蝶提示\ HExit:

Set objRptView = Nothing Set objReport = Nothing End Function

然后在m_BillTransfer对象的RetEvents事件中添加调用这个方法的代码:

Private Sub m_BillTransfer_RetEvents(ByVal Para As KFO.IDictionary) If Para(\ If Para(\ 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(\ EntryCtl(OperNo).DNumber(Row) = dctResult.GetValue(\ EntryCtl(OperNo).DName(Row) = dctResult.GetValue(\ m_BillTransfer.EntryCtl = EntryCtl

m_BillTransfer.SetGridText Row, OperNo, dctResult.GetValue(\ 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(\ 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, \ End If End If

GoTo HExit HErr: 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_icItemCustom

14. 程序外挂

程序外挂方式分为以下两种:

a) 挂程序以外的Exe

在K3的系统菜单中可以设置相关的外挂程序的设置

b) 与K3结合密切的DLL

--外挂程序要引用K3BBI.tlb 和KDVBF.dll

Delete FROM t_DataFlowTimeStamp

Delete FROM t_DataFlowSubFunc WHERE (FSubSysID = 23) And FSubFuncID=600200

insert 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) Go

Delete 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 再,Add alter Table PORequest Drop column FHeadSelfP0126

if not exists (select * from syscolumns where

POrequest add fPlanType varchar(255) NULL

id=object_id('POrequest') and name='fPlanType ') alter table

16. 更改系统单据,以便可编辑

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_ItemPrice

if Not Exists(Select 1 from sysObjects where Name = 't_ItemPrice') CREATE TABLE t_ItemPrice(

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)

VALUES (3020, 101, '物料', 'fSysItemID', 3, 0, 0, 3, 0, NULL, 4, 't_Item', 'FItemID', 'FName', '0', '1.基本资料', NULL, 0) INSERT INTO t_ItemPropDesc

(FItemClassID,FPropID,FName,FSQLColumnName,FDataType,FPrecision,FScale,FActualType,FActualSize,FBehavior,FSearch,FSrcTable,FSrcField,FDisplayField,FDefaultValue,FPageName,FComCall,FIsShownList)

VALUES (3020, 102, '单价', 'fItemPrice', 6, 0, 0, 6, 0, NULL, 0, NULL, NULL, NULL, NULL, '1.基本资料', NULL, 0) INSERT INTO t_ItemPropDesc

(FItemClassID,FPropID,FName,FSQLColumnName,FDataType,FPrecision,FScale,FActualType,FActualSize,FBehavior,FSearch,FSrcTable,FSrcField,FDisplayField,FDefaultValue,FPageName,FComCall,FIsShownList)

VALUES (3020, 103, '最低单价', 'fItemLowPrice', 6, 0, 0, 6, 0, NULL, 0, NULL, NULL, NULL, NULL, '1.基本资料', NULL, 0) go

if Not Exists(Select 1 from sysColumns Where Name = 'fItemPrice' and ID in (Select ID from sysObjects Where Name = 't_ItemPrice') ) Begin go

Alter Table t_ItemDetail Add fItemPrice int not null default(0) Create Index ix_ItemDetail_fItemPrice On t_ItemDetail(fItemPrice) FItemID int NOT NULL, fSysItemID int, fItemPrice money, fItemLowPrice money, FModifyTime TIMESTAMP ,

CONSTRAINT pk_t_Item_3020 PRIMARY KEY (FItemID))

END

if not exists(Select 1 from t_ObjectType where fObjectID = 3020 and FObjectType = 3)

insert t_ObjectType(FObjectType,FObjectID,FName,FDescription)

values(3,3020,'物料价格','')

if not Exists(Select 1 from t_objectaccess where fObjectType = 3 and fObjectID = 3020) insert t_objectaccess

select fgroupid,3,3020,findex from t_objectaccess where fobjecttype=3 and fobjectid=20;

if not Exists(Select 1 from t_objectAccessType where fObjectType = 3 and fObjectID = 3020)

insert t_objectAccessType

Select 3,3020,FIndex,FAccessMask,FAccessUse,FName,FDescription from t_ObjectAccessType where fobjecttype=3 and fobjectid=20 go

if Not Exists(Select 1 from t_BaseProperty where fItemID = 3020 and FTypeID = 2)

Insert Into t_BaseProperty(FTypeID, FItemID, FCreateDate, FCreateUser, FLastModDate, FLastModUser, FDeleteDate, FDeleteUser)

Values(2, 3020, GetDate(), 'Administrator', Null, Null, Null, Null) go

21. 新增辅助资料

Delete from t_SubMesType where fName = '票务角色'

insert t_SubMesType (FTypeID,FName,FDetail,FType,FGRType) values ( 810,'票务角色',NULL,1,0) Go

Delete from t_SubMessage where fTypeID = 810 insert t_SubMessage (FBrNo,FInterID,FID,FParentID,FName,FTypeID,FDetail,FDeleted,FSystemType,FSpec) values ( '0',30001,'01',804,'售票员',810,0,0,1,NULL) insert t_SubMessage (FBrNo,FInterID,FID,FParentID,FName,FTypeID,FDetail,FDeleted,FSystemType,FSpec) values ( '0',30002,'02',804,'售票主管',810,0,0,1,NULL) insert t_SubMessage (FBrNo,FInterID,FID,FParentID,FName,FTypeID,FDetail,FDeleted,FSystemType,FSpec) values ( '0',30003,'02',804,'商场(展厅)经理',810,0,0,1,NULL)

本文来源:https://www.bwwdw.com/article/c3m7.html

Top