CRM插件:将一个字段的值计算为其他两个字段之间的差额

时间:2018-07-13 13:34:39

标签: c# plugins dynamics-crm

我有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;
            }
        }
    }
}

2 个答案:

答案 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值,以便您将获取所有未更新的字段以在插件中进行计算。