CRM 2011 - Mudar label de campo bloqueado

by Pedro Azevedo 28. March 2014 08:27

Boas pessoal,

Mais um post rápido para responder a uma questão colocada no fórum do Dynamics CRM. A questão parece muito simples mas confesso que se complicou, por isso resolvi colocar aqui a solução e o porquê das várias soluções colocadas não funcionaram. E acabou por funcionar a primeira solução colocada (a minha por sinal Cool) que foi recorrer ao Javascript.

A questão era modificar a label do campo Opcional do formulário do Compromisso. Parece simples:

1ª Solução

Ir ao formulário e alterar a label (sei que não devia começar por esta solução mas dá jeito):

Isto vem assim por defeito e não há nada a fazer, vamos passar para a próxima solução.

2ª Solução

Alterar o nome da label directamente no campo, já que temos a opção de mudar o campo "Nome a Apresentar", diga-se que se nós modificarmos directamente no formulário e depois viermos a este campo, este deixa de funcionar passando a olhar só para o que colocarmos no formulário, mas como vimos anteriormente não conseguimos fazer isso. O nome lá colocado é "Participantes Opcionais" mudando para "Pessoal Opcional", vamos ver o que acontece:

Parece que não funcionou, o mais estranho é que aqui o nome da label do formulário já era diferente do nome a apresentar do campo. Então resta-nos uma alternativa, o javascript.

3ª Solução

Usar Javascript, ou seja no evento onload do formulário vamos colocar o seguinte código:

function onload() {
  var opAteendee = Xrm.Page.ui.controls.get('optionalattendees');
  opAteendee.setLabel('Novo Nome');
}

Vamos ver o resultado:

E finalmente funcionou.

Até a próxima.

Tags: , ,

Relatório Wizard - Limpar registos sem registos filho

by Pedro Azevedo 27. March 2014 02:54

Boas pessoal,

Hoje escrevo um post em resposta a uma dúvida do fórum de Dynamics CRM, como era difícil responder coloco aqui a resposta.

O objectivo é criar um relatório onde é listado por cliente as respectivas ordens de serviço. Este relatório é bastante simples e muito fácil de fazer através do wizard.

Vejam a configuração:

Nos ecrãs anteriores escolhi como registo primário o Cliente e como registo secundário o Incidente.

O problema é que o relatório coloca todos os clientes mesmo aqueles que não têm ordens de serviço e o objectivo é se o cliente não tiver ordens de serviço não aparecer no relatório. Vejam o resultado neste caso com incidentes.

Como podem verificar apenas o último cliente tem um incidente criado, como podemos limpar estes clientes sem incidentes. A solução foi simples:

Com isto previno que sejam mostrados clientes que não tenham tickets criados, não esquecer de colocar os mesmos critérios ao nível do cliente:

Uma solução simples e eficaz.

Até a próxima

Tags: , , ,

CRM 2013 - UR2

by Pedro Azevedo 25. March 2014 23:28

Boas pessoal,

Foi disponibilizado o UR2 do CRM 2013 e que podem transferir aqui. Para mais informações podem ver aqui.

Neste rollup para além da resolução de alguns issues também trás novidades ao nível do suporte para:

  • ·         Windows 8.1
  • ·         Internet Explorer 11
  • ·         iOS7 com o Safari no iPad e iPad air
  • ·         Windows Server 2012 R2

Outra novidade foi o retorno do botão Gravar e Fechar:

Até a próxima.

Tags: , , ,

CRM 2013 Javascript Object Model - Atributos

by Pedro Azevedo 15. March 2014 23:52

Boas pessoal,

 Como prometido vamos dar casos de chamadas de cada um dos métodos disponíveis ao nível do atributo. Para termos acesso a um atributo utilizámos a função Xrm.Page.data.entity.attributes.get(“…”) ou o “atalho” Xrm.Page.getAttribute(“…”).

 getAttributeType()

 Valores que pode devolver este método:

  • boolean
  • datetime
  • decimal
  • double
  • integer
  • lookup
  • memo
  • money
  • optionset
  • string
