STUDIO生成主子孙单据开发说明_第1页
STUDIO生成主子孙单据开发说明_第2页
STUDIO生成主子孙单据开发说明_第3页
STUDIO生成主子孙单据开发说明_第4页
STUDIO生成主子孙单据开发说明_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 主子孙单据开发说明一元数据设计 主子孙单据需要设计如上图的元数据模型,现在以上图元数据模型为例,叙述开发主子孙单据过程设计主子孙元数据,实体之间的对应关系都为组合关系,这和设计主子表单据类似。只是有几点需要注意:1. 点击主表实体(任务) 设计如下访问策略设置为bodyOfAggVOAccess2.点击子表实体(分摊任务接收方) 设计如下,访问策略需要设计为PojoAccessor2. 点击孙表实体(接收方子表)设计如下3. 只有主表实体的类型为AggVO,子表实体和孙表实体都为NCVO二生成VO点击生成Java代码,会生成如图几个VO类,需要注意的几点,必须在子表VO类中加上:如图的孙表的

2、属性,属性名字必须和单据模板对应的页签名字一样(这个是SendVO中加的,RecieveVO也是同样的加上),加上这个属性时为了在保存的时候,能够把孙表的信息一块存入表中.同时还需要再孙表的VO类中加上如图的属性(这个是SendChildVO中加的,RecieveChildVO也同样)。三设计模板设计完元数据和生成VO后,开始进行手工配置,这个节点没法使用向导生成,需要自行进行功能节点注册,菜单注册,单据模板初始化等等操作。这里需要说明是在设计单据模板。根据元数据,首先设计一个如下图样的主子表的模板接着再设计一个孙表模板:因为这里孙表实体是两个,所以还需要再设计一个孙表模板最后进行功能节点默认

3、模板设置:如下图:这里需要注意,节点标示一定要写,这里会在之后的xml配置中用到这个节点标识。四Xml配置1.设计model,主子孙界面需要设计如下图的model2.元数据转换工厂:一个是主表和子表用,一个是孙表用3.数据模型和模板容器,如下图,其中nodekeies和之前配置的节点标识对应上4. 界面元素xml: <!- 界面元素 -><bean id="billFormEditor" class="nc.ui.mmf.framework.view.BillFormFacade" init-method="initUI&qu

4、ot;><property name="model" ref="manageAppModel"></property><property name="templateContainer" ref="templateContainer" /><property name="showOrgPanel" value="false" /><property name="nodekey" value=&qu

5、ot;pm01" /><!- 是否自动增行 -><property name="autoAddLine" value="false" /><!- 表体行操作按钮注册,与表体右键菜单保持一致 -><property name="bodyLineActions"><list><!- 提供了一组默认实现 -><bean class="nc.ui.pubapp.uif2app.actions.BodyAddLineAction"&

6、gt;</bean><bean class="nc.ui.pubapp.uif2app.actions.BodyDelLineAction"></bean></list></property></bean><!- 列表视图 -><bean id="listView" class="nc.ui.pubapp.uif2app.view.ShowUpableBillListView" init-method="initUI">

7、<property name="model" ref="manageAppModel"/><property name="templateContainer" ref="templateContainer"/><property name="nodekey" value="pm01" /></bean><bean id="senderFormList" class="nc.ui.mmf.fra

8、mework.view.BillListViewFacade" init-method="initUI"><property name="model" ref="grandSonAppModel" /><property name="templateContainer" ref="templateContainer" /><property name="nodekey" value="pm0102" />

9、</bean><bean id="receiverFormList" class="nc.ui.mmf.framework.view.BillListViewFacade" init-method="initUI"><property name="model" ref="grandSonAppModel" /><property name="templateContainer" ref="templateContainer&

10、quot; /><property name="nodekey" value="pm0101" /></bean><bean id="senderFormEditor" class="nc.ui.mmf.framework.view.BillFormFacade" init-method="initUI"><property name="model" ref="grandSonAppModel" />&

