CRM 2011 - UR18

by Pedro Azevedo 29. September 2014 06:32

Boas pessoal,

Está disponível o Update Rollup 18 para o CRM 2011, podem descarregar aqui. Todas as informações estão disponíveis aqui com todos os dados e novidades.

Este é mais um update que apenas tem resoluções de issues.

Até a próxima.

Tags:

CRM 2013 SP1 - UR1

by Pedro Azevedo 28. September 2014 16:37

 

Boas pessoal,

Foi disponibilizado o UR1 do CRM 2013 SP1 (v6.1.1), tal como tinha avisado neste momento existem duas “frentes” no CRM 2013, para quem instalou o CRM 2013 SP1 e quem não instalou.

Este update é para quem tem o SP1, para quem não tem recentemente saiu o UR3. Este rollup pode-se transferir aqui. Para mais informações podem ver aqui, este rollup contém mais 94 issues resolvidos.

 

Até a próxima.

Tags: , , ,

Nomeação de MVP: Balanço e Resoluções

by Pedro Azevedo 27. September 2014 16:22

Boas pessoal,

Hoje estou aqui para anunciar que me candidatei oficialmente a ser MVP do Microsoft Dynamics CRM, isto depois de dois amigos da comunidade me terem proposto para esta nomeação.

O programa MVP é uma iniciativa da Microsoft para premiar as pessoas que mais se destacaram dentro da comunidade. Existem MVPs para várias tecnologias, Azure, ASP .NET, C#, SQL Server, etc. Não quer dizer que estas pessoas são as melhores destas tecnologias mas sim que participaram ativamente na comunidade, com posts, eventos, livros, participação nos fóruns, etc. Este programa não tem nenhuma mais valia monetária e é válida por 1 ano. Depois desse ano o MVP é novamente avaliado e a nomeação pode ser renovada ou não. Existem nomeações e renovações de 3 em 3 meses. Eu candidatei-me muito perto do final deste mês por essa razão não sei se estou a entrar na vaga para Outubro. Se dia 1 de Outubro houver um post no meu blog é porque fui nomeado MVP Laughing.

Para poder candidatar-me tive que tirar reunir os vários dados sobre a minha participação na comunidade e decidi partilhar com vocês:

A minha participação na comunidade começou no final do ano de 2012, escrevi 83 posts no meu blog sobre o Dynamics CRM. Para quem me segue desde o início sabe que tive outro blog, mas não gostava do nome e comecei este. Por isso foi feita uma transição lenta de um para o outro e só acabei efetivamente com o outro em Setembro. Até aí fui escrevendo neste e transpondo os posts do velho para este.

Em relação a estatísticas deste blog, só liguei este blog ao Google Analytics depois de Março de 2014 e os números foram estes:

  • 1020 sessões, e 671 utilizadores;
  • 2035 visualizações de páginas.

Penso que não está mal para um blog novo e que muitos posts foram sendo colocados do antigo. A minha plateia como não poderia de ser é maioritariamente de língua portuguesa (878 sessões) e com maior prevalência para seguidores do Brasil.

Para além do blog, participei ativamente nos fóruns de discussão e em algumas comunidades técnicas nomeadamente NetPonto, Portugal a Programar e numa conferência organizada por estudantes de engenharia informática a ENEI, em resumo realizei três palestras e dois workshops.

Fui pondo aos poucos as apresentações no slideshare e já conto com um total de 762 visualizações nas três apresentações que fiz upload.

Nos fóruns de discussão estou atualmente com 5.585 pontos, podem ver aqui mais detalhes sobre a minha participação nos fóruns de discussão. Se virem com atenção houve uma redução na conquista de pontos depois de tomar a decisão de participar apenas nos fóruns em português, basicamente não existe falta de contribuição nos fóruns em inglês existem muitas pessoas a participar, onde existem resposta em menos de 5 minutos. Também contribuo ativamente no Stackoverflow (3.048 pontos).

Penso que a decisão de participar no fórum em Português levou a que houvesse uma participação mais ativa e energética pudesse estimular mais pessoas a utilizar.

Neste âmbito em Julho de 2013 fui nomeado MCC (Microsoft Community Contributor) vejam aqui mais detalhes. Até hoje mantenho esta nomeação.