function getAttributeTypeTest() {

                var exampleOfAttributeTest = "subject do tipo " + Xrm.Page.getAttribute("subject").getAttributeType() + "\n";

                exampleOfAttributeTest += "fullname do tipo " + Xrm.Page.getAttribute("fullname").getAttributeType() + "\n";

                exampleOfAttributeTest += "telephone1 do tipo " + Xrm.Page.getAttribute("telephone1").getAttributeType() + "\n";

                exampleOfAttributeTest += "emailaddress1 do tipo " + Xrm.Page.getAttribute("emailaddress1").getAttributeType() + "\n";

                exampleOfAttributeTest += "websiteurl do tipo " + Xrm.Page.getAttribute("websiteurl").getAttributeType() + "\n";

                exampleOfAttributeTest += "revenue do tipo " + Xrm.Page.getAttribute("revenue").getAttributeType() + "\n";

                exampleOfAttributeTest += "numberofemployees do tipo " + Xrm.Page.getAttribute("numberofemployees").getAttributeType() + "\n";

                exampleOfAttributeTest += "industrycode do tipo " + Xrm.Page.getAttribute("industrycode").getAttributeType() + "\n";

                exampleOfAttributeTest += "campaignid do tipo " + Xrm.Page.getAttribute("campaignid").getAttributeType() + "\n";

                exampleOfAttributeTest += "lastusedincampaign do tipo " + Xrm.Page.getAttribute("lastusedincampaign").getAttributeType() + "\n";

                exampleOfAttributeTest += "decisionmaker do tipo " + Xrm.Page.getAttribute("decisionmaker").getAttributeType() + "\n";

               

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

}

getFormat()

Este método pode retornar os valores presentes na coluna “Valor do formato”, os outros valores representam o mapeamento que pode haver:

Tipo de Campo

Opção do Formato

Tipo de Atributo

Valor do formato

Date and Time

Date Only

datetime

date

Date and Time

Date and Time

datetime

datetime

Whole Number

Duration

integer

duration

Single Line of Text

E-mail

string

email

Whole Number

Language

optionset

language

Whole Number

None

integer

none

Single Line of Text

Text Area

string

textarea

Single Line of Text

Text

string

text

Single Line of Text

Ticker Symbol

string

tickersymbol

Single Line of Text

Phone

string

phone

Whole Number

Time Zone

optionset

timezone

Single Line of Text

Url

string

url

function getFormatTest() {

                var exampleOfAttributeTest = "subject tem o formato " + Xrm.Page.getAttribute("subject").getFormat() + "\n";

                exampleOfAttributeTest += "fullname tem o formato " + Xrm.Page.getAttribute("fullname").getFormat() + "\n";

                exampleOfAttributeTest += "telephone1 tem o formato " + Xrm.Page.getAttribute("telephone1").getFormat() + "\n";

                exampleOfAttributeTest += "emailaddress1 tem o formato " + Xrm.Page.getAttribute("emailaddress1").getFormat() + "\n";

                exampleOfAttributeTest += "websiteurl tem o formato " + Xrm.Page.getAttribute("websiteurl").getFormat() + "\n";

                exampleOfAttributeTest += "revenue tem o formato " + Xrm.Page.getAttribute("revenue").getFormat() + "\n";

                exampleOfAttributeTest += "numberofemployees tem o formato " + Xrm.Page.getAttribute("numberofemployees").getFormat() + "\n";

                exampleOfAttributeTest += "industrycode tem o formato " + Xrm.Page.getAttribute("industrycode").getFormat() + "\n";

                exampleOfAttributeTest += "campaignid tem o formato " + Xrm.Page.getAttribute("campaignid").getFormat() + "\n";

                exampleOfAttributeTest += "lastusedincampaign tem o formato " + Xrm.Page.getAttribute("lastusedincampaign").getFormat() + "\n";

                exampleOfAttributeTest += "decisionmaker tem o formato " + Xrm.Page.getAttribute("decisionmaker").getFormat() + "\n";

               

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

} 

getIsDirty()

