CRM 2013 Javascript Object Model - Lookup

by Pedro Azevedo 19. November 2014 19:50

Boas pessoal,

Continuando o conjunto de posts sobre a API de Javascript e também continuando o post de lookups no CRM 2013, hoje vou falar sobre o que temos na API de Javascript para interagir com os lookups. Este post já tinha sido feito para a versão 2011, por isso não vou voltar a falar das funções addCustomView, setDefaultView isso porque os métodos mantém os mesmos parâmetros e objetivos.

Ainda dentro dos métodos que existiam no CRM 2011, existe o getDefaultView, segue um exemplo:

function onload() {
        alert('default view->' + Xrm.Page.getControl('parentaccountid').getDefaultView());
}

Depois temos os métodos addCustomFilter, addPreSearch, removePreSearch, estes métodos com já foi dito aparecem na versão 2013. Para usar temos que fazer a combinação entre o addCustomerFilter e addPreSearch, para adicionamos um pré filtro temos que chamar o addPreSearch onde temos que adicionar um event handler que vai adicionar um filtro através do método addCustomerFilter:

function addPreFilter() {
	var city = Xrm.Page.getAttribute("address1_city").getValue();

	var filter ="<filter type='and'>" +
	             "<condition attribute='address1_city' operator='eq' value='" + city + "'/>" +
	             "</filter>";

	Xrm.Page.getControl("parentaccountid").addCustomFilter(filter);
}


function addPreSearchFilter() {
	Xrm.Page.getControl("parentaccountid").addPreSearch(addPreFilter);
}

Vejam as imagens em que na primeira não existe qualquer pré-filtro e na segunda aplicando o método anterior, ou seja, em vez de aparecer todos os registos consegue-se aplicar um filtro mais eficaz e com mais possibilidade de escolher sem ter que abrir uma nova janela.

 

Para se retirar este pré filtro temos que chamar o método removePreSearch e passar o event handler que passamos no método addPreSearch.

function removePreSearchFilter() {
	Xrm.Page.getControl("parentaccountid").removePreSearch(addPreFilter);
}

Este métodos podem ser de grande ajuda quando bem utilizados.

 

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

Customizar caixa de pesquisa de um lookup

by Pedro Azevedo 29. April 2013 00:49

Boas pessoal,

Uma das perguntas mais realizadas na comunidade é como modificar a janela de pesquisa de um lookup. Vamos ver as várias maneiras de customizar esta janela.

Por exemplo na entidade contacto temos um lookup para dizer qual o cliente que está afecto, podemos escolher entre a entidade cliente e contacto:

A entidade por defeito é o cliente e se quisermos que a entidade por defeito seja a entidade contacto, então podemos fazer isto:

document.getElementById("parentcustomerid").setAttribute("defaulttype", "2");

E o resultado é este:


Se quisermos dizer que a entidade contacto não faz sentido neste caso então podemos limitar a escolha a apenas a entidade cliente:

document.getElementById("parentcustomerid").setAttribute("lookuptypes", "1");

Vejam o resultado:

Agora imaginem que em vez de restringir quero colocar outra entidade, por exemplo o cliente potencial:

document.getElementById("parentcustomerid").setAttribute("lookuptypes", "1, 2, 4");

document.getElementById("parentcustomerid").setAttribute("lookuptypenames", "account:1,contact:2,lead:4");

document.getElementById("parentcustomerid").setAttribute("lookuptypeIcons", "/_imgs/ico_16_2.gif:/_imgs/ico_16_4.gif:/_imgs/ico_16_8.gif");

 

Neste caso estamos a dizer quais as entidades, os nomes das entidades e os respectivos icons, vejam o resultado:

 

Agora quero desabilitar a escolha de uma vista:

document.getElementById("parentcustomerid").setAttribute("disableViewPicker", "1");

Vejam o resultado:

Agora quero mudar qual a vista por defeito:

Xrm.Page.getControl("parentcustomerid").setDefaultView("00000000-0000-0000-00AA-000010001033");

Vejam o resultado:

 Todo este código pode ser colocado no evento onload do formulário.

 

Algumas perguntas poderão estar a ser feitas:

·         Que código são estes 1, 2 e 4?

São os códigos das entidades, eu neste post criei apenas para referência rápida sobre estes códigos.

·         Como posso obter o guid de uma vista?

Temos algumas hipóteses, abrir a vista para editar e copiar o id do URL. Estando a ver os registos de uma vista podemos carregar em “Copiar uma Hiperligação” e escolher opção “da Vista Actual”

Ainda existe outro método o addCustomView que está explicado neste post.

 

Espero que estas dicas rápidas sejam úteis.

 

Até a próxima

Tags: , , , ,

Como modificar o filtro de um lookup no Dynamics CRM 2011

by Pedro Azevedo 11. February 2013 10:50

Boas pessoal,

Foi-me reportado um problema na escolha dos produtos no pipeline de vendas, aquando da escolha do produto estavam aparecer produtos inativos, ou seja, listava todos os produtos sem filtro. Bem este será o mote para apresentar várias soluções que segui para poder resolver este problema.

 

