Trabalhando com DLLs externas em plugins ou atividades customizadas de workflow

by Pedro Azevedo 13. April 2016 08:38

Boas pessoal,

Hoje venho falar de um mecanismo que é o meu dia-a-dia no desenvolvimento de plugins ou atividades customizadas de workflow. Sempre que começamos um projeto vamos verificar que muito código pode ser reutilizado, ou seja, código que se repete em vários plugins por exemplo. Imaginem por exemplo um requisito que qualquer email temos que usar o mesmo utilizador, então em cada plugin teríamos que fazer o mesmo código.

A solução pode passar por colocar num projeto a parte e daí gerar uma DLL, assim podemos usar esse código nas atividades de workflow e em múltiplos projetos. O problema é que o CRM não deixa que coloquemos referências externas a DLLs, principalmente no CRM Online.

A solução passa por usarmos o ILMerge uma ferramenta gratuita e muito usada, onde o seu principal objetivo é fazer merge entre DLLs e gerar apenas uma. Assim a restrição de registar múltiplas DLLs fica ultrapassada, pois o plugin e a nossa biblioteca vão na mesma DLL. Antes a sua configuração ainda era complicada, mas a uns anos descobri este post que utiliza uma tarefa do MSBuild que permite otimizar muito o processo.

Presumindo que vocês já têm a vossa solution montada, vamos instalar o pacote NuGet chamado MSBuild.ILMerge.Task sobre o projeto do nosso plugin\atividade de workflow:

image

Depois de instalarmos este pacote NuGet, vamos adicionar a DLL da nossa biblioteca. Esta tarefa de MSBuild vai ter a função de fazer “merge”  de todas as DLLs que estejam na pasta bin do nosso plugin. Se forem a essa pasta vão visualizar mais DLLs e principalmente as quatro principais para desenvolvermos sobre o CRM:

image

Sobre estas referências temos que ir as propriedades dessas DLLs e mudar a configuração, “Copy Local” e colocamos a false. Assim essas DLLs não ficam no merge.

image

Antes de compilarmos podemos ver a estrutura atual da pasta bin:

image

Depois de um clean e se recompilarmos novamente o projeto passamos a ter apenas uma DLL:

image

Para confirmarmos que realmente as duas DLLs estão juntas, podemos recorrer a ferramenta ILSpy, que inspeciona a DLL:

image

Com isto podemos continuar com o registo da nossa DLL sem quaisquer problema.

 

Até a próxima.

Tags: , ,

Forçar o recalculo dos campos rollup

by Pedro Azevedo 1. March 2016 08:03

Boas pessoal,

Num post do fórum foi perguntado como colocar um campo obrigatório, quando a soma de um determinado tipo de produtos fosse maior a um determinado valor. A minha solução foi colocar num campo rollup a soma destes tipos de produtos e depois aplicar uma regra de negócio para colocar o campo obrigatório.  A resposta foi que o recalculo não é apenas de 12 em 12 horas. Hora esta resposta não está completamente correta como podemos ver aqui. Como eu menciono na resposta, mas mesmo de hora a hora este cálculo pode ser decisivo e quebrar o fluxo do processo.

Como tinha prometido e forçado devido a questão no fórum estou aqui escrever soluções para forçarmos o recalculo deste campo. A solução encontramos no SDK recorrendo a seguinte mensagem:

CalculateRollupFieldRequest

Neste caso um plugin ou uma atividade customizada, vou dar o exemplo num plugin e como vamos ver mais a frente já existe uma ferramenta que dá esta funcionalidade de graça. Para o plugin podemos correr o seguinte código:

public class PostCreateOpportunityProductPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
 
        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
        {
            var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            var service = serviceFactory.CreateOrganizationService(context.UserId);
 
            var entity = (Entity)context.InputParameters["Target"];
            var oppId = (EntityReference)entity["opportunityid"];
 
            var crfr = new CalculateRollupFieldRequest
            {
                Target = new EntityReference("opportunity", oppId.Id),
                FieldName = "new_rollupsumprods"
            };
 
            var response = (CalculateRollupFieldResponse)service.Execute(crfr);
        }
    }
}

Para a configuração deste plugin que coloquei a executar na mensagem Create da entidade OpportunityProduct e forçar o recalculo do campo rollup da oportunidade.

