您的当前位置:首页正文

K3常用二次开发

2024-05-02 来源:欧得旅游网
三

1 常用二次开发方法

1.1

1)

登陆界面图片修改

在中间层方式:在中间层KDCOM目录新建两个图片文件:

LOGIN_PIC_LOG_TOP.bmp适用于10.4版本+PT007378,或V11版本及以后版本 LOGIN_PIC_LOG_BOTTOM.bmp适用于10.4版本+PT007378,或V11版本及以后版本 MAIN_PIC_LOG_RIGHT_FLOWCHART.bmp, 适用于10.4版本+PT007378,或V11版本 MAIN_PIC_LOG_LEFT_FLOWCHART.bmp, 适用于10.4版本+PT007378,或V11版本 MAIN_PIC_LOG_LEFT.bmp, 适用于10.4版本+PT007378,或V11版本 MAIN_PIC_LOG_RIGHT.bmp, 适用于10.4版本+PT007378,或V11版本 该方式不需要每个客户端机器安装图片,登陆时自动显示。

2) 客户端方式:直接修改以下图片文件,适用于V12及以后版本:

F:\\Program Files\\Kingdee\\K3ERP\\k3Standard\\KDSYSTEM\\KEE_imgLogo.bmp

3) 企业LOG方式

在中间层新建一个文件夹,命名为eptlogo并将其设置为只读共享,然后制作两个BMP格式的图片,分别作为logo和背景图,大小为145×180,分别命名为enterprise_logo.bmp,enterprise_bg.bmp,在客户端的主控台编辑器启用企业界面即可。

页脚内容1

4) 图标替换

LOG 替换图片:KDCOM文件夹下 名称

长*宽(像素) 说明

登录界面底部 登录界面顶部

LOGIN_PIC_LOG_BOTTOM.bmp 142*39 LOGIN_PIC_LOG_TOP.bmp

331*101

需要登录主控台->系统->设置->主控台编辑->选项->取消启用企业界面应用方案。

V12.0以后不需要下面文件: MAIN_PIC_LOG_LEFT.bmp MAIN_PIC_LOG_RIGHT.bmp

614*63 186*36

主控台左上 主控台右上

流程图左上 流程图右上

MAIN_PIC_LOG_LEFT_FLOWCHART.bmp 614*71 MAIN_PIC_LOG_RIGHT_FLOWCHART.bmp 191*36

主控台子系统图标替换:

把图标文件后缀名改为.dat文件,替换为: D:\\Program Files\\Kingdee\\K3ERP\\SYSTEMICON sys_SubsysID.dat

页脚内容2

登录界面图片替换:(该替换方式不支持只替换中间层后客户端自动替换) V12.1 V12.2:(图片名称以成长版简体中文为例,如是WISE则将KEE替换为KUE, 如是繁体或英文环境则将CHS替换为CHT或EN) KEE_imgLogo.bmp 370*87 KEE_ImgLogin.bmp

617*408

登录界面左上角 登录界面背景

登录界面右下角友商网图标 登录界面右下角Kindee图标

KEE_imgLogoys.bmp 92*52 kee_imglogo2.bmp 110*52 KEE_help_CHS.gif 618*76

用户手册顶部图标

客户端工具包顶部图标

帐套管理背景图片 关于界面LOGO

KEE_KDTool_CHS.gif 793*75

KEE_Login_ACCT_CHS.bmp 440*270 KEE_About_logo_CHS.bmp 365*102

1.2 主控台无界面登陆

适用版本:(K/3V11.0.1+PT016290或V12以上版本)

1)

域用户登录:提供命令行参数:KDMain.exe -LoginWin|账套代码|机构密码 ,无界面直接登录到K/3

系统主控台

2)命名用户登录:提供命令行参数KDMain.exe -LoginUser|账套代码|机构密码|用户名|用户密码, 无界面直接登录K/3系统主控台

3) 参数之间的分隔符默认为”|”,由于用户密码可能包含特殊字符,用户可以通过修改注册表改

页脚内容3

变分隔符,注册表参数:

路径:HKEY_CURRENT_USER\\SoftWare\\KingDee\\K3 键:LoginParm

4) 获取账套代码的接口

组件名:KdLogin.dll

组件部署:客户端%Kdsystem% 程序名:KdLogin.clsLogin 方法名:GetAccountList

参数描述

GetAccountList() As ADODB.Recordset 参数:无

返回值类型:ADODB.Recordset,包含字段:序号 字段名 描述 1 FAcctID 账套ID 2 FAcctNumber 账套代码 页脚内容4

3 FAcctName 账套名称 5) 测试登录参数设置是否成功的接口

组件名:KdLogin.dll

组件部署:客户端%Kdsystem% 程序名:KdLogin.NoUILogin 方法名:LoginUser

参数描述

Public Function LoginUser(ByVal sLoginType As String _ , ByVal sAcctNumber As String _ , ByVal sOrgPass As String _ , ByVal sUserName As String _ , ByVal sUserPass As String) As String 参数:

序号 字段名 参数类型 描述 1 sLoginType String 登录方式: 页脚内容5

