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).
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:
Código simples mas ganhamos grandes!
[]’s,
Tiago Cardoso