Para facilitar foi criado uma atividade customizada de fluxos de trabalho e que está incluída numa ferramenta que espero em próximos posts falar que é Dynamics CRM 2016 Workflow Tools, que são ferramentas para utilizarmos dentro dos Fluxos de Trabalho

Até a próxima.

Tags: , ,

Como os campos rollup são recalculados

by Pedro Azevedo 24. February 2016 16:20

Boas pessoal,

Deixamos este post apenas para falar de como estes campos são recalculados e isto é uma questão importante porque poderemos a trabalhar com informações erradas se o campo não tiver sido recalculado.

Primeiramente vamos perceber como estes campo são calculados, como eu referi no post sobre os campos rollup na base dados são criados três campos por cada campo rollup:

  • <NomeCampo>
  • <NomeCampo>_date
  • <NomeCampo>_state

O campo state, pode ter um dos seguintes valores:

Valor Nome Descrição
0 NotCalculated Campo ainda não foi calculado
1 Calculated O valor do campo é da data presente no campo <NomeCampo>_date
2 OverflowError Erro de overflow.
3 OtherError O cálculo do valor de campo falhou devido a um erro interno..
4 RetryLimitExceeded Cálculo falhou porque o número máximo de tentativas para calcular o valor foi excedido devido ao número alto de conflitos de simultaneidade e bloqueio.
5 HierarchicalRecursionLimitReached O cálculo do valor de campo falhou porque o limite máximo de profundidade da hierarquia para o cálculo foi atingido.
6 LoopDetected Cálculo do campo falhou porque um loop recursivo foi detectado na hierarquia do registro.

Os campos são recalculados através das tarefas de sistema assincronamente, quando o campo é calculado é agendado o seu cálculo 12 horas depois, como podemos ver na mensagem que coloquei no post sobre estes campos. Depois da criação existe um agendamento de 1h em 1h como se pode verificar a seguir:

image

Podemos mudar estas configurações indo as tarefas de sistema e mudando a vista para “Tarefas de Sistema Periódicas”, vamos ver os campos criados:

image

image

Para modificar abrimos este trabalho sistema e dentro do formulários, temos as seguintes opções:

image

Podemos mudar a periodicidade neste formulário:

image

 

Até a próxima.

Tags: , ,

Campos rollup

by Pedro Azevedo 14. February 2016 14:57

Boas Pessoal,

No post anterior falamos sobre campos calculados, hoje vamos falar de campos rollup. Como referi no post anterior quando criamos um campo vai aparecer mais opções para além do campo simples, os campos calculados e rollup:

image

Os tipos de campos em que se pode aplicar são: Inteiro, Decimal, Data e Moeda. Ao editar vemos o seguinte formulário que passamos a explicar mais ao pormenor:

image

Antes de começarmos a configurar vamos tentar perceber quando utilizar este tipo de objeto. Basicamente quando queremos somar ou contar algo sobre a própria entidade ou entidades relacionadas, por exemplo saber o valor de oportunidades que temos para um determinado cliente, o número de atividades, saber qual foi a maior compra desse cliente ou a média do valor das oportunidades.

Começando no início do formulário, podemos verificar que a entidade de origem é a conta, ou seja, a entidade sobre a qual estamos a criar este campo rollup e este campo não pode ser modificado. O campo abaixo define se queremos navegar sobre a hierarquia, ou seja, se queremos que os cálculos percorram não só os registos diretamente relacionados com a entidade mas também sobre uma eventual hierarquia, por exemplo percorrer uma possível hierarquia dos clientes:

image

Depois temos que configurar sobre qual a entidade sobre a qual vamos fazer a agregação, aliado a isso podemos colocar filtros para segmentar dados:

image

Na Agregação, temos as seguintes hipóteses:

image

Pode parecer estranho mas para este caso apenas temos um campo disponível, mas isto tem uma razão é que este campo rollup é do tipo inteiro, então só podemos fazer contas sobre “coisas” inteiras, neste caso estamos a calcular a média de probabilidades das oportunidades de uma determinada conta:

image

Mas o mais natural é realizarmos contas sobre os valores, para isso basta criarmos um campo do tipo Moeda, e como podemos ver na imagem a baixo já aparecem outros campos do tipo Moeda:

image