11、lt;property name="templateContainer" ref="templateContainer" /><property name="nodekey" value="pm0102" /><property name="bodyLineActions"><list><beanclass="ponents.grand.action.GrandBodyAddLineAction"><property

12、 name="mainForm" ref="billFormEditor" /></bean><bean class="nc.ui.pubapp.uif2app.actions.BodyLineEditAction" /><bean class="nc.ui.pubapp.uif2app.actions.BodyDelLineAction" /><bean class="nc.ui.pub.beans.ActionsBar$ActionsBarSeparat

13、or" /><ref bean="maxmincardgrandaction" /></list></property><property name="componentValueManager" ref="grandValueAdapt" /><property name="showOrgPanel" value="false" /><!- 是否自动增行 -><property name="

14、autoAddLine" value="false" /><property name="showTotalLine" value="false" /></bean><bean id="grandValueAdapt"class="ponents.grand.valueStrategy.GrandPanelValueAdapter" /><bean id="receiverFormEditor" class="

15、;nc.ui.mmf.framework.view.BillFormFacade" init-method="initUI"><property name="model" ref="grandSonAppModel" /><property name="templateContainer" ref="templateContainer" /><property name="nodekey" value="pm0101&q

16、uot; /><property name="bodyLineActions"><list><beanclass="ponents.grand.action.GrandBodyAddLineAction"><property name="mainForm" ref="billFormEditor" /></bean><bean class="nc.ui.pubapp.uif2app.actions.BodyLineEditAction

17、" /><bean class="nc.ui.pubapp.uif2app.actions.BodyDelLineAction" /><bean class="nc.ui.pub.beans.ActionsBar$ActionsBarSeparator" /><ref bean="maxmincardgrandaction" /></list></property><property name="componentValueManager&qu

18、ot; ref="grandValueAdapt" /><property name="showOrgPanel" value="false" /><!- 是否自动增行 -><property name="autoAddLine" value="false" /><property name="showTotalLine" value="false" /></bean><!- 表体页签

19、编码按钮 -><bean id="bodyActionsMap" class="java.util.HashMap"><constructor-arg><map><!- key为页签的tabcode -><entry key="pk_taskdynfct"><list><bean class="nc.ui.pubapp.uif2app.actions.BodyAddLineAction" /><bean class=&q

20、uot;nc.ui.pubapp.uif2app.actions.BodyLineEditAction" /><bean class="nc.ui.pubapp.uif2app.actions.BodyDelLineAction" /></list></entry></map></constructor-arg></bean><!- 最大化最小化Action -><bean id="maxmincardgrandaction"class="

21、ponents.grand.action.MaxMinCardGrandAction"><property name="mainGrandModel" ref="mainGrandModel"></property></bean><bean id="orgPanel" class="nc.ui.pubapp.uif2app.view.OrgPanel"init-method="initUI"><property name=&q

22、uot;model" ref="manageAppModel" /><property name="dataManager" ref="modelDataManager" /></bean><!- 主子孙列表界面-><bean id="zhuzisunlist" class="nc.ui.grand.editor.ExtendListGrandPanelComposite"init-method="initUI">

23、;<!-主子的面板-><property name="mainPanel" ref="listView"></property><!-主子孙的MODEL-><property name="model" ref="mainGrandModel"></property><!-主子孙的对应关系-><property name="maingrandrelationship" ref="mainGrandR

24、elationShip"></property><!-主子孙的协调关系-><property name="mediator" ref="mainGrandMediator"></property><!-孙表的提示信息,默认为"孙表信息",可以不配-><property name="grandString" value="孙表"></property><property name="

25、currentLocation" value="0.55"></property><property name="uiDividerLocation" value="0.55"></property></bean><!- 主子孙卡片界面-><bean id="zhuzisuncard" class="nc.ui.grand.editor.ExtendCardPanelComposite"init-method=&q

