Search code examples
c#pluginsdynamics-crmrollup

Dynamics CRM Plugin - Refresh rollup on delete


I have a specific situation that I need to handle. I have a plugin that refreshes specific rollup field on invoice when invoice detail is created or updated. Now I need to refresh that field when invoice detail is deleted.


Analyzing this problem, I realized that I cannot refresh rollup field on pre operation because the invoice detail record is not deleted yet, and on post operation I cannot retrieve invoice Guid from that particular record because it is gone.

Here the piece of code that handles rollup refresh on create/update:

Entity invoiceDetail = service.Retrieve("invoicedetail", targetId, new ColumnSet(true));
Guid invoiceID = ((EntityReference)invoiceDetail["invoiceid"]).Id;
if (targetEntity.Attributes.Contains("extendedamount"))
{
    Entity myEntity = service.Retrieve("invoice", invoiceID, new ColumnSet(true));
    CalculateRollupFieldRequest rollupRequest = new CalculateRollupFieldRequest
    {
        Target = new EntityReference("invoice", invoiceID),
        FieldName = "detailamount"
    };
    CalculateRollupFieldResponse response = (CalculateRollupFieldResponse)service.Execute(rollupRequest);
    myEntity = response.Entity;
    service.Update(myEntity);
}

Do you have any suggestions? I am going mad over this and can't think of anything...


Solution

  • You can get guid on pre-event, and pass it to post-event - MSDN documentation

    sample code from MSDN:

    using System;
    
    // Microsoft Dynamics CRM namespace(s)
    using Microsoft.Xrm.Sdk;
    
    namespace Microsoft.Crm.Sdk.Samples
    {
        /// <summary>
        /// A plug-in that sends data to another plug-in through the SharedVariables
        /// property of IPluginExecutionContext.
        /// </summary>
        /// <remarks>Register the PreEventPlugin for a pre-operation stage and the 
        /// PostEventPlugin plug-in on a post-operation stage.
        /// </remarks>
        public class PreEventPlugin : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                // Obtain the execution context from the service provider.
                Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
                    serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
    
                // Create or retrieve some data that will be needed by the post event
                // plug-in. You could run a query, create an entity, or perform a calculation.
                //In this sample, the data to be passed to the post plug-in is
                // represented by a GUID.
                Guid contact = new Guid("{74882D5C-381A-4863-A5B9-B8604615C2D0}");
    
                // Pass the data to the post event plug-in in an execution context shared
                // variable named PrimaryContact.
                context.SharedVariables.Add("PrimaryContact", (Object)contact.ToString());
            }
        }
    
        public class PostEventPlugin : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                // Obtain the execution context from the service provider.
                Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
                    serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
    
                // Obtain the contact from the execution context shared variables.
                if (context.SharedVariables.Contains("PrimaryContact"))
                {
                    Guid contact =
                        new Guid((string)context.SharedVariables["PrimaryContact"]);
    
                    // Do something with the contact.
                }
            }
        }
    }