NC开发流程一览表说明.docx

上传人:b****5 文档编号:11936312 上传时间:2023-04-16 格式:DOCX 页数:27 大小:23.69KB
下载 相关 举报
NC开发流程一览表说明.docx_第1页
第1页 / 共27页
NC开发流程一览表说明.docx_第2页
第2页 / 共27页
NC开发流程一览表说明.docx_第3页
第3页 / 共27页
NC开发流程一览表说明.docx_第4页
第4页 / 共27页
NC开发流程一览表说明.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

NC开发流程一览表说明.docx

《NC开发流程一览表说明.docx》由会员分享,可在线阅读,更多相关《NC开发流程一览表说明.docx(27页珍藏版)》请在冰豆网上搜索。

NC开发流程一览表说明.docx

NC开发流程一览表说明

单表体的卡片型单据制作

单表体的单据:

指装载界面数据的聚合VO表头为空,只存在一组表体VO。

UI工厂设计了接口ISingleController,单表体单据界面控制类应实现此接口,并实现isSingleDetail方法。

前期准备:

单据注册,模板初始化等等,在构造好类框架后要修改界面控制类。

1.注册单据类型

2.注册VO对象如下:

publicString[]getBillVoName(){

ReturnnewString[]{

};

}

publicStringgetPKField(){

Return“pk_sample”;

}

publicStringgetChildPKField(){

Return“pk_sample”;

}

注意此时的表头,表体的VO类一致。

3.是否走平台

publicintgetBusinessActionType(){

R

}

4.注册按钮

publicint[]getCardButtonAry(){

Returnnewint[]{

};

}

最重要的一步,实现isSingleDetail方法。

publicBooleanisSingleDetail(){ueryHeadAllData(

(getUIController().getBillVoName()[1]),

getUIController().getBillType(),

strWhere);

lear();

if(queryVos==null||==0){

getBillUI().setBillOperate;

getBufferData().setCurrentRow(-1);

}else{

etBillOperate;

getBufferData().setCurrentRow(0);

}

}

/**

*对一组VO数据进行分类

*

*@param待分类的VO数据

*@return分类的结果

*/

PrivateAggregatedValueObject[]terator()

For(;();i++){

Objectkey=();

ArrayListal=(ArrayList)(key);

B

etChildrenVO(

(SuperVO[]).toArray(newSuperVO[0]));

}

Returnbills;

}

对数据增,删,改的控制

因为是虚拟主子表的数据结构,它在进行数据的操作时需要额外的控制。

这个问题的本质是在将前台数据写回后台时,需将前台的主子表结构还原为单表结构。

1.数据修改时的控制,这包括新增和编辑

在编辑(行操作)完毕,点击保存按钮。

程序会从界面取得被修改的数据,这些数据被标志成新增,删除,修改等状态,提交给后台处理。

对于真正的主子表,表头数据和标题数据会分别存储到对应的表中,但对于虚拟主子表的单据,主表数据加上字表数据的一行才构成数据表中的一行记录。

这个问题的解决方法如下:

在获取界面VO时做控制,方法是重载UI类重载基类的getChangedVOFramUI方法:

PublicAggregateValueObjectgetChangeVOFromUI()ThrowsException

