Addon Microsoft Dynamics CRM

by Pedro Azevedo 26. February 2014 21:38

Boas pessoal,

Uma das resoluções que tinha era contribuir com uma solução que permita melhorar o Dynamics CRM. Inspirado nos live tiles do Windows Phone e Windows 8, penso que ter uma visualização rápida e apelativa de um conjunto de registos. Sempre adorei a ideia de ter quadrados vivos (e penso que é um dos grandes diferenciativos que existe perante outros sistemas operativos móveis) sempre a mostrar informação e por essa razão quero implementar a mesma ideia dentro do Dynamics CRM.

A ideia deste post é apresentar como funcionará este “addon”. Comecei com um teste de conceito, veja este pequeno vídeo:

Depois de ter comprovado a sua utilidade vem o mais difícil, conseguir uma configuração o mais genérica possível. Como vimos no vídeo este addon pode ter quatro tipos de “quadrados”, denominados por live-tile:

  • ·         Flip
  • ·         Slide
  • ·         Carrousel
  • ·         Quadrante

Para além de escolher o tipo de live-tile teremos que escolher a entidade relacionada, ou seja, num cliente por exemplo queremos ver todas as oportunidades e propostas em aberto, contactos e um resumo das actividades, no fundo ter uma forma visual das subgrids.

Depois dentro de cada entidade relacionada a mostrar quais as propriedades que vamos querer mostrar.

Depois de configurar é só colocarmos o Recurso Web daquele tipo e já está. Vamos ver se consigo uma primeira versão no meio de Maio.

 

Até a próxima.

Tags: , , , ,

Esconder botão dinâmicamente ribbon ou barra de comandos

by Pedro Azevedo 19. February 2014 23:30

Boas Pessoal,

Já queria fazer este post há muito tempo, mas fui adiando e nunca cheguei a criar sobre a versão CRM 2011. Por isso estou agora a fazê-lo sobre a versão CRM 2013 mas é similar a anterior, por isso poderão aplicar os mesmos conceitos sobre o CRM 2011.

Criei neste momento por causa de uma dúvida nos fóruns do MSDN, em que se quer inibir a criação de uma encomenda numa proposta. Neste caso o critério é que a razão de estado da oportunidade esteja preenchida e tem como requisito que seja feito via Javascript e não por plugin.

Para além de responder a questão do fórum este post tem como objetivo de ser um manual genérico para desabilitar um botão dinamicamente.

Bom o primeiro requisito é instalar esta ferramenta que podem ver aqui um pequeno manual.

A primeira coisa a fazer é criar uma solução que tenha a entidade Proposta (quote), depois desta solução criada teremos que fazer load dela na Ribbon Workbench e terá um layout deste género:

 

O que nós queremos é o botão que temos selecionado “Create Order” estar visível apenas quando uma determinada função Javascript retornar true. Para isso sobre este botão “Create Order” e com o botão direito do rato, carregar “Customise Button”, quando fazemos isto ele deve acrescentar o comando de criar encomenda na tab “Solution Elements”:

Para já aqui é tudo, voltamos mais a frente. Agora vamos criar uma regra de enable, na entrada “Enable Rules” escolham “Add New”:

 

Ele cria uma nova entrada, se quiserem podem modificar o nome, sobre esta nova entrada carreguem em “Add Rule”:

 

Com isto deve aparecer uma lista de regras que podemos aplicar, no nosso caso será uma regra de Javascript.

 

Depois de confirmarmos que queremos uma regra de Javascript, basta dizer qual a função a ser chamada e sobre qual o recurso web queremos aplicar.

Como podem comprovar vou chamar a função Javascript enablequotebutton do recurso web que especifiquei, este recurso web terá que estar na solução que carregamos dentro da ferramenta, neste caso na solução TesteRibbon.

O código presente neste webresource é o seguinte:

function enablequotebutton(){
  LoadWebResource('new_json');
  LoadWebResource('new_jquery');
  LoadWebResource('new_xrmservicetoolkit');
 
  var opId = Xrm.Page.getAttribute("opportunityid").getValue()[0].id;
  var cols = ["statuscode"];
  var retrievedOpportunity = XrmServiceToolkit.Soap.Retrieve("opportunity", opId, cols);

  if(retrievedOpportunity.attributes["statuscode"].value != 1){
    return true;
  }
  else{
    return false;
  }
}

function LoadWebResource(resource) {
  httpRequest = new XMLHttpRequest();
  httpRequest.open("GET", "/webresources/" + resource, false);
  httpRequest.send(null);
  try
    {
      eval(httpRequest.responseText); 
    }
    catch (e)
    {
      alert("Erro");
    }
}