26、uot;initUI"><!-主子的面板-><property name="mainPanel" ref="billFormEditor"></property><!-主子孙的MODEL-><property name="model" ref="mainGrandModel"></property><!-主子孙的对应关系-><property name="maingrandrelationship&q

27、uot; ref="mainGrandRelationShip"></property><!-主子孙的空行过滤>-><property name="mainGrandBlankFilter" ref="mainGrandBlankFilter"></property><!-主子孙的协调关系-><property name="mediator" ref="mainGrandMediator"></proper

28、ty><!-孙表的提示信息,默认为"孙表信息",可以不配-><property name="grandString" value="孙表"></property><property name="currentLocation" value="0.55"></property><property name="uiDividerLocation" value="0.55"></

29、property></bean><!- 维持主子孙中间关系调停者的处理 -><bean id="mainGrandMediator"class="ponents.grand.mediator.MainGrandMediator"><!-主子的BillForm-><property name="mainBillForm" ref="billFormEditor"></property><property name="main

30、BillListView" ref="listView"></property><!-主子孙的MODEL-><property name="mainGrandModel" ref="mainGrandModel"></property><!-主子孙的关系-><property name="mainGrandRelationShip" ref="mainGrandRelationShip"></prope

31、rty></bean>以下这个是孙表空行过滤,对应的页签code,一定要和你单据模板初始化中的页签code一样<!- 子孙之间对应模板关系配置 -><bean id="mainGrandRelationShip"class="ponents.grand.MainGrandRelationShip"><!-列表的对应关系-><property name="bodyTabTOGrandListComposite"><map><!-key为子表的tabcod

32、e -><entry key="recieve"><!-孙表的ListForm -><ref bean="receiverFormList" /></entry><!-key为子表的tabcode -><entry key="send"><!-孙表的ListForm -><ref bean="senderFormList" /></entry></map></property>&

33、lt;!-卡片的对应关系-><property name="bodyTabTOGrandCardComposite"><map><!-key为子表的tabcode -><entry key="recieve"><!-孙表的BillForm -><ref bean="receiverFormEditor" /></entry><!-key为子表的tabcode -><entry key="send">&l

34、t;!-孙表的BillForm -><ref bean="senderFormEditor" /></entry></map></property><!-孙页签与VO的对应关系-><property name="grandTabAndVOMap"><map><!-key为孙页签的tabcode(下同)-><entry key="sendchild"><!-value为孙页签对应的VO(下同) -><ref

35、 bean="sendchildvo" /></entry><entry key="recievechild"><ref bean="recievechildvo" /></entry></map></property></bean><bean id="sendchildvo" class="nc.vo.pram.practice.SendChildVO" /><bean id="

36、;recievechildvo" class="nc.vo.pram.practice.RecieveChildVO" />5. 单据操作代理这里的页签code和上面的一样,必须和单据模板里面设置的页签code一样 <!- 单据操作代理 -><bean id="maintainProxy" class="nc.ui.grand.serviceproxy.TaskMaintainProxy"><property name="grandTabAndVOMap"><

37、;map><!-key为孙页签的tabcode、value为孙页签对应的VO -><entry key="recievechild"><ref bean="recievechildvo" /></entry><entry key="sendchild"><ref bean="sendchildvo" /></entry></map></property></bean>以上XML是比较重要的部

38、分,全部的XML有附件,这里就不全部给出了。五开发中需要注意的问题:XML配置完之后,就能够出现如图的主子孙界面了。不过主子孙单据开发和平常的单据会有些区别,这里一一说明:1. 界面初始化数据:界面初始化会用到ModelDataManager类,这个类又会调用代理类,来执行查询的数据,返回的数据才通过ModelDataManager来初始化到界面上:首先代理类必须继承AbstractGrandQueryService类然后开始远程调用查询。后台查询方法如下:需要注意的是:这里会专门用到查询孙表的方法,不然查询出来的数据没有孙表数据。如果不用这个封装好的类,那可以自己定义一个查询出封装好vo的方

