本文介绍了在一个应用系统中,如何通过多步骤实现基础资料类型和多类别基础资料的值在单据页面和列表界面之间的赋值和交互。具体步骤包括:首先,创建动态表单页面和单据页面,并在这两个页面上添加相应的基础资料控件;其次,通过编写插件类实现数据的回传和接收,包括从动态表单到单据页面,以及从单据页面到列表界面的数据传递;最后,在单据列表界面上添加按钮和插件类,以实现从动态表单接收数据并赋值到选中行的功能。整个过程展示了如何在不同页面间动态传递和更新数据,以满足特定的业务需求。
关键词:多类别基础资料控件、基础资料类型控件
一、需求背景
1.1在页面上通过弹出页面将基础资料类型、多类别基础资料的值赋值到单据页面上。
1.2在列表界面选中某一行数据点击按钮填入需要的基础资料类型、多类别基础资料值。
二、实现方案
2.1先新建一个动态表单,在动态表单上添加基础资料类型控件、多类别基础资料控件,添加插件类,将选择的数据回传给父单据页面
2.2新建一个单据页面,在页面上添加基础资料类型控件、多类别基础资料控件,将这两个控件设置其锁定性(根据不同的状态),添加一个填入信息的按钮,通过插件代码打开上一步新建的动态表单,接收动态表单回传的数据。
2.3在单据列表界面上添加按钮,通过插件类打开动态表单界面,通过动态表单页面回传数据赋值到列表上。
三、实现过程
3.1创建一个动态表单页面,在页面上添加基础资料类型控件、多类别基础资料控件,在基础资料类型控件的基础资料类型上绑定供应商如下图1所示:
图1
3.2创建一个单据页面,在单据页面上添加基础资料类型控件、多类别基础资料控件,然后添加一个按钮,用于打开动态表单页面,通过插件接收从动态表单传过来的数据,如下图2所示:
图2
3.3编写动态表单插件类,将数据提交后传入到单据页面上,将下面代码绑定到动态表单的界面插件上。
public class ItemClassControlFormPlugin extends AbstractFormPlugin{ @Override public void registerListener(EventObject e) { // TODO Auto-generated method stub super.registerListener(e); this.addClickListeners("btnok"); } @Override public void click(EventObject evt) { // TODO Auto-generated method stub super.click(evt); Control con = (Control) evt.getSource(); if(StringUtils.equals(con.getKey(),"btnok")) { String type = (String) this.getModel().getValue("kdec_itemclasstypefield"); DynamicObject obj = (DynamicObject) this.getModel().getValue("kdec_itemclassfield"); HashMap<String, String> returnDate = new HashMap<>(); returnDate.put("basedata_type", type); if(obj!=null) { returnDate.put("basedata_pk", obj.getString("id")); } this.getView().returnDataToParent(returnDate); this.getView().close(); } } }
3.4编写单据界面上的插件类,通过插件类弹出动态表单界面,接收动态表单回传的数据,将下面的插件代码添加到单据页面的页面插件上。
public class PurchaseFormPlugin extends AbstractFormPlugin{ @Override public void registerListener(EventObject e) { // TODO Auto-generated method stub super.registerListener(e); this.addItemClickListeners("tbmain"); } @Override public void itemClick(ItemClickEvent evt) { // TODO Auto-generated method stub super.itemClick(evt); String key = evt.getItemKey(); if (StringUtil.equals("kdec_baritemap", key)) { this.showForm(); } } @Override public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) { // TODO Auto-generated method stub super.closedCallBack(closedCallBackEvent); if (StringUtils.equals(closedCallBackEvent.getActionId(), "itemdata_callback") && closedCallBackEvent.getReturnData() != null) { HashMap<String, String> returnDate =(HashMap<String, String>) closedCallBackEvent.getReturnData(); String type = returnDate.get("basedata_type"); String pk = returnDate.get("basedata_pk"); //类型 this.getModel().setValue("kdec_itemclasstypefield", type); this.getModel().setValue("kdec_itemclassfield", pk); } } public void showForm() { FormShowParameter param = new FormShowParameter(); param.setFormId("kdec_testbase"); param.getOpenStyle().setShowType(ShowType.Modal); param.setCloseCallBack(new CloseCallBack(this, "itemdata_callback")); this.getView().showForm(param); } }
3.5将单据切换到单据列表界面,在单据列表界面添加按钮,列表上添加基础资料类型、多类别基础资料名称字段,如下图3所示:
图3
3.6编写列表界面插件,通过插件接收动态表单传入的数据,将下面的插件类注册到单据列表插件中。
public class PurchaseListPlugin extends AbstractListPlugin { @Override public void registerListener(EventObject e) { // TODO Auto-generated method stub super.registerListener(e); this.addItemClickListeners("toolbarap"); } @Override public void itemClick(ItemClickEvent evt) { // TODO Auto-generated method stub super.itemClick(evt); String key = evt.getItemKey(); if (StringUtil.equals("kdec_baritemap", key)) { BillList billList = this.getControl("billlistap"); ListSelectedRowCollection selectedRows = billList.getSelectedRows(); if(selectedRows!=null&&selectedRows.size()>0) { this.showForm(); }else { this.getView().showTipNotification("请选择要填入供应商的数据!!"); } } } @Override public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) { // TODO Auto-generated method stub super.closedCallBack(closedCallBackEvent); if (StringUtils.equals(closedCallBackEvent.getActionId(), "itemdata_callback") && closedCallBackEvent.getReturnData() != null) { HashMap<String, String> returnDate =(HashMap<String, String>) closedCallBackEvent.getReturnData(); String type = returnDate.get("basedata_type"); String pk = returnDate.get("basedata_pk"); BillList billList = this.getView().getControl("billlistap"); ListSelectedRowCollection selectedRows = billList.getSelectedRows(); Object id = selectedRows.get(0).getPrimaryKeyValue(); DynamicObject obj = BusinessDataServiceHelper.loadSingle(id, "kdec_purcharebill"); //多类别基础资料类型 obj.set("kdec_itemclasstypefield", type); //多类别基础资料 obj.set("kdec_itemclassfield", pk); Object[] o = SaveServiceHelper.save(new DynamicObject[] {obj}); //如果用SaveServiceHelper.saveOperate,将pk换成BusinessDataServiceHelper.loadSingle(pk, type); if(o!=null&&o.length>0) { billList.refresh(); } } } public void showForm() { FormShowParameter param = new FormShowParameter(); param.setFormId("kdec_testbase"); param.getOpenStyle().setShowType(ShowType.Modal); param.setCloseCallBack(new CloseCallBack(this, "itemdata_callback")); this.getView().showForm(param); } }
四、效果图
4.1动态表单展示的效果图如下图4.1所示:
图4.1
4.2单据页面上添加按钮展示的效果图如下图4.2所示:
图4.2
4.3在单据列表界面上添加按钮后,点击打开的效果图如图4.3所示:
图4.3
五、开发环境版本
不限,本样例采用的轻量级环境,版本是: 苍穹版本号 COSMICV4.0.014.0 星瀚版本号 CONSTELLATIONV4.0.014.0
六、注意事项
编写插件类的时候一定要注意对应的标识,注意插件类注册的位置。
七、参考资料
参考附件中的代码补丁
元数据直接在开发平台导入
源代码直接在开发工具idea/eclipse中导入
多类别基础资料.zip(12.14KB)
推荐阅读