小技巧:如何在插件中实现自动下推并保存
金蝶云社区-云社区用户S6651234
云社区用户S6651234
23人赞赏了该文章 35145次浏览 未经作者许可,禁止转载编辑于2014年04月04日 10:18:10

看到有很多同学在问如何实现自动下推及保存,回答的比较零散,主题也不明显,干脆在这开个专贴,方便以后检索。

直接上示意代码,该代码中,this = 列表插件。示意代码没有测试过,仅用于说明过程,如有错误,反馈给我修正

[code]


// 获取源单与目标单直接的转换规则,如果规则未启用,则返回为空,注意容错
// 假设:上游单据FormId为sourceFormId,下游单据FormId为targetFormId
var rules = ConvertServiceHelper.GetConvertRules(this.View.Context, sourceFormId, targetFormId);
var rule = rules.FirstOrDefault(t => t.IsDefault);
// 获取在列表上当前选择需下推的行
ListSelectedRow[] selectedRows = ((IListView)this.View).SelectedRowsInfo.ToArray();

// 如下代码为单据上获取当前当前选择行
// string primaryKeyValue = ((IBillView)this.View).Model.GetPKValue().ToString();
// ListSelectedRow row = new ListSelectedRow(primaryKeyValue, string.Empty, 0, this.View.BillBusinessInfo.GetForm().Id);
// ListSelectedRow[] selectedRows = new ListSelectedRow[] { row };

// 调用下推服务,生成下游单据数据包
ConvertOperationResult operationResult = null;
Dictionary custParams = new Dictionary();
try
{
PushArgs pushArgs = new PushArgs(rule, selectedRows)
{
TargetBillTypeId = "" , // 请设定目标单据单据类型。如无单据类型,可以空字符
TargetOrgId = 0, // 请设定目标单据主业务组织。如无主业务组织,可以为0
CustomParams = custParams , // 可以传递额外附加的参数给单据转换插件,如无此需求,可以忽略
};
//执行下推操作,并获取下推结果
operationResult = ConvertServiceHelper.Push(this.View.Context, pushArgs, OperateOption.Create());
}
catch (KDExceptionValidate ex)
{
this.View.ShowErrMessage(ex.Message, ex.ValidateString);
return false;
}
catch (KDException ex)
{
this.View.ShowErrMessage(ex.Message);
return false;
}
catch
{
throw;
}
// 获取生成的目标单据数据包
DynamicObject[] objs = (from p in operationResult.TargetDataEntities
select p.DataEntity).ToArray();
// 读取目标单据元数据
var targetBillMeta = MetaDataServiceHelper.Load(this.View.Context, targetFormId) as FormMetadata;
OperateOption saveOption = OperateOption.Create();
// 忽略全部需要交互性质的提示,直接保存;
saveOption.SetIgnoreWarning(true); // 提交数据库保存,并获取保存结果
var saveResult = BusinessDataServiceHelper.Save(this.View.Context,targetBillMeta.BusinessInfo, objs, saveOption, "Save");
// 根据保存结果,显示对应的提示
// TODO: 略,请自行查看saveResult对象的结构,利用this.View.ShowMessage之类函数,显示结果..

[/code]