1、   什么是用户自定义业务对象 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

用户自定义业务对象, User-defined Object (UDO) ,是 Sbo 提供给二次开发人员用以创建私有的本地化的业务处理对象。通过将自定义对象注册到 Sbo 中,使用户自定义业务对象成为 Sbo 业务对象集合中的一个组成部分。

用户自定义业务对象可以通过二次开发人员在程序中向 Sbo 进行注册,也可以通过 Sbo 主程序进行注册,以节约开发时间。不过对于提供服务的软件开发商来说,更多的是用程序注册的方式。本文侧重介绍怎样通过自研发软件进行 Sbo 自定义对象的注册、使用。

2、   为什么要使用自定义业务对象

自定义业务对象的基础是自定义数据表,自定义业务对象的目的是通过将多个有业务关联的不同数据表定义为业务对象,从而使 Sbo 认识到这些表单之间的内在业务关系,在业务处理的时候遵循 Sbo 业务对象的通用规则,从而提高了应用的业务完整性和数据的一致性。

应该说,通过散列的针对不同表单的业务处理模块,由二次开发程序控制不同表单 其实是同一个业务之间不同自模块之间的约束,完全可以实现自定义业务对象的功能。事实上,自定义对象只有在 Sbo 2004 以上的版本才予以支持,原来的自定义业务就采用的是散列子模块约束来完成的。

有些时候, Sbo 业务对象拥有比较复杂的一些属性,这些属性包括是否是单据对象 具有关闭、取消、结算的功能,是否具有序列号管理功能,是否具有类似财务凭证那样的年度结转功能,是否需要进行历史日志记录,是否对应缺省的界面维护窗口。

可见对于自定义的复杂业务,使用 Sbo 自定义业务对象可以大大简便对新增业务的管理,有着非常现实的意义。

3、   定义并创建支持自定义业务对象的数据结构。

数据结构是实现业务持久性保持的基础,对以管理信息软件来讲,数据结构对应着数据库中的数据表单。自定义业务对象需要自身支持自定义业务的数据表。

可以通过 Sbo 主程序(工具 用户定义字段 管理用户字段)或者通过二次开发程序实现自定义业务对象的数据库表单的建立。

SDK 中,通常用 SAPbobsCOM.UserTablesMD 创建自定义数据表,用 SAPbobsCOM.UserFieldsMD 定义用户表的数据字段。指定数据字段的数据类型(自定用户字段有 5 种数据类型:分别是字符型、文本型、数值型、日期型和浮点型)、数据长度、是否允许为空、是否是有效选择字段、是否关联到指定表内容、是否指定缺省值等。

有些业务可能不是一个数据表可以独立完成的,这个时候应该考虑对应此业务创建多个数据表,其中一个数信息主表,其他的表单位辅助表(比如销售中, OINV 对应的销售业务对象的主要信息表,而 INV1 中对应的是销售的项目清单,而附加费、代收款信息又在其它的数据表中)。

4、   创建自定义业务对象

有了自定义数据表,就可以创建自定义业务对象了。对于只对应单表的简单业务,直接通过单表操作就可以了。那么那些业务对象应该考虑使用自定义业务对象呢?以下的业务应该考虑使用自定义业务对象:

l 多表对应的业务。

l 财务相关的业务。

l 需要进行序列号管理的业务

定义自定义业务对象可以通过 Sbo 主程序来完成,也可以通过二次开发软件来实现,对于提供服务的软件公司来讲,多使用二次开发软件来实现 Sbo 自定义业务对象。

Sbo 主程序通过“工具 自定义业务对象 注册向导”来新增、修改、删除、维护自定义业务对象。二次开发程序通过 SAPbobsCOM.UserObjectsMD 完成对自定义业务对象的注册和维护的。

SAPbobsCOM.UserObjectsMD UserObjectMD;

oUserObjectMD = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oUserObjectsMD);

// 允许取消属性

oUserObjectMD.CanCancel = SAPbobsCOM.BoYesNoEnum.tYES;