Aparentemente este problema seria de fácil resolução, primeira tentativa modificar a vista que esta associado por defeito ao lookup. Para acedermos a esta configuração, vamos a customização do formulário e duplo click no lookup e aparece a caixa em baixo. Mas esta (como podem verificar) encontrava-se bloqueada, vejam na imagem:

 

A segunda opção foi modificar esta vista e colocar mais um critério que seria o produto estar activo. Para isso teremos que ir a entidade produto e escolher a vista, infelizmente não é possível editar os critérios de pesquisa, veja na imagem:

Mais uma vez a solução não poderá ser aplicada. Tinha na manga uma última solução, para isso teria que recorrer ao Javascript.

O objectivo será adicionarmos uma nova vista por intermédio do Javascript com os critérios que queremos e depois colocar essa vista como defeito, já que não conseguimos seleccionar a vista.

 

O primeiro passo é criar este filtro no Advanced Find:

Quando abrimos o XML temos este aspecto: 

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
  <entity name="product">
    <attribute name="name" />
    <attribute name="productnumber" />
    <attribute name="ret_codigofinanceiro" />
    <attribute name="productid" />
    <order attribute="name" descending="false" />
    <filter type="and">
      <condition attribute="statecode" operator="eq" value="0" />
    </filter>
  </entity>
</fetch>

 

De seguida temos que definir qual o layout da nossa vista:

<grid name='resultset' object='1' jump='name' select='1' icon='1' preview='1'>
  <row name='result' id='productid'>
    <cell name='name' width='300' />
    <cell name='productnumber' width='100' />
    <cell name='ret_codigofinanceiro' width='100' />
  </row>
</grid>

 

Agora teremos que aplicar dois métodos que nos vai possibilitar inserir a vista e coloca-la como a vista por defeito.

Para adicionar uma nova vista utilizamos a função addCustomView que tem a seguinte assinatura:

controlObj.addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, isDefault)

 

Vejam aqui mais detalhes sobre esta função.

Para colocar esta vista como a vista por defeito teremos que utilizar a função setDefaultView (já agora para podermos obter a vista por defeito temos a função getDefaultView) com a seguinte assinatura:

controlObj.setDefaultView(viewGuid)

 

Vejam aqui mais detalhes.

Vejam a seguir todo o código:

NOTA: Quando vamos colocar o FetchXML em código Javascript devemos substituir as aspas por plicas:

 

var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
                        "<entity name='product'>" +
                            "<attribute name='name' />" +
                            "<attribute name='productnumber' />" +
                            "<attribute name='ret_codigofinanceiro' />" +
                            "<attribute name='productid' /> " +
                            "<order attribute='name' descending='false' />" +
                            "<filter type='and'>" +
                                "<condition attribute='statecode' operator='eq' value='0' />" +
                            "</filter>" +
                        "</entity>" +
                   "</fetch>";
 
var layoutXml = "<grid name='resultset' object='1' jump='name' select='1' icon='1' preview='1'>" +
                        "<row name='result' id='productid'>" +
                            "<cell name='name' width='300' />" +
                            "<cell name='productnumber' width='100' />" +
                            "<cell name='ret_codigofinanceiro' width='100' />" +
                        "</row>" +
                    "</grid>";
 
var viewId = "{1DFB2B35-B07C-44D1-868D-258DEEAB88E2}";
var entityName = "product";
var viewDisplayName = "Produtos Activos";
 
Xrm.Page.getControl("productid").addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, true);
Xrm.Page.getControl("productid").setDefaultView(viewId);

 

NOTA: Esta abordagem pode ser reutilizada em outras situações, imaginem que podem por exemplo filtrar um lookup com base noutro valor do formulário. Para isso bastava por exemplo no FetchXml substituir o 0 por uma expressão válida.

 

Até aqui tudo bem o problema é que a história não terminou por aqui, como no lookup a seleção da vista está desativa o código acima não vai fazer nada, porque o controlo está disabled. A solução passa por habilitar este campo momentaneamente e executar o nosso código e coloca-la novamente no seu estado anterior.

Para isso recorri ao jQuery para realizar esta operação. Não se esqueçam que têm que adicionar a biblioteca do jQuery como WebResource e depois referenciá-la no formulário, há tempos escrevi um post de como adicionar esta e outras bibliotecas, vejam aqui.

Complementem o código anterior com isto:

 

//…
//o mesmo código
 
$("#productid").attr("disableViewPicker", "0");
Xrm.Page.getControl("productid").addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, true);
Xrm.Page.getControl("productid").setDefaultView(viewId);
$("#productid").attr("disableViewPicker", "1");

 

Para finalizar pegamos no código completo e colocámos o mesmo dentro de uma função de depois dentro de um WebResource. Nas propriedades do formulário (que contém o lookup) acrescentamos este WebResource e depois adicionamos um novo processamento no evento OnLoad do formulário para executar o método.

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