STUDIO生成主子孙单据开发说明书

上传人:无*** 文档编号:83446518 上传时间:2022-05-01 格式:DOC 页数:59 大小:4.29MB
返回 下载 相关 举报
STUDIO生成主子孙单据开发说明书_第1页
第1页 / 共59页
STUDIO生成主子孙单据开发说明书_第2页
第2页 / 共59页
STUDIO生成主子孙单据开发说明书_第3页
第3页 / 共59页
点击查看更多>>
资源描述
word主子孙单据开发说明一元数据设计主子孙单据需要设计如上图的元数据模型,现在以上图元数据模型为例,表示开发主子孙单据过程设计主子孙元数据,实体之间的对应关系都为组合关系,这和设计主子表单据类似。只是有几点需要注意: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) thrownew BusinessException(e.getMessage();if(aggVOs.length 1)/如果查询出的aggVOs数据没有数据,那么直接返回nullreturnnull;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,再保存方法里面再调用如图红线标注的方法 保存数据以后,界面依然是卡片界面,如果此时不做特殊处理,那么返回到列表界面的时候,当前选中的数据就是增加前选中的数据,所以我们需要在返回按钮当中做特殊的处理。重写返回按钮,强制发一个事件即可。同样修改,删除和新增类似这里不一一说明。3. 第一次打开界面问题主子孙界面第一次在打开界面时,可能孙表模板被隐藏,第二次打开才能显示,这里的解决方法是:列表界面:重写这个类,将readListCacheInfo()方法重写卡片界面类似如果孙表的数据不能显示,在数据初始化的时候代码如下:4. 卡片界面保存问题需要重写这个类在初始化界面的时候调用如下方法:/* * 重写下初始化方法 平台代码没有考虑多页签的问题 需要给每个子页签都添加上伪列 * * param mainBillForm * void TODO参数说明 */privatevoid 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. 在主子孙单据中,由于是将一个主子表和一个孙表糅合在一起,所以在操作列表界面或者是卡片界面时都是通过需要重写的方法:privatevoid tabChangeProcess() / 获得当前选中行int currentRow = (BillListView) this.mainPanel).getBillListPanel().getBodyTable().getSelectedRow();String currentbodyTabCode = (BillListView) this.getMainPanel().getBillListPanel().getChildListPanel().getTableCode();/ 根据当前子页签获取孙表viewBillListView grandListView = (BillListView) this.getMaingrandrelationship().getBodyTabTOGrandListposite().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);Overridepublicvoid handleEvent(AppEvent event) if (event instanceof ListBodyTabChangedEvent) /页签改变时的处理this.tabChangeProcess();return; elseif (event.getType().equals(MainGrandEventTypeEnum.loadcardgranddata.toString() CardPanelEventUtil.grandListModelInit(this);super.handleEvent(event);/* * 去除孙表数据 */privatevoid clearGrandData() String currentbodyTabCode = (BillListView) this.getMainPanel().getBillListPanel().getChildListPanel().getTableCode(); / 根据当前子页签获取孙表view BillListView grandListView = (BillListView) this.getMaingrandrelationship().getBodyTabTOGrandListposite().get(currentbodyTabCode);if (grandListView != null) String grandTabCodes = grandListView.getBillListPanel().getBillListData().getBodyTableCodes();for (String grandTabcode : grandTabCodes) grandListView.getBillListPanel().getBillListData().getBodyBillModel(grandTabcode).clearBodyData(); 和来进展操作的,例如事件的处理,给孙表设值等等。6 点击查询按钮,需要根据查询面板得到语句,再进展查询,重写查询Action:附件:红色局部需要小心配置主子孙单据完整xml :pm01pm0101pm0102beanid=receiverFormListclass=
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!