K/3WISE报表公式二次开发指南
文章目录
1、客户端演示插件SelfRpt.rar
客户端演示demo代码SelfRpt.rar。用户将代码下载解压,打开工程,将会看到如下的工程结构。
工程文件中,只有CallFunc.cls
文件需要用户修改,其它的都不需要修改。
用户也可以将SelfRpt
的工程名进行修改。
- 无须用户修改的文件
MMTS.bas
,ModPub.bas
,GLobal.bas
包含了一些基础的函,RptFunc.RES
为资源文件
Func.cls
公式实体类,包含公式的一些属性
Funcs.cls
公式实体集合
Param.cls
公式中的参数实体类,包含公式参数的一些属性
Params.cls
参数实体集合,在公式实体类中包含
- 需要修改的文件
CallFunc.cls
提供给外界调用的类, 包含了四个用户需要实现的接口函数
' 1. 参数可选值列表 接口函数(可以不修改)
Public Function GetParamValueList(sFunc As String, sParam As String, sParamText As String) As Variant
' 2. 公式参数的F7帮助 接口函数(可以不修改)
Public Function GetParamValue(sFunc As String, sParam As String, sParamText As String) As String
' 3. 自定义公式注册 接口函数(必须修改)
Public Property Get Funcs(ByVal sDefDsn As String) As Funcs
' 4. 公式运算取数 接口函数(必须修改)
Public Function GetData(ByVal sFunc As String, Params As Variant, sErr As String) As Variant
1.1、 创建插件工程
打开VB创建工程,添加MMTS.bas
,ModPub.bas
,GLobal.bas
,CallFunc.cls
,Func.cls
,Funcs.cls
,Param.cls
,Params.cls
,RptFunc.RES
文件,保存且修改工程名。
用户可以不用创建工程,直接对SelfRpt.rar进行修改工程名及CallFunc.cls
文件
1.2、实现CallFunc.cls
中的公式注册接口Funcs
1.2.1、实现接口Funcs
FuncType = LoadKDString("自定义报表函数")
为公式类型名,在该类型下有两个公式SELF_ACCT_NAME
, SELF_ADD
。
SELF_ACCT_NAME_Params
,SELF_ADD_Params
两个函数对SELF_ACCT_NAME
,SELF_ADD
两个公式进行了描述。
K3报表中将会调用的Funcs
接口
'应实现的接口,使K3报表获取自定义函数,函数信息注册
Public Property Get Funcs(ByVal sDefDsn As String) As Funcs
Dim oFunc As Func
Dim FuncType As String
mConnectionStr = sDefDsn
FuncType = LoadKDString("自定义报表函数")
'公式1: SELF_ACCT_NAME 用于获得科目名称
Set oFunc = mvarFuncs.Add("SELF_ACCT_NAME", "SELF_ACCT_NAME") '自定义的函数,用于获取科目名
SELF_ACCT_NAME_Params oFunc, FuncType
'公式2: SELF_ADD 用于做加法
Set oFunc = mvarFuncs.Add("SELF_ADD", "SELF_ADD") '自定义的函数,用于做加法
SELF_ADD_Params oFunc, FuncType
Set Funcs = mvarFuncs
Set oFunc = Nothing
End Property
1.2.2、实现接口Funcs
中调用的公式描述函数
接口Funcs
中调用了SELF_ACCT_NAME_Params
,SELF_ADD_Params
两个函数,这两个函数分别对两个公式及其参数进行了描述。
下面以SELF_ADD_Params
为例,展示如何对公式进行描述。
SELF_ADD_Params
描述了一个名为SELF_ADD的加法公式,公式有两个参数值1与值2,参数类型及返回值类型都是vbString
'公式2参数描述
'oFunc: 为公式实体
'FuncType: 公式类型
Private Sub SELF_ADD_Params(ByRef oFunc As Func, ByVal FuncType As String)
Dim objParam As Param
Dim objParams As New Params
'公式的参数描述
Set objParams = New Params
'参数1
Set objParam = objParams.Add("Value1", "Value1")
With objParam
.DataType = vbString '参数的数据类型
.DefValue = 0 '参数默认值
.IsCustomWnd = True
.ParamName = LoadKDString("值1")
.ParamDes = LoadKDString("输入数值,按F7没有用的。")
End With
'参数2
Set objParam = objParams.Add("Value2", "Value2")
With objParam
.DataType = vbString '参数的数据类型
.DefValue = 0 '参数默认值
.IsCustomWnd = True
.ParamName = LoadKDString("值2")
.ParamDes = LoadKDString("输入数值,按F7没有用的。")
End With
'公式描述
With oFunc
.FuncName = "SELF_ADD"
.GroupName = FuncType
.ResultType = vbString
.FixParamNum = True
.MinParamNum = 0
.MaxParamNum = 2
.FuncDes = LoadKDString("两数相加")
Set .ParamsInfo = objParams
End With
Set objParam = Nothing
Set objParams = Nothing
End Sub
1.3、实现CallFunc.cls
中的公式取数接口GetData
1.3.1、实现接口GetData
K3报表公式运算时将会调用GetData
接口,以获取公式运算结果。GetData
会根据公式名称去调用公式。
这里GetData
调用了实现的两个公式函数 SELF_ACCT_NAME_CAL
,SELF_ADD_CAL
。
'取数(老报表系统接口函数)
'sFunc: 为需要调用的公式名
'Params: 为公式的参数数组
'sErr: 为计算错误,返回的错误信息
Public Function GetData(ByVal sFunc As String, Params As Variant, sErr As String) As Variant
On Error GoTo ErrHandle
Dim tempParams As Variant
Select Case sFunc
'调用公式1
Case "SELF_ACCT_NAME"
If Params(0) = "" Then '当参数为默认值时
GetData = ""
Else
GetData = SELF_ACCT_NAME_CAL(sFunc, Params, sErr)
End If
'调用公式2
Case "SELF_ADD"
GetData = SELF_ADD_CAL(sFunc, Params, sErr)
End Select
Exit Function
ErrHandle:
sErr = LoadKDString("#取数错误,错误信息:") & Err.Description
End Function
1.3.2、实现接口GetData
中调用的公式函数
实现SELF_ACCT_NAME_CAL
与SELF_ADD_CAL
两个公式运算函数。以SELF_ACCT_NAME_CAL
函数为例,如下面代码。
先对Params
中的参数进行检查,Params
是否为数组,Params(0)是否为空。
再根据参数,组装SQL进行数据库读取。这里使用的是Set rs = GLData.GetAnyRecordset(sql)
进行数据库查找。
'公式1主体
'sFunc: 为需要调用的公式名
'Params: 为公式的参数数组
'sErr: 为计算错误,返回的错误信息
Private Function SELF_ACCT_NAME_CAL(ByVal sFunc As String, Params As Variant, sErr As String) As Variant
'取出报表默认设置
Dim lRptYear As Long
Dim lRptPeriod As Long
Dim lRptEndPeriod As Long
Dim sRptCurrency As String
Dim lErrCode As Long
Dim bIsTemplate As Boolean
'此处没有使用上
lRptYear = Properties("RPTYEAR") '默认年度
lRptPeriod = Properties("RPTPERIOD") '默认期间
lRptEndPeriod = Properties("RptEndPeriod") '默认结束期间
sRptCurrency = Properties("RptCurCurrency") '默认货币
'参数检查 ,最好做一下参数内容的检查
If Not IsArray(Params) Then Exit Function
'计算公式
Dim strAcct As String
Dim rs As ADOR.Recordset
Dim sql As String
strAcct = Params(0)
If strAcct = vbNullString Then
sErr = "#" & LoadKDString("科目代码为空")
Exit Function
End If
'查找数据库
sql = "SELECT FName FROM t_Account WHERE FNumber = '" & strAcct & "'"
Set rs = GLData.GetAnyRecordset(sql)
If Not rs.EOF Then SELF_ACCT_NAME_CAL = "" & rs!FName '返回公式结果
rs.Close
Set rs = Nothing
End Function
1.4、实现CallFunc.cls
中的其他两个接口
修改GetParamValueList
,GetParamValue
两个接口函数,如果需要使用就修改,不用,就不要修改。
演示插件SelfRpt.rar中实现了GetParamValue
,而没有修改GetParamValueList
。
GetParamValue
的实现使得,在输入参数是可以使用F7
进行查找
代码Set CFilter = CreateObject("EBCGLView.GLView") Set retcol = CFilter.AccountLookup
将会显示科目查询窗体。
'///////////////添加公式为SELF_ACCT_NAME时的F7帮助////////////
Public Function GetParamValue(sFuncName As String, sParamName As String, sParamText As String) As String
Dim CFilter As Object
Select Case sFuncName
Case "SELF_ACCT_NAME"
Dim retcol As Object
Set CFilter = CreateObject("EBCGLView.GLView")
Set retcol = CFilter.AccountLookup'显示查询窗体
If Not retcol.ReturnObject Is Nothing Then
GetParamValue = retcol.ReturnObject.Number
End If
Set retcol = Nothing
End Select
Set CFilter = Nothing
End Function
2、演示插件部署
2.1、配置RPTFUNC.ini
在Kingdee的K3ERP目录有一个RPTFUNC.ini
文件。
将SelfRpt.CallFucn
放入RPTFUNC.ini
文件中,如下图所示,SelfRpt
为组件名
2.2、注册插件
代码编写完成以后,进行组件编译,生成SelfRpt.dll
组件
将SelfRpt.dll
组件放入Kingdee的K3ERP目录中
将组件使用Regsvr32注册
3、演示插件效果
3.1、公式SELF_ACCT_NAME
的演示
根据科目代码读取科目名称,公式运算的时候,会调用接口GetData
,接口GetData
会调用SELF_ACCT_NAME_CAL
函数
使用F7
快捷键查找科目代码,将会调用接口GetParamValue
,显示查询窗体
3.2、公式SELF_ADD
的演示
根据科目代码读取科目名称,公式运算的时候,会调用接口GetData
,接口GetData
会调用SELF_ADD_CAL
函数