-LoginWin 域用户身份登录 -LoginUser 命名用户身份登录 2 sAcctNumber String 账套代码 String 组织机构密码 例如:账套代码为:10.02,则为组织机构10的3 sOrgPass 密码. 4 sUserName String 用户名,域用户身份登录时为空 5 sUserPass

String 用户密码,域用户身份登录时为空 返回值类型:String,空字符串代表登录成功,否则登陆不成功,内容为登录不成功的原因。

1.3

基础资料的图片读写

1.显示图片

1.1)从数据库取得图片的二进制数据 Dim bytFile() As Byte

‘根据取数SQL生成记录集:select FFile from t_Accessory

页脚内容6

bytFile= rs.Fields(\"FFILE\") 1.2)保存到文件

Dim smFile As adodb.Stream Set smFile = New adodb.Stream smFile.Type = adTypeBinary smFile.Open smFile.Write bytFile

smFile.SaveToFile m_sTempFileName, adSaveCreateOverWrite 1.3)解压缩 Dim ozip As Object

Set ozip = CreateObject(\"KDZIP.ZIP\")

ozip.DeCompress m_sTempFileName, sFileName 1.4)显示出来

Set Img.Picture = LoadPicture(sFileName)

1. 保存图片

2.1)对图片进行压缩,压缩强度为 6

页脚内容7

Set dzip = CreateObject(\"KDZIP.ZIP\")

dzip.Compress App.Path & \"\\1.bmp\

2.2)读取文件

Set mstream = New ADODB.Stream mstream.Type = adTypeBinary mstream.Open

mstream.LoadFromFile App.Path & \"\\1.zip\" Dim varFile() As Byte varFile = mstream.Read()

2.3)修正字节数,必须是偶数个(从0到奇数)

lFileSize = UBound(varFile) + 1 - (UBound(varFile) Mod 2) ReDim Preserve varFile(0 To lFileSize) As Byte

2.4)把压缩后的图片导入到t_accessory表中

页脚内容8

con = \"Persist Security Info=True;Provider=SQLOLEDB.1;User ID=sa;Password=;Data Source=?;Initial Catalog=AIS20091116094820\"

sql1 = \"select * from t_accessory where FID=1\" Set rs = New ADODB.Recordset

