用友u8提示activx出错
日期:2023年04月22日 08:42 浏览量:1
单据控件在 RowColChange、点击参照、数据校验等关键事件支持单据插件。举例说明
假如单据控件内部是这样的
Private sub ABC()
Call voucherPluginProxy.ABC(…..,bCancel)
If bCancel=false then
RaiseEvent ABC()
End if
End sub
而 VoucherPluginProxy 的 ABC 方法是这样的
Public sub ABC(…….,bCancel)
On error resume next
For each plugin in plugins
Plugin.ABC(……,bCancel)
next
End sub
单据插件管理(VoucherPluginPorxy 会在单据初始化时去初始化,找出这个单据有多少
个插件,然后放到一个集合中)。
当单据控件去执行 ABC 方法时,单据控件先去调用插件的 ABC 接口,执行完插件的 ABC
接口之后,根据返回的 bCancel 值来确定是不是需要再去 RaiseEvent ABC 接口给业务组。
单据控件
ctlVoucher
单据插件管理
[VoucherPluginPr
oxy]
销售订单插件
采购订单插件
采购入库单插件
数据
单据控件初始化时会去本地 U8soft\VoucherPlugin.config 文件去读取数据,这个 config
文件是一个 xml,结构如下:
<VoucherPlugins>
<plugin subid='pu' cardnum='25' classname='EFHC_vouchinterface.voucherinterface'
iorder='1000' />
……
</VoucherPlugins>
之所以设计成从本地 config 中读取数据是基于效率考虑的,这样不用每次读取数据库。
需要特别注意的 subid 和 cardnum 如果有英文字符需要小写,因为插件管理器
(VoucherPluginProxy 里面是通过 Dom 的 SelectNodes 来查找的,查找时做了小写处理。
在单据控件调用 VoucherPluginProxy(插件管理器)初始化时会把当前单据的 subid 和
cardnum 传过去。插件管理器(VoucherPluginProxy 会讲 subid 和 cardnum 作为关键字来查找
dom,找到的就放到一个集合中。并对这个集合中的组件做初始化。会有如下的类似代码(一
下代码仅做说明问题用,不是真正的代码):
Dim oNodes as object
Set oNodes= objDoc.selectNodes("//plugin[@subid='" & LCase(m_sSubID) & "' and
@cardnum='" & LCase(m_sCardNum) & "']")
For i = 0 To oNodes.Length-1
Set oNode = oNodelist(i)
sClassName = getAttribute(oNode, "classname")
Set m_oPlugin = CreateObject(sClassName)
If m_oPlugin Is Nothing Then
OutputDebugString "插件 " & sClassName & "创建失败"
Else
m_bCreatePlugin = True
If m_colPlugins Is Nothing Then
Set m_colPlugins = New Collection
End If
m_colPlugins.Add m_oPlugin
m_nPluginCount = m_nPluginCount + 1
End If
Next
这样我们就能够得到一个插件的集合,这个集合在单据控件执行方法 ABC 时就会被调
用 ABC 接口。
本地的 config 文件是从数据库 Data 库的 VoucherPlugins 表缓存来的。用户在登录门户时
后,门户会去异步读取这个表和本地的 config 文件对比,如果发现有新数据就会重新生成该
config。
年度 data 库 select * from dbo.VoucherPlugins
单据二次开发插件信息表(VoucherPlugins)(UFData 库)
字段名 字段类型 说明
ID uniqueidentifier GUID,唯一标示
subid Nvarchar(100) 产品 ID,例如 PU,SA,ST
cardnum Nvarchar(100) 单据 CardNumber,例如采购订单是 88,销售订单是 17
classname Nvarchar(400) 插件组件入口
ufts timestamp 时间戳(预制时无需关注,会自动生成)
iOrder int 插件加载顺序
插件接口
单据插件支持以下接口函数
示例
'''从这里开始为二次开发的接口函数
Public Function Init(ByVal oLogin As Object) As Boolean
'入口点,提供单据当前的Login对象
'Set m_oLogin = oLogin
'Init = m_bCreatePlugin
End Function
'表头字段点击参照按钮弹出参照时会触发
Public Sub headBrowUser(ByRef Voucher As Object, ByVal Index As
Variant, sRet As Variant, ByRef referPara As ReferParameter, ByRef
bCancel As Boolean)
On Error Resume Next
'参数设置见单据控件的事件描述
End Sub
'表体字段点击参照按钮弹出参照时会触发
Public Sub bodyBrowUser(ByRef Voucher As Object, ByVal Row As Long,
ByVal Col As Long, sRet As Variant, ByRef referPara As
ReferParameter, ByRef bCancel As Boolean)
On Error Resume Next
'参数设置见单据控件的事件描述
End Sub
'表体字段参照完带回值或者手动输入后校验数据时会触发
Public Sub bodyCellCheck(ByRef Voucher As Object, RetValue As
Variant, bChanged As Long, ByVal r As Long, ByVal c As Long, ByRef
referPara As ReferParameter, ByRef bCancel As Boolean)
On Error Resume Next
'参数设置见单据控件的事件描述
'如何区分用户是手动输入还是参照带回值?(通过ReferPara参数的RstGrid,
该属性是个RecordSet,有值说明是参照带回的,否则是手动输入)
End Sub
'表头字段参照完带回值或者手动输入后校验数据时会触发
Public Sub headCellCheck(ByRef Voucher As Object, Index As Variant,
RetValue As String, bChanged As CheckRet, ByRef referPara As
ReferParameter, ByRef bCancel As Boolean)
On Error Resume Next
'参数设置见单据控件的事件描述
End Sub
'单据表体上单击操作时会触发
Public Sub Click(ByRef Voucher As Object, section As
SectionsConstants, ByVal Index As Long, ByRef bCancel As Boolean)
通过上面的说明,我们知道我们的插件入口 classname 需要实现上述接口才能被系统执行。
请将以上接口代码复制到 VB 的一个 Class Module 里面,将该 VB 工程设置为 ActiveX Dll 类型
的,将该 Class Module 的 Instancing 设置成 5 MultiUse 类型的才会被调用到。
On Error Resume Next
'参数设置见单据控件的事件描述
End Sub
'单据表体上双击操作时会触发
Public Sub DblClick(ByRef Voucher As Object, section As
SectionsConstants, ByVal Index As Long, ByRef bCancel As Boolean)
On Error Resume Next
End Sub
'单据表体上切换行或者切换列时会触发
Public Sub RowColChange(ByRef Voucher As Object)
On Error Resume Next
'参数设置见单据控件的事件描述
End Sub
'修改单据字段的权限信息时会触发
Public Sub ModifyAuthString(ByRef Voucher As Object, ByRef
sAuthString As String)
On Error Resume Next
'参数设置见单据控件的事件描述
End Sub
'单据表体点击参照完成(关闭参照框)时会触发(V12.0)
Public sub BodyReferAfterBrowse( ByRef Voucher As Object , ByVal
r As Long, ByVal c As Long ,byval RstClass as object,byval RstGrid
as object,byval sXML as string,byref bCancel as boolean)
End sub
推荐阅读
-
美元和中国人民币汇率(美元与中国汇率)
2023-04-22
年度 data 库 select * from dbo.VoucherPlugins单据二次开发插件信息表(Vouche...
-
社保激费基数包括(社保的激纳基数有什么用)
2023-04-22
年度 data 库 select * from dbo.VoucherPlugins单据二次开发插件信息表(Vouche...
-
四川信托股权拍卖(四川信托股权拍卖公告)
2023-04-22
年度 data 库 select * from dbo.VoucherPlugins单据二次开发插件信息表(Vouche...
-
建行信用卡龙卡visa(建行信用卡龙卡为什么有两张)
2023-04-22
年度 data 库 select * from dbo.VoucherPlugins单据二次开发插件信息表(Vouche...
-
银行承兑汇票贴现天数怎么算(银行承兑汇票的贴现期限)
2023-04-22
年度 data 库 select * from dbo.VoucherPlugins单据二次开发插件信息表(Vouche...
-
格力电器股票十年行情(格力电器股票十年行情走势图)
2023-04-22
年度 data 库 select * from dbo.VoucherPlugins单据二次开发插件信息表(Vouche...