CRM – Mais uma aquisição para o Dynamics! FieldOne!

Pessoal,

Bob Stutz postou recentemente sobre uma nova aquisição da Microsoft que será incorporada para o módulo dedicado de serviços do CRM (Microsoft Social Engagement – MSE).

Trata-se da aquisição da FieldOne, que possui uma suite similar a do Parature (comprado em janeiro de 2014 pela Microsoft), com destaque (ao meu ver) para as áreas de agendamento e automação de rotas de entrega.

Para a leitura do material ofcial, acesse:
Microsoft acquires FieldOne, global provider of field service management solutions for the enterprise

[]’s,

#GoDynamics!

Publicado em Dynamics CRM, Microsoft | Marcado com | Deixe um comentário

Social Media Revolution 2015

Pessoal,

Um vídeo que todo ano eu procuro encontrar a nova versão e ver a atualização dos números das midias sociais, vale a pena ver:

[]’s,

Tiago Cardoso

Publicado em Social Mídia | Marcado com | Deixe um comentário

CRM 2015 – Controle de Transações (ExecuteTransactionRequest)

Pessoal,

Uma nova feacture disponibilizada no Update 1 do CRM 2015 é a possibilidade do controle de transações para processos em backgroup (batching), que é concebida pela classe “ExecuteTransactionRequest“.

IC472447

A classe “ExecuteTransactionRequest” é muito semelhante a “ExecuteMultipleRequest“, porém temos como garantia o conceito de transação, deste modo, qualquer erro retornado durante o acesso via SDK fará com que todos os demais registros que já foram inseridos no banco de dados sejam retrocedidos (rollback), aliás, na prática os registros anteriores foram adicionados, mas não foram “commitados”, só serão quando a totalidade de registros for inserida com sucesso.

Bom, mas para qual propósito devemos utilizar o “ExecuteTransaction”?

O conceito transação também traz consigo a ideia de Atomicidade, ou seja, existem cenários que desejamos que todos registros sejam carregados ou nenhum caso exista ao menos um problema. Um bom exemplo pode ser dado no caso de uma integração de dados diária, cujo dados são informados por outro sistema, que realiza uma carga de Clientes (accounts), onde desejamos que sejam importados todos os novos clientes, a única validação feita é a existência de um valor no atributo “CNPJ” (A regra de validação foi criada em um plugin da entidade Account). Caso algum cliente não possua seu CNPJ informado, precisamos que todos os demais desta mesma integração, que já foram inseridos sejam removidos do CRM

A diferença básica quando comparamos com o ExecuteMultiple, é que o ExecuteMultiple não controla transação, temos a propriedade “ContinueOnError” que pode ou não continuar as execuções mesmo após um erro, porém, os registros anteriormente inseridos não serão removidos, pois já foram “commitados” no banco de dados do CRM.

Em relação a performance fiz alguns testes com 100, 500 e 1000 registros em comparação com o ExecuteMultiple e os tempos são muito similares, não existe ganho ou perda de desempenho.

Abaixo criei um exemplo prático

public void ExecuteTransaction()
{
    int cont = 100;
    DateTime inicio = DateTime.Now;

    Console.WriteLine();
    Console.WriteLine("EXECUTETRANSACTION " + cont + " Data Início: " + inicio);

    try
    {
        CreateRequest createRequest;

        // Create an ExecuteTransactionRequest object.
        ExecuteTransactionRequest transactions = new ExecuteTransactionRequest()
        {
            ReturnResponses = true, // Para retornar os objetos Response
            // Create an empty organization request collection.
            Requests = new OrganizationRequestCollection()
        };

        // Percorre o contador adicionando CreateRequests da entidade Account
        for (int i = 0; i < cont; i++)
        {
            // Cria o objeto Entity com uma nova Account
            Entity account = new Entity("account");
            account.Attributes.Add("name", "EXECUTETRANSACTION_" + i + " " + DateTime.Now);

            createRequest = new CreateRequest { Target = account };
            transactions.Requests.Add(createRequest);

            // Desabilitar para simular um erro no CRM
            //if (i == 4)
            //{
            //    // Cria o objeto Entity com uma nova Account
            //    Entity account1 = new Entity("account");
            //    account1.Attributes.Add("fax", "123456789012345678901234567890123456789012345678901234567890"); // Atributo fax com mais de 50 caracteres, irá provovar um erro

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

        // Executa as Transações
        ExecuteTransactionResponse responseWithResults = (ExecuteTransactionResponse)service.Execute(transactions);
    }
    catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex)
    {
        ExecuteTransactionFault fault = (ExecuteTransactionFault)ex.Detail;

        int faultedIndex = fault.FaultedRequestIndex; // Caso ocorra algum erro podemos verificar qual registro teve o problema través do "FaultedRequestIndex"
    }

    DateTime fim = DateTime.Now;

    Console.WriteLine();
    Console.WriteLine("EXECUTETRANSACTION " + cont + " Data Início: " + inicio + " Data Fim: " + fim);
}

