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: , , , ,

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: , , , , ,

CRM 2013 Javascript Object Model - Data.Entity

by Pedro Azevedo 9. July 2014 02:24

Boas pessoal,

Mais um capítulo dos métodos de Javascript desta vez sobre o Xrm.Page.data.entity

Xrm.Page.data.entity.addOnSave([function reference])

function showMessage() {
                Xrm.Utility.alertDialog("Função do evento save");
}

 

function addOnSaveTest() {
                Xrm.Page.data.entity.addOnSave(showMessage);
}

Xrm.Page.data.entity.removeOnSave([function reference])

function removeOnSaveTest() {
                Xrm.Page.data.entity.removeOnSave(showMessage);
}

 

Xrm.Page.data.entity.getDataXml()

function getDataXmlTest() {
                Xrm.Page.data.entity.addOnSave(function(){
                               Xrm.Utility.alertDialog(Xrm.Page.data.entity.getDataXml());
                });
}

Neste XML só aparecem os campos que eu alterei e aquelas que serão enviadas para o registo ser guardado.

Xrm.Page.data.entity.getEntityName()

function getEntityNameTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.entity.getEntityName());
}

Xrm.Page.data.entity.getId()

function getIdTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.entity.getId())
}

Xrm.Page.data.entity.getIsDirty()

function getIsDirtyTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.entity.getIsDirty());
}

 

O primeiro teste foi no evento onload do formulário e como se está a espera o formulário não está dirty. O segundo é invocado após alteração do campo como seria de esperar o CRM diz que o formulário está dirty.

Xrm.Page.data.entity.getPrimaryAttributeValue()

function getPrimaryAttributeValueTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.entity.getPrimaryAttributeValue());
}

Xrm.Page.data.entity.save( null | "saveandclose" |"saveandnew" )

Aqui é definido o comportamento da função save, se passarmos null ele deve simular o gravar normal, o saveandclose e o saveandnew dizem tudo destas duas opções.

function saveTest() {
                Xrm.Page.data.entity.save();

                Xrm.Page.data.entity.save("saveandclose");

                Xrm.Page.data.entity.save("saveandnew");
}

Já tínhamos visto a função Xrm.Page.data.save() a diferença é que esta corre assincronamente enquanto o save dentro da entity é síncrono e com opções diferentes.

 

Até a próxima.

Tags: , , , , , ,

CRM 2013 Javascript Object Model - Coleções

by Pedro Azevedo 30. June 2014 21:47

Boas pessoal,

Neste post mais uma vez sobre o object model do Javascript para o Dynamics CRM 2013, iremos debruçar sobre collections. Antes virmos os métodos que nos permitem aceder as várias colecções vamos ver três métodos que nos vão ajudar a trabalhar sobre as colecções:

Xrm.Page.ui.controls.forEach(delegate function(control, index))

Aplica uma acção numa função delegate a cada objecto numa colecção

Xrm.Page.ui.controls.get([String][Number][delegate function(attribute, index)])

Extrair um ou mais objectos da colecção

Xrm.Page.ui.controls.getLength()

Retorna o número de itens de uma colecção

Fica aqui uma pequena referência mas eu vou aplicar várias vezes estes métodos com as várias assinaturas. Principalmente no primeiro exemplo que vou percorrer todos este métodos.

Xrm.Page.data.entity.attributes

function attributesAllTest() {

                    Xrm.Utility.alertDialog("Esta entidade tem " + Xrm.Page.data.entity.attributes.getLength() + " entidades no formulário");

                   

                    var firstControlById = Xrm.Page.data.entity.attributes.get(0);

                    var firstControlByName = Xrm.Page.data.entity.attributes.get(firstControlById.getName());

                   

                    var booleanAtts = Xrm.Page.data.entity.attributes.get(isBoolean);

                    var message = "";

                    for (var i in booleanAtts) {

                                         message += "- " + booleanAtts[i].getName() + "\n";

                    }

                    Xrm.Utility.alertDialog(message);

                   

                    message = "";

                    Xrm.Page.data.entity.attributes.forEach(function (attribute, index) {

                                         message += attribute.getName() + "(" + attribute.getAttributeType() + ") \n";

                    });

                    Xrm.Utility.alertDialog(message);

}

 

function isBoolean(att, index) {

                    return att.getAttributeType() == "boolean";

}

 

 

 

Xrm.Page.ui.controls