rs.Open sql1, con, adOpenDynamic, adLockOptimistic rs.Fields(\"FFile\").AppendChunk varFile() rs.Update

1.4 K/3自定义认证开发方法

目的:提供用户可定义的K/3主控台登陆方法,用户可以按自己的方式验证,例如:实现指纹认证,声音认证。适用于K/3V10.3及以后版本。: 1. 新建VB工程:SelfIdentity.VBP 2. 添加一个窗体Form.frm 3. 添加一个模块Module1.mod 包含以下定义:

Public g_strAcctName As String Public g_UserName As String Public g_UserPassWord As String

页脚内容9

4. 添加类ClsIdentity.cls 包含以下两个接口

Public Function SeftClientSign(strAcctName As String, UserName As String, UserPassWord As String, ErrMsg As String) As Long

If UserName = g_UserName And g_strAcctName = strAcctName And g_UserPassWord = Trim(UserPassWord) Then SeftClientSign = 1 End If End Function

Public Function GetSelfPassWord(ByVal strAcctName As String, ByRef UserPassWord As String) As String '弹出指纹任证界面,直到GetSelfPassWord返回值不为空 Form1.Show vbModal GetSelfPassWord = \"test\" UserPassWord = \"123\"

g_strAcctName = strAcctName g_UserName = GetSelfPassWord g_UserPassWord = UserPassWord

页脚内容10

End Function

5. 在账套管理>账套>参数设置,选择“自定义认证方式” 6. 在用户管理,设置用户test属性为“自定义认证方式” 7. 以test用户登陆。

1.5

基础资料插件化开发

基础资料-插件接口由K3BaseDataEvents.dll提供:

1、 概述

要使用插件,需要写一个插件的DLL,引用K3BaseDataEvents.dll,处理其提供的接口即可。写好插件DLL后,需要在数据库表中增加该插件的注册记录,如下: 表名:t_ThirdPartyComponent 关键字段及意义: FTypeID:101

FTypeDetailID:1-19,>=2000,核算项目类别ID FComponentName:客户端插件类的ProgID

FComponentSrv: 服务端插件类的ProgID – 未实现

页脚内容11

编 三

FDescription: 描述

注: 其中FTypeDetailID为0时表示该插件对所有核算项目都有效,比如对所有核算项目指定统一的编码规则、自定义某个通用行的名称等。

2、 K3BaseDataEvents.ItemEvents 类

该类定义了核算项目编辑界面所有的事件。

Public Event AfterGridLoad()

加载各字段后触发,可以在该事件中处理界面初始化、默认编码等等

Public Event GridChange(ByVal lRow As Long)

某一行单元格值更新后触发

Public Event EnterGrid(ByVal lRow As Long)

焦点进入某一行触发 - 如判断使用后不允许修改

Public Event OnPressF7 (ByVal lRow As Long,

页脚内容12

ByRef RetCol As KDVBF.ReturnCollection, ByRef Cancel As Boolean)

按F7时触发,可以在该事件中自己处理弹出F7操作

Public Event BeforeList(ByVal lRow As Long, ByRef strSqlReturn As String)

弹出下拉列表前触发,用strSqlReturn返回查询列表的SQL语句,要求包括FNumber、FName等字段。

Public Event BeforeSave(Cancel As Boolean)

保存前触发 – 自定义校验数据

3、 K3BaseDataEvents. ItemEditInterface 类

该类定义了对核算项目编辑操作的一些属性、接口和方法

属性

Public Property Get PropsString() As String

功能未公开(Reserved) Public Property Get Grid() As Object

功能未公开(Reserved)

页脚内容13

Public Property Get ItemObject() As EBCGL.Item

获得当前的核算项目对象,可以访问其属性

Public Property Get ItemClass() As EBCGL.ItemClass

获取核算项目类别对象,如类别为物料

Public Property Get ItemClassId() As Long

获取核算项目类别ID,如物料类别ID为4

Public Property Get ParentID() As Long

获取核算项目上级组ID,为0则没有上级组

Public Property Get ParentItemObject() As EBCGL.Item

获取上级组对象,通过该对象可访问上级组代码、名称等属性

方法

Public Function GetRowNumber(FieldName As String) As Long

‘根据字段名称查找行号。

页脚内容14

Public Function GetRowFieldProp(ByVal lRow As Long) As CustomProperty

'根据行号 获得字段属性

Public Sub SetRowFocus(ByVal lRow As Long)

'设置焦点

Public Sub SetRowLock(ByVal Row As Long)

'设置单元只读。

Public Sub SetRowUnLock(ByVal Row As Long)

'设置单元为缺省非只读

Public Sub SetRowNotNull(ByVal Row As Long)

'设置为必录项

Public Sub SetRowBeNull(ByVal Row As Long)

'设置为非必录项

页脚内容15

Public Sub SetRowValue(ByVal Row As Long, Optional NewVal As Variant = \"\

0) '设置行的值

Public Function ReadCellText(ByVal lCol As Long, ByVal lRow As Long) As String

'读取Text

Public Function ReadID(ByVal Row As Long) As Long

'读取内部ID

Public Function ReadValue(ByVal Row As Long) As Variant

'读取数据

Public Function GetAnyRecordset(ByVal SQL As String) As ADODB.Recordset

'保留的

Public Function IsItemInUsed() As Boolean

'判断该项目是否被使用 -wScan

页脚内容16

Public Function GetDecimalDigits(ByVal dblVal As Double) As Long

'计算一个数值的小数位数

Public Function GetSystemProfileValue(ByVal sCagegory As String, ByVal sKey As String, Optional ByVal

sDefault As String = \"\") As String '获得系统参数信息

Public Function ItemIsDetail() As Boolean

'获得该核算项目是否是明细,还是上级组

Public Sub SetRowCaption(ByVal lRow As Long, sCaption As String)

'设置行标题

4、 K3BaseDataEvents.ItemEditInterface对象

该对象不可直接创建,需由K3BaseDataEvents.ItemEvents的属性获得:

Public Property Get EditInterface() As ItemEditInterface

5、 插件编写方法

页脚内容17

内部引用,初始化,并实现事件接口即可,(请参考组件K3BaseItemPlugin.dll的实现) 步骤如下:

a)

新建DLL工程如Test.dll,并引用插件类库K3BaseItemPlugin.dll 新建类如MeterialPlug(物料插件)

定义WithEvents的K3BaseDataEvents.ItemEvents对象,并处理其事件

编写接口函数Public Sub Show(ByVal oEvents As ItemEvents),在该函数中初始化插件对象,

b) c)

d)

必须的!!

e)

可以使用K3BaseDataEvents.ItemEditInterface中提供的方法

插件写好后,编译成Test.dll,向数据库表中插入数据注册该插件即可,如下SQL:

f)

insert into t_ThirdPartyComponent (FTypeID, FTypeDetailID, FIndex, FComponentName) values (101,4, 1, 'Test. MeterialPlug') -- 101表示基础资料,4表示物料 -- 该sql表示当编辑物料时,加载Test.MeterialPlug插件,若要该插件在所有核算项目编辑中都加载,只要将FTypeDetailID设为0即可 g)

测试、发布

页脚内容18

'物料 -- 插件 Private Const ID_ITEMCLASSID = 4 ' 物料 Private WithEvents BaseItemEvents As K3BaseDataEvents.ItemEvents '事件引擎 Private m_EditInterface As K3BaseDataEvents.ItemEditInterface 'API接口 '该函数为接口函数,调用该函数进行初始化 Public Sub Show(ByVal oEvents As ItemEvents) If oEvents.EditInterface.ItemClassID <> ID_ITEMCLASSID Then Exit Sub Set BaseItemEvents = oEvents Set m_EditInterface = BaseItemEvents.EditInterface End Sub '/********************************************************************/ '/*函数名称 : BaseItemEvents_AfterGridLoad '/*日期 : 2009-06-11 14:18 '/*作者 : wScan 页脚内容19

'/*描述 : 数据加载后触发,方便根据系统参数做某些特殊控制 '/*参数 : '/********************************************************************/ Private Sub BaseItemEvents_AfterGridLoad() ''加载各字段后触发 End Sub 。。。。。。。

6、 实例:实现客户需要功能的代码

a)

定义插件对象并初始化