// 允许关闭属性

oUserObjectMD.CanClose = SAPbobsCOM.BoYesNoEnum.tYES;

// 允许创建自定义维护界面

oUserObjectMD.CanCreateDefaultForm = SAPbobsCOM.BoYesNoEnum.tYES;

// 允许删除属性

oUserObjectMD.CanDelete = SAPbobsCOM.BoYesNoEnum.tYES;

// 允许查找属性

oUserObjectMD.CanFind = SAPbobsCOM.BoYesNoEnum.tYES;

// 允许日志属性, LogTableName 指定记录日志的表名

oUserObjectMD.CanLog = SAPbobsCOM.BoYesNoEnum.tNO;

// 允许年度转结属性

oUserObjectMD.CanYearTransfer = SAPbobsCOM.BoYesNoEnum.tYES;

// 允许序列号管理属性

oUserObjectMD.ManageSeries = SAPbobsCOM.BoYesNoEnum.tNO;

// 指定子表,比如凭证行,可以通过 oUserObjectMD.ChildTables.Add() 指定多个子表

oUserObjectMD.ChildTables.TableName = "SM_CHILD1";

// 指定自定义业务内部代码

oUserObjectMD.Code = "oUDO001";

// 指定自定义业务内部描述

oUserObjectMD.Name = " 自定义业务测试 ";

// 指定自定业务的类型:主数据或者单据

oUserObjectMD.ObjectType = SAPbobsCOM.BoUDOObjType.boud_Document;

// 指定主表

oUserObjectMD.TableName = "SM_MAIN";

// 新增用户自定义业务对象

oUserObjectMD.Add();                               // 通过 Update 维护、 Remove 删除自定义用户对象

5、   使用自定义业务对象

注册了用户自定义业务对象之后,就可以来使用这些业务对象了。使用业务对象可以在自定义时刻的指定缺省的界面来维护,但是通常用二次开发的程序来实现,可以是 Add-on 插件或者使用 DI API SDK 开发独立的应用程序来处理。

使用自定义业务对象,至少需要:

l  进入到自定义业务对象的处理模块的入口。

Add-on 插件或者独立应用程序中一般为自定义菜单。如何在程序中定义进入到自定义业务对象处理界面的菜单,不在本文讨论范围之内。

l  绘制处理自定义业务对象的界面窗口。

绘制处理自定义业务对象的界面窗口,侦听窗口控件项的操作事件的程序,不在本文讨论。

l  处理自定义业务对象。

                         i.  关联业务处理界面同自定义业务对象

SAPbouiCOM.FormCreationParams cp;

SAPbouiCOM.Form frm;

cp = SBO_Application.CreateObject(SAPbouiCOM.BoCreatableObjectType.cot_FormCreationParams);

cp.BorderStyle = SAPbouiCOM.BoFormBorderStyle.fbs_Fixed;

cp.FormType = "frmType";

cp.ObjectType = "oUDO001";               // 必须关联到指定的 UDO Code

cp.UniqueID = " UDO01";

frm = SBO_Application.Forms.AddEx(cp);

                        ii.   关联窗口组件到数据源

                      iii.   通过frm.DataBrowser.BrowseBy 激活自定义业务对象导航
                      iv.    添加新增、更新、查×××按钮

SAPbouiCOM.Item oItem;

oItem = frm.Items.Add("1", SAPbouiCOM.BoFormItemTypes.it_BUTTON);

这个按钮进入界面或者保存成功之后为“新增”按钮,界面内容有修改之后为“更新”按钮,在查询状态下为“查找”按钮。

此按钮将根据当前业务状态按照自定义业务对象注册属性自动调用系统校验功能,保障自定义对象数据的正确性、一致性和完整性。

                        v.    添加取消按钮

SAPbouiCOM.Item oItem;

oItem = frm.Items.Add("2", SAPbouiCOM.BoFormItemTypes.it_BUTTON);

取消当前业务。