您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > NC开发流程一览表说明
单表体的卡片型单据制作单表体的单据:指装载界面数据的聚合VO表头为空,只存在一组表体VO。UI工厂设计了接口ISingleController,单表体单据界面控制类应实现此接口,并实现isSingleDetail方法。前期准备:单据注册,模板初始化等等,在构造好类框架后要修改界面控制类。1.注册单据类型2.注册VO对象如下:publicString[]getBillVoName(){ReturnnewString[]{SampleVo.class.getName(),SampleHeadVO.class.getName(),SampleHeadVo.class.getName(),};}publicStringgetPKField(){Return“pk_sample”;}publicStringgetChildPKField(){Return“pk_sample”;}注意此时的表头,表体的VO类一致。3.是否走平台publicintgetBusinessActionType(){Returnnc.ui.trade.businessaction.IBusinessActionType.BD;}4.注册按钮publicint[]getCardButtonAry(){Returnnewint[]{IBillButton.Query,IBillButton.Add,IBillButton.Edit,IBillButton.Line,IBillButton.Save,IBillButton.Cancel,IBillButton.Refresh,};}最重要的一步,实现isSingleDetail方法。publicBooleanisSingleDetail(){//单表体明细//单表体Returntrue;}ISingleController用来支持单表头或单表体的单据,因此,当isSingleDetail方法返回true时,单据为单表体;当返回false时,单据为但表头。单表头的卡片型单据制作除了显示有很大差异外,单表头于单表体的唯一区别在于isSingleDetail方法的返回值。另外,在单表头界面增加浏览按钮和去掉行操作按钮。虚拟主子表的卡片型单据制作虚拟主子表单据:指的是那种数据来源于一张表,却根据(自定义的)特定规则虚拟主子表的结构,将一部分放到表头,剩下的字段放到表体的单据。它通常用于数据的分组,即把数据根据(自定义的)特定字段的值进行分组。字段值相等的数据自然的被归为一类,然后,把特定字段放到表头显示,属于它的一组数据在表体列表显示,形成了标准主子表的结构。由于数据分组的特定规则取决于业务,因此UI工厂无法做缺省的实现。但加载数据库数据一般都在查询时完成,所以可以定制查询事件的行为,这需要为单据创建按钮事件处理器,并重载查询时基类调用的方法。加载数据的步骤如下:1.第一步,与前面的步骤一样,并配置好界面控制器类。2.在UI类重载按钮事件处理器类的方法,如下:ProtectedCardEventHandlercreateEventHandler(){ReturnnewSampleCardEventHandle(this.getUIControl());}3.构造按钮事件处理器类,重载onBoQuery方法。如下:ProtectedvoidonBoQuery()throwsException{UIDialogquerydialog=getQueryUI();If(querydialog.showModel())==(INormalQuery)querydialog;StringstrWhere=query.getWhereSql();If(strWhere==null)strWhere=”1=1”;strWhere=”(”+strWhere+”)and(isnull(dr,0)=0)”;//将查询对话框条件加到整个查询条件后If(getHeadCondition()!=null)strWhere=strWhere+”and”+getHeadCondition();//查询数据表数据SuperVO[]queryVos=getBusinessAction().queryHeadAllData(Class.forName(getUIController().getBillVoName()[1]),getUIController().getBillType(),strWhere);//清空缓冲数据getBUfferData().clear();if(queryVos==null||queryVos.length==0){getBillUI().setBillOperate(IBillOperate.OP_INIT);getBufferData().setCurrentRow(-1);}else{//根据规则将数据进行分组AggregatedValueObject[]bills=createBillVOs(queryVos);getBillUI().setBillOperate(IBillOperate.OP_NOTEDIT);getBufferData().setCurrentRow(0);}}/***对一组VO数据进行分类**@param待分类的VO数据*@return分类的结果*/PrivateAggregatedValueObject[]//聚合值对象数据createBillVOs(CircularlyAccessibleValueObject[]vos){//循环获得值对象数组if(vos==null||vos.length==0)returnnull;//按照年度,月度将数据分组HashMaptmpMap=Hashlize.hashlizeObjects(vos,newVOHashKeyAdapter(newString[]{“vyear”,”vmonth”}));AggregatedValueObject[]bills=newAggregatedValueObject[tmpMap.size()];Inti=0;Iteratorit=tmpMap.keySet().iterator()For(;it.hasNext();i++){Objectkey=it.next();ArrayListal=(ArrayList)tmpMap.get(key);Bills[i]=newnc.vo.trade.pub.HYBillVO();//设置表头数据bill[i].setChildrenVO((SuperVO[]).toArray(newSuperVO[0]));}Returnbills;}对数据增,删,改的控制因为是虚拟主子表的数据结构,它在进行数据的操作时需要额外的控制。这个问题的本质是在将前台数据写回后台时,需将前台的主子表结构还原为单表结构。1.数据修改时的控制,这包括新增和编辑在编辑(行操作)完毕,点击保存按钮。程序会从界面取得被修改的数据,这些数据被标志成新增,删除,修改等状态,提交给后台处理。对于真正的主子表,表头数据和标题数据会分别存储到对应的表中,但对于虚拟主子表的单据,主表数据加上字表数据的一行才构成数据表中的一行记录。这个问题的解决方法如下:在获取界面VO时做控制,方法是重载UI类重载基类的getChangedVOFramUI方法:PublicAggregateValueObjectgetChangeVOFromUI()ThrowsException{AggregatedValueObjectvo=super.getChangedVOFromUI();If(vo!=null){//将聚合VO的主表设为空Vo.setParentVO(null);}Returnvo;}通过将聚合VO的主表舍为空,后台不会再处理主表的数据。在编辑时,将需要存储的主表数据放到字表中。这需要控制行操作的行为,方法是时间处理器重载基类的行操作方法:/***增行方法*/PublicvoidonBoLineAdd()throwsjava.lang.Exception{Super.onBoLineAdd();addDefaultData();}/***粘贴行的方法*/ProtectedvoidonBoLinePaste()throwsException{Super.onBoLinePaste();addDefaultData();}/***插入行方法*/ProtectedvoidonBoLineIns()throwsException{super.onBoLineIns();addDefaultData();}/***将表头数据放到表体中*/PrivatevoidaddDefaultData()throwsException{IntcurrentBodyrow=getBillCardPanelWrapper().getBillCardPanel().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();}需要注意的是:从程序健壮性考虑,我们应该加一些前台校验类,依照前面介绍,我们创建前台校验类,并在单据类型中注册。3.对数据的删除控制这需要让事件处理器重载基类的onBoDelete方法,如:ProtectedvoidonBoDelete()throwsException{If(MessageDialog.showYesNoDlg(getBillUI(),”档案删除”,”是否确认删除该基本档案?”)!=UIDialog.ID_YES)return;AggregateValueObjectmodelVo=getBufferData().getCurrentVO();//将聚合VO的表头设为空modelVo.setParentVo(null);getBusinesssAction().delete(modelVo,getBillUI()._getDate().toString(),getBillUI.getUserObject());getBufferData().removeCurrentRo
本文标题:NC开发流程一览表说明
链接地址:https://www.777doc.com/doc-637655 .html