ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:23.69KB ,
资源ID:11936312      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11936312.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(NC开发流程一览表说明.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、NC开发流程一览表说明单表体的卡片型单据制作单表体的单据:指装载界面数据的聚合VO表头为空,只存在一组表体VO。UI工厂设计了接口ISingleController,单表体单据界面控制类应实现此接口,并实现isSingleDetail方法。前期准备:单据注册,模板初始化等等,在构造好类框架后要修改界面控制类。1.注册单据类型2.注册VO对象 如下:public String getBillVoName() Return new String;public String getPKField() Return “pk_sample”;public String getChildPKField()

2、 Return “pk_sample”;注意此时的表头,表体的VO类一致。3是否走平台public int getBusinessActionType() R4.注册按钮public int getCardButtonAry() Return new int , , , , , ,;最重要的一步,实现isSingleDetail方法。public Boolean isSingleDetail()ueryHeadAllData( (getUIController().getBillVoName()1), getUIController().getBillType(), strWhere); le

3、ar(); if(queryVos=null|=0) getBillUI().setBillOperate; getBufferData().setCurrentRow(-1);else etBillOperate; getBufferData().setCurrentRow(0);/*对一组VO数据进行分类*param待分类的VO数据*return 分类的结果*/Private AggregatedValueObjectterator()For(;();i+) Object key=();ArrayList al=(ArrayList)(key);BetChildrenVO( (SuperV

4、O).toArray(new SuperVO0);Return bills;对数据增,删,改的控制因为是虚拟主子表的数据结构,它在进行数据的操作时需要额外的控制。这个问题的本质是在将前台数据写回后台时,需将前台的主子表结构还原为单表结构。1.数据修改时的控制,这包括新增和编辑在编辑(行操作)完毕,点击保存按钮。程序会从界面取得被修改的数据,这些数据被标志成新增,删除,修改等状态,提交给后台处理。对于真正的主子表,表头数据和标题数据会分别存储到对应的表中,但对于虚拟主子表的单据,主表数据加上字表数据的一行才构成数据表中的一行记录。这个问题的解决方法如下:在获取界面VO时做控制,方法是重载UI类重

5、载基类的getChangedVOFramUI方法:Public AggregateValueObject getChangeVOFromUI()Throws Exception AggregatedValueObject vo=(); If(vo!=null) etBillCardPanel().getBillTable().getSelectedRow();Object vyear=getBillCardPanelWrapper().getBillCardPanel().getHeadItem(“vyear”).getValue();getBillCardPanelWrapper().get

6、BillCardPanel().setBodyValueAt(vyear,currentBodyrow,”vyear”);Object vmonth=getBillCardPanelWrapper().getBillCardPanel().getHeadItem(“vmonth”).getValue();getBillCardPanelWrapper().getBillCardPanel().setBodyValueAt(vmonth,currentBodyrow,”vmonth”);可以看到,在每个意在更新数据的行操作方法中,都会调用将表头相关数据放到表体当前操作行的方法。控制保存后否再次查

7、询数据库,以取得数据库最新数据。对于真正的主子表,在数据库更新数据后重新查询一下最新数据并向前台返回,是具有意义的,并且根据表头数据的主键即可获得表头数据和表体数据。而虚拟主子表,如前所述,数据的组织在UI端完成,后台没有足够的信息区查询和组织数据。因此,此时只能向前台返回当前的数据。UI工厂使用IRetCurrentDataAfterSave借口做此标志,如果UI类的getUserObject方法返回的对象实现了此接口,则在保存后部重新读取数据库。我们加了一个RetCurrentDataAfterSaveImpl类,让它实现IRetCurrentDataAfterSave接口。如:Publi

8、c Object getUserObject() Return new RetCurrentDataAfterSaveImpl();需要注意的是:从程序健壮性考虑,我们应该加一些前台校验类,依照前面介绍,我们创建前台校验类,并在单据类型中注册。1对数据的删除控制这需要让事件处理器重载基类的onBoDelete方法,如:Protected void onBoDelete() throws Exception If( getBillUI(),”档案删除”,”是否确认删除该基本档案?”)!= return; AggregateValueObject modelVo=getBufferData().g

9、etCurrentVO(); elete( modelVo, getBillUI()._getDate().toString(), (); getBufferData().removeCurrentRow();if(getBufferData().getVOBufferSize()=0)getBillUI().setBillOperate;elsegetBillUI().setBillOperate;注:删除单据时,并不涉及到界面的数据,因此只需控制BillUIBuffer中的缓存的当前VO。多子表卡片型单据多子表单据在界面显示上通常是表头+多页签的表体,每一个页签代表一个子表。在UI工厂中,

10、这种单据得到了抽象,主要从以下两个角度:1.对UI显示界面的抽象。多子表单据的UI类不使用BillCardUI做基类,而是继承与一个新的UI基类,MultiChildBillCardUI,它封装了多个页签的界面显示。2.对VO数据的抽象。在NC应用中,主子表数据存储在 聚合VO中,它支持一个主表+一个子表的结构,但是,这种结构不适合于多子表的情况。因此,UI工厂设计了接口IExAggVO,需要装载多子表数据的聚合VO类,应该实现此接口,并实现它的关键方法。制作多子表单据的步骤定义多子表VO多子表Vo是聚合VO,同事又像一个装载多个字表数据的容器,因此它必然继承自AggregatedValueO

11、bject的类层次,又实现多子表VO的接口,IExAggVO,具体如下:P ength;i+) CircularlyAccessibleValueObject cvos=getTableVO(getTableCodes()i); If(cvos!=null) (cvos);Return(SuperVO) (new SuperVO0);/*返回某个字表的VO数组。*/Public CircularlyAccessibleValueObjectgetTableVO(String tableCode) return(CircularlyAccessibleValueObject) (tableCod

12、e);/*为特定子表设置VO数据*/Public void setTableVO()(String tableCode,CircularlyAccessibleValueObject vos) (tableCode,vos);/*缺省的页签编码*/Public String getDefaultTableCode() Return getTableCodes()0;P Return null;P return null;P Return null;代码的解释:HYBillVO类是UI工厂定义的继承自AggregatedValueObject的类。它实现了AggregatedValueObjec

13、t的抽象方法。返回的子表编码必须与单据模板定义的页签编码一致,这样数据才能正确显示。2定义单据界面控制类需要重点强调的是以下代码public String getBillVoName() return new String 义单据UI类创建一个继承MultiChildBillCardUI类的单据UI类,并关联上先前创建的界面控制类,业务代理类:/*关联上界面控制类*/Protected ICardController createController() Return new SampleCardController();/*关联上业务代理类*/Protected BusinessDelega

14、tor createBusinessDelegator() Return new SampleCardDelegator();如何制作列表型单据列表型单据统一的界面基类是ListCardUI,统一的事件处理基类是ListEventHandler,统一的界面控制接口为IListController。对于数据表满足真正的主子表结构的单据,要开发单表头,单表体,多子表的单据非常简单,只是在类的继承关系上有所不同,因此在制作列表型单据时,绝大部分过程都可以仿照卡片型单据的制作。标准的列表型单据和卡片型单据相比,不同之处是:列表型单据的控制器实现IListController接口,并且应该把按钮的设置实

15、现在getListButtonAry方法中,如:Public int getListButtonAry() Return new int ,;与多子表的卡片单据相比,有两个不同:1.多子表列表型单据的UI类继承自MultiChildlistUI类;2.多子表列表型单据的界面控制类实现IListController接口。需要注意的是:列表型单据也应该创建自己的业务代理类,负责加载多页签的数据。单表头和单表体的列表型单据:因为列表界面的表头和表体都是由列表组成的,所以单表头和单表体对于列表型单据在界面显示上是一致的。UI工厂定义了ISingleController接口来指定单据时单表头还是单表体,

16、因此,如果单据的界面控制类实现ISingleController接口,辅之以配套的单据模板,就可以实现单列表的界面。需要注意的是:1.列表型单据不支持新增,而卡片型单据可以新增.2.就是列表型单据支持UI初始化时自动加载数据,而卡片型单据要初始化时自动加载,只能在构造函数中调用数据加载的方法。虚拟主子表的列表型单据:制作虚拟主子表的列表型单据,基本策略和办法还是和卡片型单据一样。因为列表型单据在UI初始化时可以调用加载单据数据的方法。BillListUI初始化时调用initBillData方法加载单据数据因此我们在UI子类重载此方法:/*初始化时加载单据数据*/Protected void i

17、nitBillData(String strWhere)throws Exception 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; setLis

18、tHeadData(queryVos); getBufferData().setCurrentRow(-1);else ddVOsToBuffer(bills); etAllHeadVOsFromBuffer(); setBillOperate; getBufferData().setCurrentRow(0);/*param待分类的VO数据*return 分类的结果*/Private AggregatedValueObject terator();();i+) Object key= ();ArrayList al =(ArrayList)(key); B Billsi.setParentV

19、O(CircularlyAccessibleValueObject)(0); Billi.setChildrenVO(SuperVO)(new SuperVO0); Return bills;这部分数据加载的逻辑和前面虚拟主子表的卡片单据例子很相似,只是它多了一步操作将查询得到的表头数据加到表头的列表中。管理型单据制作管理型单据时列表型单据和卡片型单据的组合,因此,它同时具备这两种单据的特征,也就是说,管理型单据具有两种视图,并且可以在这两种视图之间进行切换。另外,管理型单据对这两种视图又做了功能上的划分-卡片视图和列表视图都可用于数据的显示,但是一旦要对列表视图的数据进行编辑操作时,界面自动

20、切换单卡片视图。管理型单据统一的界面基类是BillManageUI,统一的事件处理类是ManageEventHandler,统一的界面控制类为AbstractManageController。这个类实际上实现了ICardController和IListController两个接口。标准的管理型单据:1.使单据UI类继承BIllManageUI。2.使单据界面控制器类继承AbstractManageController类,这个类实现了卡片型单据控制器的通用接口ICardController和列表型单据控制器的通用接口IListController,因此我们的界面控制器类实际上需要实现卡片和列表控

21、制器的所有方法,除了单据类型,单据VO的名字,是否走平台,主表主键名,字表主键名这些通用的设置以外,这里重点展示对于按钮的定义,如下:/*取得列表界面的按钮*/Public int getListButtonAry() Return new int ,据UI类应该继承MultiChildManageUI。2.单据控制器类与标准管理型单据相同,但是VO的配置应按照多子表卡片型单据所示。另外,就像制作卡片型多子表单据一样,加载多子表的数据需要设置一个业务代理类,我们完全可以重用卡片型多子表单据例子中的业务代理类。这样就完成了多子表管理型单据的制作。虚拟多子表的管理型单据:1.单据UI类继承Bill

22、ManageUI。2.单据控制器类继承AbstractManageController。3.当单据不走平台时,单据UI类应该重载基类的createBusinessDelegator方法4.查询时必须将查询得到的数据加到表头列表中,如下所示:Protected void onBoQuery() throws Exception UIDialog query = getQueryUI(); If()= INormalQuery query = (INormalQuery)querydialog; String strWhere = (); If(strWhere=null)strWhere=”1=

23、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=nul

24、l|=0) getBillUI().setBillOperate; getBillUI().setListHeadData(queryVos); getBufferData().setCurrentRow(-1);else AggregatedValueObject bills = createBillVOs(queryVos); getBufferData().addVOsToBuffer(bills); etAllHeadVOsFromBuffer(); getBillUI().setBillOperate; getBufferData().setCurrentRow(0);5.和虚拟多子