{

AggregatedValueObjectvo=();

If(vo!

=null){

etBillCardPanel().getBillTable().getSelectedRow();

Objectvyear=getBillCardPanelWrapper().getBillCardPanel().getHeadItem(“vyear”).getValue();

getBillCardPanelWrapper().getBillCardPanel().setBodyValueAt(vyear,currentBodyrow,”vyear”);

Objectvmonth=getBillCardPanelWrapper().getBillCardPanel().getHeadItem(“vmonth”).getValue();

getBillCardPanelWrapper().getBillCardPanel().setBodyValueAt(vmonth,currentBodyrow,”vmonth”);

}

可以看到,在每个意在更新数据的行操作方法中,都会调用将表头相关数据放到表体当前操作行的方法。

控制保存后否再次查询数据库,以取得数据库最新数据。

对于真正的主子表,在数据库更新数据后重新查询一下最新数据并向前台返回,是具有意义的,并且根据表头数据的主键即可获得表头数据和表体数据。

而虚拟主子表,如前所述,数据的组织在UI端完成,后台没有足够的信息区查询和组织数据。

因此,此时只能向前台返回当前的数据。

UI工厂使用IRetCurrentDataAfterSave借口做此标志,如果UI类的getUserObject方法返回的对象实现了此接口,则在保存后部重新读取数据库。

我们加了一个RetCurrentDataAfterSaveImpl类,让它实现IRetCurrentDataAfterSave接口。

如:

PublicObjectgetUserObject(){

ReturnnewRetCurrentDataAfterSaveImpl();

}

需要注意的是:

从程序健壮性考虑,我们应该加一些前台校验类,依照前面介绍,我们创建前台校验类,并在单据类型中注册。

1.对数据的删除控制

这需要让事件处理器重载基类的onBoDelete方法,如:

ProtectedvoidonBoDelete()throwsException{

If(

getBillUI(),”档案删除”,”是否确认删除该基本档案?

”)!

=

return;

AggregateValueObjectmodelVo=getBufferData().getCurrentVO();

elete(

modelVo,

getBillUI()._getDate().toString(),

());

getBufferData().removeCurrentRow();

if(getBufferData().getVOBufferSize()==0)

getBillUI().setBillOperate;

else

getBillUI().setBillOperate;

}

注:

删除单据时,并不涉及到界面的数据,因此只需控制BillUIBuffer中的缓存的当前VO。

多子表卡片型单据

多子表单据在界面显示上通常是表头+多页签的表体,每一个页签代表一个子表。

在UI工厂中,这种单据得到了抽象,主要从以下两个角度:

1.对UI显示界面的抽象。

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

2.对VO数据的抽象。

在NC应用中,主子表数据存储在聚合VO中,它支持一个主表+一个子表的结构,但是,这种结构不适合于多子表的情况。

因此,UI工厂设计了接口IExAggVO,需要装载多子表数据的聚合VO类,应该实现此接口,并实现它的关键方法。

制作多子表单据的步骤

定义多子表VO

多子表Vo是聚合VO,同事又像一个装载多个字表数据的容器,因此它必然继承自AggregatedValueObject的类层次,又实现多子表VO的接口,IExAggVO,具体如下:

P

ength;i++){

CircularlyAccessibleValueObject[]cvos=getTableVO(getTableCodes()[i]);

If(cvos!

=null)

(cvos));

}

Return(SuperVO[])(newSuperVO[0]);

}

/**

*返回某个字表的VO数组。

*/

PublicCircularlyAccessibleValueObject[]

getTableVO(StringtableCode){

return(CircularlyAccessibleValueObject[])

(tableCode);

}

/**

*为特定子表设置VO数据

*/

PublicvoidsetTableVO()(StringtableCode,CircularlyAccessibleValueObject[]vos){

(tableCode,vos);

}

/**

*缺省的页签编码

*/

PublicStringgetDefaultTableCode(){

ReturngetTableCodes()[0];

}

P

{

Returnnull;

}

P

returnnull;

}

P

Returnnull;

}

}

代码的解释:

HYBillVO类是UI工厂定义的继承自AggregatedValueObject的类。

它实现了AggregatedValueObject的抽象方法。

返回的子表编码必须与单据模板定义的页签编码一致,这样数据才能正确显示。

2.定义单据界面控制类

需要重点强调的是以下代码

