Dynamics CRM + 插件代码,用于计算跨记录的字段总和并在另一条记录中更新
Dynamics CRM + Plugin Code to Calculate Sum of fields across records and update in the another record
我有以下要求在实体的插件代码中实现说 'Entity A'-
下面是'Entity A'
中的数据
带字段值的记录 1
- 价格=100
- 数量 = 4
带字段值的记录 2
- 价格=200
- 数量 = 2
我需要添加字段的值并在新记录中更新它。示例如下 -
记录 3
- 价格=100+200=300
- 数量 = 4 + 2 = 6
实体 A 有一个名为“执行添加”的按钮,单击后将触发插件代码。
我需要一些 ideas/pseudocode 来了解如何实现它。上面解释的例子只是我的实体的一个简单版本。在 Real 中,实体上有 60 多个字段,对于每个字段,我需要在第三个字段中执行求和和更新。另外,要执行加法的记录数可以超过 2。
因此记录数越多,我将不得不遍历每条记录并执行求和,我想知道是否有更简单更好的方法来编写此逻辑。
只需要有关如何编写逻辑的指导。
任何帮助将不胜感激。
解决方案:
尝试了下面的代码,它按照答案的建议工作 -
AttributeList 是我需要对其执行求和的字段列表。所有字段都是小数
Entity EntityA = new EntityA();
EntityA.Id = new Guid({"Guid String"});
var sourceEntityDataList = service.RetrieveMultiple(new FetchExpression(fetchXml)).Entities;
foreach (var value in AttributeList)
{
EntityA[value]= sourceEntityDataList.Sum(e => e.Contains(value) ? e.GetAttributeValue<Decimal>(value) : 0);
}
service.Update(EntityA);
我最近为客户做了类似的事情。我们研究了使用汇总字段,但他们希望在 12 小时内更快得到结果。
包含我们求和的值的记录是子记录,包含结果的记录是父记录。
它的工作方式是:
- 从插件的目标实体中获取父 ID。
- 检索父项。
- 检索其子项(通过 LINQ、FetchXML 或 QueryExpression)。
- 对子项的值求和。由于你有很多字段要求和,你可以创建一个字段名称列表,然后使用这样的方法(假设它们都是
Money
个字段)
private decimal sum(string field) => Records.Sum(b => b.GetAttributeValue<Money>(field)?.Value ?? 0);
如果字段是不同的类型,您还可以创建不同的 sum
方法,例如 sumMoney
、sumInt
等。然后您需要按类型分隔字段并将它们传递给相应的方法.
- 在父
Entity
上填充结果。
- 更新 Dynamics 中的父记录。
如果信息不是那么时间敏感,可以查看开箱即用的汇总字段。
我有以下要求在实体的插件代码中实现说 'Entity A'-
下面是'Entity A'
中的数据带字段值的记录 1
- 价格=100
- 数量 = 4
带字段值的记录 2
- 价格=200
- 数量 = 2
我需要添加字段的值并在新记录中更新它。示例如下 -
记录 3
- 价格=100+200=300
- 数量 = 4 + 2 = 6
实体 A 有一个名为“执行添加”的按钮,单击后将触发插件代码。
我需要一些 ideas/pseudocode 来了解如何实现它。上面解释的例子只是我的实体的一个简单版本。在 Real 中,实体上有 60 多个字段,对于每个字段,我需要在第三个字段中执行求和和更新。另外,要执行加法的记录数可以超过 2。
因此记录数越多,我将不得不遍历每条记录并执行求和,我想知道是否有更简单更好的方法来编写此逻辑。
只需要有关如何编写逻辑的指导。 任何帮助将不胜感激。
解决方案:
尝试了下面的代码,它按照答案的建议工作 -
AttributeList 是我需要对其执行求和的字段列表。所有字段都是小数
Entity EntityA = new EntityA();
EntityA.Id = new Guid({"Guid String"});
var sourceEntityDataList = service.RetrieveMultiple(new FetchExpression(fetchXml)).Entities;
foreach (var value in AttributeList)
{
EntityA[value]= sourceEntityDataList.Sum(e => e.Contains(value) ? e.GetAttributeValue<Decimal>(value) : 0);
}
service.Update(EntityA);
我最近为客户做了类似的事情。我们研究了使用汇总字段,但他们希望在 12 小时内更快得到结果。
包含我们求和的值的记录是子记录,包含结果的记录是父记录。
它的工作方式是:
- 从插件的目标实体中获取父 ID。
- 检索父项。
- 检索其子项(通过 LINQ、FetchXML 或 QueryExpression)。
- 对子项的值求和。由于你有很多字段要求和,你可以创建一个字段名称列表,然后使用这样的方法(假设它们都是
Money
个字段)
private decimal sum(string field) => Records.Sum(b => b.GetAttributeValue<Money>(field)?.Value ?? 0);
如果字段是不同的类型,您还可以创建不同的sum
方法,例如sumMoney
、sumInt
等。然后您需要按类型分隔字段并将它们传递给相应的方法. - 在父
Entity
上填充结果。 - 更新 Dynamics 中的父记录。
如果信息不是那么时间敏感,可以查看开箱即用的汇总字段。