Alguns pontos a considerar:

  • Temos as mesmas restrições da classe ExecuteMultipleRequest em relação a quantidade de objetos (requests) e limites de execuções simultâneas
  • Não existem restrições para tipos diferentes de objetos de request (Create, Update, Delete e etc), porém não podemos ter outros ExecuteTransaction ou ExecuteMultiple
  • Devido ao uso de um único bloco transacional os registros que ainda não foram “commitados” ficam bloqueados, por tanto não generalize e pense bem antes de implementar

[]’s,

Tiago Cardoso

Publicado em Dynamics CRM | Marcado com , | Deixe um comentário

CRM 2015 – Enviar Parâmetros Customizados em um Formulário

Pessoal,

Desde a versão 2011 do CRM temos a possibilidade de passarmos parametros customizados através de querystring de forma suportada pelo SDK. O objeto Xrm.Utility nos proporciona a interação de novos parâmetros sendo enviados e recuperados via querystring do browser.

Em algumas situações necessitamos passar informações adicionais via querystring, como por exemplo quando utilizamos o USD (Unified Service Desk) e queremos recuperar informações do contexto do operador de call center e passá-las via querystring para uma página CRM. Outros momentos que o uso de parâmetros customizados podem ser requerido seria itens de menu (command bar ou sitemap), aberturas de formulários CRM dentro de outro formulário CRM, entre outros.

O trabalho deve ser dividido em três partes:

 

  • Inclusão dos Parâmetros Customizados no Formulário CRM

 

Devemos previamente cadastrar os parâmetros customizados que desejamos passar para nosso formulário, deste modo, o formulário deve ser aberto em modo edição, clicar em “Propriedades do Formulário” > aba “Parâmetros”.

Neste exemplo utilizarei a entidade “Tarefa” que receberá o parâmetro “Percentual Realizado” já previamente preenchido.

parametros_customizados_0

parametros_customizados_1

  • Recuperação dos Parâmetros Customizados

Depois de configurado o parâmetro customizado que desejamos que o formulário receba, devemos programar o código que realiza a recuperação do parâmetro. Para isso necessitamos de um JScript sendo executado no Load do formulário “Tarefa”:

function getCustomParameters()
{
    // Recupera todos os parâmetros customizados
    var parametros = Xrm.Page.context.getQueryStringParameters();

    // Valida se existem parâmetros informados E se existe o nosso parâmetro cadastrado "perc_realizado"
    if (parametros && parametros["perc_realizado"]) {
        var percentualRealizado = parseInt(parametros["perc_realizado"]);

        // Atribui o valor informado no atributo Percentual Realizado
        Xrm.Page.getAttribute("percentcomplete").setValue(percentualRealizado);
    }
}

Abra as propriedades do formulário e adicione um biblioteca JScript e coloque o evento “getCustomParameters” no Load do formulário:

parametros_customizados_2

  • Passagem dos Parâmetros Customizados via Querystring

Por fim, temos o ponto que informa o parâmetro customizado, no exemplo que usei de acordo com a “Origem” de uma “Ocorrência”, uma tarefa será criada e seu o percentual realizado será informado.