publicString[]getBillVoName(){

returnnewString[]{

义单据UI类

创建一个继承MultiChildBillCardUI类的单据UI类,并关联上先前创建的界面控制类,业务代理类:

/**

*关联上界面控制类

*/

ProtectedICardControllercreateController(){

ReturnnewSampleCardController();

}

/**

*关联上业务代理类

*/

ProtectedBusinessDelegatorcreateBusinessDelegator(){

ReturnnewSampleCardDelegator();

}

如何制作列表型单据

列表型单据统一的界面基类是ListCardUI,统一的事件处理基类是ListEventHandler,统一的界面控制接口为IListController。

对于数据表满足真正的主子表结构的单据,要开发单表头,单表体,多子表的单据非常简单,只是在类的继承关系上有所不同,因此在制作列表型单据时,绝大部分过程都可以仿照卡片型单据的制作。

标准的列表型单据和卡片型单据相比,不同之处是:

列表型单据的控制器实现IListController接口,并且应该把按钮的设置实现在getListButtonAry方法中,如:

Publicint[]getListButtonAry(){

Returnnewint[]{

};

}

与多子表的卡片单据相比,有两个不同:

1.多子表列表型单据的UI类继承自MultiChildlistUI类;

2.多子表列表型单据的界面控制类实现IListController接口。

需要注意的是:

列表型单据也应该创建自己的业务代理类,负责加载多页签的数据。

单表头和单表体的列表型单据:

因为列表界面的表头和表体都是由列表组成的,所以单表头和单表体对于列表型单据在界面显示上是一致的。

UI工厂定义了ISingleController接口来指定单据时单表头还是单表体,因此,如果单据的界面控制类实现ISingleController接口,辅之以配套的单据模板,就可以实现单列表的界面。

需要注意的是:

1.列表型单据不支持新增,而卡片型单据可以新增.2.就是列表型单据支持UI初始化时自动加载数据,而卡片型单据要初始化时自动加载,只能在构造函数中调用数据加载的方法。

虚拟主子表的列表型单据:

制作虚拟主子表的列表型单据,基本策略和办法还是和卡片型单据一样。

因为列表型单据在UI初始化时可以调用加载单据数据的方法。

BillListUI初始化时调用initBillData方法加载单据数据因此我们在UI子类重载此方法:

/**

*初始化时加载单据数据

*/

ProtectedvoidinitBillData(StringstrWhere)throwsException{

If(strWhere==null)

strWhere=”1=1”;

strWhere=“(“+strWhere+”)and(isnull(dr,0)=0)”;

SuperVO[]queryVos=getBusiDelegator().queryHeadAllData(getUIControl().getBillVoName()[1]),getUIControl().getBillTye(),strWhere);

lear();

if(queryVos==null||==0){

setBillOperate;

setListHeadData(queryVos);

getBufferData().setCurrentRow(-1);

}else{

ddVOsToBuffer(bills);

etAllHeadVOsFromBuffer());

setBillOperate;

getBufferData().setCurrentRow(0);

}

}

/**

*param待分类的VO数据

*@return分类的结果

*/

PrivateAggregatedValueObject[]terator();();i++){

Objectkey=();

ArrayListal=(ArrayList)(key);

B

Bills[i].setParentVO((CircularlyAccessibleValueObject)(0));

Bill[i].setChildrenVO((SuperVO[])(newSuperVO[0]));

}

Returnbills;

}

这部分数据加载的逻辑和前面虚拟主子表的卡片单据例子很相似,只是它多了一步操作—将查询得到的表头数据加到表头的列表中。

管理型单据制作

管理型单据时列表型单据和卡片型单据的组合,因此,它同时具备这两种单据的特征,也就是说,管理型单据具有两种视图,并且可以在这两种视图之间进行切换。

另外,管理型单据对这两种视图又做了功能上的划分---卡片视图和列表视图都可用于数据的显示,但是一旦要对列表视图的数据进行编辑操作时,界面自动切换单卡片视图。

管理型单据统一的界面基类是BillManageUI,统一的事件处理类是ManageEventHandler,统一的界面控制类为AbstractManageController。

这个类实际上实现了ICardController和IListController两个接口。

标准的管理型单据:

1.使单据UI类继承BIllManageUI。

2.使单据界面控制器类继承AbstractManageController类,这个类实现了卡片型单据控制器的通用接口ICardController和列表型单据控制器的通用接口IListController,因此我们的界面控制器类实际上需要实现卡片和列表控制器的所有方法,除了单据类型,单据VO的名字,是否走平台,主表主键名,字表主键名这些通用的设置以外,这里重点展示对于按钮的定义,如下:

/**

*取得列表界面的按钮

*/

