Uno de los tipos de campo nuevos en CRM 2015 es el Rollup, que permite realizar cálculos básicos de manera sencilla y “disminuyendo” la cantidad de código que se necesita para estos.  El principal problema que nosotros encontramos, es que no se actualizan inmediatamente (se ejecuta un job cada cierto tiempo), aunque tienen un botón de refrescar si necesita ver el valor en un momento determinado.

field

Pero puede suceder que se necesite que este campo sea actualizado inmediatamente dada la regla de negocio (una entidad padre con un campo rollup, y necesita estar al día cada que un hijo es agregado o eliminado), y en este caso, hay que hacer algo de programación para que funcione.  Lo primero que hay que hacer es un proyecto con una actividad personalizada que herede de la clase CodeActivity.  Como parámetros de entrada se deben de tener la referencia a la entidad padre y el nombre del campo.

Input_parameters

Dentro del método Execute, se hace la invocación del request para el cálculo del campo y se ejecuta.  Inicialmente no me funcionó pero al agregar el método Update a la entidad padre, hizo que se disparara y se actualizara correctamente.

protected override void Execute(CodeActivityContext executionContext)
{
IWorkflowContext extension = executionContext.GetExtension<IWorkflowContext>();
IOrganizationService service = executionContext.GetExtension<IOrganizationServiceFactory>().CreateOrganizationService(new Guid?(extension.UserId));
this.m_tracingService = executionContext.GetExtension<ITracingService>();

EntityReference eventReference = this.Event.Get(executionContext);
string fieldName = this.FieldName.Get(executionContext);

CalculateRollupFieldRequest requestRollup = new CalculateRollupFieldRequest()
{
Target = eventReference,
FieldName = fieldName
};

CalculateRollupFieldResponse response = (CalculateRollupFieldResponse)service.Execute(requestRollup);

Entity EventInfo = service.Retrieve(eventReference.LogicalName, eventReference.Id, new ColumnSet(true));
service.Update(EventInfo);
}

Después de esto, simplemente hay que crear el workflow en CRM donde se invoque la actividad.  Es importante que la opción “Proceso bajo demanda (As an on-demand process)” esté activado, ¡Y listo!, el campo se actualizará automáticamente cada que los hijos cambien.  Cualquier duda al respecto, no duden en contactarme.