在U8的实际使用过程中,经常会遇到在用友u8的单据的标准按钮中,增加一段自己的逻辑.比如:采购订单在保存的时候,要先校验单据中的存货是否符合一个特定自定义逻辑,例如:检验存货名称是否符合特定要求.这些在用友的标准控制中是不具备的.
如何达到这个功能呢?以下就是方法
1.通过Ctr+Shift+点击用友单据上的任意一个按钮(例如新增),打开写字板(不是记事本),点粘贴,即可看到单据的Key.
2.找到需要加入的按钮的Key值.例如:采购订单的内容
单据Key=88
按钮标题:向下联查,按钮Tooltip:向下联查,按钮Key:mnuRefVouchBackWard;
按钮标题:向上联查,按钮Tooltip:向上联查,按钮Key:mnuRefVouchForWard;
按钮标题:联查日志,按钮Tooltip:联查日志,按钮Key:mnuvariation;
按钮标题:确定,按钮Tooltip:确定,按钮Key:OK;
按钮标题:现付,按钮Tooltip:现付,按钮Key:Payment;
按钮标题:匹配,按钮Tooltip:匹配,按钮Key:Match;
按钮标题:定位,按钮Tooltip:定位,按钮Key:Locate;
按钮标题:帮助,按钮Tooltip:帮助,按钮Key:Help;
按钮标题:取价,按钮Tooltip:取价,按钮Key:Getcost;
按钮标题:合同结算,按钮Tooltip:合同结算,按钮Key:contractsettle;
按钮标题:合同执行,按钮Tooltip:合同执行,按钮Key:contractexec;
按钮标题:转入,按钮Tooltip:转入,按钮Key:ChangeTo;
按钮标题:弃付,按钮Tooltip:弃付,按钮Key:CancelPayment;
按钮标题:栏目,按钮Tooltip:栏目,按钮Key:ColumnSet;
按钮标题:生成,按钮Tooltip:生成,按钮Key:BatchBV;
按钮标题:调价,按钮Tooltip:调价,按钮Key:Adjust;
按钮标题:预览,按钮Tooltip:预览,按钮Key:Preview;
按钮标题:齐套,按钮Tooltip:齐套,按钮Key:QT;
按钮标题:参照,按钮Tooltip:参照,按钮Key:Query;
按钮标题:模板,按钮Tooltip:模板,按钮Key:Template;
按钮标题:全消,按钮Tooltip:全消,按钮Key:UnSelectAll;
按钮标题:滤设,按钮Tooltip:滤设,按钮Key:FilterSet;
按钮标题:释放,按钮Tooltip:释放,按钮Key:Release;
按钮标题:报检,按钮Tooltip:报检,按钮Key:ReportCheck;
按钮标题:全选,按钮Tooltip:全选,按钮Key:SelectAll;
按钮标题:设置,按钮Tooltip:设置,按钮Key:Setting;
按钮标题:结算,按钮Tooltip:结算,按钮Key:Settle;
按钮标题:查询,按钮Tooltip:查询,按钮Key:Filter;
按钮标题:退出,按钮Tooltip:退出,按钮Key:Exit;
按钮标题:生单,按钮Tooltip:生单,按钮Key:CreateVouch;
按钮标题:生单,按钮Tooltip:生单,按钮Key:CopyCreating;
按钮标题:打印,按钮Tooltip:打印(Ctrl+P),按钮Key:Print;
按钮标题:输出,按钮Tooltip:输出(ALT+E),按钮Key:Output;
按钮标题:邮件,按钮Tooltip:邮件,按钮Key:Mail;
按钮标题:增加,按钮Tooltip:增加(F5),按钮Key:Add;
按钮标题:复制,按钮Tooltip:复制(Ctrl+F5),按钮Key:Copy;
按钮标题:草稿,按钮Tooltip:草稿,按钮Key:Draft;
按钮标题:修改,按钮Tooltip:修改(F8),按钮Key:Modify;
按钮标题:删除,按钮Tooltip:删除(Del),按钮Key:Delete;
按钮标题:附件,按钮Tooltip:附件,按钮Key:Accessories;
按钮标题:放弃,按钮Tooltip:放弃(Ctrl+Z),按钮Key:Discard;
按钮标题:保存,按钮Tooltip:保存(F6),按钮Key:Save;
按钮标题:提交,按钮Tooltip:提交(Ctrl+J),按钮Key:Submit;
按钮标题:重新提交,按钮Tooltip:重新提交(Ctrl+J),按钮Key:ReSubmit;
按钮标题:撤销,按钮Tooltip:撤销(ALT+J),按钮Key:Return;
按钮标题:审核,按钮Tooltip:审核(Ctrl+U),按钮Key:Confirm;
按钮标题:查审,按钮Tooltip:查审(Ctrl+K),按钮Key:QueryConfirm;
按钮标题:弃审,按钮Tooltip:弃审(ALT+U),按钮Key:Cancelconfirm;
按钮标题:锁定,按钮Tooltip:锁定(Ctrl+L),按钮Key:Lock;
按钮标题:解锁,按钮Tooltip:解锁(ALT+L),按钮Key:removelock;
按钮标题:到货,按钮Tooltip:到货,按钮Key:pushgentonext;
按钮标题:请款,按钮Tooltip:请款,按钮Key:PayApply;
按钮标题:变更,按钮Tooltip:变更,按钮Key:AlterPO;
按钮标题:关闭,按钮Tooltip:关闭(Alt+C),按钮Key:Close;
按钮标题:打开,按钮Tooltip:打开(Alt+O),按钮Key:Open;
按钮标题:批注,按钮Tooltip:批注,按钮Key:Comment;
按钮标题:讨论,按钮Tooltip:讨论,按钮Key:Discuss;
按钮标题:通知,按钮Tooltip:通知,按钮Key:Notify;
按钮标题:上查,按钮Tooltip:上查,按钮Key:QueryUp;
按钮标题:下查,按钮Tooltip:下查,按钮Key:QueryDown;
按钮标题:整单关联,按钮Tooltip:整单关联,按钮Key:RefAllVoucher;
按钮标题:查询条码,按钮Tooltip:查询条码,按钮Key:SelectAllInvBarCode;
按钮标题:查看日志,按钮Tooltip:查看日志,按钮Key:ViewLog;
按钮标题:格式设置,按钮Tooltip:格式设置,按钮Key:VoucherDesign;
按钮标题:保存格式,按钮Tooltip:保存格式,按钮Key:SaveTemplate;
按钮标题:显示模板,按钮Tooltip:显示模板,按钮Key:ShowTemplate;
按钮标题:打印模板,按钮Tooltip:打印模板,按钮Key:PrintTemplate;
按钮标题:汇总,按钮Tooltip:汇总,按钮Key:Aggregate;
按钮标题:刷新,按钮Tooltip:刷新(Ctrl+R),按钮Key:Refresh;
按钮标题:首张,按钮Tooltip:首张,按钮Key:First;
按钮标题:上张,按钮Tooltip:上张,按钮Key:Previous;
按钮标题:下张,按钮Tooltip:下张,按钮Key:Next;
按钮标题:末张,按钮Tooltip:末张,按钮Key:Last;
按钮标题:高级,按钮Tooltip:高级,按钮Key:advanced;
按钮标题:增行,按钮Tooltip:增行,按钮Key:AddRecord;
按钮标题:生成批号,按钮Tooltip:生成批号,按钮Key:Getbatnum;
按钮标题:批改,按钮Tooltip:批改,按钮Key:MulModify;
按钮标题:查看现存量,按钮Tooltip:查看现存量,按钮Key:mnuViewCurStock;
按钮标题:现存量查询,按钮Tooltip:现存量查询,按钮Key:mnuViewStock;
按钮标题:单据联查,按钮Tooltip:单据联查,按钮Key:mnuVouchRef;
按钮标题:窗口列表,按钮Tooltip:窗口列表,按钮Key:mnuWindowList;
按钮标题:取价,按钮Tooltip:取价,按钮Key:mnuGetCost;
按钮标题:定位记录,按钮Tooltip:定位记录,按钮Key:mnuLocateRow;
按钮标题:合并显示,按钮Tooltip:合并显示,按钮Key:mnuAggrShow;
按钮标题:插行,按钮Tooltip:插行,按钮Key:InsertRow;
按钮标题:复制行,按钮Tooltip:行复制,按钮Key:mnuCopyItem;
按钮标题:拆分行,按钮Tooltip:行拆分,按钮Key:mnuSpiltItem;
按钮标题:删行,按钮Tooltip:删行,按钮Key:DeleteRecord;
按钮标题:关闭,按钮Tooltip:关闭,按钮Key:mnuCloseItem;
按钮标题:打开,按钮Tooltip:打开,按钮Key:mnuOpenItem;
按钮标题:批改,按钮Tooltip:批改,按钮Key:mnuBatchModify;
按钮标题:-,按钮Tooltip:-,按钮Key:bSeparator1;
按钮标题:存量,按钮Tooltip:存量,按钮Key:CurStock;
按钮标题:价格,按钮Tooltip:价格,按钮Key:Price;
按钮标题:PTO选配,按钮Tooltip:PTO选配,按钮Key:PTOmatch;
按钮标题:条码,按钮Tooltip:条码,按钮Key:CreateInvBarCode;
按钮标题:需求源,按钮Tooltip:需求源,按钮Key:DemandSrc;
按钮标题:关联单据,按钮Tooltip:关联单据,按钮Key:RefVoucher;
按钮标题:-,按钮Tooltip:-,按钮Key:bSeparator2;
按钮标题:排序定位,按钮Tooltip:排序定位,按钮Key:Sort;
按钮标题:显示格式,按钮Tooltip:显示格式,按钮Key:Showformat;
3.在Meta库中的Meta数据库,表AA_CustomerButton加入如下记录
delete dbo.AA_CustomerButton
where cButtonID ='D752F529-9E4A-44E0-85FD-8ED0CB48029A'
insert into [AA_CustomerButton]
(
[cButtonID],
[cButtonKey],
[cButtonType],
[cProjectNO],
[cFormKey],
[cVoucherKey],
[cKeyBefore],
[iOrder],
[cGroup],
[cCustomerObjectName],
[cCaption],
[cLocaleID],
[cImage],
[cToolTip],
[cHotKey],
[bInneralCommand],
[cVariant],
[cVisibleAsKey],
[cEnableAsKey]
)
values
('D752F529-9E4A-44E0-85FD-8ED0CB48029A', 'btnCusSASave', 'system', 'U8CustDef', '88', '88', 'save', '0', 'IEDIT', 'U8PlugIn.U8POSaveButton',
'保存', 'zh-cn', '',
'保存', 'Ctrl+N', 1, '保存', 'save', 'save');
go
说明:
cFormKey:单据的Key,采购订单88
cButtonID:可以自行生成(GUID也行),
btnCusSASave:按钮的Key,自定义,不重复即可
cButtonType:System,固定,不能修改,表示干预的是系统的按钮
cFormKey:单据的Key,具体参考粘贴到写字板的单据Key ,
cKeyBeform:要替换的系统的按钮的Key,采购订单保存是:save
cCustomerObjectName:VB开发的类名称,
4.打开VB6(很老了.找到都不容易)创建一个DLL
注意DLL名称和类名称就是上一步中cCustomerObjectName指定名称
5.在类中加入以下代码(固定方法以及参数)
Option Explicit
Public Function RunCommand(ByVal objLogin As Object, ByVal objForm As Object, ByVal objVoucher As Object, _
ByVal sKey As String, ByVal VarentValue As Variant, ByVal other As String)
End Function
'初始化
Public Function Init(ByVal objLogin As Object, ByVal objForm As Object, ByVal objVoucher As Object, msbar As Object)
End Function
'在执行系统按钮只前调用,Cancel后会不再执行系统方法。
Public Function BeforeRunSysCommand(ByVal objLogin As Object, ByVal objForm As Object, ByVal objVoucher As Object, _
ByVal sKey As String, ByVal VarentValue As Variant, ByRef Cancel As Boolean, ByVal other As String)
'程序开始执行
On Error GoTo DoERR
Dim tarObj As New Entrance
'通过HeaderText访问表头中的字段值
'curVoucher.HeaderText ("cDefine2")
Dim cCode As String
Dim ID As String
Dim sql As String
Dim cInvCode As String
Dim curUser As String
Dim cAccId As String
Dim dataNode As MSXML2.IXMLDOMNode
Dim headDom As MSXML2.DOMDocument
Dim bodyDom As MSXML2.DOMDocument
Dim subNode As MSXML2.IXMLDOMNode
Dim atts As MSXML2.IXMLDOMNamedNodeMap
Dim I As Integer
Dim moCode As String
Dim moSeq As String
Dim flagStr As String
cCode = objVoucher.headerText("cPOID")
Dim outMsg As String
Call tarObj.CheckPOData(outMsg, objLogin.UFDBName, cCode, sKey)
If outMsg <> "" Then
MsgBox "不能保存:" & outMsg
Cancel = True
End If
Exit Function
DoERR:
MsgBox Err.Description
'Cancel = True
End Function
方法说明:
执行按钮,objVoucher为单据或列表对象
‘VarentValue为在表中预置的cVariant的值。
Public Function RunCommand(ByVal objLogin As Object, ByVal objForm As Object, ByVal objVoucher As Object, _
ByVal sKey As String, ByVal VarentValue As Variant, ByVal other As String)
End Function
‘初始化
Public Function Init(ByVal objLogin As Object, ByVal objForm As Object, ByVal objVoucher As Object, msbar As Object)
End Function
‘在执行系统按钮只前调用,Cancel后会不再执行系统方法。
Public Function BeforeRunSysCommand(ByVal objLogin As Object, ByVal objForm As Object, ByVal objVoucher As Object, _
ByVal sKey As String, ByVal VarentValue As Variant, ByRef Cancel As Boolean, ByVal other As String)
Cancel = False
End Function
以上范例中,在BeforeRunSysCommand加入了一段自己的校验:
先通过:cCode = objVoucher.headerText("cPOID")读取到采购订单号,
调用方法:Call tarObj.CheckPOData(outMsg, objLogin.UFDBName, cCode, sKey)
检验一些内容后,确定当前采购订单是否允许保存.
开发技巧:
鉴于VB6的开发技术是很早以前,掌握的同学已经很少了tarObj.CheckPOData其实一个c#开发的DLL中的方法,可以把VB中读取到参数,传到C#中处理.另外objLogin对象中有当前u8的数据库连接信息,用户名,密码等等信息,具体可以参考用友的官方文档.