本文档描述了一个在单据A新增/编辑界面直接打开单据B(采购申请单)列表界面选择数据并自动赋值到单据A字段的功能实现。提出了两种方案:一是通过新建基础资料控件选择子页面数据,但需解决缓存同步问题;二是改用文本控件点击事件触发子页面列表,用户选择后通过程序赋值。详细说明了实现过程的步骤和代码示例,包括新建父单据页面、设置文本控件、添加点击事件监听和回写数据。最后提及了开发环境版本不限、方案选择注意事项及参考资料。
关键词:文本
一、需求
在单据A(以页面 文本控件样例1-选择单据列表数据/kdec_textedit_demo1,以下简称父页面 为例)的新增/编辑界面直接打开单据B(采购申请单/kdec_template_purapply,以下简称子页面)的列表界面,选择数据之后,自动赋值到单据A的相应字段上。
二、思路与方案
通常,我们要在父页面上的某字段去选择子页面的业务数据,其中一种方案是:新建一个空白基础资料,其数据存储用的表名,以及其上字段的字段标识、字段名与子页面单据上的全部保持一致,从而达到此基础资料页面与子页面一一对应的效果。然后,在父页面上放置基础资料控件去选择基础资料页面的数据。因为基础资料页面与子页面共用的一个表,所以可实现用户在父页面上选择子页面的业务数据。但该方案有个问题:考虑到平台里面的基础资料数据都是有缓存的,而且请求都是先从缓存中取值。如果用户修改了子页面的数据,其实是没有同步修改基础资料页面的缓存,所以用户在选择子页面业务数据的时候有可能选择还是修改前的旧数据。
为了解决这个问题,我们可以在修改子页面数据的时候同步去清理基础资料页面的缓存即可。但这里我们再推荐一个二开方案。
在父页面上,我们不通过基础资料控件来选择子页面的数据,改用文本控件来实现。响应文本控件的点击事件,用代码打开子页面的列表界面,用户选择数据后,用程序将其选择的值赋到父页面上的相应字段。
三、实现过程
1. 新建父单据页面,并放置一文本控件(采购申请单单号),将其业务属性“编辑风格”改为:按钮点击编辑。其设计器界面如下图所示。
注意:
① 点击采购申请单单号字段后选择 采购订货案例 中采购申请单(子页面)的业务数据,并将其申请人 & 申请日期字段值携带至父页面上。
② 父页面上的申请人、申请日期字段类型需和子页面上同字段的字段类型保持一致。
图 1
图 2
2. 响应采购申请单单号的点击事件,并弹出子页面的列表界面。用户选择数据后,在父页面上的 closedCallBack 事件中去获取被选择的数据,并赋值到父页面上的相应字段。
注意:
该插件注册在父页面上。
@Override public void registerListener(EventObject e) { super.registerListener(e); // 对采购申请单单号字段(文本控件)添加点击监听 TextEdit textEdit = getControl("kdec_purapply"); textEdit.addClickListener(this); } @Override public void click(EventObject evt) { Control control = (Control) evt.getSource(); String key = control.getKey(); // 点击采购申请单单号字段,打开采购申请单的单据列表界面 if (StringUtils.equalsIgnoreCase("kdec_purapply", key)) { ListShowParameter parameter = ShowFormHelper.createShowListForm("kdec_template_purapply", false); parameter.setCloseCallBack(new CloseCallBack(this, "purapply")); getView().showForm(parameter); } super.click(evt); } @Override public void closedCallBack(ClosedCallBackEvent evt) { String key = evt.getActionId(); Object returnData = evt.getReturnData(); // 将选择的采购申请单数据回写至样例单据上的相应字段 if (StringUtils.equalsIgnoreCase("purapply", key) && returnData != null) { ListSelectedRow row = ((ListSelectedRowCollection) returnData).get(0); DynamicObject billObj = BusinessDataServiceHelper.loadSingle(row.getPrimaryKeyValue(), "kdec_template_purapply"); getModel().setValue("kdec_purapply", row.getBillNo()); getModel().setValue("kdec_applicant", billObj.get("kdec_applier")); getModel().setValue("kdec_applydate", billObj.get("kdec_applydate")); } super.closedCallBack(evt); }
四、效果图
图 3
五、开发环境版本
不限
六、注意事项
1. 方案通过基础资料控件和通过文本控件去选择子页面的业务数据,皆可实现本样例需求,各有优劣,各位小伙伴请自行取舍。
2. 若通过文本控件去选择子页面的业务数据,且无需在父页面A上冗余存储子页面B的数据,可不设置单据A上的相关字段的“字段名”属性(即:本例中的“申请人”& “申请日期”字段)。
七、参考资料
某单据上的文本字段选择其它业务单据列表中的数据.rar(9.31KB)
推荐阅读