开发案例分享-单据转换之多单据体转换
一、问题描述:
如下图,标准系统仅支持一个单据体的字段映射,配置多个单据体映射保存时报错
二、解决方法:可通过单据转换插件进行处理
2.1、插件代码如下:
using System.Collections.Generic;
using System.ComponentModel;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.App;
namespace Dave.ConvertDemo.ServicePlugIn
{
/// <summary>
/// 按顺序输出单据转换-下推过程的插件事件
/// </summary>
[Kingdee.BOS.Util.HotUpdate]
[Description("多单据体单据转换插件")]
public class MulEntity : AbstractConvertPlugIn
{
//// <summary>
/// 主单据体的字段携带完毕,与源单的关联关系创建好之后,触发此事件
/// </summary>
/// <param name="e"></param>
public override void OnAfterCreateLink(CreateLinkEventArgs e)
{
// 预先获取一些必要的元数据,后续代码要用到:
// 源单第二单据体
Entity srcSecondEntity = e.SourceBusinessInfo.GetEntity("F_QYGN_Entity");
// 目标单第一单据体
Entity mainEntity = e.TargetBusinessInfo.GetEntity("FEntity");
// 目标单第二单据体
Entity secondEntity = e.TargetBusinessInfo.GetEntity("F_QYGN_Entity");
// 目标单关联子单据体
Entity linkEntity = null;
Form form = e.TargetBusinessInfo.GetForm();
if (form.LinkSet != null
&& form.LinkSet.LinkEntitys != null
&& form.LinkSet.LinkEntitys.Count != 0)
{
linkEntity = e.TargetBusinessInfo.GetEntity(
form.LinkSet.LinkEntitys[0].Key);
}
if (linkEntity == null)
{
return;
}
// 获取生成的全部下游单据
ExtendedDataEntity[] billDataEntitys = e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");
// 对下游单据,逐张单据进行处理
foreach (var item in billDataEntitys)
{
DynamicObject dataObject = item.DataEntity;
// 定义一个集合,用于收集本单对应的源单内码
HashSet<long> srcBillIds = new HashSet<long>();
// 开始到主单据体中,读取关联的源单内码
DynamicObjectCollection mainEntryRows =
mainEntity.DynamicProperty.GetValue(dataObject) as DynamicObjectCollection;
foreach (var mainEntityRow in mainEntryRows)
{
DynamicObjectCollection linkRows =
linkEntity.DynamicProperty.GetValue(mainEntityRow) as DynamicObjectCollection;
foreach (var linkRow in linkRows)
{
long srcBillId = Convert.ToInt64(linkRow["SBillId"]);
if (srcBillId != 0
&& srcBillIds.Contains(srcBillId) == false)
{
srcBillIds.Add(srcBillId);
}
}
}
if (srcBillIds.Count == 0)
{
continue;
}
// 开始加载源单第二单据体上的字段
// 确定需要加载的源单字段(仅加载需要携带的字段)
List<SelectorItemInfo> selector = new List<SelectorItemInfo>();
selector.Add(new SelectorItemInfo("F_QYGN_TestText"));
selector.Add(new SelectorItemInfo("F_QYGN_TestDecimal"));
selector.Add(new SelectorItemInfo("F_QYGN_TestDepartment"));
// TODO: 继续添加其他需要携带的字段,示例代码略
// 设置过滤条件
string filter = string.Format(" {0} IN ({1}) ",
e.SourceBusinessInfo.GetForm().PkFieldName,
string.Join(",", srcBillIds));
OQLFilter filterObj = OQLFilter.CreateHeadEntityFilter(filter);
// 读取源单
IViewService viewService = ServiceHelper.GetService<IViewService>();
var srcBillObjs = viewService.Load(this.Context,
e.SourceBusinessInfo.GetForm().Id,
selector,
filterObj);
// 开始把源单单据体数据,填写到目标单上
DynamicObjectCollection secondEntryRows =
secondEntity.DynamicProperty.GetValue(dataObject) as DynamicObjectCollection;
secondEntryRows.Clear(); // 删除空行
foreach (var srcBillObj in srcBillObjs)
{
DynamicObjectCollection srcEntryRows =
srcSecondEntity.DynamicProperty.GetValue(srcBillObj) as DynamicObjectCollection;
int i = 1;
foreach (var srcEntryRow in srcEntryRows)
{
// 目标单添加新行,并接受源单字段值
DynamicObject newRow = new DynamicObject(secondEntity.DynamicObjectType);
secondEntryRows.Add(newRow);
// 填写字段值
//序号
newRow["Seq"] = i;
//测试文本
newRow["F_QYGN_TestText"] = srcEntryRow["F_QYGN_TestText"];
//测试小数
newRow["F_QYGN_TestDepartment"] = srcEntryRow["F_QYGN_TestDepartment"];
//测试部门
newRow["F_QYGN_TestDecimal"] = srcEntryRow["F_QYGN_TestDecimal"];
i++;
}
}
}
}
}
}
2.2、将插件注册到单据转换中:
2.3、启用单据转换规则:
2.4、实现效果:
楼主能否提供python代码,谢谢。
销售合同到销售订单报错:寻找实体上abc_Cust_ZLBZEntity对应的属性描述符失败,实体不存在此属性![EntityType:CRM_Contract Propeyties:Id FFormId BOS_ConvertTakeDataInfo ]
能否帮忙看下@Dave
是这一句报的:
以下是源单第二单据体:
C# 试过了,python HashSet 这个报错
发货通知单到销售出库单,按照上面的代码写的,抛出一个异常,能不能帮看一下@Dave
您好,我复制这个插件代码 保存时提示语法错误,这个怎么解决?
Dave ,如果在表头 中增加页签及单据体,这块如何携带呢,还请指点,如何修改代码,谢谢!
Dave 你好,单据体 放在表头中,进行携带到下游单据体中,如何实现,代码改那个地方呢,能指点一下吗。
非常感谢,修改后成功。
只是有点小问题,转换后的目标单据的第二单据体的很多空白行(行数和数据行数相同)
顾问:示例中的 获取每行关联表中的源字段是指哪个表的哪个字段?
如何查找?
示例代码报错(我换了几个LK表的源单据内码字段都报错)
谢谢大神 重新编辑,学习一下
开发案例分享-单据转换之多单据体转换
本文2024-09-16 17:23:41发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-15432.html
- 鼎捷EAI整合規範文件V3.1.07 (集團).pdf
- 鼎捷OpenAPI應用場景說明_基礎資料.pdf
- 鼎捷OpenAPI應用場景說明_財務管理.pdf
- 鼎捷T100 API設計器使用手冊T100 APIDesigner(V1.0).docx
- 鼎新e-GoB2雲端ERP B2 線上課程E6-2應付票據整批郵寄 領取.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A4使用者建立權限設定.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程C3會計開帳與會計傳票.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程E6-1應付票據.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A5-1進銷存參數設定(初階篇).pdf
- 鼎新e-GoB2雲端ERP B2 線上課程D2帳款開帳與票據開帳.pdf