Como podem ver no troço de código anterior estou a utilizar uma função auxiliar para poder carregar bibliotecas Javascript, pois estou a utilizar a biblioteca XrmServiceToolkit para poder ir buscar propriedades da oportunidade associada a proposta.

Depois disto não esqueçam de publicar a solução na Ribbon Workbench.

Até a próxima.

Tags: , , , , ,

Ferramenta - Site Map Editor

by Pedro Azevedo 12. February 2014 23:47

 Boas pessoal,

Continuando a série sobre ferramentas, esta ferramenta permite editar o site map. Bom no CRM 2011 permitia mexer no menu a esquerda, no CRM 2013 serve para editar a Barra de Navegação. Eu vou demonstrar sobre a versão CRM 2013 mas é similar para a versão do CRM 2011.

A ferramenta que utilizo realizada pela Microsoft foi retirada do Pinpoint. Por isso o nosso amigo Scott Durow disponibilizou noutro sítio.

Depois de fazerem download da solução e a instalarem, terão esta entrada nas várias soluções:

Ao abrirmos esta solução, ele vai abrir no modo configuração e aparecer a página que permite editarmos o site map.

Aqui podemos adicionar\eliminar áreas, grupos e os próprios elementos aqui designados como subarea. Basicamente são os três botões mais a direita. O botão de save permite guardar as configurações mas não publica as alterações, por isso teremos que publicar todas as customizações. Outra funcionalidade que podermos reorganizar os vários elementos com um simples drag na drop.

Sobre cada elemento temos várias opções:

 

Aqui configuramos as áreas, em que costumamos a ter as áreas de Vendas, Marketing, Serviço, Definições e o Help. Ou seja são as seguintes áreas:

A seguir podemos definir as propriedades do grupo:

 

Podemos ver o grupo do MyWork (em português “O Meu Trabalho”):

Vejam que os vários elementos estão agrupados em grupos e tem o tútulo que configuramos. Podemos ver o outro grupo que é o grupo “Clientes”.

A seguir podemos ver os elementos em concreto:

 

 

Aqui temos mais opções para configurar, mas penso que todos intuitivos.

E é isto uma ferramenta simples mas muito útil. Existe pelo menos mais uma alternativa que ainda não explorei mas prometo que vou explorar e digo-vos alguma coisa. A alternativa está dentro de um conjunto de ferramentas muito poderosa que é a XRMToolbox. Eu já uso algumas destas ferramentas, muito úteis. Mas com certeza será o meu próximo alvo de análise.

Até a próxima.

Tags: , , ,

CRM 2013 - Javascript Object Model

by Pedro Azevedo 8. February 2014 00:55

Boas pessoal,

O “object model” do Javascript permite-nos aceder aos elementos de um formulário do CRM, efectuar chamadas a API do CRM, etc. Desde o CRM 4.0 com o crmForm até ao mais recente Xrm que apareceu com o CRM 2011. O CRM 2011 (até ao UR12) ainda suportava a biblioteca do CRM 4.0 mas com o CRM 2013 essa compatibilidade foi totalmente quebrada, suportando tudo o que derivou do Xrm do CRM 2011.

Neste vídeo está um resumo muito bom do novo object model e de onde tirei a imagem a seguir:

Como nunca tinha feito um post completo de métodos Javascript, apenas falei esporadicamente, vou agora colocar alguns dos métodos que temos disponíveis desde o CRM 2011 e vou realçar as novidades no CRM 2013.

A biblioteca Xrm como vimos na imagem anterior é dividida em vários “namespaces”:

Xrm.Utility

alertDialog (CRM 2013)

Lança caixa de diálogo com uma mensagem

confirmDialog (CRM 2013)

Lança caixa de diálogo de confirmação com uma mensagem e dois botões. OK e Cancel

isActivityType (CRM 2013)

Determina se uma entidade é uma actividade

openEntityForm

Abre um formulário de uma entidade

openWebResource

Abre um Recurso Web HTML

openWebResourceDialog (CRM 2013)

Abre um Recurso Web específico com uma janela de diálogo. Esta função ainda não está disponível.

Xrm.Page.data

getIsValid (CRM 2013)

Realiza uma validação dos dados presentes no formulário

refresh (CRM 2013)

Permite a refrescamento dos dados do formulário sem que ocorra um refrescamento de toda a página.

save (CRM 2013)

Guarda os dados do formulário.

Xrm.Page.data.entity

addOnSave

Adiciona uma função a ser chamada quando um registo é gravado

getDataXml

Retorna um XML numa string que vai será enviada para o servidor quando um registo é gravado