Outro tipo de contribuição é o que estou a publicar neste momento, que é um add-on para o Microsoft Dynamics CRM, o objetivo deste add-on é termos uma forma interativa para navegar sobre os registos do CRM. Diverti-me e aprendi imenso com esta experiência e espero que seja um sucesso.

Mas a principal descoberta que fiz e onde estou também a contribuir foi o twitter, tem sido uma experiência muito boa, temos a possibilidade rapidamente estar atualizado com as últimas novidades.

Resoluções para depois de Outubro:

Aquilo que sinto é que quanto mais participo mais coisas quero fazer, por essa razão já tenho planeado para o ano de 2015 poder falar em comunidades técnicas pelo menos mais 3 vezes sobre o Dynamics CRM.

Outro objetivo e que quero concretizar brevemente é a publicação de pelo menos dois artigos na revista Portugal a Programar. Um dos primeiros está em fase avançada, e o outro no espero lançar no decorrer do ano.

Tenho outro add-on para publicar e que estou praticamente acabar e que já tinha falado nele aqui. Outra coisa que quero fazer é abrir o código fonte do add-on que estou a publicar neste momento.

A participação nos fóruns de discussão é para continuar, a mudança para o fórum só em português veio libertar tempo para eu poder contribuir de outras maneiras para a comunidade. E espero conseguir que mais pessoas a falar português o utilizem.

Ao nível das redes sociais, como disse adoro o twitter, mas tenciono começar a participar mais ativamente tanto no Facebook e Linkedin.

Tenho um objetivo mais ambicioso mas também mais difícil de concretizar, que é formar uma comunidade de Microsoft Dynamics onde se falasse tanto do ERP e do CRM. É algo que quero trabalhar mais a sério no ano de 2015.

Penso que foi são dois anos em cheio. E estou a ultrapassar os meus objetivos que era dar o que a comunidade me tinha dado, já que foi com ela que eu aprendi a trabalhar com o Dynamics CRM. Penso que também é importante falar destas plataformas em português e poder publicitar de forma a que se torne cada vez mais uma alternativa.

 

Para finalizar e quem achar que mereço ser nomeado como MVP pode ajudar preenchendo aqui o formulário.

 

Até a próxima.

Tags: , , , ,

Novos releases - CRM 2015

by Pedro Azevedo 26. September 2014 20:01

Boas pessoal,

Estas duas semanas têm sido repletas de novidades, tanto ao nível do Microsoft Dynamics CRM como na minha vida profissional.

Hoje vou falar do update denominado como CRM 2015. Para além disso saiu o UR1 para o SP1, o UR18 para o CRM 2011 e candidatei-me a MVP da Microsoft para a tecnologia Microsoft Dynamics CRM, mas cada um destes assuntos vai ter um post durante este fim-de-semana.

Este é um major release que estava denominado como “Vega” e está previsto para sair no final do ano. Já tínhamos visto um slide com as principais novidades do WPC 2014.

Para este post estou-me a basear essencialmente e mais uma vez no Release Preview lançado pela Microsoft. Este update baseia-se nos seguintes produtos:

  • Microsoft Dynamics CRM 2015 (on-premise será a versão 7.0)
  • Microsoft Dynamics CRM Online (2015 Update)
  • Microsoft Dynamics Marketing (2015 Update – Teremos que aplicar o update manualmente)
  • Microsoft Social Listening (2014 R2)

 

Microsoft Dynamics Marketing

Este update veio melhorar e muito este novo produto (que saiu com o major release anterior denominado como Leo), que para além da sua expansão para a Rússia e China, trouxe outras novidades:

Novo Editor de Emails

Um novo editor de email que possibilita criarmos um email através de templates ou de raiz, onde temos a hipótese de compormos o email através de drag and drop ou para utilizadores mais avançados utilizar um editor para HTML e CSS.

Consola de gestão de uma campanha

De modo a aumentar a confiança de quem faz marketing foram incluídos melhorias ao nível das condições múltiplas e a inclusão de testes A/B, que vai permitir uma maior confiança:

Integração com o Social Listening

A integração do social listening no Microsoft Dynamics Marketing, possibilitando a visualização do sentimento perante as campanhas realizadas:

 

Painel de colaboração com as vendas