Private WithEvents BaseItemEvents As K3BaseDataEvents.ItemEvents '事件引擎 Private m_EditInterface As K3BaseDataEvents.ItemEditInterface 'API接口 '该函数为接口函数,调用该函数进行初始化 Public Sub Show(ByVal oEvents As ItemEvents) 页脚内容20

Set BaseItemEvents = oEvents Set m_EditInterface = BaseItemEvents.EditInterface End Sub b)

实现: 录入物料的时候,不需要录入上级组代码。系统自动带出上级组代码; 核算

项目录入界面的前两个字段是代码和名称,对任何核算项目都是这样。客户要求加上前缀,如物料代码,客户代码。

Private Sub BaseItemEvents_AfterGridLoad() ''加载各字段后触发 Dim lRow As Long Dim sParentNumber As String On Error GoTo Err_Handler lRow = m_EditInterface.GetRowNumber(\"FNumber\") If m_EditInterface.ParentID <> 0 Then sParentNumber = m_EditInterface.ParentItemObject.Number End If 页脚内容21

''自动根据上级组编码填入前缀 If m_EditInterface.ItemObject.ItemID = 0 And m_EditInterface.ParentID <> 0 Then '新增 m_EditInterface.SetRowValue lRow, sParentNumber & \".\" End If ''设置个性化的行标题,如 物料代码、物料名称等 m_EditInterface.SetRowCaption 1, m_EditInterface.ItemClass.Name & \"代码\" m_EditInterface.SetRowCaption 2, m_EditInterface.ItemClass.Name & \"名称\" m_EditInterface.SetRowCaption 3, m_EditInterface.ItemClass.Name & \"全名\" Exit Sub Err_Handler: End Sub

c)

自动编码实现和上面原理一样,指定一个规则,自动生成代码,并锁定不允许修改即

可。

页脚内容22

d)

客户要求自动带出上级组代码,由于按上面的方法上级组代码仍然可以被修改掉,因

此一种方法是:可以让客户只录最后一级代码,在保存前自动加上其上级组代码,处理BeforeSave事件即可。

2.实现对物料的默认仓库属性的F7功能和下拉列表功能的进一步过滤,使其只显示包含“6.”的仓库

页脚内容23

1.6

用户权限管理插件化开发

用户权限管理-插件接口由K3BaseDataEvents.dll提供:

页脚内容24

组件位置:

$/CodePublic/K3BASE/BaseData/client/K3BaseDataEvents/K3BaseDataEvents.vbp 实例插件代码位置:

$/CodePublic/K3BASE/BaseData/client/K3BaseAccessPlugin/K3BaseAccessPlugin.vbp 1.概述

要使用插件,需要写一个插件的DLL,引用K3BaseDataEvents.dll,处理其提供的接口即可。写好插件DLL后,需要在数据库表中增加该插件的注册记录,如下: 表名:t_ThirdPartyComponent 关键字段及意义: FTypeID:102

FTypeDetailID:从1开始,按照已有顺序+1定义。 FComponentName:客户端插件类的ProgID

FComponentSrv: 服务端插件类的ProgID – 未实现 FDescription: 描述

2.K3BaseDataEvents. AccessEvents类 该类定义了权限管理保存后的相关事件。

页脚内容25

编 三

Public Event AfterSaveUserAccessGroup(ByVal UserID As Long, vctPermData As Vector, ByVal UserName As String, ByVal sMachineName As String, ByVal sIPAddress As String)

用户组权限保存后触发

Public Event Public Event AfterSaveUserAccessDetail(ByVal ObjectType As Long, _ ByVal ObjectID As Long, _ ByVal vctSecurityInfo As Object, _ ByVal UserID As Long, _ ByVal sUserName As String, _ ByVal sMachineName As String, _ ByVal sIPAddress As String, _ ByVal vctDelAccess As KFO.Vector)

用户明细权限保存后触发

3.插件编写方法

内部引用,初始化,并实现事件接口即可,(请参考组件K3BaseAccessPlugin.dll的实现) 步骤如下:

页脚内容26

新建DLL工程如K3BaseAccessPlugin.dll,并引用插件类库K3BaseDataEvents.dll 新建类如CBIAccessEdit (BI模块在权限修改后做相关处理的插件) 定义WithEvents的K3BaseDataEvents. AccessEvents对象,并处理其事件

编写接口函数Public Sub Show(ByVal oEvents As AccessEvents),在该函数中初始化插件对象,

a) b)

c)

d)

必须的!!

e)

插件写好后,编译成K3BaseAccessPlugin.dll,向数据库表中插入数据注册该插件即可,

如下SQL:

insert into t_ThirdPartyComponent (FTypeID, FTypeDetailID, FIndex, FComponentName) values (102,1, 1, 'K3BaseAccessPlugin.CBIAccessEdit') -- 102表示权限修改的插件类对该类插件是固定的。在权限修改界面会加载所有定义成该类型的用户插件 -- 该sql表示当修改用户权限时,加载K3BaseAccessPlugin.CBIAccessEdit插件。 f) 测试、发布

Private Const ID_TypeDetailID = 1 'BI权限管理 Private WithEvents m_BaseAccessEvents As K3BaseDataEvents.AccessEvents '事件引擎 页脚内容27