function controlsTest() {

                    var message = "";

                    Xrm.Page.ui.controls.forEach(function (control, index) {

                                         message += control.getName() + "(" + control.getControlType() + ") \n";

                    });

                   

                    Xrm.Utility.alertDialog(message);

}

Xrm.Page.ui.formSelector.items

Vou abordar esta colecção aquando Xrm.Page.ui.

Xrm.Page.ui.navigation.items

Vou abordar esta colecção aquando Xrm.Page.ui.

Xrm.Page.ui.tabs

function tabsTest() {

                    var message = "";

                    Xrm.Page.ui.tabs.forEach(function (tab, index) {

                                         message += "A tab " + tab.getName() + " está " + tab.getDisplayState() + "\n";

                    });

                   

                    Xrm.Utility.alertDialog(message);

}

 

 

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

function attControlsTest() {

                    var message = "";

                    Xrm.Page.getAttribute("subject").controls.forEach(function (control, index) {

                                         message += control.getName() + "(" + control.getControlType() + ") \n";

                    });

                   

                    Xrm.Utility.alertDialog(message);

}

 

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

function sectionsTest() {

                    var message = "";

                    Xrm.Page.ui.tabs.get("Summary").sections.forEach(function (section, index) {

                                         message += "A secção " + section.getName() + "tem a seguinte label " + section.getLabel() + " \n";

                    });

                   

                    Xrm.Utility.alertDialog(message);

}

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

function sectionControlsTest() {

                    var message = "";

                    Xrm.Page.ui.tabs.get("Summary").sections.get("Contact").controls.forEach(function (control, index) {

                                         message += control.getName() + "(" + control.getControlType() + ") \n";

                    });

                   

                    Xrm.Utility.alertDialog(message);

}

 

Até a próxima.

Tags: , , ,

CRM 2013 Javascript Object Model - Contexto

by Pedro Azevedo 28. May 2014 20:04

Boas pessoal,

Chegou a vez de falarmos sobre o Xrm.Page.context. Aqui temos que obter primeiro o objecto de contexto.

context.client.getClient()

Valores de retorno possíveis deste método:

Cliente

Valor

Browser

Web

Outlook

Outlook

Mobile

Mobile

function getClientTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.client.getClient());

}

De referir que este método veio tornar o método isOutlookClient obsoleto.

 

context.client.getClientState()

Valores de retorno possíveis deste método:

Cliente

Valor

Web, Outlook, Mobile

Online

Outlook, Mobile

Offline

function getClientStateTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.client.getClientState());

}

Tal como o método anterior este método veio tornar obsoleto o método isOutlookOnline.

 

context.getClientUrl()

Valores possíveis no retorno:

Cliente

Valor

Microsoft Dynamics CRM (on-premises)

http(s)://server/org

Microsoft Dynamics CRM Online

https://org.crm.dynamics.com

Microsoft Dynamics CRM for Outlook with Offline Access when offline

http://localhost:2525

Na documentação o método getServerURL não vem documentado mas ainda funciona apesar de estar obsoleto deve-se usar sempre o getClientUrl.

 

context.getCurrentTheme()

Este método serve essencialmente para podermos customizar os nossos Recursos Web mediante o theme do Outlook. Valores possíveis de retorno para este método:

Valor

Theme

default

Microsoft Dynamics CRM web application

Office12Blue

Microsoft Dynamics CRM for Outlook 2007 or 2010 Blue Theme

Office14Silver

Microsoft Dynamics CRM for Outlook 2007 or 2010 Silver or Black Theme

function getCurrentThemeTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getCurrentTheme());

}

Devem ter atenção que alguns destes métodos não funcionam por exemplo nos tablets por isso os métodos acima passam a ser essenciais. Por exemplo este método em específico não funciona nos tablets.

 

context.getOrgLcid()

Esta função permite devolver a linguagem base da organização.

 

function getOrgLcidTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getOrgLcid());

}

Este valor representa o Português de Portugal. Já agora o Português do Brazil é o 1046.

 

context.getOrgUniqueName()

function getOrgUniqueNameTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getOrgUniqueName());

}

context.getQueryStringParameters()

Este método serve para ler os query strings passados ao formulário para além dos parâmetros que o CRM envia pode-se passar parâmetros customizados, por exemplo usando a função que já testamos a openEntityForm.

 

function getQueryStringParametersTest() {

                var params = Xrm.Page.context.getQueryStringParameters();

                for(var par in params) {

                               Xrm.Utility.alertDialog("QueryString:" + par + " com o valor " + params[par]);

                }

}

 

 