function getIsDirtyTest() {

                Xrm.Utility.alertDialog(Xrm.Page.getAttribute("subject").getIsDirty());

}

De referir se tiver o autosave activado poderá não apanhar que o campo está dirty porque quando ocorre um save esse campo deixa de estar nesse estado.

getIsPartyList()

function getIsPartyListTest() {
                Xrm.Utility.alertDialog(Xrm.Page.getAttribute("ownerid").getIsPartyList());

}

getMaxLength()

function getMaxLengthTest() {

                var exampleOfAttributeTest = "subject tem o tamanho máximo " + Xrm.Page.getAttribute("subject").getMaxLength() + "\n";

                exampleOfAttributeTest += "fullname tem o tamanho máximo " + Xrm.Page.getAttribute("fullname").getMaxLength() + "\n";

                exampleOfAttributeTest += "telephone1 tem o tamanho máximo " + Xrm.Page.getAttribute("telephone1").getMaxLength() + "\n";

                exampleOfAttributeTest += "emailaddress1 tem o tamanho máximo " + Xrm.Page.getAttribute("emailaddress1").getMaxLength() + "\n";

                exampleOfAttributeTest += "websiteurl tem o tamanho máximo " + Xrm.Page.getAttribute("websiteurl").getMaxLength() + "\n";

               

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

} 

Se estavam com atenção utilizei o mesmo código que nos métodos anteriores, mas retirei alguns dos campos pois não contêm este método, só os atributos do tipo string e memo têm este método.

getName()

function getNameTest() {

                Xrm.Utility.alertDialog(Xrm.Page.getAttribute("subject").getName());

}

getParent()

getRequiredLevel()

Possíveis valores de retorno:

  • none
  • required
  • recommended
function getRequiredLevelTest() {         

                var exampleOfAttributeTest = "subject tem este nível de obrigatoriedade " + Xrm.Page.getAttribute("subject").getRequiredLevel() + "\n";

                exampleOfAttributeTest += "telephone1 tem este nível de obrigatoriedade " + Xrm.Page.getAttribute("telephone1").getRequiredLevel() + "\n";

                exampleOfAttributeTest += "companyname tem este nível de obrigatoriedade " + Xrm.Page.getAttribute("emailaddress1").getRequiredLevel() + "\n";

               

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

}

setSubmitMode(“mode”)

Este método define o modo que um campo se vai comportar aquando da sua gravação na BD. Por defeito tem o valor dirty e só vai ser gravado caso existe alterações nesse campo. Se queremos que o campo seja sempre gravado na BD utilizamos o valor always e never para nunca ser gravado. Este método é muito utilizado quando um controlo está disabled na UI, pois estando disabled o CRM coloca-o com o valor never, mas se o alterarmos em background teremos que colocar o valor always.

function setSubmitModeTest() {

                Xrm.Page.getAttribute("telephone1").setSubmitMode("always");

                Xrm.Page.getAttribute("companyname").setSubmitMode("never");

}

getSubmitMode()

function getSubmitModeTest() {           

                var exampleOfAttributeTest = "subject tem este modo de submissão " + Xrm.Page.getAttribute("subject").getSubmitMode() + "\n";

                exampleOfAttributeTest += "telephone1 tem este modo de submissão " + Xrm.Page.getAttribute("telephone1").getSubmitMode() + "\n";

                exampleOfAttributeTest += "companyname tem este modo de submissão " + Xrm.Page.getAttribute("companyname").getSubmitMode() + "\n";

               

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

}

getUserPrivilege()

Esta função retorna um objecto que nos diz que operações se pode realizar sobre o atributo mediante o nível de segurança (Field Level Security) sobre esse mesmo atributo. Este objecto tem três propriedades: canRead, canUpdate, canCreate.

function getUserPrivilegeTest() {

                var exampleOfAttributeTest = "Para o campo subject ele pode ler " + Xrm.Page.getAttribute("subject").getUserPrivilege()["canRead"] + "\n";

                exampleOfAttributeTest += "Para o campo subject ele pode criar " + Xrm.Page.getAttribute("subject").getUserPrivilege()["canCreate"] + "\n";

                exampleOfAttributeTest += "Para o campo subject ele pode actualizar " + Xrm.Page.getAttribute("subject").getUserPrivilege()["canUpdate"] + "\n";

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

}

