Atualizando Campos de Acúmulo em Tempo Real

3 minutos para ler

Os campos de acúmulo, introduzidos no Dynamics CRM 2015, permitem a visualização de um valor agregado a partir de registros relacionados. Por exemplo, é possível exibir a soma do valor das oportunidades de negócio abertas para um cliente, em seu cadastro.

Entretanto, a atualização destes campos não é imediata. O Dynamics CRM atualiza os valores de tempo em tempo, mas em alguns casos é necessário uma contagem em tempo real.

Para isso podemos usar uma função que realiza o “refresh” do campo de acúmulo, forçando o cálculo imediatamente. Apesar de ser via código (plugin), a solução ainda é mais simples do que desenvolver um plugin para o cálculo e a lógica de negócio de acúmulo pode ser parametrizada pela interface do Dynamics CRM.

Apresentamos abaixo um exemplo da função de atualização:

//Captura o contexto da execução

IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

//Gera o objeto service, utilizado para realizar requisições de create, update, delete, retrieve, etc…

IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

service = serviceFactory.CreateOrganizationService(context.UserId);

OrganizationServiceContext orgContext = new OrganizationServiceContext(service);

if (!context.InputParameters.Contains(“Target”))
return;

//Se for Create

if (context.MessageName.ToLower() == “create”) {

//Pega o contexto

Entity entity = (Entity)context.InputParameters[“Target”];

//chama o metodo do Update.

UpdateRollupField(entity);

}

//Se for Update

else if (context.MessageName.ToLower() == “update”) {

Entity entity = (Entity)context.InputParameters[“Target”];

entity = service.Retrieve(entity.LogicalName, entity.Id, new ColumnSet(true));

UpdateRollupField(entity);

}

//Se for Delete

else if (context.MessageName.ToLower() == “delete”) {

//Nesse caso é necessário pegar a preImage do Registro

if (!context.PreEntityImages.Contains(“preIMG”))

return;

Entity img = (Entity)context.PreEntityImages[“preIMG”];

UpdateRollupField(img);

}

//Método para dar update

private void UpdateRollupField(Entity entity)

{

Guid equipeId = new Guid();

Entity equipe = new Entity();

//verifica se o lookup da entidade de contexto está preenchido

if (!entity.Attributes.Contains(“smart_participanteid”))

return;

//pega o ID do lookup

equipeId = ((EntityReference)entity.Attributes[“smart_participanteid”]).Id;

//Metodo para dar update no primeiro campo acumulado

CalculateRollupFieldRequest crfr = new CalculateRollupFieldRequest {

//Seleciona a Entidade (“TARGET”, idRegistroqueSeráAtualizado)

Target = new EntityReference(“contact”, equipeId),

//Seleciona o Logical Name do Campo que será Atualizado.

FieldName = “smart_qtd_avaliacoes”

};

//Service.Execute(nome do metodo de atualização

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

//Caso seja mais de um campo deverá ser feito um método para cada um dos campos

CalculateRollupFieldRequest crfr2 = new CalculateRollupFieldRequest {

Target = new EntityReference(“contact”, equipeId),

FieldName = “smart_somatoriaavaliacoes”

};

CalculateRollupFieldResponse response2 = (CalculateRollupFieldResponse)service.Execute(crfr2);

Share and Enjoy !
Posts relacionados

Deixe um comentário