context.getUserId()
function getUserIdTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getUserId());

}

 

context.getUserId() 
function getUserLcidTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getUserLcid());

}

 

context.getUserName()
Esta função retorna o nome do utilizador.
function getUserNameTest() {

                    Xrm.Utility.alertDialog(Xrm.Page.context.getUserName());

}

 

context.getUserRoles()

function getUserRolesTest() {

                var roles = Xrm.Page.context.getUserRoles();

                for(var role in roles) {

                               Xrm.Utility.alertDialog("Role ID:" + role);

                }

}

context.prependOrgName(sPath)

 

function prependOrgNameTest() {

Xrm.Utility.alertDialog(getClientUrlTest() + Xrm.Page.context.prependOrgName("/XRMServices/2011/OrganizationData.svc/"));

}

 

Neste contexto ainda tenho a referir que o método getAuthenticationHeader foi retirado definitivamente, este tinha permanecido por causa de compatibilidades com o CRM 4.0.

 

Até a próxima

 

Tags: , , , , , , ,

CRM 2013 Javascript Object Model - Utility

by Pedro Azevedo 22. April 2014 01:22

Boas pessoal,

Como vos tinha prometido aqui vão exemplos de chamada a cada uma das funções Javascript que apresentei no post sobre o novo object modelo do CRM. Vou dividir em vários posts e vou dividir pelo mesmo critério que separei em tabelas:

Por isso vou começar pelo Xrm.Utility

Xrm.Utility.alertDialog(message,onCloseCallback)

function testAlertDialog(){
                Xrm.Utility.alertDialog("Mensagem a dizer que vou mudar o Nome da Empresa", function () {
                               Xrm.Page.getAttribute("companyname").setValue("Novo Nome");
                });
}

Por isso já sabem pessoal deixem de utilizar o alert e passem a usar esta função suportada.

Xrm.Utility.confirmDialog(message,yesCloseCallback,noCloseCallback)

function confirmDialogTest() {
                Xrm.Utility.confirmDialog("Quer mudar o Nome da Empresa?", function () {
                                               Xrm.Page.getAttribute("companyname").setValue("Mudei o nome da empresa");
                               },
                               function () {
                                               Xrm.Page.getAttribute("companyname").setValue("Não mudei o nome da empresa");
                               }
                );
}

 

Xrm.Utility.isActivityType(entityName)

function isActivityTypeTest() {
                Xrm.Utility.alertDialog("Cliente Potencial é uma entidade de actividade" + Xrm.Utility.isActivityType("lead"));
                Xrm.Utility.alertDialog("Email é uma entidade de actividade" + Xrm.Utility.isActivityType("email"));
}

Xrm.Utility.openEntityForm(name,id,parameters)

Esta função já merece uma descrição mais pormenorizada, para além do que o nome sugere que é a abertura de um formulário com um determinado registo, caso não coloquemos nada no parâmetro id ele abre um formulário de criação. No parâmetro parameters pode receber alguns parâmetros:

  • formid para poder especificar um formulário, quando existe mais que um;
  • parâmetros para passar valores por defeito quando existe um formulário de criação;
  • parâmetros query string quando um formulário está configurado para receber query string customizadas – não vou dar nenhum exemplo pois implica outras alterações, já está marcado para realizar um post mais tarde.
function openEntityFormTest() {
                Xrm.Utility.openEntityForm("account");
                Xrm.Utility.openEntityForm("account","D045613F-3CBF-E311-88C5-D89D67632EAC");

                var parameters = {};
                parameters["name"] = "este é o meu nome";
                parameters["telephone1"] = "(351) 123456789";
                Xrm.Utility.openEntityForm("account", null, parameters);
}

 

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height) e Xrm.Utility.openWebResourceDialog(webResourceName, webResourceData, width, height)

Nesta função apenas referir que se o Recurso Web receber dados teremos que o passar no segundo parâmetro.

function openWebResourceTest() {
                Xrm.Utility.openWebResource("new_controlhtml", null, 600,300);
}

 

Começamos com duas funções que utilizávamos muito os métodos de Javascript, ou seja, alert e confirm. Devemos usar estas novas funções pois assim vamos garantir que vão funcionar em todos os ambientes.

 

PS: Todos os testes foram realizados no evento onload da entidade Oportunidade Potencial.

 

Até a próxima.

Tags: , , , , , ,

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: , ,

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