A introdução de um painel de colaboração com as vendas, possibilita haver uma maior comunicação e maiores sinergias entre o Marketing e as Vendas, possibilitando as vendas de introduzir informações nas campanhas e poder aumentar os dados para o Marketing, bem como as vendas poderem registar-se em eventos que aconteçam em campanhas:

B2B Marketing

A capacidade de gestão de leads foi aumentada com integração de webinar, a capacidade de classificarmos a lead foi aumentada com a introdução de modelos múltiplos para a classificação das leads:

 

Gestão de recursos

A introdução de um calendário de Marketing vem possibilitar visualizar o plano e as suas principais metas e ter outra visão geral sobre o mesmo e com mais opções de colaboração com a integração com o Lync.

Automação de processos internos

Com um processo de aprovação e poder controlar o status de cada atividade e poder alinhar cada equipa com os objetivos delineados:

Vendas

Processos de vendas guiados

Os fluxos de processo de negócio foram melhorados, estes fluxos foi uma das novidades do CRM 2013. Resumidamente foi introduzida a capacidade de realizar branchs, basicamente e dependente de determinadas regras o fluxo de negócio pode escolher automaticamente entre dois caminhos, um dos exemplos dados é num processo de negócio de vendas, ter a mesma fase de qualificação mas dependente de ser um produto ou um serviço ter caminhos diferentes:

Família de produtos

Um dos objetivos desta versão é a melhoria na gestão dos produtos com a possibilidade de conseguirmos realizar bundles de produtos e podermos ter produtos ou acessórios recomendados, ou seja, numa cross-sell ou up-sell podermos ter produtos\acessórios que podemos vender nesse negócio, ou apresentar produtos como alternativas:

Hierarquia de vendas

Podermos visualizar como é que a informação está agrupada ou relacionada por uma visualização hierárquica dos dados. Esta visualização pode-se aplicar nas seguintes entidades: clientes, produtos ou utilizadores. Sobre cada tile podemos executar várias operações:

Por exemplo no exemplo acima estamos a ver uma hierarquia de um cliente, sobre um cliente podemos realizar as seguintes operações:

  • Visualizar como é que a receita esta distribuída;
  • Navegar para contas filha e saber onde estão os negócios;
  • Descobrir quem está a trabalhar num cliente e pedir ajudar de outros enviando email ou partilhando conta com outra pessoa;
  • Ver detalhes importantes sobre um cliente.

Isto tudo está disponível em mobile que vamos falar a seguir.

 

Melhorias na aplicação para tablets

A parte de vendas foi melhorada para aumentar a produtividade neste módulo, para além de podermos visualizar os dados hierárquicos, os dashboards podem ser habilitados para serem vistos no mobile e ter páginas de entrada personalizadas, mas para mim a grande melhoria tem a ver com cenários onde não estamos conectados a nossa organização, possibilitando com a criação de rascunhos de registos e haver uma sincronização quando estivermos ligados a nossa organização:

Módulo de serviço

Gestão de incidentes

No último update houve grandes melhorias neste módulo principalmente na gestão dos SLAs, entitlements e no novo controlo Time. Com esta versão temos a possibilidade de pausar e retomar o SLA e ter a noção de quanto tempo esteve em cada uma destas fases:

Microsoft Social Listening

Para além das fontes atuais (redes sociais – Facebook, Twitter, …), foram adicionadas fontes para sites de notícias, a análise do sentimento vai suportar a língua italiana.

 

Plataforma

Pesquisa

Uma das funcionalidades mais requisitas era haver uma pesquisa global, ou seja, até agora conseguíamos pesquisar registos de uma determinada entidade, com esta nova funcionalidade permite-se fazer uma pesquisa sobre todos os registos. Esta possibilidade até agora estava disponível através de um add-on. Esta funcionalidade está acessível na barra de navegação através de um novo icon de pesquisa avançada.

 

Sincronização de registos

Como sabemos a sincronização de registos pode ser feita entre o CRM e o Outlook\Exchange. Com esta nova versão podemos sincronizar mais informações:

·         Mais campos dos contactos e tarefas

·         Tarefas atribuídas

·         Anexos de compromissos

Outra novidade é ter visualmente quais os dados que foram sincronizados. Por falar no Outlook a configuração do CRM para o Outlook foi melhorado com um novo design.

 