'该函数为接口函数,调用该函数进行初始化 Public Sub Show(ByVal oEvents As AccessEvents) Set m_BaseAccessEvents = oEvents End Sub '卸载例程 Private Sub Class_Terminate() Set m_BaseAccessEvents = Nothing End Sub 4.实例:实现客户需要功能的代码

a)

定义插件对象并初始化

'该函数为接口函数,调用该函数进行初始化 Public Sub Show(ByVal oEvents As AccessEvents) Set m_BaseAccessEvents = oEvents End Sub 页脚内容28

b)

实现:

'权限修改完成后触发,请在这里填写你的业务逻辑代码 Private Sub m_BaseAccessEvents_AfterSaveUserAccessDetail(ByVal ObjectType As Long, ByVal ObjectID As Long, ByVal SecurityInfo As Object, ByVal UserID As Long, ByVal sUserName As String, ByVal sMachineName As String, ByVal sIPAddress As String, ByVal vctDelAccess As KFO.Vector) Dim strRet As String Dim strFaccessType As String Dim strFaccessMask As String If Not SecurityInfo Is Nothing Then strFaccessType = SecurityInfo(1)(\"FaccessType\") strFaccessMask = SecurityInfo(1)(\"FaccessMask\") End If strRet = \"ObjectType=\" & CStr(ObjectType) & vbCrLf & _ 页脚内容29

\"ObjectID=\" & CStr(ObjectID) & vbCrLf & _ \"FaccessType=\" & strFaccessType & vbCrLf & _ \"FaccessMask=\" & strFaccessMask & vbCrLf & _ \"UserID=\" & CStr(UserID) & vbCrLf MsgBox strRet End Sub '权限修改完成后触发,请在这里填写你的业务逻辑代码 Private Sub m_BaseAccessEvents_AfterSaveUserAccessGroup(ByVal UserID As Long, vctPermData As KFO.Vector, ByVal UserName As String, ByVal sMachineName As String, ByVal sIPAddress As String) Dim strRet As String Dim strFaccessType As String Dim strFaccessMask As String Dim strGroupID As String Dim strSubSys As String 页脚内容30