Estes campos podem ser usados em formulários, gráficos, visualizações e relatórios. Para além destes objetos os campos calculados poderão usar estes campos e o vice-versa também é possível.

Vamos ver como estes campos são visualizados no formulário:

image

 

Como podemos ver na imagem acima temos os dois campos rollup que criamos. Na imagem vemos o campo “campo rollup” que não tem valor mas se recalcularmos ele vai colocar o valor correto. No aviso que aparece na configuração do campo rollup explica a razão deste comportamento:

image

Mas o mesmo acontece aquando da atualização de uma das oportunidades, por exemplo vou adicionar produtos a oportunidade e vamos ver que o valor não se atualiza, apenas se forçarmos o recalculo. Este recalculo não implica a alteração do campo “modificado em”. No próprio campo é referido qual foi a última atualização que aquele campo teve:

image

Mas esta questão da atualização e como podemos resolver esta questão será descortinada em futuros posts. É uma questão muito importante porque as campos calculados, as regras de negócio e fluxos de trabalho vão usar o último valor calculado e pode não ser o “verdadeiro”.

Tal como nos campos calculados também existem algumas considerações:

  • Poderá haver no máximo 100 campos numa organização e até 10 por entidade;
  • Workflows não podem ser lançados por estes campos e não podem ser utilizados numa condição de espera;
  • Não pode ser aplicado sobre um campo rollup;
  • Não podemos fazer “rollup” sobre um campo rollup;
  • Um rollup não pode ser efetuado sobre relações N:N ou relação 1:N se a entidade for a atividade;

Ao contrário dos campos calculados estes campos são físicos, ou seja, são gravados na base de dados através de três campos, que serão explicados num post futuro.

Até a próxima

Tags: , ,

Mais uma compra–AdxStudio

by Pedro Azevedo 15. October 2015 16:03

Boas pessoal,

Resultado de imagem para adxstudio

Tinha acabado de escrever sobre a compra do FieldOne e FantasySalesTeam e a Microsoft faz mais uma compra desta vez o AdxStudio. Quem anda neste mundo sabe perfeitamente do que se trata pelo menos já ouviu falar que é acerca de portais.

A AdxStudio há muito tempo era um parceiro da Microsoft e sempre ofereceu portais integrados com o Dynamics CRM e que consegue estender o seu comportamento, seja ele online ou on-premise. Estes portais podem funcionar com o Parature.

Para além de portais estamos a falar de solução de “engagement” e de ALM (Application Lifecycle Management).

Mais uma grande adição para melhorar

Até a próxima.

Tags: , , ,

Dynamics CRM 2015 - Update 1.1

by Pedro Azevedo 21. September 2015 13:59

Boas pessoal,

Foi publicado o Update 1.1 para o CRM 2015 online. Neste site podem ver as novidades bem como um detalhe dos bugs que foram resolvidos. Neste site podem fazer download. Entre várias correção de vários bugs e melhorias, ressalvamos o suporte ao:

  • Windows 10
  • Microsoft Edge
  • Android 5.0

Até a próxima

Tags: , ,

MS CRM 2016–Release Preview Guide

by Pedro Azevedo 14. September 2015 14:38

Boas pessoal,

Como tinha referido no post anterior foi anunciado o Microsoft Dynamics CRM 2016 e como sempre a Microsoft lançou um guia para resumir as prinicipais novidades desta versão e mais uma vez estou aqui a fazer um resumo deste mesmo guia. O guia não se limita a falar apenas do Dynamics CRM mas também do Dynamics Marketing e Social Engagement.

Dynamics Marketing

O Dynamics Marketing que está apostar na utilização do Office 365 e do PowerBI para medir a performance do inicio ao fim com o intuito de construir um funil de vendas e demonstrar o impacto do investimento do marketing em real-time, como principais funcionalidades temos:

  • SMS Marketing – podemos criar, enviar e receber SMSs, o que torna esta aplicação ainda mais poderosa, chegando ao marketing móvel.

image_thumb2

  • Email Marketing – podemos considerar o coração desta aplicação e em todas as atualizações recebe melhorias e este update não é exceção. A destacar a possibilidade de usar bibliotecas de media diretamente no HTML.

image_thumb5

Social Engagement