Regras de Negócio

Outra das novidades que foi introduzido no CRM 2013 são as regras de negócio, possibilidade de validar dados sem que seja necessário escrever uma única linha de código. Neste update foram melhorados alguns pontos:

·         A execução destas regras do lado do servidor permite que estas sejam executadas independentemente de onde as mudanças são efetuadas no lado do cliente ou através do SDK. As regras são executadas na criação ou atualização de um registo. Ações no formulário (de visibilidade, habilitar e desabilitar e obrigatoriedade de campos) são ignoradas. Esta melhoria vem retirar muito do código de validação efetuada nos plugins.

·         O suporte a uma estrutura If…Else…If…Else… permite definir-nos estruturas mais complexas. Bem como agrupar múltiplas expressões através de blocos de condição And\Or.

·         Suporte a valores (quando se cria registos) e comportamentos por defeito.

O editor das regras de negócio foi melhorado para dar suporte as novidades acima.

 

Fluxos de Processos de Negócio

Agora passa a ser possível aceder a estes objetos através da API cliente, ou seja, através do Javascript. Poderá ser possível ativar e habilitar processos, bem como sermos notificados aquando da mudança de estágio.

 

Campos calculados

Um novo tipo de campo, onde podemos definir a fórmula e condições para poder efetuar um determinado cálculo. Isto tudo sem escrever uma única linha de código. As fórmulas podem referir campos da entidade em causa ou entidades relacionadas.

 

Campos rollup

Estes campos permitem que sejam recolhidos campos das entidades relacionadas (com uma relação de 1:N). Estes campos podem ser do tipo decimal, número, moeda e do tipo data. Este tipo de campo permite por exemplo saber o total de oportunidades que um cliente tem, somando as todas as oportunidades de contas filha.

Em resumo os valores são passados do filho para o registo pai. Existem algumas limitações, como a criação de 100 campos rollups por organização e 10 por cada entidade.

Os campos rollup são calculados por tarefas de sistema assíncronas. Estas tarefas correm regularmente conforme um padrão de recorrência, quando são criados ou atualizados correm numa tarefa diferente numa tarefa em massa. Estes campos são componentes da solução por isso são facilmente transportados para outros ambientes ou organizações.

 

Field Level Security

Este tipo de segurança estava apenas disponível para campos customizados, agora podemos habilitar este tipo de segurança para campos standard.

 

Conclusão

Para finalizar teremos que ter cuidado que com esta nova versão, versões mais antigas de tecnologias Microsoft vão deixar de ser suportadas, entre outras o Windows Server 2008, Windows Server 2008 R2, SQL Server 2008, SQL Server 2008 R2, e todas as versões do Windows Small Business Server, Internet Explorer 8 e Internet Explorer 9.

Os próximos updates conforme o roadmap mostrado no Convergence 2014 em Atalanta existirá mais dois updates este ano. Este updates são denominados por Hydra e Electra. Mas penso que mais novidades serão mostradas no Convergence 2014 em Barcelona.

 

Até a próxima.

Tags: , , , ,

CRM 2013 - Customizar caixa de pesquisa de um lookup

by Pedro Azevedo 16. September 2014 23:29

 Boas pessoal,

Neste post vou rever um dos artigos mais requisitados mas que foi escrito para a versão do CRM 2011. O tema é “Customizar caixa de pesquisa de um lookup”. Para complementar este posta aconselho a darem uma vista de olhos neste post também.

Antes de começarmos a pensar nisto aviso que este tipo de operação ainda não é suportado pela Microsoft, logo o código aqui presente pode não funcionar em todas as ocasiões. O código é muito semelhante ao que tínhamos no CRM 2011, só que a estrutura do HTML no CRM 2013 foi modificado por isso deixou de funcionar. Esta é a razão do código não ser suportado, a Microsoft pode alterar qualquer coisa e não se preocupa com os efeitos colaterais.

A mudança é muito simples temos que acrescentar o sufixo “_i”. Eu tive que acrescentar também código para esperar que este elemento seja selecionável, pois o elemento que persiste estas opções só aparece quando carregamos no controlo.

Vou colocar aqui o código corrido com todas as opções:

function changeType(){
	if (document.getElementById("customerid_i")) {
		//Dizer qual a entidade que aparece como defeito neste caso a entidade Contacto
		document.getElementById("parentcustomerid").setAttribute("defaulttype", "2");
		
		//Restringir quais as entidades que podemos selecionar neste caso a entidade Contacto
		document.getElementById("customerid_i").setAttribute("lookuptypes", "2");
		
		//Dizer quais as entidades, os nomes das entidades e os respectivos icons
		document.getElementById("customerid_i").setAttribute("lookuptypenames", "account:1,contact:2,lead:4");
		document.getElementById("customerid_i").setAttribute("lookuptypeIcons", "/_imgs/ico_16_2.gif:/_imgs/ico_16_4.gif:/_imgs/ico_16_8.gif");
		
		//Desabilitar a escolha de uma vista
		document.getElementById("customerid_i").setAttribute("disableViewPicker", "1");
	}
	else {
		setTimeout("changeType();", 1500);
	}
}

 

Até a próxima

 

Tags: , , , ,

Como enviar notas criadas por email

by Pedro Azevedo 11. September 2014 07:21

Boas pessoal,

Esta semana decidi colocar um post para resolver uma questão no fórum do Microsoft Dynamics CRM, resumidamente o objetivo é criar um email com as últimas notas criadas.

Na questão é mencionada se é possível criar um modelo de email, mas não conseguimos chegar a entidade Notas. Para este caso penso que o melhor é recorrermos aos Workflows, outra solução era recorrer aos plugins. Então para começar vamos criar o nosso Workflow (na opção Processos):

Como disse vamos recorrer aos Workflow (Fluxo de Trabalho) e vamos querer apanhar eventos na entidade Nota. Continuando a criação vamos querer ser avisados quando uma nota for criada e quero enviar um email (no email é referido a utilização de um modelo de email mas nos modelos não conseguimos chegar a entidade Nota):

Agora vamos definir que valores queremos colocar no email:

E já está, um requisito que parecia a partida que podia levantar alguns problemas foi resolvido facilmente e sem uma única linha de código.

Caso não queiramos receber emails de todas as entidades podemos realizar um filtro antes da criação do email:

Vamos ver a como ficou a condição da cláusula de condição:

Se tiverem alguma dúvida passem no fórum do Microsoft Dynamics CRM e coloquem lá.

 

Até a próxima.

Tags: , , ,

CRM 2013 Javascript Object Model - UI

by Pedro Azevedo 30. August 2014 19:48

Boas pessoal,

 

Mais um post sobre o object model. Desta vez estaremos a ver o “namespace” Xrm.Page.ui.

 

Xrm.Page.ui.close()

Como o próprio nome diz fecha o formulário, infelizmente não conseguir tirar um printscreen Cool mas acreditem que funciona.

function closeTest() {
	Xrm.Page.ui.close();
}

 

formSelector.getCurrentItem

function getCurrentItemTest() {
                var formSelect = Xrm.Page.ui.formSelector.getCurrentItem();
                if (formSelect == null) {
                               Xrm.Utility.alertDialog("é nulo quando existe apenas um form para escolha");
                }
                else {
                               Xrm.Utility.alertDialog("Este é o form escolhido: " + item.getLabel());
                }
}

formSelector.items
function formSelectorItemsTest() {
                Xrm.Page.ui.formSelector.items.forEach(function (item, index) {
                               Xrm.Utility.alertDialog(item.getLabel());
                });
}

Xrm.Page.ui.getViewPortHeight() e Xrm.Page.ui.getViewPortWidth()
function getViewPortHeightWidthTest() {
                Xrm.Utility.alertDialog("Largura: " + Xrm.Page.ui.getViewPortWidth() + ", Altura: " + Xrm.Page.ui.getViewPortHeight());
}

Xrm.Page.ui.getCurrentControl()

function getCurrentControlTest() {
                var currentControl = Xrm.Page.ui.getCurrentControl();
                if (currentControl == null) {
                               alert("Não há controlos com focus");
                }
                else {
                               alert("O controlo com focus é o '" + currentControl.getLabel());
                }
}

Xrm.Page.ui.getFormType()

Valores possíveis de retorno deste método:

Valor

Tipo de formulário

0

Undefined

1