39、法,使其是主子孙VO:Overridepublic AggMgsSchoolVO queryAllData(String whereSql)throws BusinessException AggMgsSchoolVO aggVOs = null;/EfficientBillQuery是根据sql条件(以and开始)进行单据VO高效查询的工具类EfficientBillQuery<AggMgsSchoolVO> efq = new EfficientBillQuery<AggMgsSchoolVO>(AggMgsSchoolVO.class);try aggVOs =

40、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 < aggVOs.length; i+) AggMgsSchoolVO aggMgsSc

41、hoolVO = aggVOsi;MgsClassaVO acvo = (MgsClassaVO) aggMgsSchoolVO.getChildren(MgsClassaVO.class);if(acvo.length > 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(")");/构造出孙表外键

42、的数组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 < aggVOs.length; i+) AggMgsSchoolVO aggMgsSchoolVO = aggVOsi;MgsClassbVO bcvo = (MgsClassbV

43、O) aggMgsSchoolVO.getChildren(MgsClassbVO.class);if(bcvo.length > 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_

44、c_b_list.length()-4, pk_c_b_list.length()-2).toString();BaseDAO bd = new BaseDAO();/查询出MgsTeacheraVO数据List<MgsTeacheraVO> tas = (List<MgsTeacheraVO>) bd.retrieveByClause(MgsTeacheraVO.class, "dr = 0 and pk_c_a in"+pk_c_a_lists);/查询出MgsTeacherbVO数据List<MgsTeacherbVO> tbs =

45、 (List<MgsTeacherbVO>) 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<MgsTeacheraV

46、O> lavos = new HashSet<MgsTeacheraVO>(); 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