Esta aplicação que é transversal a todas as áreas e aplicações dentro do mundo Dynamics, pois ajuda as Vendas, Marketing e Serviço a terem acesso as redes sociais de uma maneira muito fácil. Não tem nenhuma das anteriores aplicações não faz mal porque o Social Engagement pode trabalhar de uma forma standalone. As principais novidades:

  • Social Listening & Social Analytics – esta ferramenta já procurava em fontes como Twitter, Facebook, Blogs, Youtube, e Notícias, agora vai ser capaz de procurar em fóruns e em RSS customizados. Incluí fontes internas como o Yammer. foram acrescentadas mais 14 línguas para a análise do sentimento, relembro que o português já era suportado.

image_thumb10

  • Inteligência Social – o Social Engagement vai ser capaz de detetar oportunidades potenciais e incidentes automaticamente e com um algoritmo adaptativo.

image_thumb13

  • Colaboração em Grupo – Introdução de processos e fluxos através de grupos para uma melhor colaboração, muito semelhante ao que acontece no Office 365.

image_thumb16

  • Social CRM – poder criar incidentes e oportunidades através dos posts sociais.

image_thumb20

  • Social Center – publicar posts no facebook ou twitter dentro do Social Center incluindo conteúdo de multimédia.

image_thumb23

Dynamics CRM

Aqui vamos ver as novidades por área, começando nas vendas:

  • Aplicação CRM para o Outlook – até hoje tínhamos “CRM for Outlook” que trabalhava com a versão desktop do Outlook, com “Microsoft Dynamics CRM App for Outlook” expande para o browser e fica mais fácil fazer track de emails, criação de novos registos com base no email. Atualmente com suporte para o Chrome e IE, irá expandir para dar suporte também ao Firefox, Safari e Outlook para o Mac. Apenas disponível para o CRM Online.

image_thumb27

  • Integração excel – com o último update passamos a abrir o excel diretamente no CRM através do CRM Online, que agora vai permitir trabalhar com templates familiares, fazer análises sempre mantendo o trabalho dentro do contexto. Esta exportação e análise também vai ser suportada nas aplicações Phone e Tablets.

image_thumb31

  • Information Discovery – a informação vai-nos aparecendo com os documentos mais visualizados, através do Office Delve num dashboard.

image_thumb34

  • OneDrive para empresas – os documentos podem ser partilhados através do OneDrive para empresas em conjunto com o sharepoint e grupos Office 365 dentro de um contexto de um registo.

image_thumb36

  • Geração de documentos – fazer documentos com dados do CRM vai ficar facilitado com o Document Generation. Passa a existir templates pré-definidos e estes podem ser limitados por papeis.
  • Integração com a Cortana – suporte as atividades de venda, clientes e oportunidades.

image_thumb38

Área Serviço:

  • Questionários – a minha funcionalidade preferida, podermos realizar inquéritos aos nossos clientes, recolher os resultados e realizar ações sobre esses resultados. Podemos customizar um inquérito através de um designer. Os inquéritos podem ser respondidos num tablet, telemóvel ou computador. Os resultados ficam ao nível do cliente. Esta funcionalidade requer uma subscrição Azure para hospedar os inquéritos.

image_thumb40

  • Interactive Service Hub – para os papéis de serviço tem um hub interativo dentro dos dashboards, onde podemos ter streams de dados, onde lista informação das vistas ou equipas.Gráficos interativos.

image_thumb43

  • Novo formulário – o formulário dos incidentes foi todo revisto reduzir “clicks” e navegação. Os processos guiados aparecem como um fly-out. Este novo layout vai ser transportado para os clientes e contactos.

image_thumb47

  • External Party Access – tem a ver com a forma que elementos externos se ligam ao CRM. Atualmente uma solução muito utilizada são os portais. No documento fala em melhorias na API e SDK, presumo que tenha algo a ver com a WebAPI que está em preview.
  • Gestão do conhecimento – o editor de artigos foi alterado e agora segue a metodologia Knowledge-Centered Support (KCS).

image_thumb49

  • Unified Service Desk – atualizações através do Windows Update\ System Center. DLLs customizadas através da configuração no servidor de CRM. Melhoria no audit e diagnóstico. Integração por exemplo com Azure HDInsights.
  • Inteligência no Serviço -  um dashboard PowerBI com uma vista agregada para ver a performance do serviço ao cliente.

image_thumb52