Create (Dá para Quick Create)

2

Update

3

Read Only

4

Disabled

5

Quick Create (Deprecated)

6

Bulk Edit

11

Read Optimized (Deprecated)

function getFormTypeTest() {
                Xrm.Utility.alertDialog(Xrm.Page.ui.getFormType());
}

navigation.items

 

Xrm.Page.ui.setFormNotification(message, level, uniqueId)

Os valores possíveis para definir o nível da mensagem, referir também que o elemento uniqueid deve-se dar uma id único para podermos retirar mais tarde esta notificação.

ERROR

Notification will use the system error icon

WARNING

Notification will use the system warning icon

INFO

Notification will use the system info icon

function setFormNotificationTest() {
                Xrm.Page.ui.setFormNotification("Isto é um teste as notificações", "INFO", "TesteNotificacaoInfo");
}

Xrm.Page.ui.clearFormNotification(uniqueId)
function clearFormNotificationTest() {
                Xrm.Page.ui.clearFormNotification("TesteNotificacaoInfo");
}

 

Mais uma vez não consigo tirar um screenshot que ajude por isso acreditem que funciona.

Xrm.Page.ui.refreshRibbon()

Este método permite refrescar a ribbon, mas o que isto significa? Por exemplo quando temos um botão na ribbon onde o seu estado depende de um valor no formulário, se este for alterado agora podemos dizer que queremos que ele aplique novamente as regras.

function refreshRibbonTest() {
                Xrm.Page.ui.refreshRibbon();
}

 

 

Neste caso coloquei uma condição baseada no campo email, só mostra o botão se o valor for psazevedo@psa.com

 

Até a próxima.

Tags: , , ,

Colocar uma subgrid disabled in CRM 2013

by Pedro Azevedo 23. August 2014 01:24

Boas pessoal,

Há algum tempo nos fóruns de discussão surgiu a dúvida de como colocar uma grid readonly criei um script na altura e foram surgindo várias dúvidas e eu fui complementando o script. Por isso estou aqui para explicar e partilhar o script. Este post será atualizado sempre que surgir problemas de não funcionar ou quando falhar numa atualização da Microsoft.

Este script não está no seu código mais atualizado mas espero que num futuro próximo espero melhorar muito. Por exemplo uma coisa que não gosto é misturar Javascript puro como JQuery.

Para começar e como primeira alternativa foi tentar usar o seguinte código:

document.getElementById(gridName).disabled = "true";

Mas este código não tem qualquer efeito na grid, pelo menos no CRM Online. Por isso o meu primeiro objetivo foi prevenir que o utilizador pudesse abrir um registo na grid, para isso apliquei o seguinte código:

disableSubgrid = function(gridName) {
	var subgridArea = document.getElementById(gridName + "_divDataArea");
	if (subgridArea != null) {
		var subgridTable = subgridArea.childNodes[0].childNodes[1];
                              
		for(j = 1; j < subgridTable.rows[i].cells.length; j++) { 
			if (subgridTable.rows[i].cells[j].childNodes[0].childNodes[0] != null && subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].nodeName == "A") {
				subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].outerHTML = subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].innerText;
			}
		}
	}
}

Este código retirei desta thread num fórum de discussão mas este não funciona totalmente pois a primeira coluna ficava sem dados, a thread era especifica para a versão 2011. Para além disso não tratava do double-click.

Com base nesse código fiz a minha própria versão para que este comportamento não acontecesse e tratar do double-click:

disableSubgrid = function(gridName) {
	var subgridArea = document.getElementById(gridName + "_divDataArea");
	if (subgridArea != null) {
		var subgridTable = subgridArea.childNodes[0].childNodes[1];
                              
		for(i = 1; i < subgridTable.rows.length; i++) {
			subgridTable.rows[i].ondblclick=function(e){
				if (!e)
					e = window.event;

				if (e.stopPropagation) {
					e.stopPropagation();
				}
				else {
					e.cancelBubble = true;
				}
			};
			
			for(j = 1; j < subgridTable.rows[i].cells.length; j++) { 
				if (subgridTable.rows[i].cells[j].childNodes[0].childNodes[0] != null && subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].nodeName == "A") {
					var node = subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].childNodes[0];
					subgridTable.rows[i].cells[j].childNodes[0].removeChild(subgridTable.rows[i].cells[j].childNodes[0].childNodes[0]);
					subgridTable.rows[i].cells[j].childNodes[0].appendChild(node);
				}
			}
		}
	}
}

 