47、(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<MgsTeacherbVO> lbvos = new HashSet<MgsTeacherbVO>(); String pk_c_b = mgscbi.getPk_c_b();for(int j = 0 ; j <

48、; 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,最后在组装一

49、次主子孙全VO,这样只是对数据库执行查询操作3次,而且条件也比较精确,而上一种方法需要遍历整个主子aggVO,没遍历一次就执行一次查询,这样对数据库就会产生频繁的操作,影响性能(没有很大的数据量测试过,只是根据需要对数据库的相互次数得到的结论,不完全保证正确)。选中的代码就是根据子VO再去查出孙VO,并且组合出一个完整的主子孙VO的代码。2. 新增保存动作:和上面一样,使用代理类,调新增,后台代码如下:这里的新增需要用到GCInsertBPTemplate 类来进行主子孙的保存.nc.util.mmf.framework.gc.GCBillTransferTool<E>这是一个主子

50、孙单据单据简化工具.在保存前,打断点看看孙表数据是否传到后台,如下图:前台代码需要新增:在保存按钮里面,注入主子孙管理的model,再保存方法里面再调用如图红线标注的方法 保存数据以后,界面依然是卡片界面,如果此时不做特殊处理,那么返回到列表界面的时候,当前选中的数据就是增加前选中的数据,所以我们需要在返回按钮当中做特殊的处理。重写返回按钮,强制发一个事件即可。nc.ui.xgh_study.maingrand.action.UEReturnActionEx同样修改,删除和新增类似这里不一一说明。3. 第一次打开界面问题主子孙界面第一次在打开界面时,可能孙表模板被隐藏,第二次打开才能显示,这里

51、的解决办法是:列表界面:重写这个类,ponents.grand.ListGrandPanelComposite将readListCacheInfo()方法重写卡片界面类似如果孙表的数据不能显示,在数据初始化的时候代码如下:4. 卡片界面保存问题需要重写这个类ponents.grand.CardGrandPanelComposite在初始化界面的时候调用如下方法:/* * 重写下初始化方法 平台代码没有考虑多页签的问题 需要给每个子页签都添加上伪列 * * param mainBillForm * void TODO(参数说明) */private void constructPreColumB

52、illItem(BillForm mainBillForm) String bodyTableCodes = mainBillForm.getBillCardPanel().getBillData().getBodyTableCodes();for (int i = 0; i < bodyTableCodes.length; i+) BillModel billModel = mainBillForm.getBillCardPanel().getBillModel(bodyTableCodesi);if (billModel.getBodyColByKey("precolumn

53、") > 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

54、 + 1);newItemsbodyItems.length = newItem;billModel.setBodyItems(newItems);mainBillForm.getBillCardPanel().getBodyPanel(bodyTableCodesi).setTableModel(billModel);在保存按钮的doAction方法中需要修改为如下代码,这样自己手动增加伪列,否则在保存的时候就会显示错误数据。5. 在主子孙单据中,由于是将一个主子表和一个孙表糅合在一起,所以在操作列表界面或者是卡片界面时都是通过ponents.grand.ListGrandPanelComp

55、osite 需要重写的方法:private void tabChangeProcess() / 获得当前选中行int currentRow = (BillListView) this.mainPanel).getBillListPanel().getBodyTable().getSelectedRow();String currentbodyTabCode = (BillListView) this.getMainPanel().getBillListPanel().getChildListPanel().getTableCode();/ 根据当前子页签获取孙表viewBillListView

56、 grandListView = (BillListView) this.getMaingrandrelationship().getBodyTabTOGrandListComposite().get(currentbodyTabCode);/ 加载孙模板this.getMainGrandAssist().updateGrandListByBodyTab(this);if (grandListView != null && currentRow != -1 )/ 加载孙面板数据AbstractBill aggVO = (AbstractBill) (BillListView)

57、this.getMainPanel().getModel().getSelectedData();ShowUpableBillListViewEx billListViewEx = (ShowUpableBillListViewEx) this.getMainPanel();/ 获取类路径String bodyClassName = billListViewEx.getBillListPanel().getBodyBillModel(currentbodyTabCode).getTabvo().getBillMetaDataBusinessEntity().getFullClassName()

58、;List<Object> grandVOList = this.getMainGrandAssist().getGrandListDataByMainRow(BillListView) this.mainPanel,currentRow, grandListView, bodyClassName,this.getMaingrandrelationship();if (grandVOList != null) / 孙面板加载数据并显示grandListView.getBillListPanel().getBodyBillModel().setBodyDataVO(grandVOLi

59、st.toArray(new SuperVO0);grandListView.getBillListPanel().getBodyBillModel().loadLoadRelationItemValue();grandListView.getBillListPanel().getBodyBillModel().execLoadFormula(); else grandListView.getBillListPanel().getBodyBillModel().clearBodyData();else/如果子表没有数据,则先清空孙表数据,再强制发送一次数据选择改变事件this.clearGra

60、ndData();(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

61、.loadcardgranddata.toString() CardPanelEventUtil.grandListModelInit(this);super.handleEvent(event);/* * 清除孙表数据 */ private void clearGrandData() String currentbodyTabCode = (BillListView) this.getMainPanel().getBillListPanel().getChildListPanel().getTableCode(); / 根据当前子页签获取孙表view BillListView grandLi

62、stView = (BillListView) this.getMaingrandrelationship().getBodyTabTOGrandListComposite().get(currentbodyTabCode); if (grandListView != null) String grandTabCodes = grandListView.getBillListPanel().getBillListData().getBodyTableCodes(); for (String grandTabcode : grandTabCodes) grandListView.getBillL

63、istPanel().getBillListData().getBodyBillModel(grandTabcode).clearBodyData(); 和ponents.grand.CardGrandPanelComposite来进行操作的,例如事件的处理,给孙表设值等等。6 点击查询按钮,需要根据查询面板得到语句,再进行查询,重写查询Action:附件:红色部分需要小心配置主子孙单据完整xml :<?xml version="1.0" encoding="gbk"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xsi:schema

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论