Mobile

  • Suporte offline – suporte completo para cenários offline, onde vai permitir a criação, alteração e apagar registos offline. Quando voltar a ficar online todas as operação são aplicadas. Esta funcionalidade apenas vai estar disponível a quem tenha mais de 30 licenças profissionais ou empresariais.

image_thumb55

  • App-to-App – Abrir outras aplicações dentro desta aplicação

image_thumb58

  • Experiência amiga – novos controlos modernos um calendário e um slider são alguns exemplos.

image_thumb60

  • Tarefas baseadas em experiências – o objetivo é que nos concentremos nas tarefas e não nos registos. Esta experiencia vai estar como preview nesta versão o que quer dizer que não terá suporte da Microsoft.
  • Pré-visualização dos formulários mobile – enquanto estamos a configurar o formulário mobile no Dynamics CRM agora é possível pré-visualizar o cliente mobile e tablet diretamente no browser.

image_thumb[1]

  • IFrame e Recursos Web – esta funcionalidade já tinha sido lançada como preview, ou seja, era possível termos iframes e recursos web dentro do tablet, neste momento esta funcionalidade passará a ter total suporte da Microsoft.

image_thumb[3]

  • Gestão Mobile – através do Microsoft Intune agora a Microsoft consegue separar e proteger o que são dados pessoais dos dados empresariais.

image_thumb[5]

