Custom Workflow Activities - Resolução de incidentes

by Pedro Azevedo 9. September 2013 06:06

Boas pessoal,

EDIT: Eu já cá tinha um exemplo de uma criação de um Custom WorkFlow Activity, o post continua igual (alterei apenas o objectivo) mas mudei o exemplo, o exemplo que tinha era muito simples e estou a trocar por um exemplo que acontece-nos penso que a todos. O objectivo é extrair propriedades da Resolução de Incidente.

Hoje vou fazer um pouco de código C# Smile estava a ver que não… vamos falar em concreto sobre Custom Workflow Activities que permitem estender o comportamento por defeito dos Workflows.

O objectivo será que quando um incidente seja encerrado enviar em email com a descrição de resolução. A primeira opção que ocorria era criar um workflow, o problema é que dentro de um Workflow não conseguimos aceder a entidade Resolução de Incidente.

Uma solução seria criar um campo no incidente com esta informação. Mas existe uma solução mais eficaz que é recorrer a actividades customizadas de Workflow. Dentro desta actividade vamos pesquisar por esta entidade e retornar a descrição.

A primeira coisa a fazer é criar um projecto do template Workflow, do tipo Activity Designer Library:

 

Depois do projecto criado podem apagar o ficheiro que é criado por defeito:

 

E adicionem uma classe normal:

 

Antes de começarmos a colocar código vamos referenciar três DLLs fundamentais para programarmos para o CRM:

 

Estas DLLs estão na pasta onde vocês instalaram o SDK (se não tiverem podem sacar aqui). A seguir podemos colocar o seguinte código:

public class GetIncidentRes : CodeActivity
{
    protected override void Execute(CodeActivityContext activityContext)
    {
        IWorkflowContext contexto = activityContext.GetExtension<IWorkflowContext>();
        IOrganizationServiceFactory serviceFact = activityContext.GetExtension<IOrganizationServiceFactory>();
        IOrganizationService service = serviceFact.CreateOrganizationService(contexto.UserId);

        QueryByAttribute queryIncRes = new QueryByAttribute();
        queryIncRes.Attributes.AddRange(new string[] { "incidentid" });
        queryIncRes.ColumnSet = new ColumnSet(new string[] { "description" });
        queryIncRes.EntityName = IncidentResolution.EntityLogicalName;
        queryIncRes.Values.AddRange(new object[] { contexto.PrimaryEntityId });

        EntityCollection incidentResEntity = service.RetrieveMultiple(queryIncRes);
        IncidentResolution incidentResolution = (IncidentResolution)incidentResEntity.Entities.FirstOrDefault();
        DescrResol.Set(activityContext, incidentResolution.Description);
    }


    [OutputAttribute("DescrResol")]
    public OutArgument<string> DescrResol { get; set; }
}

Temos que referenciar três namespaces:

using System.Activities;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Workflow;

Em relação ao código é bastante simples, temos que derivar de CodeActivity, declarar o nosso output através do atributo OutputAttribute o texto que colocamos é o nome que vai aparecer depois no editor do Workflow. Mais de resto é o que fazemos habitualmente no CRM.

O Visual Studio vai-se queixar que não conhece a class IncidentResolution, isto porque ele não conhece as entidades que temos no CRM. Como estamos a trabalhar apenas com as entidades standard temos um ficheiro com todas as entidades standard na pasta do SDK (\samplecode\cs\helpercode). Poderíamos ter optado por usar o método late bound, mas neste caso quero trabalhar com early bound para isso teremos que gerar as classes das entidades e assim receber as entidades customizadas. Teremos que utilizar a ferramenta crmsvcutil.exe (\bin), a sua definição é a seguinte:

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

Podemos adicionar o ficheiro resultante ao nosso projecto:

 

Ao tentarmos compilar vai aparecer mais alguns erros um deles relacionado com a versão do .Net que ele coloca por defeito “.NET Framework 4 Client Profile”, mudamos para a “normal”:

Adicionamos ainda outra referência – System.Runtime.Serialization. Uma última coisa que é adicionar um strong name a nossa DLL:

Depois disto tudo vamos registar a nossa DLL, através da ferramenta: Plugin Registration Tool:

 

 

Depois de escolhermos a nossa DLL, basta dizer qual o workflow que queremos registar e temos o nosso workflow registrado.

Agora já podemos ir ao CRM e fazer o nosso Workflow que quando um incidente for finalizado envie um email com os detalhes da resolução, portanto criamos um novo processo do tipo Fluxo de Trabalho:

Depois de dizermos que o workflow só vai correr aquando da mudança de estado e depois de adicionarmos a condição que é apenas no estado Resolvido, podemos executar a nossa actividade customizada:

Depois deste passo podemos criar o email com base na informação retornada do nossa actividade customizada:

 

E temos a nossa actividade customizada, podem ver a sua funcionalidade e utilidade deste mecanismo.

 

Até a próxima.

Tags: , , , ,

Comments (3) -

Eduardo
Eduardo Brazil
7/11/2014 4:17:02 PM #

Olá,

Estou utilizando o Dynamics CRM Online,

Baixei o SDK e executei o comando conforme explicação acima:

CrmSvcUtil.exe /url:startlinktec.api.crm.dynamics.com/.../...ation.svc /out:CRMEntities.cs /username:"xxxxxx@startlinktec.onmicrosoft.com" /password:"xxxxxx"

Após executar o comando eu recebo a seguinte mensagem:

Exiting program with exception: O nome de usuário nao foi fornecido. Especifique
o nome de usuário em ClientCredentials.
Enable tracing and view the trace files for more information.

Sabe me dizer se fiz algo errado ?

Reply

Eduardo
Eduardo Brazil
7/15/2014 2:51:41 PM #

Olá,

Estou tentando executar o comando CrmSvcUtil.exe, sem sucesso, eu uso o Dynamics CRM 2013 online, poderia por favor verificar se tem algum erro em meu comando ?


C:\Users\eduardo\SDK\Bin>CrmSvcUtil.exe /url:https://minhaorganização.api.crm.dynami
cs.com/XRMServices/2011/Organization.svc /out:CRMEntities.cs /username:usuario@empresa.onmicrosoft.com /password:passwrd /domain:onmicrosoft
CrmSvcUtil : CRM Service Utility [Version 6.1.0000.0581]
c 2014 Microsoft Corporation.  All rights reserved.


Exiting program with exception: O nome de usuário nao foi fornecido. Especifique
o nome de usuário em ClientCredentials.
Enable tracing and view the trace files for more information.

Obrigado

Reply

Admin
Admin Brazil
7/24/2014 6:44:57 AM #

Eduardo se não me engano eu respondi a tua pergunta no forum do Dynamics CRM, aqui (social.msdn.microsoft.com/.../inserir-dados-da-entidade-resoluo-da-ocorrncia-em-um-fluxo-de-trabalho).

Reply

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

About

Muito bem casado, Pai babado e um gosto muito grande pela tecnologia.

Tenho um lema "Sharing is Learning"

Mais aqui -> http://www.psazevedo.com

Month List