Devemos abrir em modo de edição a entidade “Ocorrência”, adicionar uma biblioteca JScript com o código que pode ser visualizado à seguir e no evento Change do atributo “Origem” o método “getCaseOriginAndOpenTask” deve ser adicionado:

function getCaseOriginAndOpenTask()
{
    // Recupera o valor do atributo "Origem"
    var origem = parseInt(Xrm.Page.getAttribute("caseorigincode").getValue());

    var parameters = {};

    // Verifica se a Origem é Telefone ou Email e atribui como Percentual Realizado o valor 20
    if(origem == 1 || origem == 2)
        parameters["perc_realizado"] = 20;
    // Para as demais origens o valor 30 deve ser atribuído
    else
        parameters["perc_realizado"] = 30;

    // Abre o formulário de Tarefa com o parâmetro informado
    Xrm.Utility.openEntityForm("task", null, parameters);
}

parametros_customizados_3

 

Bom, terminamos os ajustes e configurações necessárias para a passagem de parâmetros customizados entre as entidade Ocorrência e Tarefa. Agora vamos ao teste, abra um registro de uma ocorrência e selecione um valor no atributo Origem:

parametros_customizados_4

 

Automaticamente seremos direcionados para a entidade Tarefa e o parâmetros “perc_realizado” será informado, na abertura da tarefa o JScript irá recuperar o valor e atribuir no atributo Percentual Realizado:

parametros_customizados_5

 

Como eu disse anterioremente este é só um exemplo de como podemos fazer para passar parâmetros customizados e recuperá-los no formulário CRM “alvo”. Atualmente estou usando com certa frequencia no USD para passar um parâmetro do contexto do operador de call center e recuperá-lo em um formulário CRM.

[]’s,

Tiago Cardoso

Publicado em Dynamics CRM | Marcado com , , , , , , | Deixe um comentário

CRM OnPremises – Agendamento de Relatórios (Salvar Resultados em Disco)

Pessoal,

Algo que existe (pela minha memória) desde a versão 4 do CRM OnPremises é a possibilidade de agendar a execução de relatórios!

*Importante lembrar que o CRM Online não possui esta funcionalidade

Em muitas vezes temos a necesidade de agendar execuções periódicas para gerarmos visões de acordo com o intervalo consultado.

Irei fazer um agendamento bem como salvarei o resultado em um arquivo, armazenando em disco.

Criei um relatório bem simples contendo as ocorrências que estão marcadas com prioridade Alta, podemos fazer o agendamento com qualquer relatório já existente:

reportschedule_1

Agora precisamos selecioná-lo, depois clicar em “Agendar Relatório”, uma tela será aberta, devemos selecionar a opção “Agendado”:

reportschedule_2

Agora precisamos definir a frequencia e as datas de início e término (vale lembrar que a data informada será a utilizada para o snapshot do relatório, ou seja, será a data que a consulta será realizada e armazenada):

reportschedule_3

 

Caso seu relatório possua filtros será solicitado o preenchido, senão continue o fluxo até finalizar o agendamento.

Com o agendamento concluído, teremos que abrir o servidor que contém o Reporting Services para fazer a etapa que grava o arquivo em disco.

Navega no browser pela URL do Reporting Services, selecione a sua Organização CRM e clique em “Exibição de Detalhes”

reportschedule_4

Clique em “CustomReports”, depois localize seu relatório em expanda suas opções, clique em “Gerenciar”:

reportschedule_5

Precisamos criar uma “Assinatura” para gerar o agendador:

reportschedule_6

Aparecerá as opções que devemos  alterar de acordo com nossas necessidades finais, como a Forma de Entrega, Nome do Arquivo que será gerado, Caminho do disco onde será feita a gravação, Formato do arquivo, Credenciais, Opções de Substituição do arquivo. Informe seus valores, mas não conclua ainda.

reportschedule_7

 

A última parte do agendamento é informar quando a gravação irá ocorrer, temos que ter cuidado aqui, pois o snapshot do relatório já deve existir, assim deixei 15 minutos de intervalo entre o snapshot e o agendador de garavação em disco:

reportschedule_8

 

Pronto! Temos nosso relatório agendado! Após o período informado, podemos observar o diretório informado a existencia de nosso arquivo:

