K3WISE报表公式二次开发指南

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_ParamsSELF_ADD_Params两个函数对SELF_ACCT_NAMESELF_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_CALSELF_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函数

在这里插入图片描述

[

发布了62 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/native_lee/article/details/99695259