CRM 2013 – Execuções Múltiplas (Execute Multiple)

Pessoal,

Outra melhoria para o time de desenvolvimento que deu-se após o release Polaris no CRM 2011, foi a criação da classe “ExecuteMultipleRequest” que nos possibilita adicionarmos milhares de requisições com o WCF/Banco de Dados do CRM em um único objeto.

O resultado deste agrupamento de requisições é um ganho significativo na performance, mas eu também considero a possibilidade de “aceitarmos” erros nas transações como outro grande diferencial. Sim, podemos configurar para que caso existam erros não seja lançada uma exceção e as demais iterações irão ser executadas. Cabe a funcionalidades que estamos trabalhando determinar se precisaremos criar uma espécie de log ou simplesmente desconsiderarmos os erros transacionais.

Os lugares onde mais seria utilizado este recurso seriam em customizações que envolvem grande quantidade de iterações com o CRM, em pacotes ETL (SSIS) e principalmente no CRM Online para escalarmos nossas iterações (dividir para conquistar).

big-data

Bom, vamos ao termos mas técnicos e seu uso…

Precisamos de várias iterações ao sendo realizadas ao mesmo tempo, para isso, criei alguns objetos entities:

// Cria o objeto Entity com uma nova Account
Entity account1 = new Entity("account");
account1.Attributes.Add("name", "TESTE_1_" + DateTime.Now);

// Cria o objeto Entity com uma nova Account
Entity account2 = new Entity("account");
account2.Attributes.Add("name", "TESTE_2_" + DateTime.Now);

// Cria o objeto Entity com uma nova Account
Entity account3 = new Entity("account");
account3.Attributes.Add("nameXXXXX", "TESTE_3_" + DateTime.Now); // NOTEM QUE O ATRIBUTO "nameXXXXX" NÃO EXISTE NA ENTIDADE ACCOUNT, OU SEJA, CASO NÃO SEJA TRATADO TEREMOS UM EXCEÇÃO

Agora teremos que criar o objeto “ExecuteMultipleRequest”:

// Create an ExecuteMultipleRequest object.
ExecuteMultipleRequest requestMultiple = new ExecuteMultipleRequest()
{
 // Assign settings that define execution behavior: continue on error, return responses.
 Settings = new ExecuteMultipleSettings()
 {
 ContinueOnError = true, // ESTA PROPRIEDADE QUE PERMITE IGNORARMOS ERROS E CONTINUARMOS A EXECUTAR AS ITERAÇÕES
 ReturnResponses = false
 },
 // Create an empty organization request collection.
 Requests = new OrganizationRequestCollection()
};

 

Por fim, devemos adicionar as iterações no objeto de requisições múltiplas (requestMultiple), notem que estamos adicionando “CreateRequest” nos “Request’s”, isso deve-se a estarmos iterando “Create’s”, este objeto deve ser trocado para tipo diferente de iteração (Update, Delete, SetState, etc):

CreateRequest createRequest;

createRequest = new CreateRequest { Target = account1 };
requestMultiple.Requests.Add(createRequest);

createRequest = new CreateRequest { Target = account2 };
requestMultiple.Requests.Add(createRequest);

createRequest = new CreateRequest { Target = account3 };
requestMultiple.Requests.Add(createRequest);

// Realizar as Execuções Múltiplas
ExecuteMultipleResponse responseWithResults = (ExecuteMultipleResponse)localContext.OrganizationService.Execute(requestMultiple);

* Por já estarmos em uma requisição múltipla o método “ExecuteMultipleRequest” não é suportado.

 

O código completo é o a seguir:

// Create an ExecuteMultipleRequest object.
 ExecuteMultipleRequest requestMultiple = new ExecuteMultipleRequest()
 {
 // Assign settings that define execution behavior: continue on error, return responses.
 Settings = new ExecuteMultipleSettings()
 {
 ContinueOnError = true,
 ReturnResponses = false
 },
 // Create an empty organization request collection.
 Requests = new OrganizationRequestCollection()
 };

 // Cria o objeto Entity com uma nova Account
 Entity account1 = new Entity("account");
 account1.Attributes.Add("name", "TESTE_1_" + DateTime.Now);

 // Cria o objeto Entity com uma nova Account
 Entity account2 = new Entity("account");
 account2.Attributes.Add("name", "TESTE_2_" + DateTime.Now);

 // Cria o objeto Entity com uma nova Account
 Entity account3 = new Entity("account");
 account3.Attributes.Add("nameXXXXX", "TESTE_3_" + DateTime.Now);

 CreateRequest createRequest;

 createRequest = new CreateRequest { Target = account1 };
 requestMultiple.Requests.Add(createRequest);

 createRequest = new CreateRequest { Target = account2 };
 requestMultiple.Requests.Add(createRequest);

 createRequest = new CreateRequest { Target = account3 };
 requestMultiple.Requests.Add(createRequest);

 // Realizar as Execuções Múltiplas
 ExecuteMultipleResponse responseWithResults = (ExecuteMultipleResponse)localContext.OrganizationService.Execute(requestMultiple);

Como eu definido a propriedade ContinueOnError como “Verdadeira” não teremos uma exceção sendo criada, porém apenas os dois primeiros objetos Accounts serão criados no CRM:

executemultiple
Código simples mas ganhamos grandes!

[]’s,

Tiago Cardoso

Anúncios

Sobre Tiago Michelini Cardoso

I have been working with IT since 2006, almost of this time using Microsoft Dynamics CRM/365 as a source of solutions. I graduated in Bachelor of Information Systems at FIAP (Brazil) in 2012. I really love what I do! Technology has been my interest since always. Even in a tool different world of the current. When we didn't have internet, tablets, smartphones e social networks! Although I have worked in some roles, I can't give up "the developer life". Even so far of the greatest developers. Development in general is the thing that I love to work! I started my contributions about Dynamics in 2010. At the beginning, I used to help at MSDN and TechNet forums. But now, I'm dedicating all my time in my personal blog! Currently, I have the enormous honour of being the only Brazilian who got the award for Microsoft MVP (Most Valuable Professional) for Microsoft Dynamics CRM/365 product. I have been receiving the award since 2012.
Esse post foi publicado em Dynamics CRM e marcado , , . Guardar link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s