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

Comments (2) -

Elton Pacella
Elton Pacella United States
6/28/2015 2:05:31 PM #

Hi mates, its fantastic article on the topic of teachingand completely explained, keep it up all the time.|

Reply

Harley Spuler
Harley Spuler United States
7/13/2015 4:37:23 AM #

Tremendous things here. I'm very glad to look your article. Thank you so much and I'm taking a look ahead to contact you. Will you kindly drop me a mail?|

Reply

Pingbacks and trackbacks (1)+

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

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