Uma das novas functionalidades do CRM 2013 é as Ações. As Ações são em poucas palavras, o encapsulamento de lógica de negócio numa só regra e através de código C# ou Javascript será possivel evocar essa mesma regra. 

Um exemplo bastante comum e prático no CRM pode ser algo como um processo de aprovação. E em qualquer tipo de organização antes de se fazer determinada ação é necessária a aprovação de alguém superior. O administrador de CRM (parceiro CRM ou até mesmo administrador de CRM) poderá então criar um ação "Aprovação" e defini-la com alguns passos (criar uma tarefa, atribuir a uma Queue, envio de um email passado um determinado número de dias, caso a tarefa ainda esteja activa atribuir a tarefa directamente ao superior...). Através de SDK (C# ou Javascript), o programador poderá querer chamar a ação, sem necessitar de saber qual o negócio ou o conjunto de ações que corresponde a ação criada, neste nosso caso o processo de Aprovação. O cliente ou o administrador de CRM poderá então alterar a ação adicionando ou removendo determinados passos mas o código será sempre o mesmo. 

O objectivo deste artigo é exemplicar a chamada de uma ação através de uma aplicação .NET, neste caso, uma aplicação consola. 

Pré-requesitos:

Para começar é necessário criar uma ação no CRM 2013 (Definições > Processos). Com o CRM 2013 é nos dado a possibilidade de criação de quatro diferente tipos de processos: Ação, a qual vamos detalhar mais a baixo, Dialogo, Fluxo de Trabalho e Fluxo do Processo de Negocio. 

Por exemplo, a ação será baseado num envio de email:

  • Nome do processo: Send Custom Email
  • Categoria: Ação
  • Entidade: Conta

 

 

Ao clicar em OK uma nova janela aparecerá:

 

Podemos definir parametros de entrada e saída de vários tipos: Booleano, DateTime, Decimal, Dinheiro, Entidade, EntityCollection, EntityReference, Flutuante, Número inteiro, Picklist e String, como se pode verificar na imagem abaixo.

  

Por exemplo, a ação terá dois argumentos de entrada, um opcional e um necessário (obrigatório). 

Clique em “+” para adicionar um novo parametro:

           Nome: StringOptional

Tipo: String

           Necessário: De

Clique em “+” para adicionar um novo parametro:

           Nome: IntegerRequired

Tipo: String

           Necessário: Check

 

A definição na ação é construída utilizando os mesmos mecanismos que os Diálogos e Fluxos de trabalho .

 

Para a execução da nossa ação iremos utilizar dois métodos diferentes:

Ao gerar as várias classes (Early Bound) através da execução do comando crmsvcutil é necessário activar a geração das classes relacionadas com as Ações. Foi então adicionado um novo parametro (generateActions): 

CrmSvcUtil.exe /url:http://<serverName>/<organizationName>/XRMServices/2011/Organization.svc /out:<outputFilename>.cs /username:<username> /password:<password> /domain:<domainName> /namespace:<outputNamespace> /serviceContextName:<serviceContextName> /generateActions 

  1. Abra o Visual Studio 2008, Visual Studio 2010 ou Visual Studio 2012.
  2. Crie um novo projecto: Aplicação de Consola.
  3. Adicionar as seguintes referencias ao projecto:
  • Microsoft.Crm.Sdk.Proxy
  • Microsoft.IdentityModel
  • Micrososft.Xrm.Sdk
  • System.DirectoryServices.AccountManagement
  • Systme.Runtime.Serialization
  • System.Security
  • System.ServiceModel
  1. Adicione os seguintes ficheiros (.cs):
  • Ficheiro gerado pelo crmsvcutil (<outputFilename>.cs).
  • SDK\SampleCode\CS\HelperCode\DeviceIdManager.cs
  • SDK\SampleCode\CS\HelperCode\CrmServiceHelpers.cs
  1. E adicione o seguinte código: 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text; 

using System.ServiceModel;

using System.ServiceModel.Description; 

using Microsoft.Xrm.Sdk;

using Microsoft.Xrm.Sdk.Query;

using Microsoft.Xrm.Sdk.Client; 

namespace Microsoft.Crm.Sdk.Samples

{ 

        public static void Main(string[] args)

        {

            ServerConnection serverConnect = new ServerConnection();

            ServerConnection.Configuration config = serverConnect.GetServerConfiguration();

            using (OrganizationServiceProxy _serviceProxy = ServerConnection.GetOrganizationProxy(config))

            {

                _serviceProxy.EnableProxyTypes();

                 IOrganizationService _service = (IOrganizationService)_serviceProxy;

                 try{

                     // EARLY BOUND

                     new_SendCustomEmailRequest request = new new_SendCustomEmailRequest();

                     request.IntegerRequired = 0;

                     request.StringOptional = "Hello World";

                     request.BooleanOptional = false;

                     request.Target = new EntityReference("account", new Guid("04121E5E-9994-E311-A0CD-00155D407C68"));

                     new_SendCustomEmailResponse response = _serviceProxy.Execute(request) as new_SendCustomEmailResponse;              

 // LATE BOUND

                     OrganizationRequest req = new OrganizationRequest("new_SendCustomEmail");

                     req["Target"] = new EntityReference("account", new Guid("04121E5E-9994-E311-A0CD-00155D407C68")); // ACCOUNT GUID

                     req["IntegerRequired"] = 0;

                     //req["BooleanOptional"] = false;

                     OrganizationResponse resp = _service.Execute(req);

                 }

                 catch (Exception ex)

                 {

                    // TODO

                 }

            } 

 

Mais informação em: http://msdn.microsoft.com/en-us/library/dn481600(v=crm.6).aspx

 

 Hélio Delgado.