25、表的卡片型单据一样,管理型单据应创建事件处理类,负责查询时组织数据以及删除和保存单据时去掉表头VO,但是,由于管理型单据的表头是列表,UI工厂将此列表VO缓存到界面上,因此,在修改单据和新增单据后,应该同时更新表头列表的VO数据。虚拟主子表的表头是一个逻辑的表头,在保存单据时,我们首先取得界面改变的VO数据,并将其表头VO设置为空,但是,这保证了保存操作的正确性,却给自动更新表头列表的VO数据制造了麻烦,解决的办法是在保存后将VO数据的表头VO还原,代码如下:/*单据保存后调用的方法*/Protected void setAddNewOperate(Boolean isAdding,Aggre

26、gatedValueObject billVO)throws Exception If(billVO!=null&().length!=0) CircularlyAccessibleValueObject pvo= ()0; etCurrentVO();(null);getBusinessAction().delete(modelVo,getUIController().getBillType(),getBillUI()._getData().toString(),getBillUI().getUserObject();emoveListHeadData(getBufferData().get

27、CurrentRow();getBufferData().removeCurrentRow();if(getBufferData().getVOBufferSize()=0)getBillUI().setBillOperateelsegetBillUI().setBillOperate树卡片类型单据UI工厂提供了左树右单据这种界面形式,根据右边单据的界面类型又可以分为树卡片型单据和树管理型单据,树型结构为单据提供了更为丰富的界面表达形式,对客户来说具有很好的导航效果,NC-UAP提供了产生树形结构的工具类,我们可以有两种方法生成树:1.通过ID和ParentID,树的最基本元素是节点,节点既可

28、以作为父节点,又可以作为孩子节点。每个节点都有一个ID标识自身,如果采用孩子节点链接父亲节点的数据结构,那么节点还需要一个域存储父亲节点的ID,这个ID是ParentID。2.通过编码和编码规则,这里的编码规则实际上是将编码分段,然后通过判断编码长度构造树,假设编码规则是“,它意味着第一级树节点的编码只有一个字符长度,第二级树节点的编码长度是三个字符长度,第三极树节点是五个字符长度。如果有4个节点A,B,C,D,他们的编码分别是0,000,001,00100,那么构造的树的根节点是A,A有两个子节点B和C,C的子节点是D。这两种构造树的方法并不影响单据的制作,选择哪种策略完全取决于业务的要求和

29、数据的构成形态。树卡片型单据的类结构:树卡片型单据统一的界面基类是BillTreeCardUI,它继承自BillCardUI。统一的事件处理基类是TreeCardEventHandler,它继承自CardEventHandler。统一的界面控制类接口为ITreeCardController,它继承自IcardController。开发树卡片型单据的步骤:标准的树卡片型界面:(构造树数据类)树的数据类封装了树的构造规则,如何获取数据等,按照ID构造的树,其数据必须实现IVOTreeDataByID接口,而按编码构造的树,其数据类必须实现IVOTreeDataByCode接口。例子如下:(按ID为

30、准)Public class SampleTreeCardData implements IVOTreeDataByID /*取得节点的ID域名称*/Public String getIDFieldName() Return “pk_sample”;/*取得节点的PARENT_ID域名称*/Public String getParentIDFieldName() Return null;/*取得节点的显示域名称*/Public String getShowFieldName() Return “pk_sample”;/*取得树的数据*/Public SuperVO getTreeVO() SuperVO treeVOs = null;N Try treeVOs

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

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