二开案例.服务插件.操作事务内修改并保存单据的多选基础资料数据

【应用场景】单据执行操作时,在该操作的事务内修改单据的多选基础资料数据。
【案例演示】采购订单,新增多选基础资料字段,提交单据时,在服务插件中修改单据的多选基础资料数据并保存到数据库。

【实现步骤】
<1>编写服务插件,代码如下。
using Kingdee.BOS;
using Kingdee.BOS.App.Core;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace Jac.XkDemo.BOS.App.PlugIn
{
/// <summary>
/// 【服务插件】操作事务内修改并保存单据的多选基础资料数据
/// </summary>
[Description("【服务插件】操作事务内修改单据的多选基础资料数据"), HotUpdate]
public class SetMulBaseDataFieldValueInTransactionOperationServicePlugIn : AbstractOperationServicePlugIn
{
/// <summary>
/// 加载指定字段到实体数据包里
/// 1.在列表上执行操作时,单据的字段并没有被完全加载。 如果操作插件用到了未被加载的字段,一定会中断。
/// 2.本事件允许插件,强制要求加载某些字段,避免中断
/// </summary>
/// <param name="e"></param>
public override void OnPreparePropertys(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
// 提前将要改的字段加入到当前操作的单据的数据包中
e.FieldKeys.Add("F_Jac_MulBase");
}
/// <summary>
/// 操作事物前事件(事务内触发)
/// </summary>
/// 1.此事件在操作校验之后
/// 2.此事件在操作事务开始之后
/// 3.此事件在操作执行代码之前
/// 4.此事件中的数据库处理,受操作的事务保护
/// 5.通常此事件,可以用来做数据准备,在操作之前,提前写数据到库
/// <param name="e"></param>
public override void BeginOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeginOperationTransactionArgs e)
{
base.BeginOperationTransaction(e);
// 保存8提交9审核1反审核26
if (this.FormOperation.OperationId == 9 || this.FormOperation.OperationId == 1)
{
//SetMulBaseDataFieldValue(e.DataEntitys);
}
}
/// <summary>
/// 操作事物后事件(事务内触发)
/// </summary>
/// <param name="e"></param>
/// <remarks>
/// 1. 此事件在操作执行代码之后,操作的内部逻辑已经执行完毕
/// 2. 此事件在操作事务提交之前
/// 3. 此事件中的数据库处理,受操作的事务保护
/// 4. 通常此事件,可以用来做同步数据,如同步生成其他单据,而且需要受事务保护
/// </remarks>
public override void EndOperationTransaction(EndOperationTransactionArgs e)
{
base.EndOperationTransaction(e);
// 保存8提交9审核1反审核26
if (this.FormOperation.OperationId == 9 || this.FormOperation.OperationId == 1)
{
// 方式1
SetMulBaseDataFieldValue(e.DataEntitys);
// 方式2
//SetMulBaseDataFieldValue2(e.DataEntitys);
}
}
/// <summary>
/// 修改单据的多选基础资料数据
/// </summary>
/// <param name="dataEntitys"></param>
private void SetMulBaseDataFieldValue(DynamicObject[] dataEntitys)
{
// 获取多选基础资料字段
var field = this.BusinessInfo.GetField("F_Jac_MulBase") as MulBaseDataField;
if (field == null)
{
return;
}
// 使用基础资料内码进行赋值
var ids = new object[] { "100211", "100212" };
foreach (var dataEntity in dataEntitys)
{
DataObjectSetValue(this.Context, field, dataEntity, ids);
}
// 保存变更后的数据
new BusinessDataWriter(Context).Save(dataEntitys);
}
/// <summary>
/// 修改单据的多选基础资料数据(使用SQL直接修改)
/// </summary>
/// <param name="dataEntitys"></param>
private void SetMulBaseDataFieldValue2(DynamicObject[] dataEntitys)
{
// 使用基础资料内码进行赋值
var ids = new object[] { "100211", "100212" };
// 批量获取多个待插入数据的主键
var pkids = new SequenceReader(Context).GetSequence<long>("Jac_t_Cust_Entry100166", ids.Length * dataEntitys.Length).ToList();
var sqlList = new List<SqlObject>();
foreach (var dataEntity i
二开案例.服务插件.操作事务内修改并保存单据的多选基础资料数据
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