reportschedule_9

 

Poderíamos enviá-lo por Email também! Para isso precisamos configurar um servidor SMTP no Report Server Manager, assim teremos a opção habilitada nas “Formas de Entrega”, para maiores detalhes de como habilitar veja:

https://technet.microsoft.com/en-us/library/ms345234(v=sql.105).aspx

https://technet.microsoft.com/en-us/library/ms159155(v=sql.105).aspx

Bom é isso!

[]’s,

Tiago Cardoso

Publicado em Dynamics CRM | Marcado com , | Deixe um comentário

CRM 2015 – Migração de Dados (Data Migration Utility)

Pessoal,

Desde o service pack 1 do CRM 2013 (Leo), a Microsoft disponibilizou o Data Migration Utility (ferramenta de Migração de Dados) dentro do próprio SDK (SDK\Tools\ConfigurationMigration\DataMigrationUtility.exe).

O Data Migration Utility, também faz uso do XRM Tooling como interface de autenticação no CRM, assim não teremos problemas adicionar para acessar o nosso CRM.

Ao meu ver é uma solução muito mais completa do que a exportação via Localização Avançada, pois temos como vantagens:

  • Exportação de múltipla de entidades ao mesmo tempo, podemos selecionar “N” entidades
  • Possibilidade de criar um schema com todas as entidades que desejamos exportar/importar, isso facilita quando trabalhamos com vários ambientes diferentes e atualizações frequentes
  • Importação de múltipla de entidades ao mesmo tempo, após a exportação ter sido realizada, conseguimos importar todos os registros de todas entidades de uma só vez
  • Podemos exportar entidades/relacionamentos Muitos para Muitos (N:N)
  • Podemos habilitar ou desabilitar os plugins das entidades mapeadas para serem desativados enquanto a importação ocorre
  • Atributos Status, State e Option Sets são mapeados através de seus valores e não por suas labels
  • Todos os relacionamentos da entidade mapeada são automaticamente mapeados e podem ser removidos caso necessitarmos
  • Podemos validar o schema para a importação futura

Alguns pontos de atenção que devem ser considerados:

  • Nativamente não conseguimos criar arquivos de exportação com dados que não estão em um CRM, assim temos uma limitação de copiar de um CRM A e aplicá-la em outro CRM B
  • Não é possível criar filtros nos dadosm, assim todos os registros mapeados serão exportados e consequentemente serão importados posteriormente
  • Existe a validação de duplicidade através do atrabito primário de cada entidade, podem ser criadas regra de detecção de duplicadas para realizar outra validações
  • Devido a validação de duplicidades observar o atributo primário, podem haver updates não desejados caso o atributo chave (guid) esteja mapeado, pois considerará um update. Por exemplo: Exportamos todos os atributos de uma entidade que possua o Atributo Primário = “Tiago”, após a exportação alteramos no CRM para “Tiago Cardoso”, ao importar o registro voltará a possuir como atributo primário o valor “Tiago’
  • Não é possível deletar dados via exportação/importação

