`
wuhaidong
  • 浏览: 349211 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

如何制作卡片型单据

    博客分类:
  • NC
阅读更多

卡片型单据UI工厂中最基本的单据,与其他类型的单据比较起来,它的界面形式以及VO数据的组织相对简单。

 

卡片型单据的应用场景是:单据聚合VO的数据在界面上展示这个聚合VO,可以有标准的表头+表体数据组成,也可以是单表体和单表头。

 

卡片型单据统一的界面基类 BillCardUI

               统一的事件处理类 CardEventHandler

       统一的界面控制接口 ICardController

 

 

单表体的卡片型单据界面

表头+表体的卡片型单据界面

多子表的卡片型单据界面

 

开发卡片型单据的步骤:

 

与传统的单据开发方式一样,基于UAP平台,需要做一下准备:

#以数据库表结构为蓝本,利用工具自动生成单据VO类

#在NC二次开发工具/单据类型管理中对单据的相关配置套类进行注册。比如单据UI类,前台校验类等。

#在NC单据模板设置工具中对该单据的显示模板进行设置。

 

 

从卡片单据的相关基类继承,即可生产初步的类框架。由于UI工厂在基类对许多功能进行了缺省实现,因此只需要配置几个简单的信息(通过方法的重载)即可生产最简单的界面。

 

1. 界面控制类是必须的。因此它保存着单据的VO信息,以及单据的主子表主键信息

重载getBillType() 方法 -- 返回在平台里给此单据注册的单据类型

重载getBillVOName() 方法 -- 返回单据的VO信息

重载getPKField() 方法 -- 返回主表的主键

重载getChildPKField() 方法 -- 返回子表的主键。

 

2. EventHandler 类用来响应按钮事件,所有按钮事件在基类都有缺省实现!

 

3. SampleCardUI 

重载createController() 方法 -- 该方法得到界面控制类

 

通过这几步,实际已经利用UI工厂创建了最简单的单据。

 

 

完善功能一:数据加载

 

# 初始化单据模板的数据,比如对comboBox数据的初始化,对参照数据的初始化。实现这个功能,需重载initSelfData 方法,并在方法内完成对单据模板初始化的代码。

 

# 初始化界面数据,UI工厂通过setDefaultData方法来设置界面的初始数据。该方法的主要目的是初始化单据必须的信息,它在新增数据的时候会被调用。但是,在UI类实例化的时候,它不会自动调用。因此,应该在UI类的构造器显式地调用该方法。

 

# 读取单据的数据。从外部数据源获取单据数据,比如数据库、数据文件等。最普遍的情况是通过查询数据库获得单据。

第一,在平台上定制单据的查询模板,并进行注册。

第二,根据业务确定单据是基本档案的单据还是需要流程平台、会计平台等平台支持的单据。这个信息需要在单据类中指明,在SampleCardController 中重载getBusinessActionType 方法。

第三,为单据定制按钮。很显然,我们现在必须要一个查询按钮,为了浏览的方法,在添加一个按钮和一个刷新按钮。方法是:在SampleCardController中重载 getCardButtonAry 方法。

 

 

经过上面几步,就完成了简单的数据加载功能。按钮的事件处理,及数据库查询的逻辑都已在基类实现,因此,只需做简单的信息配置(主表主键,子表主键,是否走平台,主表VO类,子表VO类,聚合VO类)即可。

 

 

完善功能二: 对数据的增,删,改操作

 

      我们并没有显示地控制查询的逻辑,仅仅是见主子表信息,单据类型配置在程序中,如果对数据的增删改并没有特殊的功能要求,我们只需要添加相应的操作按钮,此时应该修改SampleCardController的 getCardButtonAry 方法。

      上一步之后,单据已经具备了对数据的增,删,改功能。需要提醒的是,按钮状态的管理在UI工厂中是交给ButtonManager对象集中控制。

 

 

完善功能三: 前后台校验

 

在UI工厂中,单据的前台校验也是先在单据类型管理中注册前台校验类,但是提供了校验的辅助类和对校验规则的封装。而单据的后台校验,在UI工厂有特殊的实现方法。

 

前台校验主要处理对界面数据的校验。UI工厂定义了一个抽象类BeforeActionCHK,它实现了平台的前台校验接口IUIBeforeProcAction 。这样,单据的前台校验类应继承BeforeActionCHK。为了辅助做校验,UI工厂利用校验规则和校验执行类完成功能。通用的校验执行类是VOChecker ,校验规则分为三种:

1. 由接口ICheckRules 所定义的

它主要用来做最基本的校验,比如表头,表体数据的非空校验,数据类型校验等等。

2. 由接口ICheckRules2所定义的

它主要用来做表体数据是否为空的校验,并且增加了设定特殊的校验执行类的接口。

3. 由接口IUniqueRules所定义的

它用来校验前台表体数据的唯一性。

 

 

 

变体一:单表体的卡片型单据

单表体的单据时指装载界面数据的聚合VO表头VO为空,只存在一组表体VO。UI工厂在设计的时候考虑到这种情况,设计了一个接口ISingleController,单表体单据的界面控制类应实现此接口,并实现isSingleDetail方法。

 

 

变体二:单表头的卡片型单据

 

变体三:虚拟主子表的卡片型单据

 

虚拟主子表单据指的是那种数据来源于一张数据表,却根据特定规则模拟主子表的结构,将一部分字段放到表头,剩下的字段放到表体的单据。它通常用于数据的分组,即把数据根据特定字段的值进行分组。特定字段的值相等的数据自然的被归为一类,然后,把特定字段放到表头显示,属于它的一组数据在表体列表显示,形成了标准主子表的结构。

 

因为数据分组的特定规则取决于业务,因此UI工厂无法做缺省的实现。但是,加载数据库一般都在查询时完成,所有可以定制查询事件的行为,这需要为单据创建按钮事件处理器,并重载查询时基类调用的方法。

 

1.加载数据的步骤。

2.对数据增、删、改的控制。

因为是虚拟主子表的数据结构,它在进行数据的操作时需要额外的控制。这个问题的本质是在将前台数据写回后台时,需将前台的主子表结构还原为单据结构。

 

在编辑(行操作)完毕,点击保存按钮。程序会从界面企鹅的被修改的数据,这些数据被标识成新增、删除、修改等状态,提交给后台处理。对于真正的主子表,表头数据和表头数据会分别存储到对应的表中,但对于虚拟主子表的单据,主表数据加上子表数据的一行才构成数据表中的一行记录。

 

 

变体四:多子表的卡片型单据

多子表单据在界面显示上通常是表头 + 多页签的表体,每一个页签代表一个子表。在UI工厂中,这种单据也得到了抽象,主要是从两个角度抽象的

#对UI显示界面的抽象。多子表单据的UI类不使用BillCardUI做基类,而是继承于一个新的UI基类,MultiChildBillCardUI,它封装了多个页签的界面显示。

#对VO数据的抽象。在NC应用中,主子表数据存储在聚合VO中,它支持一个主表+一个子表的结构,但是这种结构不适合于多子表的情况。因此,UI工厂设计了接口IExAggVO,需要装载多子表数据的聚合VO类,应该实现此接口,并实现它的关键方法。

 

步骤

1. 定义多子表

多子表VO是聚合VO,同时又象一个装着多个子表数据的容器,因此它必然继承自AggregatedValueObject的类层次,又实现多子表VO的接口,IExAggVO

2. 定义单据界面控制类

3. 定义事件处理类

4. 定义业务代理类

简单介绍过业务代理类,它的缺省行为主要是获取后台数据。为了将职责划分得更清楚,我们可以创建专门业务的代理类。

前面的例子中一直没有涉及业务代理类,但是,对于多子表的单据,一定要创建业务代理类,并重载其中的一个方法。原因:在加载数据时,除了虚拟主子表的单据自己负责加载所有表头,表体数据,并一次性地在BillUIBuffer中缓存所有已组织好的聚合VO对象外,其它表结构的单据都要先加载表头数据,然后在必要时才通过主子表的主键关系取得表体数据。真正的主表 -- 多子表关系往往也满足这样的主键关系,但是,为了控制的灵活,UI工厂将数据组成多子表结构的任务放到了业务代理中。多子表单据应创建自己的业务代理类,并重载loadChildDataAry方法。

5. 定义单据UI类


分享到:
评论
1 楼 漫成咖啡 2015-02-02  
 

相关推荐

Global site tag (gtag.js) - Google Analytics