1. 业务对象层
应用框架在业务对象层建立了一些典型业务对象,可用做设计人员建立自己的业务对象的超类。这些用 做超类的业务对象,既定义了对象属性,也提供了业务方法。例如,层次数据的超类 TreeBase 在数据保存时 会自动维护 level、isLeaf 和 longNumber 的正确性。 1.1. 类体系 类体系 CoreBase |- ObjectBase |- DataBase |- TreeBase |- BillBase |- BillEntryBase 1.2. 属性 名称 Id 描述 对象 ID 数据类型 BOSUUID 对应字段 FID 所有业务对象超类 CoreBase 所有业务对象的超类 普通业务对象的超类 基础资料类业务对象的超类 基础资料 层次数据类业务对象的超类 层次数据 单据业务对象的超类,对应单据头 单据头部分 单据头 单据业务对象的超类,对应单据体 单据体部分 单据体 内容
方法 名称 addNew 描述 继承基类,添加时设置 creator,createTime, lastUpdateUser, lastUpdateTime,等 添加时设置 , 等 固定属性值。 固定属性值 继承基类, 更新时设置 等固定属性值。 更新时设置 lastUpdateUser, lastUpdateTime, company 等固定属性值 设置业务数据生效,并保存 设为暂存状态,并保存 作废(逻辑删除) ,并保存 取消作废状态,并保存 检查业务数据是否是有效 检查业务数据能否更新,逻辑条件是否满足更新要求(补充) 检查业务数据是否被引用,删除操作会调用此函数(补充)
Update Submit save cancel cancelCancel checkStatusValid canUpdate isReferenced
1.3. 属性
普通业务对象超类 ObjectBase
名称 Creator CreateTime LastUpdateUser LastUpdateTime 创建者
描述
数据类型 连接属性——连接到用户 Timestamp 连接属性——连接到用户 Timestamp
对应字段 对应字段 FCreatorID FCreateTime FLastUpdateUserID FLastUpdateTime
创建时间 最后修改者 最后修改时间
方法 名称 描述
常见问题 1.问:Creator、CreateTime、LastUpdateUser、LastUpdateTime 作用和意义? 答:所在普通业务对象的基本属性,由基类来维护,业务对象不能用作其他用途。
1.4. 属性
基础资料超类 DataBase
名称 Name Number description simpleName
描述 名称(多语言) 编码 描述(多语言) 简称
数据类型 String String String String
方法 名称 checkNameBlank checkNameDup 名称是否为空 名称是否重复 描述
checkNumberBlank checkNumberDup
编码是否为空 编码是否重复
【 注: 名称与编码】检查方法都是需要根据业务要求进行调用的,应用框架本身不调用。 常见问题 1.问:为何继承自 DataBase 的类没有自动进行名称及编码的检查? 答:没办法统一检查机制,可能由于检查的条件不一样,如科目表使用全局的检查,就可直接调用如 上的方法来完成。 2.问:编码规则如何起作用? 答:编码规则在 DataBase 类起作用。从 DataBase 继承的类如果定义了编码规则就会自动由基类来完 成,子类不需要关心。
1.5. 属性
层次数据超类 TreeBase
名称 IsLeaf Level LongNumber
描述 是否叶节点 所在级次 节点完整编号
数据类型 Boolean Integer String FIsLeaf FLevel
对应字段
FLongNumber
因为超类中定义的关系无法实例化,所以 TreeBase 并未定义 parent 关联属性。要求在子类中自行建立 自行建立 这个表示指向父节点的关联属性 指向父节点的关联属性,并且约定属性名一定是 parent。 约定属性名一定是 parent 指向父节点的关联属性 方法 名称 updateLeafByLongNumber checkParentDataExist checkParentValid checkParentBeUsed 描述 父节点编号更新时重设所有子节点编号 检查该编号下的父节点是否存在 校验父节点的状态应为有效,父节点是否被删除。 校验父节点是否被其他数据使用。如果被使用则不能新建子节点。子 类需要通过重载_isReference 来定义引用逻辑 获取根节点 返回儿子节点集合 返回所有后代节点集合
getRoot getChildren getAllChildren
deleteWithChildren
删除自身及其所有后代节点
常见问题 1.问:isLeaf、level、longNumber 由基类处理吗? 答:是的。父类自动维护,子类不需要进行干预。 2.问:检查编码重复的注意事项。 答:原则:输入项必须完整,生成项可以没有,如 level,isLeaf,longnumber 等,传递给基类的值要求 有 id,number,name,description id,number,name,description description。
1.6. 属性
单据超类 BillBase(单据头) (单据头)
名称 Number handleTime Handler Description hasEffected Auditor sourceBillId sourceFunction
描述 单据编号 经办时间 经手人 备注(多语言) 是否曾经生效 审核人 原始单据 ID 来源功能 String TimeStamp
数据类型 FNumber
对应字段
FHandleTime FhandlerID Fdescription FhasEffected FcheckID FsourceBillID FsourceFunction
连接属性——连接到用户 String Boolean 连接属性——连接到用户 String String
方法 名称 checkOut passAudit UnpassAudit Freeze Unfreeze checkStatusFreeze
checkNumberDup
描述 结清(关闭)业务数据 审核通过 设置为未审核状态 冻结业务数据 解冻业务数据 检查业务数据是否被冻结 检查单据编号是否重复
checkNumberBlank checkHandleTimeBlank checkHandlerBlank
检查单据编号是否为空 检查经办时间是否为空 检查经办人是否为空 检查是否至少有一条分录
checkLineExist
可选的方法: 1. protected SystemEnum getOwnedSys():定义单据所属的系统。通常情况下一种单据所属的系统是 确定的,可以在单据对象的扩展属性予以定义。超类负责处理这种情况。对于一种类型的单据被实 例化到不同系统的情况,可以增加实体属性,并重载这个方法。 常见问题 1.问:单据生成凭证的处理? 答:校验是否已经生成过凭证,如果已经生成过则抛异常。 2.问:单据关联关系处理。 答:处理所有的分录关联。分为暂存与提交两类。
1.7. 属性
单据超类 BillEntryBase(单据体) (单据体)
名称 Sequence
描述
数据类型
对应字段 FSequence
单据分录序列号(定义为序列属性即使用{seq}) Integer
常见问题
1.8. 1.8.1.
通用设计方法
业务数据状态管理
业务数据状态属于数据的附加描述属性,表达业务数据经过的处理过程,例如:是否已生效、是否已审 核,并据此进行相应的逻辑控制。业务数据状态根据业务数据的不同类型会有不同组合,例如:基础资料中 可能只有是否生效状态,而单据中会有是否已审核及是否已关闭等状态。 在应用架构中会抽象业务数据中存在的状态种类,并在超类体系里固化对某些通用状态的处理逻辑。
状态配置表 下表列出了所有已知的数据状态属性,这些属性将作为基础的状态属性供定义具体的业务对象时选择使 用。
状态名 生效状态 状态描述 0:暂存 状态枚举类型 EffectedStatusEnum 属性名 EffectedStatus 字段名 FEffectedStatus 说明 暂存的业务数据不需 要进行数据合法性检 查,不参与统计报表 和结账结算处理 1:生效 作废状态 0:普通 DeletedStatusEnum DeletedStatus FDeletedStatus 作废的业务数据不参 与统计报表和结账结 算处理 1:作废 审核状态 冻结状态 0:未审核 1:已审核 0:未冻结 BlockedStatusEnum BlockedStatus FBlockedStatus 冻结的业务对象禁止 参与新的业务活动, 但已经存在的业务活 动不受影响。有的业 务对象的冻结状态可 能会进一步细分,如 “客户”的冻结可能 会包含:Posting block、Order block、 Delivery block、 Invoicing block 1:已冻结 下达状态 0:未下达 1:已下达 预算审批 状态 1:审批未 通过 2:审批已 通过 交付状态 0:未交付 1:部分交 付 2:全部交 付 DeliveredStatusEnu m DeliveredStatu s FDeliveredStatu s 0:未审批 BudgetAuditedStatu sEnum BudgetAuditedS tatus FBudgetAuditedS tatus ReleasedStatusEnum ReleasedStatus FReleasedStatus 订单类的单据一般会 有下达状态 CheckedStatusEnum CheckedStatus FCheckedStatus
FI记账状 态
0:未记账 1:已记账
FIPostedStatusEnum
FIPostedStatus
FFIPostedStatus
MA记账状 态
0:未记账 1:已记账
MAPostdStatusEnum
MAPostdStatus
FMAPostdStatus
关闭(结 清)状态
0:未关闭 1:已关闭
ClosedStatusEnum
ClosedStatus
FClosedStatus
说明: 1、 属性对应的数据类型都是相应的枚举类型,类型为 Int。字段的数据类型也使用 Int。 2、 在 com.kingdee.eas.framework 包中定义了枚举类型供使用。 使用方法 所有基础的状态属性被定义于配置表中,已集成于 BOS Studio 中。如果业务对象要使用某个状态属性, 可方便地选取即可。 单据状态 单据状态往往是由多个基础状态属性组合后对外的统一表现形式。以订单处理为例,可能表现为六种状 态:
在内部处理中,实际上选择了三个基础的状态属性来实现控制逻辑:作废状态、完成状态和关闭状态。 控制逻辑的规则是: 单据状态 取消 关闭 计划 下达 进行中 完成 状态判断 只要作废状态为 1 单据不是取消状态且关闭状态为 1 单据不是取消状态也不是关闭状态, 且完成状态为 0(未下达) 单据不是取消状态也不是关闭状态, 且完成状态为 1(下达) 单据不是取消状态也不是关闭状态, 且完成状态为 2(进行中) 单据不是取消状态也不是关闭状态, 且完成状态为 3(完成) 允许关闭操作 操作控制 若单据进入取消状态,则只有恢复后才 能进行其它所有单据操作 禁止除与取消相关外的其它操作 允许下达操作 允许撤消操作
从编程的方便性考虑,推荐为单据状态定义自己的枚举,并为值对象增加一个 getBillStatus 方法。该 方法通过计算基本属性的取值而得到对应的单据状态。需要注意的是,设置单据状态的操作仍将操作基本状
态属性,并且在设置某个状态属性时可能需要根据控制逻辑同时设置其它属性。
2. UI 层
UI 层提供数据的展现方式与客户端控制逻辑。 2.1. 2.1.1. 通用设计方法
数据绑定
数据绑定主要分为两种类型:查询类界面的数据绑定和编辑类界面的数据绑定。 对于查询类界面,数据绑定是一个从 Query 对象到 KDTable 的单向过程。通常在设计期定义完绑定关系 后,不会在代码中再关注绑定问题。相关方法是: 1. 由 KDTable 的 setFormatXML 方法完成列的定义 2. 由 KDTable 的 putBindContents 传递绑定关系 3. 在 KDTalbe 的 doRequestRowSet 事件中完成数据的获取与显示 对于编辑类界面,由 loadFields 和 storeFields 方法定义了 Entity 对象与界面控件双向的绑定关系。 如果对象是聚合类型的数据(例如单据)并选择 KDTable 显示单据体,则进一步由 loadLineFields 和 storeLineFields 定义了单据行与 KDTable 的绑定关系。如果在 BOS Studio 中定义绑定关系,那么这些方法 会由 BOS 自动生成。 注意:不管是完全不使用 BOS Studio 来定义绑定关系,还是只有部分控件使用 BOS Studio 定义了绑定 关系,你都需要重载这些方法,并通过手工编码来把所有绑定关系补充完整。这是因为超类依赖于这些方法 来管理绑定关系。 示例: 假设币别编辑界面没有为 isoCode 在设计期定义绑定关系,那么需要补充定义: public void loadFields() { super.loadFields();
// editData允许强类型访问 txtIsoCode.setText(editData.getIsoCode()); } public void storeFields() { super.storeFields(); editData.setIsoCode(txtIsoCode.getText()); }
2.1.2.
UI 元素的使能控制
对 UI 元素进行使能控制有两种方法:一是利用 setOprtState 方法,二是利用 checkActionStatus 方法。
在 BOS 的 UI 设计器中,可以利用状态编辑视图定义各种状态下控件的使能情况。BOS 会自动生成反映满 足这种定义的 setOprtState 方法。当然,也可以不用 BOS 的定义能力而重载后完全自行编码,尤其是在需要 定义更多逻辑时:例如控件的使能可能需要检查当 OprtState 处于某种状态时,某些数据是否同时符合要求。 而 checkActionStatus 方法会在按钮的事件响应完毕后被调用,作为一种推荐的检查控件使能的统一位 置。checkActionStatus 的调用频率比较高,故检查逻辑最好比较简单。 注意:这种方式与 UI 的 OprtState 没有关系,视为对 OprtState 机制的一种补充。 2.1.3. UILoadListener
应用框架提供一种扩展机制,允许在加载 UI 对象和注销 UI 对象时加入自定义的处理逻辑。
public interface IUILoadListener extends EventListener { public void load(UILoadEvent e); public void unload(UILoadEvent e); }
例如,想实现用户监控功能,可以按如下步骤进行: 1. 在 BOS Studio 中定义 UI 对象的扩展属性。此处定义功能编号和功能描述。 2. 编写 IUILoadListener 的实现类,在 load 事件中访问 UI 元数据,获取扩展属性中定义的信息,注 册用户监控信息;在 unload 事件中访问 UI 元数据,获取扩展属性中定义的信息,注销用户监控信 息。 2.2. 序时簿类 UI
序时簿是 EAS 规范地展现数据的方式,提供查询过滤的能力,并可打开维护数据的编辑类界面。序时簿 使用查询对象来执行查询,使用 KDTable 来展现数据。 2.2.1.
类体系
内容 EAS 的 UI 最高超类,继承 BOS 定义的 CoreUIObject(从 KDPanel 派生,这样 UI 可以方便地嵌入到其它 UI 中) 。 序时簿类 UI 的最高超类,提供数据查询与显示,关联编辑 界面的管理等。适用于小数据量的基础资料、无过滤条件 的查询等。 带通用查询对话框的序时簿类 UI 的超类。 适用于基础资料、 带过滤条件的查询等。 单据序时簿类 UI 的超类。 支持针对单据类的通用操作处理, 例如结清、冻结、审核等。处理状态过滤与显示。 层次数据序时簿的 UI 超类。支持层次数据的展现,提供 KDTree 与 KDTable 的关联处理,支持层次分类数据本身的 编辑。 带拥有者的层次数据序时簿的 UI 超类。适用于层次数据本 身还有分类的情形,例如物料按仓位分类。
类体系 CoreUI |- ListUI
|- CommonQueryListUI |- BillListUI |- TreeListUI
|- ComboTreeListUI
|- TreeDetailListUI
层次数据序时簿的 UI 超类。支持层次数据的展现,提供 KDTree 与 KDTable 的关联处理,支持层次分类数据本身的 编辑。 带拥有者的层次数据序时簿的 UI 超类。适用于层次数据本 身还有分类的情形,例如科目按科目表分类。
|- ComboTreeDetailListUI
2.2.2.
通用基类 UI
完成了通用职责处理,在此,进行了权限、License、网络控制的通用处理。 2.2.3.
普通序时簿类 UI
从 CoreUI 继承下来。下图是一个普通的序时簿界面的样例。 截图。 类方法介绍 普通序时簿类 UI 从 com.kingdee.eas.framework.client.ListUI 继承。通过 BOS Studio 完成 UI 对象的 创建、更改继承 Query 对象的类型以及 KDTable 控件绑定等。 必须重载的方法: 1. protected abstract String getEditUIName():指示关联的编辑 UI 对象名 protected
示例: protected String getEditUIName() { return “com.kingdee.eas.basedata.assistant.client.CurrencyEditUI”; }
2. protected abstract IObjectBase getBizInterface():获取列表对应实体的业务接口,以便调用业务
方法。要求实体必须从 ObjectBase 及其子类派生。 示例: protected IObjectBase getBizInterface() { return CurrencyFactory.getRemoteInstance(); }
可选的方法: 1. protected void prepareUIContext(UIContext uiContext, java.awt.event.ActionEvent e):允许构
造传递给 EditUI 的 UIContext。利用这个方法,你可以加入需要的任何对象并传递给 EditUI。 示例: protected void prepareUIContext(UIContext uiContext, java.awt.event.ActionEvent e) {
// 检查是否按下新建按钮 if (e.getSource() == btnAddNew) uiContext.put(“myObject”, null); else uiContext.pub(“myObject”, getMyObject()); }
2. protected String getEditUIModal():产生编辑 UI 的方式,缺省是 Dialog 方式。可以重载这个方法,
指定其它的模式。 示例: protected String getEditUIModal() { return UIFactoryName.EDITWIN; }
3. protected boolean initDefaultFilter():设置默认过滤条件。该方法被 onLoad 调用。 4. protected void refresh(ActionEvent e):界面刷新方法。通过传递的参数 e 可以知道触发事件源。在
ListUI 的缺省实现中,refresh 是靠调用 execQuery 把数据重新获取一遍来达到刷新的效果的。派生类 可以依据实际情况来定义更合理的刷新策略。
5. protected String getKeyFieldName():获取 KDTable 中的主键列名称,供编辑/删除时获取主键用。默
认值为"id"。 注意:BOS 自动生成 KDTable 的列时,使用的是 query 对象名.id 的形式,与超类中约定并不一致。要么 在设计期将列名修改,要么在重载该方法返回正确的列名。
常见问题 1. 问:序时簿界面打开时会自动查询并显示所有的数据,我想加入一个过滤条件应该怎么做? 答:重载 initDefaultFilter 方法,为 mainQuery 对象(类型是 EntityViewInfo)增加过滤条件 (filterItem) 。也可弹出一个对话框(例如通用查询对话框) ,让用户指定过滤条件。 2. 问:我增加了一个按钮,想在执行完毕的时候刷新一下列表,该怎么做? 答:在 actionPerformed 方法最后一行加调用 exceQuery()的代码即可。 3. 问:我增加了一个按钮,想在执行前先检查列表是否有选中的行,该怎么做? 答:在 actionPerformed 方法第一行加调用 checkSelected()的代码即可。该方法在检查到没有选 中的行时,会弹出对话框提示用户,并且不再继续执行 actionPerformed 方法中后面的代码。 4. 问:如何得到选中行的主键值? 答:使用 getSelectedKeyValue 方法即可
2.2.4.
带通用查询的序时簿类 UI
界面样式。 超类为 CommonQueryListUI,从 ListUI 继承。在超类基础上增加了对通用查询对话框的管理。
类方法介绍 带通用查询的序时簿类 UI 从 com.kingdee.eas.framework.client.CommonQueryListUI 继承。 可选的方法: 1. protected void prepareCommonQueryParam(CommonQueryParam param):在该方法中定义要传递给通用
查询对话框的参数。超类的该方法已经把查询对象放到了 param 中,通常可不必再重载。如果有特别的 需要,则按通用查询对话框的要求进行设置。 示例(用一个自己编写的过滤页面替换掉通用过滤页面): protected void prepareCommonQueryParam(CommonQueryParam param) { super.prepareCommonQueryParam(param); param.setShowFilter(false); // 不显示通用过滤页面 param.addPanel(new MyQueryPanel()); // 加入自己的过滤页面 }
常见问题 1. 问:打开带通用查询的序时簿类 UI,缺省会弹出通用查询对话框,我怎么调整这个行为? 答:超类使用 getDefaultFilterInited()方法来判定 UI 是否已设置了缺省的 filter。当没有设置 时,就会弹出通用查询对话框。你可以重载 initDefaultFilter 方法,设置缺省的 filter 并返回 true(不设置 filter 也没有关系,主要是返回 true 即可) 。 2.2.5.
单据序时簿类 UI
超类为 BillListUI,从 CommonQueryListUI 继承。在超类基础上增加了对单据通用操作的处理。
2.2.6.
层次数据序时簿类 UI
超类为 TreeListUI,从 ListUI 继承。在超类基础上,增加了一个 KDTree,以管理层次数据。除支持在 KDTable 中展现数据的编辑外 (该能力从 ListUI 继承) 还支持 Tree 本身的编辑 , (典型如地址簿分类的编辑) 。 类方法介绍 层次数据序时簿类 UI 从 com.kingdee.eas.framework.client.TreeListUI 继承。通过 BOS Studio 完成 UI 对象的创建、更改继承 Query 对象的类型以及处理控件绑定等。KDTree 上每个节点的类型为 KDTreeNode 类型。 必须重载的 abstract 方法: 1. protected abstract String getQueryFieldName():点击树上节点时形成过滤条件时的字段,例如地址
簿序时簿界面右边的地址列表要依据左边 Tree 上选中的地址分类而刷新,此处则返回 Address.class 即 可。
2. protected abstract ITreeBase getTreeInterface():获取层次数据实体的业务接口,以便调用业务方
法。要求实体必须从 TreeBase 及其子类派生。
可选的方法: 1. protected void buildTreeFilter():构造查询子节点数据的过滤条件。在 TreeListUI 中默认实现为在
EntityViewInfo 中添加一个 getQueryFieldName()=treeNodeInfo 的过滤条件, 即查询对象的某个属性关 联到 Tree 节点所代表的对象。超类认为这种查询条件是是最常见的情况,例如地址簿对象有一个属性指 向关联的地址簿分组对象。该默认实现依赖于 getQueryFieldName 纯虚方法。如果你需要构造的查询条 件不是这种形式,则需要重载本方法自行设定过滤条件。 示例: protected void buildTreeFilter() { KDTreeNode treeNode = (KDTreeNode)treeMain.getLastSelectedPathComponent(); AddressClassInfo info = (AddressClassInfo)treeNode.getUserObject(); // 清空并加入自己的过滤条件(通讯地址包含被选中地址簿分类的名称=>仅示意而已) FilterItemCollection items = mainQuery.getFilter().getFilterItems(); items.clear(); items().add(new FilterItemInfo ("postalAddress",info.getClassName(),CompareType.LIKE)) }
2. protected String getGroupEditUIName():指示 Tree 关联的类别编辑 UI 对象名,如果界面需要实现类
别编辑,则需要重载该方法。
3. protected String getGroupEditUIModal():与 ListUI 类似,表示产生类别编辑 UI 的方式。 4. protected void prepareGroupUIContext(UIContext uiContext, ActionEvent e):类似于 ListUI 对关
联 EditUI 的处理方式,允许构造传递给 GroupEditUI 的 UIContext。超类默认对于新增类别,传入了当 前选中的节点对象(默认为是新增节点的父节点,通过 UIContext.PARENTNODE 传递)。
5. protected String getRootName():定义一个虚拟根节点的显示名称,默认返回 null,即不需要虚拟根
节点。此时,所有节点都依据实际的数据构造,可能会有多个一级节点。继承类可以重载,定义虚拟根 结点。 示例(地址簿序时簿需要定义一个虚的根节点): protected String getRootName() { return "地址分类"; }
6. protected void initTree():初始化构造 Tree。一般情况下请不要重载这个方法,除非你决定用自己的
ITreeBuilder 接口的实现类替换掉超类默认提供的 LNTreeBuilder。
7. protected ILNTreeNodeCtrl getLNTreeNodeCtrl(): 返回与 LNTreeBuilder 配合使用的 ILNTreeNodeCtrl
实现类。超类提供默认的实现类 DefaultLNTreeNodeCtrl。在特定情况下需要重载,例如菜单树需要根据 权限进行过滤而不是仅根据 longnumber 过滤时。
常见问题 1. 问:如何启用 TreeListUI 对 Tree 分组的编辑能力? 答:首先将分组编辑相关的按钮 Visible 属性设置为 true,然后重载 getGroupEditUIName 方法指示 关联的编辑 UI 对象名。 2. 问:如何获得选中节点?如何获得选中节点的主键值? 答 : 使 用 getSelectedNode 获 得 选 中 节 点 所 对 应 的 对 象 。 为 方 便 获 取 主 键 值 , 提 供 了 getSelectedNodeKeyValue 方法。 Tree 的构造机制及如何扩展? 的构造机制及如何扩展? 树的构造由 ITreeBuidler 接口定义。主要的方法是:
public JTree buildTree(JTree tree):构建树,若传入 tree 为 null,则新建树。 public void refreshTreeNode(KDTreeNode treeNode):重新取数,刷新节点。
针对 EAS 处理层次数据采用长编码(longnumber)的情况,应用框架提供了 LNTreeBuilder 这个特定实 现类。与此配合,又定义了 ILNTreeNodeCtrl 接口和该接口的实现类 DefaultLNTreeNodeCtrl。
1. LNTreeBuilder:实现 ITreeBuilder 接口,提供树的构建能力。 public AbstractObjectCollection getChildren(TreeBaseInfo parentNodeInfo, int level):获 取指定结点的指定级次的子孙结点。若 parent==null,则获取从 1 到指定级次的结点。 3. DefaultLNTreeNodeCtrl:实现 ILNTreeNodeCtrl 接口,完成根据 longnumber 获取下级节点数据的能力。
2. ILNTreeNodeCtrl 接口:根据父结点信息,获取指定层次子孙结点信息。主要的方法是:
如果有不基于 longnumber 方式的层次数据,可通过实现 ITreeBuilder 接口予以扩展。 2.2.7.
带拥有者的层次数据序时簿类 UI
超类为 ComboTreeListUI,从 TreeListUI 继承。 2.2.8.
带分类的层次数据序时簿 UI
超类为 TreeDetailListUI,从 ListUI 继承。
类方法介绍 层次数据序时簿类 UI 从 com.kingdee.eas.framework.client.TreeListUI 继承。通过 BOS Studio 完成 UI 对象的创建、更改继承 Query 对象的类型以及处理控件绑定等。KDTree 上每个节点的类型为 KDTreeNode 类型。 必须重载的 abstract 方法:
1.
protected abstract String getQueryFieldName():点击树上节点时形成过滤条件时的字段,例如地址 簿序时簿界面右边的地址列表要依据左边 Tree 上选中的地址分类而刷新,此处则返回 Address.class 即 可。
2. 3.
protected abstract ITreeBase getTreeInterface():获取层次数据实体的业务接口,以便调用业务方 法。要求实体必须从 TreeBase 及其子类派生。 protected abstract String getGroupEditUIName():关联的类别编辑 UI 对象名,如果界面需要实现类 别编辑,则需要重载该方法。
可选的方法: 参考层次数据序时簿类 UI。 2.2.9.
带拥有者和分类的层次数据序时簿 UI
超类为 ComboTreeDetailListUI,从 TreeDetalListUI 继承。
2.3. 2.3.1.
编辑类 UI
类体系
内容 EAS 的 UI 最高超类,继承 BOS 定义的 CoreUIObject(从 KDPanel 派生,这样 UI 可以方便地嵌入到其它 UI 中) 。 编 辑 类 UI 的 超 类 , 支 持 实 体 对 象 的 编 辑 能 力 , 与 ObjectBase 配合使用。 单据编辑类 UI 的超类,与 BillBase 配合使用。
类体系 CoreUI |- EditUI |- BillEditUI
2.3.2.
普通编辑类 UI
超类为 EditUI,从 CoreUI 继承。EditUI 支持实体对象的编辑,提供新增、删除、提交、暂存、作废数 据、放弃作废、打印及上一条、下一条等功能。EditUI 支持的实体对象必须从 ObjectBase 及其子类继承。 类方法介绍 类方法介绍 普通编辑类 UI 从 com.kingdee.eas.framework.client.EditUI 继承。通过 BOS Studio 完成 UI 对象的创 建、更改继承 Entity 对象的类型以及处理控件绑定等。 必须重载的方法: 1. protected IObjectValue createNewData():新建业务对象,并设置初始值。
示例: protected IObjectValue createNewData()
{ CurrencyInfo info = new CurrencyInfo(); // 设定初值 info.setCreator(sysContext.getOperator()); info.setIsoCode(defaultIsoCode); info.setSign(defaultSign); return info; }
2. protected abstract IObjectBase getBizInterface():获取实体对象的业务接口,供调用后台方法使
用。 示例: protected IObjectBase getBizInterface() { return CurrencyFactory.getRemoteInstance(); }
可选的方法: 1. protected void verifyInput () throws Exception:校验输入的合法性。可以直接检查空或范围等条
件,也可以调用服务端提供的校验方法。可使用 SysUtil.abort 方法中断操作流程,并视情况弹出提示 框及设置输入焦点。 示例: protected void verifyInput() throws Exception {
if (isNull(txtNum.getText())) {
MsgBox.showWarning(“编号不能为空”); txtNum.requestFocus(); SysUtil.abort(); } // 可能抛出异常但无须捕获,最外层有缺省的异常处理器 getBizInterface().checkNameDup(editData); // … 其它检查代码 }
2. loadFields/storeFields:作用请参考前面通用设计方法的说明。 3. getMessageIcon()/getMessageBgcolor()/getMessageText()设置状态栏提示图标、背景色、提示文 字。
示例: protected Icon getMessageIcon() { return SHOW_MESSAGE_ICON_DEFAULT; }
protected Color getMessageBgcolor() {
return new Color(0x0F , 0x88 , 0x28); } protected String getMessageText() { return SHOW_MESSAGE_TEXT_OK; } 4. showSaveSuccess/showSubmitSuccess 子类可重载这些处理方式。默认情况下,如果有状态栏则使 用状态栏处理,如果保存成功则绿色背景闪烁三次;否则使用消息对话框显示。
示例: protected void showSaveSuccess() { MsgBox.ShowInfo(“success!”); }
常见问题
2.3.3.
单据编辑类 UI
超类为 BillEditUI,从 EditUI 继承。BillEditUI 支持单据对象的编辑,除继承了 EditUI 的能力外,还 可处理单据行的新增和删除。BillEditUI 支持的实体对象必须从 BillBase 及其子类继承。 类方法介绍 单据编辑类 UI 从 com.kingdee.eas.framework.client.BillEditUI 继承。通过 BOS Studio 完成 UI 对象 的创建、更改继承 Entity 对象的类型以及处理控件绑定等。 必须重载的方法: 1. protected IObjectValue createNewDetailData():新建单据行,并设置初始值。
示例: protected IObjectValue createNewDetailData() { VoucherEntryInfo info = new VoucherEntryInfo(); // 设定初值 info.setCreator(sysContext.getOperator()); info.setXXX… return info; }
可选的方法: 1. loadLineFields/storeLineFields:数据绑定方法,针对单据行。若不能利用 BOS Studio 在设计期全部
定义好绑定关系,则需要编码完成。
2. protected void afterAddLine(IObjectValue lineData):通知方法,允许在增加单据行后做相关处理。 protected
protected void afterAddLine(IObjectValue lineData) { // 计算合计值并显示 calcTotalAmount(); }
3. protected void afterRemoveLine(IObjectValue lineData ):通知方法,允许在删除单据行后做相关
处理。
4. protected void afterSelectLine(IObjectValue lineData ):通知方法,允许在选中单据行后做相关
处理。
常见问题
3. EAS 迁移
3.1. 实体对象的迁移 在 BOS Studio 设计器中,完成如下工作: 1. 找到要修改的实体对象,打开编辑视图 2. 选择合适的超类实体对象作为父实体对象。例如,对于币别对象,应选择从 DataBase 继承。 3. 将超类中已经定义的属性需要去掉。例如,对于币别对象,应将超类中已经定义的 id、number 和 name 属性去掉。 4. 重新发布数据表 对于从 TreeBase 派生的层次数据对象,要注意: 1. 因为超类中定义的关系无法实例化,所以 TreeBase 并未定义 parent 关联属性。要求在子类中自行 建立这个表示指向父节点的关联属性,并且约定属性名一定是 parent 约定属性名一定是 parent。 3.2. UI 对象的迁移
UI 对象需要重新生成。可以同时打开老的 UI 对象和新的 UI 对象,把控件拷贝过来。相关处理代码若超 类已提供处理则废弃,否则拷贝过来并做适当修改。