If Not vctPermData Is Nothing Then strFaccessType = vctPermData(1)(\"Faccess\") strFaccessMask = vctPermData(1)(\"FMask\") strSubSys = vctPermData(1)(\"FSubSys\") strGroupID = vctPermData(1)(\"FGroupID\") End If strRet = \"FSubSys=\" & CStr(strSubSys) & vbCrLf & _ \"FGroupID=\" & CStr(strGroupID) & vbCrLf & _ \"FaccessType=\" & strFaccessType & vbCrLf & _ \"FaccessMask=\" & strFaccessMask & vbCrLf & _ \"UserID=\" & CStr(UserID) & vbCrLf MsgBox strRet End Sub

页脚内容31

1.7 系统参数平台插件化开发

用户权限管理-插件接口由K3ParaConsoleEvents.dll提供: 组件位置:

$/CodePublic/K3BASE/K3ParameterConsole/Client/K3ParaConsoleEvents/K3ParaConsoleEvents.vbp 实例插件代码位置:

1.概述

要使用插件,需要写一个插件的DLL,引用K3BaseDataEvents.dll,处理其提供的接口即可。写好插件DLL后,需要在数据库表中增加该插件的注册记录,如下: 表名:t_ThirdPartyComponent 关键字段及意义: FTypeID:103

FTypeDetailID:按照对应功能的子系统ID*1000~子系统ID*999定义 FComponentName:客户端插件类的ProgID

FComponentSrv: 服务端插件类的ProgID – 未实现 FDescription: 描述

方法:

页脚内容32

编 三

Public Sub AddPara(dctPara as KFO.Dictionary)

添加一个系统参数,dctPara是系统参数的详细信息,包括参数类型,参数值,相关组件等信息。 如果参数这中有一个名为” vctParas” 的值的话,

系统会认它是一个KFO.Vector,这时进行批量添加系统参数,该原则同样适用于SetPara中的参数值。这样可以尽量减少接口的数量。

FParaID:参数的唯一标识。可以为长度50的任意字符,该参数为必填。

FParaType(0:CheckBox,1:TextBox,2: DropDownList,3:Button,4: Number),该参数为必填。

FParaValue(

CheckBox复选框参数,值用0,1表示; TextBox文本框参数,值直接填充;

DropDownList下拉列表参数,值用chr(1)分隔显示名称和值,用chr(2)分隔每个DropDownList的值; Chr(3)分隔下拉列表的初始化值和当前选中的值

Button按钮参数,值用来填写要调用组件的名称,参数和要调用的方法, 组件名称也就是用CreateObject调用的“工程名.类名”,

用chr(1)分隔组件名称,参数和要调用的方法,如有多个参数,用chr(2)分隔各个参数, 程序解析时,首先用chr(1)为分隔符分组,可以将参数分为一个ary(2),其中

页脚内容33

ary(0)= “工程名.类名”

ary(1)= 系统参数的集合(用chr(2)分隔) ary(2)= 被调用的接口方法 如果想触发ClickButtonPara事件 而不想使用系统本身的方法调用相关组件请使用 dct(\"FValue\")=Chr(1)

Number 数值参数。值只能输入数值。 )

参数扩展属性:

FSubSysName:参数子系统名称,指定参数所属的子系统。 FParaName:参数名称

FSysDefaultValue:系统参数默认值.

可以不同,在界面上显示FTradeDisplay,但保存时使用FTradeValue FDisplay:系统参数显示值

FValue:系统参数真实值。如类型为TextBox的参数,真实值与显示值可以不同,如果没有指定显示值,则系统使用真实值显示在界面上。 FTradeValue:系统参数所属行业值

FTradeDisplay:系统参数所属行业显示值。 FDiffValue: “存在差异”列对应的值。

页脚内容34

FMaxEditLen:系统参数类型为TextBox时,可以为参数文本框指定一个最大长度。 FNumberDecPlaces:系统参数类型为Number时,用该参数来指定小数位数,默认为0. FNumberMin: 系统参数类型为Number时,用该参数来指定数值可使用的最小值. FNumberMax: 系统参数类型为Number时,用该参数来指定数值可使用的最大值. Flock:若要锁定某参数,使其在界面上无法编辑,这可以指定Flock=1锁定参数。 FTips:参数提示信息Tips

Public Sub SetCellFocus(ByVal lRow As Long, ByVal lCol) 设置单元获得焦点焦点

Public Sub SetCellLock(ByVal lRow As Long, ByVal lCol, bLock As Boolean) 设置单元只读属性

Public Function GetCellText(ByVal lRow As Long, ByVal lCol As Long) As String 读取某个单元格的Text

Public Function SetCellText(ByVal lRow As Long, ByVal lCol As Long, Optional NewVal As Variant = \"\") As String '设置某个单元格的Text

页脚内容35

'同步显示值和真实的值

Public Sub SyncParaValue(ByVal lRow As Long)

'得到当前参数值,即调整后状态值

Public Function GetParaValue(ByVal lRow As Long) As String

'得到当前参数值,即调整后状态值

Public Function GetParaValueByParaID(ByVal ParaID As String) As String

'通过ParaID获取当前参数所在的行号,如果该参数没有在界面上显示,则返回-1 Public Function GetParaRowByParaID(ByVal ParaID As String) As Long

‘用子系统ID重新刷新该子系统下的所有参数到界面 Public Sub RefreshParaBySubSysID(ByVal lSubSysID As Long)

'设置参数值

Public Sub SetParaValue(ByVal lRow As Long, ByVal dctData As KFO.Dictionary)

页脚内容36

Public Sub SetParaValueByParaID(ByVal ParaID As String, ByVal dctData As KFO.Dictionary)

事件:

'修改系统参数值时触发,dctPara 为被修改参数的相关数据,Cancel=True取消修改 Public Event ChangeParaValue(ByVal dctPara As KFO.Dictionary)

'系统参数平台点保存,在更新数据库值之前触发 Public Event BeforeSave(ByRef Cancel As Boolean)

'系统参数平台点保存,在修改数据库值之后触发 Public Event AfterSave()

'点击按钮类型的系统参数后触发

Public Event ClickButtonPara(ByVal dctPara As KFO.Dictionary)

'行业配置改变时触发

Public Event TradeChange(ByVal dctPara As KFO.Dictionary)

页脚内容37

'子系统改变时触发

Public Event SubSysNodeClick(ByVal dctPara As KFO.Dictionary)

'点击参数平台

Public Event GridClick(ByVal dctPara As KFO.Dictionary)

'KeyDown事件,F7功能可以在该事件中实现

Public Event GridKeyDown(ByVal dctPara As KFO.Dictionary)

'点击工具栏上的刷新Refresh时触发该事件事件 Public Event ClickRefresh(ByVal dctPara As KFO.Dictionary)

2.系统参数定义表

页脚内容38

t_ParaData[系统参数平台主表]FID[参数唯一ID]FSubSysID[子系统ID]FParaID[系统参数ID]FParaType[系统参数类型]FSysDefaultValue[系统预设默认值]FTradeValue[行业配置状态值]FValue[调整后状态值]FSourceValueSQL[系统参数来源SQL]intintnvarchar(200)intnvarchar(200)nvarchar(200)nvarchar(200)nvarchar(800)t_ParaTradeData[系统参数行业数据定义]FID[参数ID]FTradeID[行业ID]FParaID[参数字符型ID]FTradeValue[行业默认参数值]intintNVARCHAR(200)T_ParaData表: FID:参数ID

[ID根据下面公式计算:子系统ID*10000~ ID*10000 + 9999]目前该子系统已有最大

编号+1

FSubSysID:子系统ID

FParaType:系统参数类型0:CheckBox,1:TextBox,2: DropDownList,3:Button

FParaID:系统参数ID[可以用字符表示的参数ID,全局唯一] 方便业务组标识参数 FSysDefaultValue:系统预设默认值 FTradeValue:行业配置状态值 FValue:调整后状态值

FSourceValueSQL:参数值来源SQL,定义了该字段后,保存系统参数时同时更新目标字段,注意: 业务组可以根据自己的情况填写改语句来同步更新自己的系统参数,系统用@Value@来表示当前值。

页脚内容39

例如:

Update t_SystemProfile Set FValue='@Value@' Where FCategory='Base' and FKey='CurrentTradeID'

T_ParaTradeData表:

FID:请与t_ParaTradeData保持一致

FTradeID:目前在系统中与插入了下面数据:

Insert Into t_SystemProfile (FCategory,FKey,FValue) Values ('Base_Trade','Trade_0','标准行业(默认)') Insert Into t_SystemProfile (FCategory,FKey,FValue) Values ('Base_Trade','Trade_1','机械行业') Insert Into t_SystemProfile (FCategory,FKey,FValue) Values ('Base_Trade','Trade_2','汽配行业') Insert Into t_SystemProfile (FCategory,FKey,FValue) Values ('Base_Trade','Trade_3','食品行业') Insert Into t_SystemProfile (FCategory,FKey,FValue) Values ('Base_Trade','Trade_4','医药行业') GO

FTradeID与对应的ID保持一致:即0:标准行业;1:机械行业;2: 汽配行业;3: 食品行业;4: 医药行业 注:系统预设值其实总是与0:标准行业的值是一样的。换句话说,初始化系统预设值实际上就是读取0:标准行业的值

T_ParaData与T_ParaTradeData中的预定义数据需要业务组根据需求插入。 可以通过下面语句得到当前帐套设置的行业值

页脚内容40

Select FValue from t_SystemProfile Where FCategory='Base' and FKey='CurrentTradeID'

3.系统参数平台界面列定义

Public Enum GridColDefine

COL_FID = 1 '参数ID [ID根据下面公式计算:子系统ID*10000~ ID*10000 + 9999]目前该子系统已有最大编号+1

COL_SUBSYS_ID = 2 '子系统ID

COL_PARA_Type = 3 '系统参数类型0:CheckBox,1:TextBox,2: DropDownList,3:Button COL_PARA_ID = 4 '系统参数ID[可以用字符表示的参数ID,全局唯一] COL_SYSDEFAULT_VALUE = 5 '系统预设默认值 COL_TRAD_VALUE = 6 '行业配置状态值 COL_VALUE = 7 '调整后状态值 COL_SUBSYS_NAME = 8 '子系统名称 COL_PARA_NAME = 9 '参数名称

COL_SYSDEFAULT_DISPLAY = 10 '系统预设默认值显示列 COL_TRAD_DISPLAY = 11 '行业配置状态值显示列 COL_VALUE_DISPLAY = 12 '调整后状态值显示列

页脚内容41

COL_DIFF = 13 '差异分析 End Enum

'参数类型

Public Enum ParaType PT_CHECKBOX = 0 PT_TEXTBOX = 1 PT_DROWDOWNLIST = 2 PT_BUTTON = 3 PT_NUMBER = 4 End Enum

37.8主控台插件化开发

主控台-插件接口由KDMainDataEvents.dll提供: 组件位置:

$/CodePublic/K3BASE/kdMainNew/client/KDMainDataEvents

页脚内容42

1.概述

要使用插件,需要写一个插件的DLL,引用KDMainDataEvents.dll,处理其提供的接口即可。 编写好插件DLL后,需要在数据库表中增加该插件的注册记录,如下: 表名:t_ThirdPartyComponent 关键字段及意义: FTypeID:104

FTypeDetailID:按照对应功能的子系统ID*1000~子系统ID*999定义 FComponentName:客户端插件类的ProgID

FComponentSrv: 服务端插件类的ProgID – 未实现 FDescription: 描述

1 *主控台标准接口

1.1 流程简介

Step 1:新建ActiveX Dll工程PrjTest,引用K3BBI.tlb和KFO10.dll Step 2:创建一个类(Application类)实现IBizConsole接口

函数CallFunc:当用户在主控台上双击某个明细功能时,主控台会创建相应的组件,并调用该组件的CallFunc方法。

页脚内容43

PS:可以通过select * from t_UserDetailFunc Where FDetailFuncID>=1000000000查找对应功能ID,其中FDetailFuncID对应CallFunc接口的dctPara(\"FuncID\"),FClassParam对应CallFunc接口的dctPara(\"OTHERPARAM\")

Step 3:通过update t_UserDetailFunc set fclassname='PrjTest.Application'

,fclassparam=1 where fdetailfuncid=1000000000。修改FClassName(被调用类名称,即实现IBizConsole接口的类)和FClassParam(最好是该字段不重复的)的值。

Adv. 0:如果在调用用户功能的前后需要初始化用户功能的组件,比如传参数,那么可以创建一个类(OtherEvent类)实现ILoadCtrlListener接口来实现

OtherEvent.cls

页脚内容44

PS:由于动态加载Ocx控件到子窗口中,当这些控件包含了需要license的子控件(如 ActiveBar)时, 在加载该控件之前需要调用Licenses.Add方法添加相应的License Key。

Application.cls

Adv. 1:相关接口说明

页脚内容45

1.2 子系统功能调用标准接口BizConsoleClass

说明:各个主控台组件,要求实现IBizConsole接口,该接口包含如下方法: (1)Private Sub IBizConsole_CallFunc(ByVal dctPara As Object, ByVal oKDMain As Object)

功能:当用户在主控台上双击某个明细功能时,主控台会创建相应的组件,并调用该组件的CallFunc方法。

参数:dict – 包含标识明细功能相关参数的字典对象,包含下列关键字

FuncID: 明细功能ID,对应t_UserDetailFunc的FDetailFuncID

OtherParam: 其它参数,对应t_UserDetailFunc的FClassParam FFuncName: 明细功能名称 oKDMain– 即KDMainService对象

(2) Private Function IBizConsole_SubID() As String

功能:主控台控件所属子系统的标识(比如gl, ar, ap, hr等)

(3) Private Function IBizConsole_GetPeriodString() As String

功能:表示当前帐套期间的文本信息

(4) Private Function IBizConsole_OneTimeAlter()

功能:一次性预警功能的实现代码

页脚内容46

1.3 MDI子窗体实现接口LoadCtrlListener

1. 编写OCX代码:

KDMainService加载主控台控件时的事件通知接收器,需要实现ILoadCtrlListener接口,该接口包含下面方法:

a) 控件加载显示前

Private Function ILoadCtrlListener_AttachObject(ByVal oLoadCtl As Object, ByVal oParentWindow As Object) As Boolean

功能:当控件成功加载后(还没有显示出来)通知BizConsoleClass

参数:oLoadCtl – 新加载的控件对象(注意:并不是控件本身,而是控件的一个包装对象,需要通过oLoadCtl.object来访问真正的控件)

oParentWindow – 指定义在主控台frmSub窗体中的类型为KDVBF.ParentWindows对象实例,用于用户控件与主控台的交互(通过自定义事件)

返回: True表明可以继续正常流程, False表明结束控件显示流程,不再显示控件

b) 控件加载显示后

Private Function ILoadCtrlListener_AfterShow() As Boolean 功能:当控件显示后通知BizConsoleClass

返回: True表明可以继续正常流程, False表明结束控件显示流程

c) 调用前

页脚内容47

Private Function BeforeLoad(ByVal oParentWindow As Object) As Boolean 功能:当控件显示前通知BizConsoleClass

参数:oParentWindow – 指定义在主控台frmSub窗体中的类型为KDVBF.ParentWindows对象实例,用于用户控件与主控台的交互(通过自定义事件)

返回: True表明可以继续正常流程, False表明结束控件显示流程

2. 添加license实现OCX在主控台运行时调用:

a) 首先确保OCX控件在开发环境可用,例如:LMBillImport.ocx