Este código funciona muito bem, só que tem um problema quando ordenamos ele voltava a recarregar a lista e tanto o link com o double-click passavam a funcionar:

Aqui a minha primeira opção era apanhar o reload da sub-grid mas não conseguir por isso a minha solução foi desativar a funcionalidade de ordenar, com este código em JQuery:

$("#" + gridName + " .ms-crm-List-Sortable").bind("click", function(event){
	event.stopPropagation();
});

Com este código aplicado ele não consegue ordenar logo fica tudo bem J não é a melhor opção mas por agora funciona. Agora só faltava desabilitar os botões de adicionar e de mostrar o detalhe dos registos, aqui também recorri ao JQuery:

$("#" + gridName + "_addImageButtonImage").bind("click", function(event){
	event.stopPropagation();
});

$("#" + gridName + "_openAssociatedGridViewImageButtonImage").bind("click", function(event){
	event.stopPropagation();
});

Et voilà tornamos a nossa subgrid totalmente disabled. Vejam o código completo usado, onde também tentei tornar o mais dinâmico possível para isso bastando passar o nome da sub-grid:

disableSubgrid = function(gridName) {
	var subgridArea = document.getElementById(gridName + "_divDataArea");
	if (subgridArea != null) {
		$("#" + gridName + " .ms-crm-List-Sortable").bind("click", function(event){
			event.stopPropagation();
		});
		
		$("#" + gridName + "_addImageButtonImage").bind("click", function(event){
			event.stopPropagation();
		});

		$("#" + gridName + "_openAssociatedGridViewImageButtonImage").bind("click", function(event){
			event.stopPropagation();
		});

		var subgridTable = subgridArea.childNodes[0].childNodes[1];
                              
		for(i = 1; i < subgridTable.rows.length; i++) {
			subgridTable.rows[i].ondblclick=function(e){
				if (!e)
					e = window.event;

				if (e.stopPropagation) {
					e.stopPropagation();
				}
				else {
					e.cancelBubble = true;
				}
			};
			
			for(j = 1; j < subgridTable.rows[i].cells.length; j++) { 
				if (subgridTable.rows[i].cells[j].childNodes[0].childNodes[0] != null && subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].nodeName == "A") {
					var node = subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].childNodes[0];
					subgridTable.rows[i].cells[j].childNodes[0].removeChild(subgridTable.rows[i].cells[j].childNodes[0].childNodes[0]);
					subgridTable.rows[i].cells[j].childNodes[0].appendChild(node);
				}
			}
		}
	}
	else {
		setTimeout("disableSubgrid('" + gridName + "');", 1500);
	}
}

function onload() {
	setTimeout("disableSubgrid('Contacts');", 1500);
	setTimeout("disableSubgrid('accountopportunitiesgrid');", 1500);
}

 

 

PS: Se tiverem problemas coloquem nos comentários ou coloquem a dúvida no fórum de discussão.

 

Até a próxima

Tags: , , , ,

Como obter guids de registos

by Pedro Azevedo 15. August 2014 08:16

Boas pessoal,

Vou iniciar hoje um conjunto de pelo menos dois artigos onde vou tentar resumir as várias formas que temos para obter os vários tipos de guids e nas duas versões 2011 e 2013. Para começar adicionei uma nova entrada no dicionário de CRM com o que significa GUID.

Hoje vou falar em várias possibilidades de obter os guids de registos, num futuro post irei falar como obter guids de vários objetos. O mais comum é obtermos o guid de um registo, se tivermos dentro desse registo temos várias opções:

CRM 2011

No CRM 2011 podemos obter o guid através do URL, mas quase ele esteja no modo aplicação abre assim:

Não temos URL então podemos fazer F11 ou CTRL+N e conseguimos ver o URL associado:

Seleccionamos o URL e retiramos o que queremos:

http://server/org/main.aspx?etc=3&extraqs=%3f_gridType%3d3%26etc%3d3%26id%3d%257b64E808B4-3A1A-E311-9B18-005056907305%257d%26pagemode%3diframe%26preloadcache%3d1412850657742%26rskey%3d566790654&pagetype=entityrecord