getEntityName

Retorna o nome da entidade do registo

getId

Retorna o ID (guid) do registo

getIsDirty

Verifica se mexemos em algum dos campos do formulário

getPrimaryAttributeValue (CRM 2013)

Retorna o valor do atributo primário da entidade

removeOnSave

Remove a função que é chamada quando o registo é gravado

save

Guarda o registo com as opções de fechar ou novo

setFormDirty (CRM 2013)

Coloca o formulário dirty para forçar a gravação do formulário

Xrm.Page.context

client.getClient (CRM 2013)

Retorna qual o tipo de cliente que está a correr, outlook, web ou móvel

client.getClientState (CRM 2013)

Retona qual o estado do cliente se está online ou offline.

getClientUrl

Retorna o URL base usado para aceder a aplicação

getCurrentTheme

Qual o “theme” corrente no Microsoft Office Outlook

getOrgLcid

Retorna o LCID da linguagem base da organização

getOrgUniqueName

Retorna o nome da organização

getQueryStringParameters

Retorna um dicionário chave-valor que representa querystring passada a página.

getUserId

Retorna o ID (guid) do utilizador actual

getUserLcid

Retorna o LCID da linguagem escolhida pelo utilizador com linguagem preferida

getUserName (CRM 2013)

Retorna o nome do utilizador actual

getUserRoles

Retorna um array de IDs com as regras de segurança associadas ao utilizador

prependOrgName

Coloca o nome da organização no inicio de um caminho

Xrm.Page.ui

close

Fecha o formulário

formSelector.getCurrentItem

Retorna uma referência para o formulário activo

formSelector.items

Mostra todos os formulários disponíveis para o utilizador actual

getViewPortHeight

Altura do viewport em pixéis

getViewPortWidth

Largura do viewport em pixéis

getCurrentControl

Retorna o controlo que tem actualmente o focus

getFormType

Qual o contexto do formulário

navigation.items

Retorna todos os itens de navegação da página

setFormNotification (CRM 2013)

Coloca notificações no topo do formulário

clearFormNotification (CRM 2013)

Limpa notificações do formulário

refreshRibbon (CRM 2013)

Actualiza a ribbon

Collections

Xrm.Page.data.entity.attributes

Atributos numa página

Xrm.Page.ui.controls

Todos os controlos

Xrm.Page.ui.formSelector.items

Todos os formulários disponíveis para o utilizador

Xrm.Page.ui.navigation.items

Todos os items de navegação do formulário

Xrm.Page.ui.tabs

Todos os tabs de uma página

Xrm.Page.getAttribute("…").controls

Todos os controlos para um atributo

Xrm.Page.ui.tabs.get("…").sections

Todas as secções de um tab

Xrm.Page.ui.Section.controls

Todos os controlos de uma secção

Xrm.Page.getAttribute(“…”) ou Xrm.Page.data.entity.attributes

getAttributeType

Retorna o tipo de atributo

getFormat

Retorna o formato do atributo

getIsDirty

Se o atributo mudou depois da última gravação

getIsPartyList

Se um lookup é uma partylist

getMaxLength

Retorna o tamanho máximo de uma string que o atributo suporta

getName

Retorna o nome do atributo

getParent

Obter uma referência para o objecto Xrm.Page.data.entity que é pai de todos os atributos

getRequiredLevel

Se este atributo é obrigatório ou recomendado

getSubmitMode

Obtém como é que atributo vai ser submetido na gravação

getUserPrivilege

Previlégios de um utilizador usando o Field Level Security

getValue

Retorna o valor de um atributo

setValue

Afecta um atributo com um valor

setRequiredLevel

Afecta o nível de obrigatoriedade de um atributo

setSubmitMode

Como se vai comportar o atributo quando o registo for gravado

getMax

Retorna o máximo valor para o atributo

getMin

Retorna o mínimo valor para o atributo

getPrecision

Retorna as casas decimais

setPrecision (CRM 2013)

Faz override do número de casas decimais

Xrm.Page.getControl(“…”) ou Xrm.Page.ui.controls.get

getAttribute

Retorna o atributo que está associado ao controlo

getControlType

Retorna o tipo de controlo

getDisabled

Verifica se o controlo está disabled

setDisabled

Coloca um controlo disabled

getLabel

Retorna a label do controlo

setLabel

Coloca uma label num controlo

getName

Obtém o nome do controlo

getParent

Retorna a secção que o controlo está dentro

getVisible

Verifica se um controlo está visível ou não

setVisible

Coloca um controlo visível ou invisível

setFocus

Coloca o focus num determinado controlo

setNotification