b) 在开发环境进行代码调试:sName=licenses.Add “程序名.控件名”,获得sName的值 c) 编写正式代码,例如:

代码调试:sName=licenses.Add “LMBillImport.ctlStockIn” 返回值:sName=”wshdf”,

sName为空,则不需要处理,不为空,则需要修改m_kdMain.ShowForm调用正式代码: Call m_kdMain.ShowForm(SystemName, \" LMBillImport.ctlStockIn , wshdf \ \"ctlStockIn\

备注:从V12开始新增OCX废除原来的方式, 但原来的方式继续可用。

页脚内容48

\\\\192.168.16.159\\K3CtlLic

1.4 主控台对象KDMainService

说明:KDMain主控台提供的服务对象,供BizConsoleClass调用;包含下面方法: Function ShowForm(ByVal SystemName As String, _ ByVal sCtrlProgID As String, _ Optional ByVal sFormID As String, _ Optional ByVal bGlobal As Boolean = False, _ Optional ByVal sTitle As String, _

Optional ByVal bRefresh As Boolean = True, _ Optional ByVal oEvent As Object _ ) As Object

功能:加载sCtrlProgID所标识的控件到主控台一个MDI子窗口中 参数:SystemName – 系统名称,显示在MDIMain主窗体的标题栏上

sCtrlProgID – 控件ProgID

sFormID – 控件所在的子窗口标识(如果bGlobal参数为True,最好提供sFormID)

bGlobal – 如果为True,表明假如存在sFormID的子窗口,则将该窗口激活即可,不必再创建新的子窗口;如果为False则表明始终创建新的子窗口来加载控件

页脚内容49

sTitle – 子窗口标题

bRefresh – 加载控件后是否强制刷新该控件,缺省为True oEvent – 即图-1中的LoadCtrlListener对象, 可以传入Nothing

返回: 新加载的控件对象;如果bGlobal为True则始终返回Nothing Sub DoCallFunc(ByVal sProgID As String, ByVal dict As KFO.Dictionary)

功能:加载其它的主控台控件 参数:sProgID – 控件ProgID

Dict – 参见CallFunc的第一个参数说明

Property Get Cache() As Object

功能:主控台程序提供的缓存服务对象

(该对象暴露的接口即是ClientCacheService.CacheFacade接口, 使用缓存的代码示例见后面)

Property Get TimerService() As Object

功能: 主控台提供的异步定时服务(定时服务由一个单独的线程发起)

(该对象暴露的接口是KDTimerSrv.TimerSrv,可通过VB的对象浏览器查阅该对象接口函数,也可参考相关文档) Property Get ActiveBar() As Object

功能: 主控台的ActiveBar控件

页脚内容50

Property Get StatusBar() As Object

功能: 主控台主窗体的StatusBar控件 Sub Refresh(Optional ByVal bReLogin As Boolean = True)

功能:清除当前的环境信息,关闭所有打开的业务子窗口;如果bReLogin参数为True,还会重新登录。

页脚内容51

因篇幅问题不能全部显示,请点此查看更多更全内容