CRM Online

  • Encriptação – hoje em dia temos a opção de encriptar os dados da base dados. Agora e em preview passamos a poder gerir as chaves de encriptação.
  • Data Performance Dashboard – este item deixei em inglês pois a tradução pode ser dúbia. Pois parece-me que poderá ser uma dashboard onde vamos visualizar problemas de performance e uma ajuda para resolver esses problemas e qual a evolução dessas resoluções.
  • Novos Datacenters – com a introdução de mais 2 datacenters, na Índia e Canadá, passam a ser 9 datacenters espalhados no mundo.
  • Bulk data loader – esta ferramenta é um novo serviço da nuvem, cujo objetivo é fazer importar e exportar dados para o CRM Online. Irá suportar grandes volumes de dados e irá gravar em tabelas temporárias e fazer pequenas alterações antes de enviar para o CRM Online. Este serviço estará disponível no portal de adminstração do Office 365 que irá redirecionar para o site do Dynamics Life Cycle Services (https://lcs.dynamics.com)

image_thumb[8]

  • Compliance e proteção de dados – a Microsoft reuniu toda a informação de compliance e proteção de dados num único sítio o CRM Trust Center.
  • Experiência guiada de utilizador – esta nova funcionalidade permite guiar os utilizadores numa auto-formação sobre funcionalidades e sobre novas novidades, diminuindo assim o tempo de formação presencial. Este conteúdo pode ser redirecionado por papel, ou seja, os vendedores receberem apenas as novidades da sua área.

image_thumb[12]

Plataforma

  • Web API moderna – hoje em dia uma Web API é essencial para qualquer sistema e o Dynamics CRM não é exceção. Nas últimas atualizações a Microsoft apresentou a nova versão da sua API implementando o OData v4 e OAuth 2.
  • Melhorias no ecosistema – várias melhorias irão aparecer nas soluções permitindo adicionar sub-componentes, suporte a patchs,melhorias no ciclo de vida para a integração com o Marketplace e paralelização do deployment.
  • Sincronização server side – esta funcionalidade só trabalhava entre o CRM Online e Exchange Online e o CRM Online e Exchange On-Premise.
  • Nova geração de pesquisa – a nova versão desta funcionalidade vai disponibilizar uma única lista de pesquisa, ordenado por importância. Esta nova funcionalidade estará disponível em preview e apenas se os administradores a ativarem. A pesquisa atual permanecerá caso “instalemos” esta nova versão com outro nome: Pesquisa Categorizada.

image_thumb[15]

  • Azure Machine Learning – recomendações cross-selling e sugestões de artigos de conhecimento será possível com a integração com o Azure Machine Learning sem necessidade de perceber de grande aprendizagem. Esta funcionalidade será preview mas só para os datacenters da américa do norte.

image_thumb[18]

  • Compatibilidade – como sempre a Microsoft continua a querer dar suporte com as últimas novidades tecnológicas e por isso é necessário manter debaixo de olho este site.

Até a próxima

Tags: , ,

Microsoft Dynamics CRM 2016

by Pedro Azevedo 8. September 2015 17:03

Boas pessoal,

Hoje tenho uma grande notícia pois foi anunciado a nova versão do Dynamics CRM, o Microsoft Dynamics CRM 2016, foi anunciado pelo Bob Stutz neste post que apelida esta versão “Um marco da empresa para reinventar a produtividade”, conjuntamente com o post a Microsoft lançou este vídeo que resume as principais novidades desta versão:

Esta nova versão está inserida no “fall release” que tinha o codename "Ara". Como sempre o CRM Online vai receber primeiro esta versão seguindo-se os clientes On-Premise.

Entre várias novidades destacamos uma maior integração com o Office 365 (Office 365 Groups, OneDrive para empresas, Sharepoint, Office Delve, Word, Excel, OneNote e Outlook) e PowerBI. De realçar que o Dynamics CRM vai estar mais integrado com a Cortana que aparece por defeito no Windows 10 e que já estava nos Windows Phone.

Também se esperam novidades para o Dynamics Marketing ("Capella"), and Social Engagement ("Corvus").

Brevemente devo fazer outro post com o “Release Preview Guide” desta versão.

 

Até a próxima.

Tags: ,

Registar resposta de campanha numa oportunidade

by Pedro Azevedo 2. June 2015 11:55

Boas pessoal,

Mais uma vez aproveito este espaço para responder a uma pergunta do fórum do MSDN tem sido uma boa fonte de inspiração. Desta vez a pergunta era como poderíamos gravar a referência para a resposta de campanha quando a transformamos numa oportunidade, ou seja, quando convertemos uma resposta de campanha numa oportunidade, como podemos gravar a referência dessa resposta de campanha.

Foi algum que nunca tinha dado grande importância por isso fui ver qual era o comportamento por defeito e se o sistema já gravava por si só essa informação, pois não guarda a única coisa que guarda desta interação é a campanha onde está inserida esta resposta de campanha.

Próximo passo recorrer a um fluxo de trabalho, também não temos como obter esta informação quer na atualização da resposta de campanha, quer na criação da nova oportunidade. A abordagem a seguir foi tentar por Javascript apanhar a resposta da caixa de diálogo, aquando da conversão também sem sucesso. Depois fui para a documentação para ver se esta conversão estava assente em alguma mensagem, se assim fosse poderíamos registar nessa mensagem através de um plugin, tal como acontece quando por exemplo convertemos uma Lead num Oportunidade. Mais uma vez sem sucesso. Numa tentativa já desesperada (nem tanto foi mesmo para colocar algum drama Sorriso) fui ver o que a caixa de diálogo fazia por trás dos panos para tentar emular o comportamento através de uma caixa de diálogo personalizada, mas a coisa não se adivinha fácil por isso também deixei cair essa solução.

Eu poderia ter colocado logo a resposta correta mas penso que é bom sabermos as várias possibilidades que temos quando estamos a trabalhar com uma plataforma tão rica como esta, bom a solução que arranjei não é ideal pois baseia-se numa solução assíncrona e sem certezas que realmente vamos apanhar a resposta de campanha. Então a solução foi criar um plugin na mensagem de Create da Oportunidade. Daquilo que estive a estudar a primeira coisa que faço é saber se tem a referência a uma campanha, isto quer dizer que este Create poderá vir de uma conversão de resposta de campanha

public void Execute(IServiceProvider serviceProvider)
{
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
Entity newOpportunity = (Entity)context.InputParameters["Target"];

if (newOpportunity.Contains("campaignid"))
{
// Obtain the organization service reference.
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

FilterExpression filter = new FilterExpression(LogicalOperator.And);

ConditionExpression condExprRegarding =
new ConditionExpression("regardingobjectid", ConditionOperator.Equal, ((EntityReference)newOpportunity["campaignid"]).Id);
ConditionExpression condExprSubject = new ConditionExpression("subject", ConditionOperator.Equal, newOpportunity["name"]);

filter.Conditions.Add(condExprRegarding);
filter.Conditions.Add(condExprSubject);

QueryExpression query = new QueryExpression("campaignresponse");
query.Criteria = filter;
query.ColumnSet = new ColumnSet(new string[] { "activityid" });

EntityCollection campaignResponse = service.RetrieveMultiple(query);
if (campaignResponse.Entities.Count == 1)
{
EntityReference entRef = new EntityReference("campaignresponse", (Guid)campaignResponse.Entities[0]["activityid"]);
newOpportunity["new_respostadecampanhaid"] = entRef;
}
else if (campaignResponse.Entities.Count <= 0)
{
//Erro
}
else
{
//Erro
}
}
}
}

