知识分享 - 在App层插件中如何给辅助属性字段赋值
金蝶云社区-JohnnyDing
JohnnyDing
11人赞赏了该文章 6406次浏览 未经作者许可,禁止转载编辑于2016年12月08日 11:17:43

背景说明

在操作插件、单据转换插件中,不能依赖view, model提供的方法给字段赋值,必须直接操作单据数据包。
维度关联字段(辅助属性、仓位、核算项目),单据数据包中,与基础资料字段非常类似,但是,赋值要复杂些。

本帖,以辅助属性字段为例,介绍如何直接操作单据数据包,给维度关联字段赋值。
同样适用于仓位、核算维度字段。

特别说明

不同的账套中,辅助属性启用的维度各不相同;
本示例代码,仅供参考,未实地验证

示例代码

//**********************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.App;
using Kingdee.BOS.App.Core;

namespace JDSample.ServicePlugIn.Operation
{
///


/// 在服务端插件中,给辅助属性字段赋值
///

///
/// 特别说明:
/// 不同的账套中,辅助属性启用的维度各不相同;
/// 本示例代码,仅供参考,未实地验证
///
[Description("在服务端插件中,给辅助属性字段赋值")]
public class S161208SetAuxPropOpPlug : AbstractOperationServicePlugIn
{
///
/// 开启事务,保存到数据库之前,触发此事件:通常用来对单据数据进行修订,以便随后保存进数据库
///

///
///
/// 本示例代码,演示在保存之前,先填写好辅助属性字段值
///
public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
{
int type = 1;
if (type == 1)
{// 已知辅助属性数据内码
long auxPropId = 100000;
this.Case1(e.DataEntitys, auxPropId);
}
else if (type == 2)
{// 已知辅助属性各维度值
Dictionary dctFlexItemIds = new Dictionary();
dctFlexItemIds.Add("FF100001", "005056a3024ca51d11e428fbd7c96188"); // 等级 = A等
dctFlexItemIds.Add("FF100002", "005056a3024ca51d11e428fc0a650bee"); // 产地 = JPN
this.Case2(e.DataEntitys, dctFlexItemIds);
}
}

///
/// 已知辅助属性数据内码
///

///
/// 辅助属性数据内码
private void Case1(DynamicObject[] billObjs, long auxPropId)
{
// 单据体元数据
Entity entity = this.BusinessInfo.GetEntity("FEntity");
// 辅助属性元数据:字段在单据体上
RelatedFlexGroupField fldAuxProp = this.BusinessInfo.GetField("FAuxPropId") as RelatedFlexGroupField;

foreach (var billObj in billObjs)
{
DynamicObjectCollection rows = entity.DynamicProperty.GetValue(billObj) as DynamicObjectCollection;

foreach (var row in rows)
{
// 根据辅助属性数据内码,加载辅助属性引用数据包(内含各维度数据)
IViewService viewService = ServiceHelper.GetService();
DynamicObject[] auxPropObjs = viewService.LoadFromCache(this.Context,
new object[] { auxPropId },
fldAuxProp.RefFormDynamicObjectType);

// 把辅助属性字段值,填写到单据体数据包中:Id与引用数据包,均必须填写
fldAuxProp.RefIDDynamicProperty.SetValue(row, auxPropId);
fldAuxProp.DynamicProperty.SetValue(row, auxPropObjs[0]);
}
}
}


///


/// 已知辅助属性各维度值
///

///
/// 各维度的值: key 为维度标识FF100001, value为基础资料内码
private void Case2(DynamicObject[] billObjs, Dictionary dctFlexItemIds)
{
// 单据体元数据
Entity entity = this.BusinessInfo.GetEntity("FEntity");
// 辅助属性元数据:字段在单据体上
RelatedFlexGroupField fldAuxProp = this.BusinessInfo.GetField("FAuxPropId") as RelatedFlexGroupField;

foreach (var billObj in billObjs)
{
DynamicObjectCollection rows = entity.DynamicProperty.GetValue(billObj) as DynamicObjectCollection;

foreach (var row in rows)
{
// 新建辅助属性数据包,用来存储各维度值
DynamicObject auxPropObj = new DynamicObject(fldAuxProp.RefFormDynamicObjectType);

// 把新建的辅助属性数据包,填写到单据体行上
fldAuxProp.RefIDDynamicProperty.SetValue(row, 0);
fldAuxProp.DynamicProperty.SetValue(row, auxPropObj);

// 填写各维度值:注意区分基础资料类型的维度,与普通文本类型的维度,赋值方式不同
foreach (var flexItem in dctFlexItemIds)
{
Field fldFlex = fldAuxProp.RelateFlexBusinessInfo.GetField(flexItem.Key);
if (fldFlex is BaseDataField)
{// 维度是基础资料类型
BaseDataField fldBDTypeFlex = fldFlex as BaseDataField;

IViewService viewService = ServiceHelper.GetService();
DynamicObject[] flexItemObjs = viewService.LoadFromCache(this.Context,
new object[] { flexItem.Value },
fldBDTypeFlex.RefFormDynamicObjectType);

fldBDTypeFlex.RefIDDynamicProperty.SetValue(auxPropObj, flexItem.Value);
fldBDTypeFlex.DynamicProperty.SetValue(auxPropObj, flexItemObjs[0]);
}
else
{// 维度是普通文本类型
fldFlex.DynamicProperty.SetValue(auxPropObj, flexItem.Value);
}
}
}
}

// 所有单据的辅助属性字段,维度值都已经填写完毕
// 开始调用弹性域服务,把辅助属性数据包,保存到数据库,自动产生数据内码,回填到单据数据包中
FlexSaveService flexSave = new FlexSaveService(this.Context, "Save");
flexSave.BatchSaveEntityFlexObject(this.BusinessInfo, entity, billObjs);
}
}
}