如何对多选基础资料字段进行取值和赋值原创
金蝶云社区-聚宝彭
聚宝彭
24人赞赏了该文章 7523次浏览 未经作者许可,禁止转载编辑于2022年04月15日 18:38:04

关键词:多选基础资料


一、需求

1. 对前端页面上的多选基础资料字段 取值 & 赋值

2. 后台创建一条含多选基础资料字段的单据, 并赋值, 然后存入数据表中

3. 后台查询一条单据数据, 并获取其中多选基础资料字段的值


二、思路与方案

平台提供的多选基础资料字段可实现业务单据数据与基础资料数据之间多对多的关系,配置多选基础资料字段的业务属性“表名”(以下简称:中间表)即可将业务单据(表名:tk_kdec_demobill)与币别(表名:T_BD_Currency)进行关联。通过分析中间表的表结构可知:该中间表只含有 3 个字段(FPKID、FId、FBasedataId),且 FPKID 为该中间表的主键ID,FId 为业务单据数据的主键ID,FBasedataId 为关联基础资料数据的主键ID。所以,在获取多选基础资料字段的值之后得到一个 DynamicObjectCollection,再对其进行遍历,并通过 fbasedataid 才可获取每条基础资料的详情数据。同理反之,在后台针对多选基础资料赋值,先要new一个中间表的对象集合,并将基础资料数据(以币别为例)添加到其中,最后将该集合赋值到多选基础资料字段即可。


三、实现过程

1. 新建业务单据,并放置一个多选基础资料字段,其类型绑定币别,设计器界面如下图所示。

设计器界面.png


2. 给前端页面上的多选基础资料字段赋值。

	/**
	 * 利用表单数据模型, 给前端页面上的多选基础资料字段赋值: 需要传入DynamicObjectCollection或者主键集合Object[]
	 * 在表单插件中,推荐此方案
	 */
	private void setMulBasedataFieldVal1() {
		// 获取待赋值的币别数据
		DynamicObject [] currencyArr = this.getMulbaseDatas();
		
		// 方案1: 传入DynamicObjectCollection
		DynamicObjectCollection currencyColl = new DynamicObjectCollection();
		Collections.addAll(currencyColl, currencyArr);
//		getModel().setValue(KEY_MULBASEDATA, currencyColl);
				
		// 方案2: 传入主键集合Object[]
		Object [] currencyIds = new Object [currencyArr.length];
		for (int i = 0; i < currencyArr.length; i++) {
			currencyIds [i] = currencyArr[i].getPkValue();
		}
		getModel().setValue(KEY_MULBASEDATA, currencyIds);
	}


3. 后台新建单据, 并给其中的多选基础资料字段赋值。

	/**
	 * 后台新建单据, 并给其中的多选基础资料字段赋值
	 * 本方案适合在无界面交互场景(如: 操作插件、工作流插件等)中使用
	 */
	private void setMulBasedataFieldVal2() {
		// 后台创建一个指定单据的实体对象
		String entityName = "kdec_demobill";
		DynamicObject billObj = BusinessDataServiceHelper.newDynamicObject(entityName);
		// 请注意修改单据编号!
		billObj.set("billno", "demo-1111-001");
		billObj.set("billstatus", "A");
		billObj.set("creator", UserServiceHelper.getCurrentUserId());
		billObj.set("createtime", new Date().getTime());
		
		// 获取多选基础资料的值(此时为空)
		DynamicObjectCollection currencyColl = billObj.getDynamicObjectCollection(KEY_MULBASEDATA);
		// 获取待赋值的币别数据
		DynamicObject [] currencyArr = this.getMulbaseDatas();
		
		// 方案一(简单, 推荐)
		for (DynamicObject currency : currencyArr) {
			DynamicObject newCurrency = new DynamicObject(currencyColl.getDynamicObjectType());
			newCurrency.set("fbasedataId", currency);
			currencyColl.add(newCurrency);
		}
		// 多选基础资料字段赋值
		billObj.set(KEY_MULBASEDATA, currencyColl);
		
		// 方案二: 利用属性对象, 操作单据数据包, 给多选基础资料字段赋值
//		// 获取指定单据的主实体模型
//		MainEntityType mainEntityType = MetadataServiceHelper.getDataEntityType(entityName);
////		MainEntityType mainEntityType = getModel().getDataEntityType();
//		// 获取多选基础资料字段的属性对象
//		MulBasedataProp mulBasedataProp = (MulBasedataProp) mainEntityType.findProperty(KEY_MULBASEDATA);
//		// 下级子实体:集合元素对应的实体对象, 其下包含了普通基础资料属性对象
//		DynamicObjectType subEntityType = mulBasedataProp.getDynamicCollectionItemPropertyType();
//		// 基础资料: 存储每条基础资料的数据包, 属性名是常量(fbasedataId)
//		BasedataProp basedataProp = (BasedataProp) subEntityType.getProperties().get("fbasedataId");
//		// 给多选基础资料集合(currencyColl)添加新行, 在新行上填写基础资料
//		for (DynamicObject currency : currencyArr) {
//			DynamicObject newCurrency = new DynamicObject(subEntityType);
//			basedataProp.setValue(newCurrency, currency);
//			currencyColl.add(newCurrency);
//		}
		
		// 保存
		OperationResult result = SaveServiceHelper.saveOperate(entityName, new DynamicObject [] {billObj}, OperateOption.create());
		logger.info(">>> 新单据的主键ID: " + result.getSuccessPkIds() + " <<<");
	}


