




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档 主子孙单据开发说明一元数据设计 主子孙单据需要设计如上图的元数据模型,现在以上图元数据模型为例,叙述开发主子孙单据过程设计主子孙元数据,实体之间的对应关系都为组合关系,这和设计主子表单据类似。只是有几点需要注意:1. 点击主表实体(任务) 设计如下访问策略设置为bodyOfAggVOAccess2.点击子表实体(分摊任务接收方) 设计如下,访问策略需要设计为PojoAccessor2. 点击孙表实体(接收方子表)设计如下3. 只有主表实体的类型为AggVO,子表实体和孙表实体都为NCVO二生成VO点击生成Java代码,会生成如图几个VO类,需要注意的几点,必须在子表VO类中加上:如图的孙表的属性,属性名字必须和单据模板对应的页签名字一样(这个是SendVO中加的,RecieveVO也是同样的加上),加上这个属性时为了在保存的时候,能够把孙表的信息一块存入表中.同时还需要再孙表的VO类中加上如图的属性(这个是SendChildVO中加的,RecieveChildVO也同样)。三设计模板设计完元数据和生成VO后,开始进行手工配置,这个节点没法使用向导生成,需要自行进行功能节点注册,菜单注册,单据模板初始化等等操作。这里需要说明是在设计单据模板。根据元数据,首先设计一个如下图样的主子表的模板接着再设计一个孙表模板:因为这里孙表实体是两个,所以还需要再设计一个孙表模板最后进行功能节点默认模板设置:如下图:这里需要注意,节点标示一定要写,这里会在之后的xml配置中用到这个节点标识。四Xml配置1.设计model,主子孙界面需要设计如下图的model2.元数据转换工厂:一个是主表和子表用,一个是孙表用3.数据模型和模板容器,如下图,其中nodekeies和之前配置的节点标识对应上4. 界面元素xml: -以下这个是孙表空行过滤,对应的页签code,一定要和你单据模板初始化中的页签code一样5. 单据操作代理这里的页签code和上面的一样,必须和单据模板里面设置的页签code一样 以上XML是比较重要的部分,全部的XML有附件,这里就不全部给出了。五开发中需要注意的问题:XML配置完之后,就能够出现如图的主子孙界面了。不过主子孙单据开发和平常的单据会有些区别,这里一一说明:1. 界面初始化数据:界面初始化会用到ModelDataManager类,这个类又会调用代理类,来执行查询的数据,返回的数据才通过ModelDataManager来初始化到界面上:首先代理类必须继承AbstractGrandQueryService类然后开始远程调用查询。后台查询方法如下:需要注意的是:这里会专门用到查询孙表的方法,不然查询出来的数据没有孙表数据。如果不用这个封装好的类,那可以自己定义一个查询出封装好vo的方法,使其是主子孙VO:Overridepublic AggMgsSchoolVO queryAllData(String whereSql)throws BusinessException AggMgsSchoolVO aggVOs = null;/EfficientBillQuery是根据sql条件(以and开始)进行单据VO高效查询的工具类EfficientBillQuery efq = new EfficientBillQuery(AggMgsSchoolVO.class);try aggVOs = efq.query(whereSql); catch (Exception e) throw new BusinessException(e.getMessage();if(aggVOs.length 1)/如果查询出的aggVOs数据没有数据,那么直接返回nullreturn null;StringBuffer pk_c_a_list = new StringBuffer();pk_c_a_list.append();for (int i = 0; i 0)for (int j = 0; j acvo.length; j+) MgsClassaVO mgsClassaVO = acvoj;pk_c_a_list.append(mgsClassaVO.getPk_c_a()+,);pk_c_a_list.append();/构造出孙表外键的数组String pk_c_a_lists = pk_c_a_list.delete(pk_c_a_list.length()-4, pk_c_a_list.length()-2).toString();StringBuffer pk_c_b_list = new StringBuffer();pk_c_b_list.append();for (int i = 0; i 0)for (int j = 0; j bcvo.length; j+) MgsClassbVO mgsClassaVO = bcvoj;pk_c_b_list.append(mgsClassaVO.getPk_c_b()+,);pk_c_b_list.append();/构造出孙表外键的数组String pk_c_b_lists = pk_c_b_list.delete(pk_c_b_list.length()-4, pk_c_b_list.length()-2).toString();BaseDAO bd = new BaseDAO();/查询出MgsTeacheraVO数据List tas = (List) bd.retrieveByClause(MgsTeacheraVO.class, dr = 0 and pk_c_a in+pk_c_a_lists);/查询出MgsTeacherbVO数据List tbs = (List) bd.retrieveByClause(MgsTeacherbVO.class, dr = 0 and pk_c_b in+pk_c_b_lists);/封装为主子孙的VOfor(int k = 0; k aggVOs.length; k+)MgsClassaVO mgsca = (MgsClassaVO) aggVOsk.getChildren(MgsClassaVO.class);for (int i = 0; i mgsca.length; i+) Set lavos = new HashSet(); String pk_c_a = mgscai.getPk_c_a();for(int j = 0 ; j tas.size() ; j+)MgsTeacheraVO tavo = tas.get(j);if(tavo.getPk_c_a().equals(pk_c_a)lavos.add(tavo);tas.remove(tavo);(MgsClassaVO) aggVOsk.getChildren(MgsClassaVO.class)i.setPk_t_a(lavos.toArray(new MgsTeacheraVO0);for(int k = 0; k aggVOs.length; k+)MgsClassbVO mgscb = (MgsClassbVO) aggVOsk.getChildren(MgsClassbVO.class);for (int i = 0; i mgscb.length; i+) Set lbvos = new HashSet(); String pk_c_b = mgscbi.getPk_c_b();for(int j = 0 ; j tbs.size() ; j+)MgsTeacherbVO tbvo = tbs.get(j);if(tbvo.getPk_c_b().equals(pk_c_b)lbvos.add(tbvo);tbs.remove(tbvo);(MgsClassbVO) aggVOsk.getChildren(MgsClassbVO.class)i.setPk_t_b(lbvos.toArray(new MgsTeacherbVO0);return aggVOs;在这里面需要先查询出主子VO,再遍历子VO找到其主键,将其加到一个StringBuffer数组当中,再这些根据条件查询出孙的VO,最后在组装一次主子孙全VO,这样只是对数据库执行查询操作3次,而且条件也比较精确,而上一种方法需要遍历整个主子aggVO,没遍历一次就执行一次查询,这样对数据库就会产生频繁的操作,影响性能(没有很大的数据量测试过,只是根据需要对数据库的相互次数得到的结论,不完全保证正确)。选中的代码就是根据子VO再去查出孙VO,并且组合出一个完整的主子孙VO的代码。2. 新增保存动作:和上面一样,使用代理类,调新增,后台代码如下:这里的新增需要用到GCInsertBPTemplate 类来进行主子孙的保存.nc.util.mmf.framework.gc.GCBillTransferTool这是一个主子孙单据单据简化工具.在保存前,打断点看看孙表数据是否传到后台,如下图:前台代码需要新增:在保存按钮里面,注入主子孙管理的model,再保存方法里面再调用如图红线标注的方法 保存数据以后,界面依然是卡片界面,如果此时不做特殊处理,那么返回到列表界面的时候,当前选中的数据就是增加前选中的数据,所以我们需要在返回按钮当中做特殊的处理。重写返回按钮,强制发一个事件即可。nc.ui.xgh_study.maingrand.action.UEReturnActionEx同样修改,删除和新增类似这里不一一说明。3. 第一次打开界面问题主子孙界面第一次在打开界面时,可能孙表模板被隐藏,第二次打开才能显示,这里的解决办法是:列表界面:重写这个类,ponents.grand.ListGrandPanelComposite将readListCacheInfo()方法重写卡片界面类似如果孙表的数据不能显示,在数据初始化的时候代码如下:4. 卡片界面保存问题需要重写这个类ponents.grand.CardGrandPanelComposite在初始化界面的时候调用如下方法:/* * 重写下初始化方法 平台代码没有考虑多页签的问题 需要给每个子页签都添加上伪列 * * param mainBillForm * void TODO(参数说明) */private void constructPreColumBillItem(BillForm mainBillForm) String bodyTableCodes = mainBillForm.getBillCardPanel().getBillData().getBodyTableCodes();for (int i = 0; i 0)continue;/ 添加伪列操作BillItem bodyItems = billModel.getBodyItems();BillItem newItem = new BillItem();BillItem newItems = Arrays.copyOf(bodyItems, bodyItems.length + 1);newItem.setKey(precolumn);newItem.setShow(false);newItem.setNull(false);newItem.setShowOrder(bodyItems.length + 1);newItemsbodyItems.length = newItem;billModel.setBodyItems(newItems);mainBillForm.getBillCardPanel().getBodyPanel(bodyTableCodesi).setTableModel(billModel);在保存按钮的doAction方法中需要修改为如下代码,这样自己手动增加伪列,否则在保存的时候就会显示错误数据。5. 在主子孙单据中,由于是将一个主子表和一个孙表糅合在一起,所以在操作列表界面或者是卡片界面时都是通过ponents.grand.ListGrandPanelComposite 需要重写的方法:private void tabChangeProcess() / 获得当前选中行int currentRow = (BillListView) this.mainPanel).getBillListPanel().getBodyTable().getSelectedRow();String currentbodyTabCode = (BillListView) this.getMainPanel().getBillListPanel().getChildListPanel().getTableCode();/ 根据当前子页签获取孙表viewBillListView grandListView = (BillListView) this.getMaingrandrelationship().getBodyTabTOGrandListComposite().get(currentbodyTabCode);/ 加载孙模板this.getMainGrandAssist().updateGrandListByBodyTab(this);if (grandListView != null & currentRow != -1 )/ 加载孙面板数据AbstractBill aggVO = (AbstractBill) (BillListView) this.getMainPanel().getModel().getSelectedData();ShowUpableBillListViewEx billListViewEx = (ShowUpableBillListViewEx) this.getMainPanel();/ 获取类路径String bodyClassName = billListViewEx.getBillListPanel().getBodyBillModel(currentbodyTabCode).getTabvo().getBillMetaDataBusinessEntity().getFullClassName();List grandVOList = this.getMainGrandAssist().getGrandListDataByMainRow(BillListView) this.mainPanel,currentRow, grandListView, bodyClassName,this.getMaingrandrelationship();if (grandVOList != null) / 孙面板加载数据并显示grandListView.getBillListPanel().getBodyBillModel().setBodyDataVO(grandVOList.toArray(new SuperVO0);grandListView.getBillListPanel().getBodyBillModel().loadLoadRelationItemValue();grandListView.getBillListPanel().getBodyBillModel().execLoadFormula(); else grandListView.getBillListPanel().getBodyBillModel().clearBodyData();else/如果子表没有数据,则先清空孙表数据,再强制发送一次数据选择改变事件this.clearGrandData();(BillListView) this.getMainPanel().getModel().fireEvent(new AppEvent(AppEventConst.SELECTION_CHANGED);Overridepublic void handleEvent(AppEvent event) if (event instanceof ListBodyTabChangedEvent) /页签改变时的处理this.tabChangeProcess();return; else if (event.getType().equals(MainGrandEventTypeEnum.loadcardgranddata.toString() CardPanelEventUtil.grandListModelInit(this);super.handleEvent(event);/* * 清除孙表数据 */
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年数码摄影艺术与技术课程考核试题及答案
- 2025年物流管理专业实务考试试卷及答案
- 2025年网络安全技术考试试卷及答案
- 培训学员考核评估补充协议
- 新媒体平台电商合作带货分成比例调整补充协议
- 夫妻忠诚协议书附带婚姻财产分割及子女教育责任及离婚冷静期约定
- 公共建筑楼梯安全检测与改造协议
- 地质工程地质灾害防治劳务合同
- 生物实验动物活体运输及疾病预防服务合同
- 城市综合体商业街摊位产权分割及品牌连锁合作协议
- 如何预防与处理劳动争议培训课件
- GB/T 16866-1997一般用途的加工铜及铜合金无缝圆形管材外形尺寸及允许偏差
- GB/T 13477.8-2017建筑密封材料试验方法第8部分:拉伸粘结性的测定
- 公司刀模检验记录表
- 四年级英语下unit5sport课件
- 重大活动公共卫生安全监督保障课件
- 监控施工报价单
- 电解质溶液导电性影响因素的探究
- 餐饮油烟污染防治承诺书
- GB∕T 13554-2020 高效空气过滤器
- 幼儿园环境创设评分表
评论
0/150
提交评论