getValue()

function getValueTest() {

                Xrm.Utility.alertDialog(Xrm.Page.getAttribute("subject").getValue());

}

Aqui gostava de ressalvar uma particularidade, quando estamos a tratar de lookups para obter informação teremos que fazer algo do género:

Xrm.Page.getAttribute("subject").getValue()[0].id //Obter o guid desse registo
Xrm.Page.getAttribute("subject").getValue()[0].name //Obter o guid o texto do registo
Xrm.Page.getAttribute("subject").getValue()[0]entityType //Obter o tipo de entidade desse registo

setValue(value)

function setValueTest() {

                Xrm.Page.getAttribute("subject").setValue("Novo Valor");

}

setRequiredLevel()

function setRequiredLevelTest() {

                Xrm.Page.getAttribute("jobtitle").setRequiredLevel("required");

} 

 

getMax()

function getMaxTest() {

                var exampleOfAttributeTest = "Valor máximo do campo revenue " + Xrm.Page.getAttribute("revenue").getMax() + "\n";

                exampleOfAttributeTest += "Valor máximo do campo número de empregados " + Xrm.Page.getAttribute("numberofemployees").getMax() + "\n";

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

}

Como podemos ver este método funciona apenas para campos numéricos.

getMin()

function getMinTest() {

                var exampleOfAttributeTest = "Valor mínimo do campo revenue " + Xrm.Page.getAttribute("revenue").getMin() + "\n";

                exampleOfAttributeTest += "Valor mínimo do campo número de empregados " + Xrm.Page.getAttribute("numberofemployees").getMin() + "\n";

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

}

getPrecision()

function getPrecisionTest() {

                var exampleOfAttributeTest = "Número de casas decimais no campo revenue " + Xrm.Page.getAttribute("revenue").getPrecision() + "\n";

                exampleOfAttributeTest += "Número de casas decimais no campo número de empregados " + Xrm.Page.getAttribute("numberofemployees").getPrecision() + "\n";

                Xrm.Utility.alertDialog(exampleOfAttributeTest);

}

setPrecision(value)

function setPrecisionTest() {

                Xrm.Page.getAttribute("new_float").setPrecision("2");

                Xrm.Utility.alertDialog(Xrm.Page.getAttribute("new_float").getPrecision());

}
 

Espero que tenham gostado deste nova categoria de posts. Mais virão...

 

Até a próxima.

Tags: , , , ,

Convergence 2014 Atalanta

by Pedro Azevedo 6. March 2014 01:21

Boas pessoal,

Decorreu mais um Convergence desta vez em Atalanta e decorreu entre os dias 4 e 7 de Março. Este ano promete muitos releases do Microsoft Dynamics CRM, depois de um ano de “compras”. Quem quiser (aconselho muito) ainda se pode inscrever no Convergence Virtual e ver os vídeos, vejam aqui.

Vamos começar com alguns dados interessantes actualmente existem 40.000 clientes com 4 milhões de utilizadores. E vejam na imagem a seguir com dados muito concretos e animadores:

Mas vamos ao que nos levou aqui: NOVIDADES. Como sempre nada melhor do que começar com o roadmap do Microsoft Dynamics CRM.

 

Como podemos visualizar temos três releases deste produto muito em breve com o Leo, Libra e Mira. E mais para o final do ano com mais quatro releases programados: Libra, Vega, Hydra e Electra, para além da integração efectiva do Parature, também para o final do ano.

Vamos falar primeiro deste próximos três releases que temos vindo a falar:

Microsoft Dynamics Marketing - Mira

Esta ferramenta promete tornar-se numa plataforma colaborativa na Cloud, para os profissionais de Marketing. Estou a denominar uma ferramenta, pois vai ser uma aplicação a parte do Dynamics CRM, mas como é óbvio com uma integração através de um conector. Vejam a seguir um resumo do que esta ferramenta se propõe:

Já com vários ecrãs conhecidos, podemos ver que foi garantida a consistência de look com o Dynamics CRM 2013, apesar de existir um novo menu drilldown. Até ao “Assets & Media” tudo bem, mas ao seleccionarmos este tile aparece outro menu com todas as opções. Uma pergunta que fica é se este menu vai ser expandido para o Dynamics CRM:

Outro ponto muito importante é o planeamento da campanha, uma forma visual e com um workflow e com caminhos alternativos, podemos fazer coisas do género: caso o cliente não abra o email realizar um telefonema passado uma semana.

A possibilidade de ter um sistema de pontuação de Leads será uma ferramenta muito importante. E vejam no slide a seguir que podemos dar uma pontuação diferente mediante a acção do cliente:

Como disse esta ferramenta vai trabalhar externamente do Dynamics CRM, por isso é importante sabermos como nos vamos poder conectar:

Como vamos ver mais a frente foi incluída um novo tipo de licença para podermos tirar partido desta nova ferramenta.

Microsoft Social Listening - Subra

Mais uma ferramenta que vem de outra compra da Microsoft a Netbreeze, mais uma vez vai trabalhar fora do Dynamics CRM. Toda a interface e funcionamento do NetBreeze foi revista para o ambiente Dynamics CRM e tecnologias Microsoft, por exemplo vai assentar totalmente sobre a plataforma Azure, vejam aqui mais alguns dos principais pontos desta “remodelação”:

 

Um dos grandes objectivos desta ferramenta é saber qual o sentimento que a nossa marca ou um concorrente tem na internet, para isso o cálculo do sentimento é uma parte muito importante:

Vejam a seguir a configuração de listas para podermos seguir tópicos nas redes sociais:

 

Apesar de este ser um grande acréscimo ao Dynamics CRM e ao contrário do Dynamics Marketing esta ferramenta poderá não acarretar novos custos, por exemplo uma empresa com mais que 10 licenças profissionais, vão receber as novas capacidades sociais sem aumento de preço, neste momento está em $65 por utilizador e por mês, isto no CRM Online porque nas versões On-Premise existirá um aumento de $20 por mês para ter estas novas capacidades sociais.

Módulo de Serviço – Leo

Antes da integração do Parature que foi comprado no início do ano e que vem reforçar este módulo com mais funcionalidades para o apoio ao cliente, este módulo vai reforçado com novas funcionalidades. O Leo foi confirmado que será tanto para online como para on-premisse Vejam a seguir um resumo dos objectivos deste novo release:

Sendo mais concreto ao nível das novas funcionalidades temos o seguinte:

  • ·         O cliente móvel irá ter mais entidades deste módulo;
  • ·         Gestão dos incidentes com a noção de pai-filho;
  • ·         Gestão embutida de SLAs:

  • ·         Unified Service Desk, que vem substituir o CCA (Customer Care Accelerator) com um nível de integração maior:

 

  • ·         Uma nova entidade Entitlement, daquilo que percebi uma melhor gestão de contrato;
  • ·         Melhoria na gestão das filas;

A seguir podem ver estas e outras melhorias anunciadas:

Mas este release não se fica apenas pelo módulo de serviço e inclui diversas melhorias:

  • ·         Foi retirado o iFrame para o sharepoint, tendo neste momento um processo de sincronização, presumo que utilizando a API do Sharepoint;
  • ·         Uma aplicação android para tablets;
  • ·         Sincronismo com o Exchange online, deixa de haver a necessidade de instalar o Email Router;
  • ·         Melhoria na gestão das instâncias online:

 

·         Outras melhorias na plataforma:

Alguns detalhes sobre os releases depois da “Spring Wave”:

Libra e Hydra

Vega

Electra

Parature Integration

 

 

Foram algumas informações recolhidas, mais uma vez via o twitter, são genéricas mas dá para ter uma ideia do que está para vir.

Já agora está combinado o próximo Convergence que será aqui “perto” em Barcelona.

 

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