Publicint[]getListButtonAry(){

Returnnewint[]{

据UI类应该继承MultiChildManageUI。

2.单据控制器类与标准管理型单据相同,但是VO的配置应按照多子表卡片型单据所示。

另外,就像制作卡片型多子表单据一样,加载多子表的数据需要设置一个业务代理类,我们完全可以重用卡片型多子表单据例子中的业务代理类。

这样就完成了多子表管理型单据的制作。

虚拟多子表的管理型单据:

1.单据UI类继承BillManageUI。

2.单据控制器类继承AbstractManageController。

3.当单据不走平台时,单据UI类应该重载基类的createBusinessDelegator方法

4.查询时必须将查询得到的数据加到表头列表中,如下所示:

ProtectedvoidonBoQuery()throwsException{

UIDialogquery=getQueryUI();

If()=={

INormalQueryquery=(INormalQuery)querydialog;

StringstrWhere=();

If(strWhere==null)

strWhere=”1=1”;

strWhere=”(“+strWhere+”)and(isnull(dr,0)=0)”;

if(getHeadCondition()!

=null)

strWhere=strWhere+”and”+getHeadCondition();

SuperVO[]queryVos=getBusinessAction().queryHeadAllData(getUIController().getBillVoName()[1]),getUIController().getBillType(),strWhere);

清空缓冲数据

getBufferData().clear();

if(queryVos==null||==0){

getBillUI().setBillOperate;

getBillUI().setListHeadData(queryVos);

getBufferData().setCurrentRow(-1);

}else{

AggregatedValueObject[]bills=createBillVOs(queryVos);

getBufferData().addVOsToBuffer(bills);

etAllHeadVOsFromBuffer();

getBillUI().setBillOperate;

getBufferData().setCurrentRow(0);

}

}

}

5.和虚拟多子表的卡片型单据一样,管理型单据应创建事件处理类,负责查询时组织数据以及删除和保存单据时去掉表头VO,但是,由于管理型单据的表头是列表,UI工厂将此列表VO缓存到界面上,因此,在修改单据和新增单据后,应该同时更新表头列表的VO数据。

虚拟主子表的表头是一个逻辑的表头,在保存单据时,我们首先取得界面改变的VO数据,并将其表头VO设置为空,但是,这保证了保存操作的正确性,却给自动更新表头列表的VO数据制造了麻烦,解决的办法是在保存后将VO数据的表头VO还原,代码如下:

/**

*单据保存后调用的方法

*/

ProtectedvoidsetAddNewOperate(BooleanisAdding,AggregatedValueObjectbillVO)throwsException{

If(billVO!

=null&&().length!

=0){

CircularlyAccessibleValueObjectpvo=()[0];

etCurrentVO();

(null);

getBusinessAction().delete(modelVo,getUIController().getBillType(),getBillUI()._getData().toString(),getBillUI().getUserObject());

emoveListHeadData(getBufferData().getCurrentRow());

getBufferData().removeCurrentRow();

if(getBufferData().getVOBufferSize()==0)

getBillUI().setBillOperate

else

getBillUI().setBillOperate

}

树卡片类型单据

UI工厂提供了左树右单据这种界面形式,根据右边单据的界面类型又可以分为树卡片型单据和树管理型单据,树型结构为单据提供了更为丰富的界面表达形式,对客户来说具有很好的导航效果,NC-UAP提供了产生树形结构的工具类,我们可以有两种方法生成树:

1.通过ID和ParentID,树的最基本元素是节点,节点既可以作为父节点,又可以作为孩子节点。

每个节点都有一个ID标识自身,如果采用孩子节点链接父亲节点的数据结构,那么节点还需要一个域存储父亲节点的ID,这个ID是ParentID。

2.通过编码和编码规则,这里的编码规则实际上是将编码分段,然后通过判断编码长度构造树,假设编码规则是“,它意味着第一级树节点的编码只有一个字符长度,第二级树节点的编码长度是三个字符长度,第三极树节点是五个字符长度。

如果有4个节点A,B,C,D,他们的编码分别是0,000,001,00100,那么构造的树的根节点是A,A有两个子节点B和C,C的子节点是D。

这两种构造树的方法并不影响单据的制作,选择哪种策略完全取决于业务的要求和数据的构成形态。

树卡片型单据的类结构:

树卡片型单据统一的界面基类是BillTreeCardUI,它继承自BillCardUI。

统一的事件处理基类是TreeCardEventHandler,它继承自CardEventHandler。

统一的界面控制类接口为ITreeCardController,它继承自IcardController。

开发树卡片型单据的步骤:

标准的树卡片型界面:

(构造树数据类)

树的数据类封装了树的构造规则,如何获取数据等,按照ID构造的树,其数据必须实现IVOTreeDataByID接口,而按编码构造的树,其数据类必须实现IVOTreeDataByCode接口。

例子如下:

(按ID为准)

PublicclassSampleTreeCardDataimplementsIVOTreeDataByID{

/**

*取得节点的ID域名称

*/

PublicStringgetIDFieldName(){

Return“pk_sample”;

}

/**

*取得节点的PARENT_ID域名称

*/

PublicStringgetParentIDFieldName(){

Returnnull;

}

/**

*取得节点的显示域名称

*/

PublicStringgetShowFieldName(){

Return“pk_sample”;

}

/**

*取得树的数据

*/

PublicSuperVO[]getTreeVO(){

SuperVO[]treeVOs=null;

N

Try{

treeVOs

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1