4. 获取前端页面上多选基础资料字段的值。

	/**
	 * 获取前端页面上多选基础资料字段的值
	 * 利用表单数据模型, 获取多选基础资料字段的值
	 * 在表单插件中,推荐此方案
	 */
	private void getMulBasedataFieldVal1() {
		// 获取单据头中多选基础资料字段的值, DynamicObjectCollection类型
		DynamicObjectCollection coll = (DynamicObjectCollection) getModel().getValue(KEY_MULBASEDATA);
		StringBuffer logBuffer = new StringBuffer("字段( " + KEY_MULBASEDATA + " )的值为: ");
		for (DynamicObject obj : coll) {
			DynamicObject basedataObj = (DynamicObject) obj.getDynamicObject("fbasedataid");
			Long basedataId = (Long) basedataObj.getPkValue();
			logBuffer.append(basedataObj.get("name")).append("( " + basedataId + " ), ");
		}
		logger.info(logBuffer.toString());
		getView().showMessage(logBuffer.toString());
	}


5. 后台获取指定业务单据数据中多选基础资料字段的值。

	/**
	 * 后台获取指定业务单据数据中多选基础资料字段的值
	 * 本方案适合在无界面交互场景(如: 操作插件、工作流插件等)中使用
	 */
	private void getMulBasedataFieldVal2() {
		// 查询指定业务单据数据
		QFilter filter = new QFilter("billno", QCP.equals, "demo-1111-001");
		String selectProperties = "id, billno, kdec_mulbasedata";
		DynamicObject [] billObjArr = BusinessDataServiceHelper.load(KEY_BILL, selectProperties, filter.toArray());
		if (billObjArr != null && billObjArr.length > 0) {
			StringBuffer logBuffer = new StringBuffer("字段( " + KEY_MULBASEDATA + " )的值为: ");
			// 获取单据头中多选基础资料字段的值
			// 方案一(简单, 推荐)
			DynamicObjectCollection coll = billObjArr[0].getDynamicObjectCollection(KEY_MULBASEDATA);
			for (DynamicObject obj : coll) {
				DynamicObject basedataObj = (DynamicObject) obj.getDynamicObject("fbasedataid");
				Long basedataId = (Long) basedataObj.getPkValue();
				logBuffer.append(basedataObj.get("name")).append("( " + basedataId + " ), ");
			}
			
			// 方案二: 利用属性对象, 直接操作单据数据包取值
//			// 获取指定单据的主实体模型
//			String entityName = KEY_BILL;
//			MainEntityType mainEntityType = MetadataServiceHelper.getDataEntityType(entityName);
////			MainEntityType mainEntityType = getModel().getDataEntityType();
//			// 获取多选基础资料字段的属性对象
//			MulBasedataProp mulBasedataProp = (MulBasedataProp) mainEntityType.findProperty(KEY_MULBASEDATA);
//			// 下级子实体:集合元素对应的实体对象, 其下包含了普通基础资料属性对象
//			DynamicObjectType subEntityType = mulBasedataProp.getDynamicCollectionItemPropertyType();
//			// 基础资料: 存储每条基础资料的数据包, 属性名是常量(fbasedataId)
//			BasedataProp basedataProp = (BasedataProp) subEntityType.getProperties().get("fbasedataId");
//
//			// 获取多选基础资料字段值:DynamicObjectCollection 类型
//			DynamicObjectCollection collection = (DynamicObjectCollection) mulBasedataProp.getValue(billObjArr[0]);
//			// 逐条取基础资料及其主键
//			for (DynamicObject row : collection) {
//				DynamicObject basedataObj = (DynamicObject) basedataProp.getValue(row);
//				Long basedataId = (Long) basedataObj.getPkValue();
//				logBuffer.append(basedataObj.get("name")).append("( " + basedataId + " ), ");
//			}
			
			logger.info(logBuffer.toString());
		}
	}


四、效果图

1. 给前端页面上的多选基础资料字段赋值。

给前端页面上的多选基础资料字段赋值.png


2. 后台新建单据, 并给其中的多选基础资料字段赋值。

后台新建单据并给其中的多选基础资料字段赋值-1.png


后台新建单据并给其中的多选基础资料字段赋值-2.png


3. 获取前端页面上多选基础资料字段的值。

获取前端页面上多选基础资料字段的值.png


4. 后台获取指定业务单据数据中多选基础资料字段的值。

后台获取指定业务单据数据中多选基础资料字段的值.png


五、开发环境版本

不限


六、注意事项

如果需要把多选基础资料字段的值存储到数据库,则需要创建一个子表,在子表上增加一个字段存储基础资料主键,即:配置多选基础资料字段的“表名”属性即可。


七、参考资料

开发平台

学习成长中心

控件使用指南——多选基础资料字段

通过代码查出基础资料并赋值到多选基础资料字段保存



赞 24