用户定义属性组与用户定义属性开发使用指南.docx
- 文档编号:17455085
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:24
- 大小:332.13KB
用户定义属性组与用户定义属性开发使用指南.docx
《用户定义属性组与用户定义属性开发使用指南.docx》由会员分享,可在线阅读,更多相关《用户定义属性组与用户定义属性开发使用指南.docx(24页珍藏版)》请在冰点文库上搜索。
用户定义属性组与用户定义属性开发使用指南
用户定义属性组与用户定义属性开发使用指南
版本
维护人
维护时间
相关文档
备注
V60
陈伟
2009-07-07
V6公共服务
V60
陈伟
2009-11-12
界面显示自定义项的方法变更
V60
陈伟
2010-4-6
为解决同一界面多个模板需要多次远程调用来实现用户定义属性显示问题、及一个界面需要显示多个实体的用户定义属性问题,提出container与preparator分离的设计方案,container负责远程查询所有用户定义属性引用,界面可以配置多个preparator来显示用户定义属性
V60
陈伟
2010-4-7
自定义档案为参照时,需要按组织过滤
1术语
1.1用户定义属性
即以前版本的自定义项。
它的具体含义是指业务对象中预留若干字段,这些字段的数据类型是在系统运行期由用户定义的。
在V6版本中,对字段可定义的数据类型进行了扩充:
它可以是基本类型,如字符串、整数、数值(小数)、布尔、日期等;也可以引用系统预置档案、枚举或用户自定义档案。
1.2用户定义属性组
用户定义属性的集合升级用户定义属性组,即以前版本的自定义项对象。
一个用户定义属性组有自己的编码、名称及包含用户定义属性的数量。
抽象出用户定义属性组的目的,是为了允许多个业务对象引用同一组用户定义属性,以保证多个业务对象中的用户定义属性一一对应。
如在采购流程中,希望采购单、入库单的自定义项一一对应,可以定义一个公共的“采购流程用户定义属性组”。
1.3用户定义属性组引用
将一个业务对象关联到一个用户定义属性组,以表明这个业务对象的自定义字段的数据类型是由用户定义属性组中包含的用户定义属性所定义的,这时称业务对象与用户定义属性组间的关联关系为用户定义属性组引用。
2设计概要
2.1简单类图
图1用户定义属性类图
3使用说明及API
3.1元数据建模时设置自定义属性
元数据建模时,如果该实体需要预留用户定义的属性,需要将该字段的数据类型设置为“自定义项”,如图2所示
图2 元数据建模时指定字段数据类型为自定义项
3.2创建用户定义属性组
在“开发平台/开发配置工具”结点下有一个“用户定义属性组”结点,可在此结点创建和维护用户定义属性组,如图3所示。
图3用户定义属性组结点
打开结点后,左侧树显示的是现有的用户定义属性组。
可以通过左侧树上方的按钮创建和维护用户定义属性组所在的模块,如图4所示。
图4 创建维护用户定义属性组所在模块
通过结点上方可创建和维护用户定义属性,如图5所示。
图5创建维护用户定义属性组
ﻩ完成上述功能后,开发人员需要将生成的模块信息和用户定义属性组数据导入到基准库中,模块信息和用户定义属性组的数据记录在bd_userdefrule表中。
3.3创建用户定义属性组引用
创建好用户定义属性组后,需要指定对该属性组的引用。
在用户定义属性组结点中,选中一个用户定义属性组后,可在界面右下方的表体中为该属性组指定引用,如图6所示。
图6为用户定义属性组设置引用
引用用户定义属性组的实体,是通过参照选择的,参照的范围是所有元数据实体。
但需要注意的是,最终选择的引用实体必须有数据类型为“自定义项”的属性,并且“自定义项”属性的数量必须与前述用户定义属性组设定的用户定义属性数量相等。
如图6所示,用户定义属性组“客商销售信息”设定的用户定义属性数量是30,则在为该属性组设置引用实体时,所中的实体“custsaleinfo”中必须有30个数据类型为“自定义项”的属性,否则系统不允许保存。
开发人员可以在设置用户定义属性组引用时,为该引用设置变更校验类的类名,该字段不是必输的,如图7所示。
该校验类应该实现nc.itf.bd.userdefrule.IUserdefitemChangeListener接口,当用户定义属性组中包含的用户定义属性发生变化时,会调用所有引用实体注册的校验类的校验方法(userdefitemChanged(UserdefitemVO,UserdefitemVO))。
如果开发人员在指定引用实体时未指定变更校验类名,则在相应用户定义属性发生变化时按默认的校验规则进行校验。
默认的校验规则如下:
当某个用户定义属性变更时,如引用实体中的对应字段在数据库中的值不全部为空,则会抛出异常、不允许保存用户定义属性变更。
图7 在引用实体时指定变更校验类的类名
完成上述功能后,开发人员需要将生成的用户定义属性组引用数据导入到基准库中,用户定义属性组引用的数据记录在bd_userdefruleref表中。
3.4用户定义属性设置
用户定义属性可以在全局设置,也可以在集团设置,分别对应“用户定义属性-全局”和“用户定义属性-集团”两个结点,如图8所示。
图8 用户定义属性结点
同一个用户定义属性,在全局设置后,在各集团均可见,并且各集团均不能修改;在任一集团设置后,在全局结点也不能修改,但全局结点中该属性设置仍为空。
可以为用户定义属性设置显示名称、数据类型、输入长度和精度。
数据类型是通过参照选择的,选择的范围是所有扩展标签带“DOC”标签的元数据实体或枚举,如图9所示。
仅当数据类型是字符串、整数、数值时,可以设置输入长度;仅当数据类型为数值时,可以指定精度。
图9为用户定义属性设置数据类型
3.5用户定义属性的界面显示
当完成3.1.1、3.1.2、3.1.3步骤的设置后,希望在引用用户定义属性组的业务实体的界面中显示用户定义属性,这时需要开发人员在业务实体界面的初始化过程中,利用用户定义属性的显示工具对界面进行设置。
3.5.1UI工厂中的处理方法
在UI工厂的界面开发中,IControllerBase接口中有两个方法getHeadZYXKey()和getBodyZYXKey(),这两个方法允许用户分别指定表头关联的用户定义属性组名称和表体关联的用户定义属性组名称。
只要用户在IControllerBase的实现类中指定了表头和/或表体的用户定义属性组名称,系统会自动查询相关用户定义属性组在当前登录集团的设置情况,并按前缀名“def”和“vdef”分别重置表头和表体的用户定义属性的显示设置。
因此,如果业务对象的UI界面是UI工厂实现的、并且其中用户定义属性字段的前缀为“def”或“vdef”,则可以通过在IControllerBase实现类中指定用户定义属性组名称的方法,实现用户定义属性的界面展现。
UI工厂中用户定义属性的界面展现代码样例如下:
publicclassSaleOrederControllerimplementsICardController{
......
@Override
publicStringgetBodyZYXKey(){
return"供应链-销售订单-表体";
}
@Override
publicintgetBusinessActionType(){
ﻩreturnIBusinessActionType.PLATFORM;
ﻩ}
ﻩ@Override
publicStringgetChildPkField(){
return"pk_saleorder_item";
}
ﻩ@Override
ﻩpublicStringgetHeadZYXKey(){
ﻩﻩreturn"供应链-销售订单-表头";
ﻩ}
ﻩ......
}
3.5.2UI工厂II中的处理方法
在UI工厂II中,主要的IEditor如BatchBillTable、BillForm、BillCardPanelForm都聚合了IBillData或IBillListData用于处理用户定义属性的展现。
UI工厂II中,由于界面结构比较复杂,这里分以下几个场景分别描述用户定义属性展现的处理方法。
(1)简单界面
简单界面,即单据模板的一个区域(表头或表体)仅展现一个用户定义属性组的用户定义属性(即不支持同一表头/表体展现两个不同用户定义属性组中的用户定义属性),并且该界面不支持动态扩展机制。
为使简单界面展现用户定义属性,需要在界面的XML配置文件中显式的注射工具类UserdefitemBillDataPreparator或UserdefitemBillListDataPreparator,并为这两个工具类注射必要的属性,其中UserdefitemBillDataPreparator用于卡片界面(BillCardPanel)的用户定义属性展现、UserdefitemBillListDataPreparator用于列表界面(BillListPanel)的用户定义属性展现。
如果当前界面的单据模板是由元数据生成的、并且仅主实体需要处理用户定义属性,则仅需为上述preparator设置context构造子参数即可(注意,context应包含正确的组织信息)。
配置样例如下:
......
<beanid="areaeditor"class="nc.ui.bd.cust.areaclass.view.AreaClassEditor" init-method="initUI">
ﻩ <property name="model"ref="appmodel">property>
ﻩ
ﻩ
</constructor-arg> </bean> </property> ﻩ ﻩ...... 如果当前界面的单据模板不是元数据生成的、或者要同时展现表头及表体的用户定义属性,则除需要为上述preparator设置context构造子参数外,还需要为其设置用户定义属性组的编码或名称、以及用户定义属性字段的前缀;如果需要在表体展现用户定义属性,还需要指定表体所在页签的页签编码。 配置样例如下: ﻩ...... class="nc.ui.uif2.editor.UserdefitemBillDataPreparator"> ﻩ <refbean="context"/> ﻩ</constructor-arg> ﻩﻩ ﻩ ﻩ<list> ﻩﻩ ﻩﻩﻩ ﻩﻩﻩ ﻩﻩproperty> ﻩ<propertyname="bodyUserdefitemPrefixs"> ﻩﻩ<list> ﻩﻩ ﻩﻩ<value>vdef ﻩ ﻩ ﻩ ﻩ ﻩﻩﻩ<value>人员备用金value> ﻩlist> ﻩ</property> ﻩ --卡控件--> ﻩ ﻩ...... ﻩﻩ<propertyname="userdefitemPreparator"ref="userdefitemPreparator"/> </bean> ﻩ... ... (2)需要同时展现多个实体的用户定义属性的界面 场景1已经可以支持多数应用场景,但存在以下两点弊端: i.不支持同一表头/表体展现两个不同用户定义属性组中的用户定义属性 ii.如果需要展现多个用户定义属性组的用户定义属性,则需要多次远程调用来查询用户定义属性的引用情况。 为了解决上述问题,场景2采用了UserDefItemContainer与UserdefitemContainerPreparator/UserdefitemContainerListPreparator配合使用的方式在界面展现用户定义属性。 UserDefItemContainer负责远程查询界面所需的所有用户定义属性组中用户定义属性的引用情况,UserdefitemContainerPreparator/UserdefitemContainerListPreparator从UserDefItemContainer中读取用户定义属性的引用情况,并做相应处理。 首先需要为UserDefItemContainer注射环境变量context、和查询参数列表params。 params是结构化参数,用于查询用户定义属性组,中需为每个参数指定用户定义属性组编码(rulecode)或实体元数据全名(mdfullname,即namespace.entityname)中的一个即可。 这里不再支持按用户定义属性组名称查找用户定义属性组。 之后,需要为每个iEditor配置相应的UserdefitemContainerPreparator或UserdefitemContainerListPreparator。 每个preparator必须指定对应的UserDefItemContainer,另外还需要指定一个格式化参数列表,每个参数对应一个用户定义属性组的展现,其中rulecode和mdfullname与UserDefItemContainer中参数的相应属性含义相同,并且前后要保持一致,以便preparator能根据参数从UserDefItemContainer读取用户定义属性的引用情况(如contain中参数指定的是rulecode,则在之后的preparator中也应指定rulecode,且值应相同)。 一个preparator可以有一组参数,因此可以展现多个用户定义属性组中的用户定义属性。 配置样例如下: ﻩ...... ﻩ<beanid="userdefitemContainer" ﻩclass="nc.ui.uif2.userdefitem.UserDefItemContainer"> ﻩ <propertyname="params"> ﻩ ﻩﻩ<beanclass="nc.ui.uif2.userdefitem.QueryParam"> ﻩﻩ<propertyname="mdfullname"value="md1.entity1"/> ﻩﻩ</bean> ﻩﻩﻩ ﻩﻩﻩ<propertyname="rulecode" value="rulecode1"/> ﻩﻩ ﻩﻩﻩ<beanclass="nc.ui.uif2.userdefitem.QueryParam"> ﻩﻩﻩﻩ<propertyname="mdfullname"value="md2.entity2"/> ﻩ</bean> ﻩ ﻩﻩﻩ bean> list> ﻩ</property> ﻩ ﻩ<beanid="headEditor" ﻩclass="nc.ui.uif2.editor.BillForm" ﻩinit-method="initUI"> ... ﻩﻩﻩ<beanid="userdefitemListPreparator" ﻩﻩﻩclass="nc.ui.uif2.editor.UserdefitemContainerPreparator"> ﻩﻩﻩﻩ ﻩﻩﻩ ﻩﻩ ﻩﻩﻩﻩﻩ ﻩﻩ ﻩﻩﻩvalue="md1.entity1" /> ﻩﻩﻩ<propertyname="pos"value="0"/> ﻩﻩﻩﻩ<propertyname="prefix"value="def"/> ﻩﻩﻩﻩﻩ ﻩﻩﻩﻩ ﻩﻩﻩ<beanclass="nc.ui.uif2.editor.UserdefQueryParam"> ﻩﻩﻩﻩ<propertyname="rulecode" ﻩﻩﻩvalue="rulecode1" /> ﻩﻩﻩﻩﻩﻩ ﻩﻩ<propertyname="prefix"value="vdef"/> ﻩﻩﻩ</bean> ﻩﻩﻩ ﻩ ﻩﻩﻩﻩﻩ<property name="mdfullname" ﻩﻩvalue="md2.entity2"/> ﻩﻩﻩ ﻩﻩﻩﻩ<propertyname="prefix"value="zyx" /> ﻩﻩﻩ</bean> ﻩﻩﻩﻩ ﻩﻩﻩﻩﻩ<beanclass="nc.ui.uif2.editor.UserdefQueryParam"> ﻩﻩ ﻩﻩﻩvalue="rulecode2" /> ﻩ<propertyname="pos"value="1" /> ﻩﻩﻩﻩﻩ<propertyname="prefix" value="userdef"/> ﻩﻩﻩ</bean> ﻩ ﻩﻩﻩ</property> ﻩﻩ ﻩﻩ</property> ﻩbean> ﻩ...... (3)支持动态扩展机制的界面 上述两种方法均可实现动态扩展界面的用户定义属性展现,但方法一需要在扩展点和扩展页签分别配置UserdefitemBillDataPreparator或UserdefitemBillListDataPreparator,这样会造成多次远程调用,因此在此场景下,建议使用场景2的方法,但这时需要在扩展页签中引用preprocessor,以便为UserDefItemContainer动态注射查询参数。 扩展页签在preprocessor的初始化方法会在srping beans实例化之前调用,因此可以在UserDefItemContainer进行远程查询前动态收集所有页签用户定义属性的查询条件。 配置样例如下: 扩展点配置信息: ﻩ...... ﻩclass="nc.ui.uif2.userdefitem.UserDefItemContainer"> ﻩ<propertyname="context"ref="context"/> ﻩﻩ<list> ﻩﻩﻩ<beanid="customerUserdefitemParam" ﻩﻩﻩclass="nc.ui.uif2.userdefitem.QueryParam"> ﻩﻩ<propertyname="mdfullname"value="uap.customer"/> ﻩ</bean> ﻩﻩ ﻩ</property> ﻩ ﻩ ﻩ ﻩﻩclass="nc.ui.bd.cust.baseinfo.editor.CustBaseInfoEditor" ﻩinit-method="initUI"> ﻩ... ... ﻩ<propertyname="userdefitemPreparator"> ﻩ<bean ﻩﻩclass="nc.ui.uif2.editor.UserdefitemContainerPreparator"> ﻩﻩﻩ ﻩﻩ ﻩﻩﻩ<beanname="cardUserdefitemQueryParam" ﻩﻩﻩclass="nc.ui.uif2.editor.UserdefQueryParam"> ﻩﻩﻩﻩﻩ ﻩﻩﻩﻩﻩvalue="uap.customer"/> ﻩﻩ ﻩﻩﻩ ﻩﻩ</bean> ﻩﻩ ﻩﻩ</property> ﻩ</property> ﻩbean> ﻩ... ... 扩展页签配置信息: ﻩ...... <beanid="userdefitemFinancePreprocessor"class="nc.ui.uif2.editor.UserdefitemUIPreprocessor"init-method="init"> ﻩﻩ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用户 定义 属性 开发 使用指南