Até a próxima.

Tags: , , ,

Gestão da edição em massa

by Pedro Azevedo 28. May 2015 10:14

Boas pessoal,

Mais uma vez estou aqui para falar-vos de uma solução para uma pergunta nos fóruns. A questão era prevenir a abertura de um formulário quando o tipo de formulário seja Edição Rápida, sem ler uma segunda vez a questão respondi rapidamente com este pedaço de código:

var formType= Xrm.Page.ui.getFormType();
if(formType == 6) { //Bulk Edit
    var items = Xrm.Page.ui.formSelector.items.get();
    for (var i in items) {
        var form= items[i];
        
        if (form.getLabel() == "Information") {
            form.navigate();
        }
    }
}

Erro meu pois tive logo uma resposta a dizer que não tinha funcionado e logo se fez luz, nos formulário de edição rápida a execução de Javascript está desabilitada. Já tinha tido este problema em versões anteriores então bastava ver se a resolução era idêntica, devo apenas chamar atenção que esta solução não é suportada.

Então a solução passar por primeiro adicionar a entidade que queremos ativar o Javascript numa solução e exportar essa mesma solução, extraímos a solução e editamos o ficheiro customizations.xml, procurem o formulário que querem correr o Javascript e dentro desse formulário procurem a tag events, vejam o exemplo:

<event name="onload" application="false" active="false">
  <Handlers>
    <Handler functionName="BulkEdit.OnLoad" libraryName="mvp_/scritps/bulkedit.js" handlerUniqueId="{a32493d2-a2d6-1ccd-2a0a-1cabcd6e9898}" enabled="true" parameters="" passExecutionContext="false" />
  </Handlers>
</event>

Sobre a tag event vamos adicionar o seguinte atributo BehaviorInBulkEditForm=”Enabled”

<event name="onload" application="false" active="false" BehaviorInBulkEditForm="Enabled">
  <Handlers>
    <Handler functionName="BulkEdit.OnLoad" libraryName="mvp_/scritps/bulkedit.js" handlerUniqueId="{a32493d2-a2d6-1ccd-2a0a-1cabcd6e9898}" enabled="true" parameters="" passExecutionContext="false" />
  </Handlers>
</event>

De seguida gravamos o ficheiro voltamos a compactar o ficheiro e voltamos a importar a solução. Se voltarmos a abrir o formulário de edição em massa ele vai dar erro, isto porque este formulário como vocês podem reparar não tem um seletor de formulários por isso a invocação a este objeto vai dar erro.

O objetivo da pergunta era a necessidade de abrir um formulário específico. Para vossa informação o formulário escolhido para a edição em massa é o último formulário que abrimos para essa entidade, ou seja, ao abrirmos uma entidade ele abre num determinado formulário, se mudarmos esse formulário a edição em massa vai abrir nesse último formulário.

A questão não parece mas é bastante complexa então e para não me alongar muito, neste post eu vou só demonstrar como detetar o formulário e se não for o correto dar uma mensagem e fechar esse mesmo formulário, num futuro post tratamos de abrir a edição em massa num respectivo formulário.

Um dos problemas é não termos o seletor de formulários por isso temos um problema de identificar se é um determinado formulário. Então a solução que arranjei foi buscar um determinado campo que apenas está presente nesse formulário. Se não for envio uma mensagem ao utilizador e fecho o formulário:

function OnLoad() {
    var field = Xrm.Page.getAttribute("reportingyear");
    if (!field) {
        Xrm.Utility.alertDialog("O formulário para edição em massa mal escolhido", AlertOk);
    }
}
 
function AlertOk() {
    Xrm.Page.ui.close();
}

Desta maneira conseguimos prevenir a abertura de um formulário em massa que não queiramos. Eu podia tentar abrir outro formulário em massa o problema é que a solução é complexa por isso deixamos para um post futuro.

Espero ter ajudado.
Se respondi a sua pergunta por favor marque como resposta e\ou como útil.

Tags:

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