Mostra uma mensagem ao nível do controlo. Para além de algum aviso de dados poderá ser utilizado como uma tooltip customizada

clearNotification (CRM 2013)

Limpa mensagens ao nível do controlo

Lookup Controls

addCustomFilter (CRM 2013)

Utiliza FetchXml para adicionar filtros adicionais a um controlo lookup

addCustomView

Adiciona uma nova vista a caixa de diálogo de um lookup

addPreSearch (CRM 2013)

Aplica uma função para filtrar o controlo lookup antes do popup abrir

getDefaultView

Retorna o ID da vista que está por defeito na caixa de diálogo de um lookup

setDefaultView

Afecta a vista por defeito na caixa de diálogo de um lookup

removePreSearch (CRM 2013)

Retira a função de filtragem dos controlos lookup

OptionSet

getInitialValue

Retorna o valor que uma caixa de selecção ou um booleano tem aquando da abertura do formulário

getOption[s]

Retorna uma ou mais opções

getSelectedOption

Obtém a opção que está seleccionada

getText

Retorna o texto de uma opção seleccionada

addoption

Adiciona uma opção

removeOption

Remove uma opção

clearOptions

Limpa todas as opções

IFRAME and Web Resource Controls

getData

Retorna a querystring passado a um Recurso Web Silverlight

setData

Atribuir valor a querystring de um Recurso Web Silverlight

getInitialUrl

Retorna o URL por defeito que um controlo iFrame é configurado

getObject

Retorna o objecto que representa um iFrame ou Recurso Web

getSrc

Retorna o URL que vai ser mostrado num iFrame ou Recurso Web

setSrc

Coloca um URL para mostrar num iFrame ou Recurso Web

Sub-Grid Control

refresh

Refresca os dados mostrados num SubGrid

OnChange Event

addOnChange

Adiciona uma função a ser chamada quando um atributo é modificado

removeOnChange

Remove a função que iria ser chamada quando um atributo é modificado

fireOnChange

Causa a chamada ao evento OnChange

Datetime Controls

setIsAllDay (CRM 2013)

 

setShowTime (CRM 2013)

Especifica se um controlo de data mostra a componente tempo ou não

Ficou então uma referência rápida, em futuros posts espero falar de alguns destes métodos com exemplos concretos.

 

Até a próxima

Tags:

CRM 2013 - Gestão dos Formulários de Criação Rápida

by Pedro Azevedo 2. February 2014 15:53

Boas pessoal,

Depois de vermos como funcionam os formulários de criação rápida vamos agora ver em concreto como é que estes formulários são criados e como os podemos configurar.

Como foi dito no post anterior algumas entidades (tirando algumas entidades para suporte interno e as actividades onde se inclui as actividades customizadas) podem ter um formulário criação rápida, para comprovar vamos habilitar a entidade Campanha para ter formulário de criação rápida. Para isso nas configurações da entidade temos o setting “Permitir criação rápida” para permitir a criação rápida:

 

Se voltarmos a barra de navegação não vamos ver a entrada para a campanha, isto porque apesar de dizermos que permitimos a criação rápida ainda falta configurar esse formulário. Para criarmos um formulário de criação rápida vamos aos formulários e criamos um formulário deste tipo:

 De seguida aparece-me um formulário para eu poder colocar campos existentes, o layout deste formulário está estabelecido e não dá para modificar, nem para adicionar novas secções por exemplo:

Não sei se repararam mas eu deixei o tabulador no “Inserir” de propósito para vermos que para além do layout, não podemos inserir iFrames, Recursos Web ou Sub-Grids.

Depois de gravarmos o formulário e publicarmos já podemos criar uma campanha rápida:

Se seleccionarmos a campanha ele vai aparecer o formulário que nós configuramos, mas ao gravarmos este mesmo formulário ele dá um erro de SQL Server, um erro que não é nada perceptível. Mas o erro foi propositado, o erro é porque eu não adicionei ao formulário de criação rápida os campos obrigatórios.

 Para resolver voltei a configuração do formulário e adicionei o campo obrigatório neste caso seria o nome. Depois de adicionar esse campo já consegui criar uma campanha através do formulário rápido.

Vamos experimentar outra situação que é criar um outro formulário de criação rápida, ao contrário do que acontece com os formulários principais não podemos associar perfis de segurança, por essa razão ele vai mostrar sempre o primeiro que criamos para mostrarmos por exemplo o segundo que criamos teremos que utilizar a funcionalidade “Ordenar Formulário” e escolher a opção de “Definir Formulário de Criação Rápida”.

 

Ak

Um funcionalidade simples e que vai dar muito útil.

 

Até a próxima.

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