CRM 2013

No CRM 2013 aparentemente deixamos de ter a opção de obtermos através do URL, então uma possibilidade passa por utilizarmos este botão:

Obtemos um email e de onde podemos extrair o guid deste registo:

A. Datum Corporation (sample)
<https://cmfazevedo.crm4.dynamics.com/main.aspx?etc=1&extraqs=formid%3d8448b78f-8f42-454e-8e2a-f8196b0419af&id=%7b0DDD50D8-021E-E411-892E-2C59E541AD08%7d&pagetype=entityrecord>

Bem o que disse anteriormente e como vimos no CRM 2011 deixámos de ver o guid no URL, caso façamos popup desse registo obtemos um URL com o guid:

 

https://cmfazevedo.crm4.dynamics.com/main.aspx?etc=1&extraqs=&histKey=604351270&id={0DDD50D8-021E-E411-892E-2C59E541AD08}&newWindow=true&pagetype=entityrecord#945933055

Outra possibilidade e que funciona para as duas versões é colocar um botão (vou mostrar como fazer mais adiante) para mostrar o guid e para isso basta usar o seguinte código:

function showMeGuid() {
    prompt("Este é o teu GUID",  Xrm.Page.data.entity.getId());
}

 

Este pedaço de código Xrm.Page.data.entity.getId() é o mais importante, é o que permite obter o guid do registo atual.

Agora vamos ver o caso de numa lista de registos querermos saber quais os registos que estão selecionados, para este exemplo vou mostrar como criar o botão com o Ribbon Workbench para refrescar a memória e para mostrar como trabalhar com parâmetros por defeito.

Vamos então acrecentar um botão:

 

Para executar uma ação teremos que adicionar um comando, este comando adicionamos regras para mostrar e tornar disable. Mas onde me quero focar é nas “actions”:

Adiciono uma nova ação de Javascript:

 Dentro da configuração da ação para a chamada de uma função Javascript temos que especificar qual o Recurso Web e qual a função dentro desse recurso que queremos chamar. Para o primeiro caso bastava este passo:

 Mas agora o objetivo é que o CRM nos passe os registos selecionados, conseguimos indicar através dos “parameters”, que neste caso é um parâmetro do CRM:

Como podemos ver podemos passar vários parâmetros, neste caso existe um parâmetro mesmo para aquilo que queremos:

 Terminada a nossa configuração do comando podemos associá-la ao nosso botão:

 E é este o resultado:

Outra maneira que habitualmente queremos saber o guid de um registo é quando temos um lookup no formulário e temos um registo selecionado, aqui recorremos a um post já realizado para ver como podemos aceder a estes dados.

 

Até a próxima

Tags: , , , ,

CRM 2013 Javascript Object Model - Data

by Pedro Azevedo 8. August 2014 02:34

 Boas pessoal,

Continuando a “saga” dos métodos Javascript vamos agora ver os métodos Xrm.Page.data.

Xrm.Page.data.getIsValid()

function getIsValidTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.getIsValid());
}

Xrm.Page.data.refresh(save).then(successCallback, errorCallback)

Esta função refresh recebe um booleano para dizer se queremos que ele salve depois do formulário ser refrescado. Depois existe a possibilidade de passar funções quando houver sucesso ou insucesso na execução da função.

function refreshTest()
{
                Xrm.Page.data.refresh(false).then(function() {
                                               Xrm.Utility.alertDialog("Sucesso no refrescamento");
                               },
                               function() {
                                               Xrm.Utility.alertDialog("Erro no refrescamento");
                });
}

Esta caixa aparece porque como estou a colocar o evento no onchange de um campo do CRM, ele verifica que estamos a querer refrescar a página sem guardarmos as alterações.

Xrm.Page.data.save().then(successCallback, errorCallback)

function saveTest() {
                Xrm.Page.data.save().then(function() {
                                               Xrm.Utility.alertDialog("Sucesso no save");
                               },
                               function() {
                                               Xrm.Utility.alertDialog("Erro no save");
                });
}

As duas últimas funções são muito rápidas isto porque o refrescamento é só dos dados e não da página inteira.

 

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