我有36个字段,按3行对齐,所以我有12行。对于每一行,我需要将field3
绘制为field1
-field2
之间的差。必须对每一行重复此操作。我的困难在于,我是CRM领域的新手,我找不到解决方案或指南。我附加了一个小模式和当前代码。此外,所有字段都具有不同的名称,方案应提出想法。我什至找不到类型,因为它们都具有相同的类型。
模式:
field1 field2 field3 = field1-field2
field4 field5 field6 = field4-field5
field7 field8 field9 = field7-field8
etc.
代码:
public class BudgetingOnChangeUpdateOffset : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.InputParameters.Contains("Target") &&
context.InputParameters["Target"] is Entity)
{
Entity entity = (Entity)context.InputParameters["Target"];
if (entity.LogicalName != "budgeting")
return;
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
try
{
var budget = (Money)entity.Attributes["budget"];
var consumptive = (Money)entity.Attributes["cons"];
var offset = budget.Value - consumptive.Value;
entity.Attributes["offset"] = offset;
service.Update(entity);
}
catch (Exception ex)
{
tracingService.Trace("MyPlugin: {0}", ex.ToString());
throw;
}
}
}
}
答案 0 :(得分:2)
一些想法:
(1)当插件在“更新”步骤上触发时,它将仅发送触发插件的字段。要获取其他字段,您可以通过您在插件步骤中配置的图片将其传递,也可以进行检索以获取所需的列。
在这里的代码中,似乎需要获取进行计算的字段的值。
如果您在Create上运行此插件,则可以将Post-image与所有字段一起使用,也可以执行单独的Retrieve操作来获取所有字段。 (创建步骤无法使用前映像,因为尚未在数据库中创建记录)
有关前置和后置图像的更多信息,请参见:
Utilising Pre/Post Entity Images in a Dynamics CRM Plugin
Pre image and Post image in Dynamics crm Plugins : Advanced Plugin concepts Part 1
(2)我喜欢先在控制台应用程序中构建和调试插件逻辑,然后再在插件中使用它。要将控制台应用程序连接到CRM,请使用XrmTooling NuGet package中的CrmServiceClient类的实例。
我通常处理此问题的方法是将所有逻辑放入共享项目中,该项目来自控制台应用程序和插件。但是,请注意,这种方法依赖于使用“检索”从目标实体而不是从“插件”中获取必要的数据。
(3)如果要直接将其开发为插件,则可能需要熟悉Tracing Service和plugin trace logs。
(4)超出了此答案的范围,但是您可能还想研究Dynamics 365中的“早期绑定”与“晚期绑定”开发的概念。This page中包含一些信息关于这个。
答案 1 :(得分:1)
看起来很简单。
1。在操作前阶段注册此插件步骤,删除行service.Update(entity);
。下面的代码行将负责计算两个字段之间的差异,并根据需要在同一执行管道(数据库更新)中将其放在第三个字段中。无需额外的更新呼叫。
var budget = (Money)entity.Attributes["budget"];
var consumptive = (Money)entity.Attributes["cons"];
var offset = budget.Value - consumptive.Value;
entity.Attributes["offset"] = offset;
var field4 = (Money)entity.Attributes["field4"];
var field5 = (Money)entity.Attributes["field5"];
var field6 = field4.Value - field5.Value;
entity.Attributes["field6"] = field6;
2。在插件步骤中仅将field1,field2,field4,field5选择为过滤属性-因此,插件仅在更新这些字段时触发,而不在所有字段上触发
就像Aron解释的那样,注册PreImage值,以便您将获取所有未更新的字段以在插件中进行计算。