Wednesday, 30 August 2017

Deactivate Child Records When Parent Record Gets Deactivated Using Plugin in CRM

In my earlier post I have already written about cascade deactivate records using plugin.But this article is for deactivating child records once parent record gets deactivated.

Here I have Account lookup field present on Event Entity form. Once account record gets deactivated then it should deactivate related event record.Below screenshot follows :



1. Below code I wrote :

public void Execute(IServiceProvider serviceProvider)
       {
           ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
           IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
           IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
           IOrganizationService service = factory.CreateOrganizationService(context.UserId);

           if (context.InputParameters.Contains("EntityMoniker") && context.InputParameters["EntityMoniker"] is EntityReference)
           {
               var entity = (EntityReference)context.InputParameters["EntityMoniker"];
               var state = (OptionSetValue)context.InputParameters["State"];
               var status = (OptionSetValue)context.InputParameters["Status"];

               if(state.Value==1)
               {
                   QueryExpression event= new QueryExpression { EntityName = "ags_event", ColumnSet = new ColumnSet(true) };
                   event.Criteria.AddCondition("ags_account", ConditionOperator.Equal, entity.Id);
                   event.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);
                   EntityCollection retrieveEvent = service.RetrieveMultiple(event);

                   if (retrieveEvent.Entities.Count > 0)
                   {
                       foreach (var a in retrieveEvent.Entities)
                       {
                           SetStateRequest request = new SetStateRequest();
                           request .EntityMoniker = new EntityReference(a.LogicalName, new Guid(a.Id.ToString()));
                           request .State = new OptionSetValue(1);
                           request .Status = new OptionSetValue(-1);
                           service.Execute(request );
                       }
                   }

               }
               if (state.Value == 0)
               {
                   QueryExpression event= new QueryExpression { EntityName = "ags_event", ColumnSet = new ColumnSet(true) };

                   event.Criteria.AddCondition("ags_account", ConditionOperator.Equal, entity.Id);
                   event.Criteria.AddCondition("statecode", ConditionOperator.Equal, 1);
                   EntityCollection retrieveEvent = service.RetrieveMultiple(event);


                   if (retrieveEvent.Entities.Count > 0)
                   {
                       foreach (var a in retrieveEvent.Entities)
                       {
                           SetStateRequest request = new SetStateRequest();
                           request .EntityMoniker = new EntityReference(a.LogicalName, new Guid(a.Id.ToString()));
                           request .State = new OptionSetValue(0);
                           request.Status = new OptionSetValue(-1);
                           service.Execute(request );
                       }
                   }
               }
           }
       }

2. Register the plugin With message SetStateDynamicEntity on Account Entity.


Below Screenshots You can see :


 
Hope it may helps !!



No comments:

Post a Comment