Atualmente existem três operações suportadas na ferramenta:

  • Create a Schema: Criamos nossos mapeamentos de entidades e atributos para termo um modelo/chassi de tudo que desejamos exportar
    • Selecione “Create a Schema”
    • Faça a autenticação no CRM (PS para organizações Online use “Office 365″ no atributo Deployment Type)
    • Após a autenticação será possível selecionar as entidades e atributos que serão mapeados:dmu_1
      1. Selecione a Solution CRM que deseja utilizar como referencia para mapear as entidades/atributos
      2. Selecione a entidade
      3. Selecione alguns ou todos os atributos
      4. Adicione os atributos ou a entidade no mapeamento
    • Podemos importar um schema já existente ou salvar o que está em andamento, para isso, devemos acessar a toolbar “File”:dmu_6
    • Podemos validar o Schema ou configurar as opções de importação, acessando a toolbar “Tools” e posteriormente podemos  clicar em “Save and Export”:dmu_2
    • Será solicitado o nome de um arquivo “xml” que queremos salvar o schema, após isso, será questionado se desejamos também exportar os dados, caso seja confirmada, o próximo tópico “Export Data” detalha o que devemos fazer

 

  • Export Data: Realizamos nossas exportações de dados seguindo um schema previamente criado
    • Selecione “Export data”
    • Faça a autenticação no CRM (PS para organizações Online use “Office 365″ no atributo Deployment Type)
    • Após a autenticação será possível selecionar as entidades e atributos que serão mapeados (vide detalhes na seção de “Create Schema”)
    • O primeiro atributo solicita o arquivo “xml” que queremos recuperar o schema das entidades/atributos
    • O segundo atributo solicita o arquivo “zip” que receberá todos os dados das entidades mapeadas. Após informar, podemos clicar em “Export Data”:dmu_5
    • A exportação se iniciará e podemos acompanhar seu andamento, no final teremos algo assim:dmu_4

 

  • Import Data: Realizamos nossas importações fazendo o uso do arquivo “zip” que foi exportado anteriormente
    • Selecione “Import data”
    • Faça a autenticação no CRM (PS para organizações Online use “Office 365″ no atributo Deployment Type)
    • Após a autenticação será possível selecionar as entidades e atributos que serão mapeados (vide detalhes na seção de “Create Schema”)
    • Devemos selecionar o arquivo “zip” que será importado, automaticamente será demonstrada a quantidade de entidades que estão presentes no arquivo. Por fim, clicamos em “Import Data”:dmu_7
    • A importação se iniciará e podemos acompanhar seu andamento, no final teremos algo assim:dmu_8

 

Para maiores detalhes vide:

https://msdn.microsoft.com/en-us/library/dn647422.aspx

https://msdn.microsoft.com/en-us/library/dn647419.aspx

[]’s,

Tiago Cardoso

Publicado em Dynamics CRM | Deixe um comentário

CRM 2015 Update 1 – Turbo Forms

Pessoal,

Outra novidade muito importante que temos no CRM 2015 com o Update 1 são os “Turbo Forms”! (O codename já diz o propósito, certo!?)

Sim, temos novo motor de renderização de forms do CRM, que podem chegar a uma redução de 500% (comparando um form com 300 atributos) conforme o gráfico de progressão feito pela Microsoft:

turboforms_1

 

Mesmo comparando com forms mais próximos de nossas realidades (50 campos) já temos um ganho de 300%!

Mas onde está a mágica?

Bom, primeiro uma descrição de como tudo era feito antes do Update 1…

Nas versões anteriores ou quando o atributo “Use legacy form rendering” (Settings > Administration > System Settings) possuir o valor “Falso“. Cada formulário é na realidade um “iframe” (uma área/janela dentro do layout) que possui todos scripts nativos e customizados que os forms necessiatm. Todos os scripts são destruídos e recriados a cada navegação, fechamento ou abertura do formulário, esta abordagem é ótima quando pensamos em problemas de caching, porém é muito ruim em relação à performance e reaproveitamento de scprits já carregados.

Com o Update 1, utilizando a nova renderização (Use legacy form rendering = Verdadeiro), o “iframe” nunca é encerrado, ele sempre manterá em cache do usuário todos os scripts nativos, ou seja, no primeiro formulário que o usuário abrir, todos os scripts nativos serão “cacheados” e todos os próximos formulários do não serão mais carregados! Além disso, existe melhorias em relação ao paralelismo no carregamento dos scripts, o conceito de threads foi evoluído. Com isso temos uma melhoria absurda!

Como tudo na vida temos pontos negativos… Na verdade não deveriam ser negativos… Por que digo isso? Pois código não suportados, realmente não são suportados com os “Turbo Forms”, tais como:

  • document.getElementById
  • Seletores JQuery
  • window.parent
  • window.load

Assim, valide seu código antes de mudar a renderização!

Segue o link oficial:

http://blogs.msdn.com/b/crm/archive/2015/04/29/microsoft-dynamics-crm-online-2015-update-1-new-form-rendering-engine.aspx

[]’s,

Tiago Cardoso

Publicado em Dynamics CRM | Marcado com , | Deixe um comentário