none
Filtrando campo lookup com scritp - Dúvida RRS feed

  • Pergunta

  • Através do código abaixo eu consigo envira para o campo lookup um um falor para ser filtrado quano do campo for aberto para alteração, porem se o usuário apagar o filtro ele pode escolher qualque registro. tem como desabilitar a aleração desse campo ou retirar esse campo do poupap que abre quado se altera um loocku?

     

    if (crmForm.all.new_contaid.DataValue != null)
    {
       SetarNovoFiltroFacilitador();
    }
    function SetarNovoFiltroFacilitador()
    {
        var searchVal = crmForm.all.new_contaid.DataValue[0].name;
       if (searchVal != null)
       {
          searchVal = searchVal.replace("&", "%26");
          crmForm.all.new_facilitadorid.additionalparams = "search=" + searchVal;
        }
    }


    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    quarta-feira, 20 de outubro de 2010 17:43

Respostas

  • Tiago,

     

    Tenta assim:

     

    if (crmForm.all.new_contaid.DataValue != null)
    {
     SetarNovoFiltroFacilitador();
    }
    function SetarNovoFiltroFacilitador()
    {
     var searchVal = crmForm.all.new_contaid.DataValue[0].name;
     if (searchVal != null)
     {
      searchVal = searchVal.replace("&", "%26");
      crmForm.all.new_facilitadorid.additionalparams = "search=" + searchVal;
      crmForm.all.new_facilitadorid.lookupbrowse = 1;
     }
    
    

     

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Editado RicardoAlves quarta-feira, 20 de outubro de 2010 18:17 ajuste
    • Marcado como Resposta Tiago H quinta-feira, 21 de outubro de 2010 19:29
    quarta-feira, 20 de outubro de 2010 18:15
  • Eu já visto este erro antes...

     

    Você pode usar essa função que resolve:

    http://www.pietrogaiao.com.br/blog/retirar-acentos-com-javascript/

     

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves quinta-feira, 21 de outubro de 2010 19:59
    • Marcado como Resposta RicardoAlves terça-feira, 26 de outubro de 2010 15:25
    quinta-feira, 21 de outubro de 2010 19:59
  • Tiago,

     

    Na verdade não era para filtrar mesmo... Existem duas formas de fazer esse tipo de filtro, eu esqueci de passar a segunda na função...

     

    Quando você utiliza a propriedade "additionalparams", você depende no campo de busca e o valor nele.

    var valor = "teste";
    crmForm.all.new_facilitadorid.additionalparams = "search=" + valor;
    

     

    Uma segunda opção, é utilizar a função "AddParam()" para assim remover o campo utilizando o "lookupbrowser = 1". Pois assim você não depende do valor no campo que montará o fetchxml e sim inserir o fetchxml diretamente.

    var fetchxml = "<fetch mapping='logical'>...</fetch>";
    
    crmForm.all.new_facilitadorid.AddParam("search", fetchxml);
    crmForm.all.new_facilitadorid.lookupbrowse = 1;
    

     

    Abraço,

     

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves quinta-feira, 21 de outubro de 2010 20:47
    • Marcado como Resposta RicardoAlves quinta-feira, 28 de outubro de 2010 12:46
    quinta-feira, 21 de outubro de 2010 20:44
  • Tiago,

     

    O fetchxml que me refiro seria uma query em formato xml. Por exemplo:

    var fetch = "
      <fetch mapping='logical'>
       <entity name='account'>
    <attribute name='accountid'/>
    <attribute name='name'/>
    <link-entity name='systemuser' to='owninguser'>
      <filter type='and'>
       <condition attribute='lastname' operator='ne' value='Cannon' />
      </filter>
    </link-entity>
       </entity>
      </fetch>
      ";
    

     

    Aqui tem mais exemplos

    http://technet.microsoft.com/en-us/library/ms936573.aspx

     

    Desta forma você consegue manipular os dados que serão inseridos no grid do lookup... essa ação é o que chamamos de "FilterLookup".

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves sexta-feira, 22 de outubro de 2010 02:11
    • Marcado como Resposta RicardoAlves quinta-feira, 28 de outubro de 2010 12:46
    sexta-feira, 22 de outubro de 2010 01:53
  • O código tá certo... É que está faltando registrar um plugin...

     

    Tem o plugin pronto aqui:

    http://mscrmfilteredlookup.codeplex.com/releases/view/46051#DownloadId=124099

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Marcado como Resposta RicardoAlves quinta-feira, 28 de outubro de 2010 12:46
    sexta-feira, 22 de outubro de 2010 18:46
  • Adicionei a linha no arquivo lookupsigle e a consulta Fetch funcionou corretamente. sem necessicade do plugin. obrigado

     

    void crmgrid_PreRender( object sender , EventArgs e )

    {

     

    // As we don't want to break any other lookups, ensure that we use workaround only if

     

    // search parameter set to fetch xml.

     

    if (crmGrid.Parameters["search"] != null && crmGrid.Parameters["search"].StartsWith("<fetch"))

    {

    crmGrid.Parameters.Add(

    "fetchxml", crmGrid.Parameters["search"]);

     

    // searchvalue needs to be removed as it's typically set to a wildcard '*'

    crmGrid.Parameters.Remove(

    "searchvalue");

     

    // Icing on a cake - ensure that user cannot create new contact outside of the account

     

    // and then select it.

     

    this._showNewButton = false;

    }

    }


    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    • Marcado como Resposta RicardoAlves quinta-feira, 28 de outubro de 2010 12:46
    quarta-feira, 27 de outubro de 2010 15:30

Todas as Respostas

  • Tiago,

     

    Tenta assim:

     

    if (crmForm.all.new_contaid.DataValue != null)
    {
     SetarNovoFiltroFacilitador();
    }
    function SetarNovoFiltroFacilitador()
    {
     var searchVal = crmForm.all.new_contaid.DataValue[0].name;
     if (searchVal != null)
     {
      searchVal = searchVal.replace("&", "%26");
      crmForm.all.new_facilitadorid.additionalparams = "search=" + searchVal;
      crmForm.all.new_facilitadorid.lookupbrowse = 1;
     }
    
    

     

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Editado RicardoAlves quarta-feira, 20 de outubro de 2010 18:17 ajuste
    • Marcado como Resposta Tiago H quinta-feira, 21 de outubro de 2010 19:29
    quarta-feira, 20 de outubro de 2010 18:15
  • Tiago,

     

    Funcionou?

     


    Ricardo Alves
    www.ricardoalves.me
    quinta-feira, 21 de outubro de 2010 12:08
  • Ricardo,

    Obrigado funcionou sim.

     


    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    quinta-feira, 21 de outubro de 2010 19:29
  • Por nada ;)

     


    Ricardo Alves
    www.ricardoalves.me
    quinta-feira, 21 de outubro de 2010 19:38
  • Ricardo.

    Ou tem como eu colocar a palavras sem ascento?

     

    tipo to filtrando negócio e que que mande negócio pois qudno eu mando com ascento ele escreve um tando de coisa esquisita mas não a letra com ascento.


    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    quinta-feira, 21 de outubro de 2010 19:46
  • Eu já visto este erro antes...

     

    Você pode usar essa função que resolve:

    http://www.pietrogaiao.com.br/blog/retirar-acentos-com-javascript/

     

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves quinta-feira, 21 de outubro de 2010 19:59
    • Marcado como Resposta RicardoAlves terça-feira, 26 de outubro de 2010 15:25
    quinta-feira, 21 de outubro de 2010 19:59
  • Ricardo,

     

    Se eu colocar isso  crmForm.all.new_facilitadorid.lookupbrowse = 1;
     no filtro ele esconde mais naum filtra nada aparece tudo


    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    quinta-feira, 21 de outubro de 2010 20:20
  • Tiago,

     

    Na verdade não era para filtrar mesmo... Existem duas formas de fazer esse tipo de filtro, eu esqueci de passar a segunda na função...

     

    Quando você utiliza a propriedade "additionalparams", você depende no campo de busca e o valor nele.

    var valor = "teste";
    crmForm.all.new_facilitadorid.additionalparams = "search=" + valor;
    

     

    Uma segunda opção, é utilizar a função "AddParam()" para assim remover o campo utilizando o "lookupbrowser = 1". Pois assim você não depende do valor no campo que montará o fetchxml e sim inserir o fetchxml diretamente.

    var fetchxml = "<fetch mapping='logical'>...</fetch>";
    
    crmForm.all.new_facilitadorid.AddParam("search", fetchxml);
    crmForm.all.new_facilitadorid.lookupbrowse = 1;
    

     

    Abraço,

     

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves quinta-feira, 21 de outubro de 2010 20:47
    • Marcado como Resposta RicardoAlves quinta-feira, 28 de outubro de 2010 12:46
    quinta-feira, 21 de outubro de 2010 20:44
  • o VALOR A SER PROCURADO EU COLOCO NO LUGAR DOS ....

     

    TIPO

    var palavra = crmForm.all.new_cidadeId.DataValue[0].name

    var fetchxml = "<fetch mapping='logical'>" + palavra +"</fetch>";
    
    crmForm.all.new_facilitadorid.AddParam("search", fetchxml);
    crmForm.all.new_facilitadorid.lookupbrowse = 1;
    
    ???

    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    quinta-feira, 21 de outubro de 2010 23:10
  • Tiago,

     

    O fetchxml que me refiro seria uma query em formato xml. Por exemplo:

    var fetch = "
      <fetch mapping='logical'>
       <entity name='account'>
    <attribute name='accountid'/>
    <attribute name='name'/>
    <link-entity name='systemuser' to='owninguser'>
      <filter type='and'>
       <condition attribute='lastname' operator='ne' value='Cannon' />
      </filter>
    </link-entity>
       </entity>
      </fetch>
      ";
    

     

    Aqui tem mais exemplos

    http://technet.microsoft.com/en-us/library/ms936573.aspx

     

    Desta forma você consegue manipular os dados que serão inseridos no grid do lookup... essa ação é o que chamamos de "FilterLookup".

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves sexta-feira, 22 de outubro de 2010 02:11
    • Marcado como Resposta RicardoAlves quinta-feira, 28 de outubro de 2010 12:46
    sexta-feira, 22 de outubro de 2010 01:53
  • Ricardo seria mais ou menos assim?

     

    estou filtrando o pais dento do estados

    Entidade new_pais --> campo new_name

    Entidade new_estado --> campo a filtrar new_paisid

    Tela que em que deve ocorrer o filtro

    Etidaade  account  campo de Estado new_estadoid campo de pais new_paisid

     

    crmForm.all.new_estadoid.AddParam("search", fetchxml);
    crmForm.all.new_estadoid.lookupbrowse = 1;


    var fetchxml = "
      <fetch mapping='logical'>
       <entity name='new_pais'>
    <attribute name='new_paisid'/>
    <attribute name='name'/>
    <link-entity name='systemuser' to='owninguser'>
      <filter type='and'>
       <condition attribute='new_paisid' operator='ne' value='" + crmForm.all.new_paisid.DataValue[0].name  + "' />
      </filter>
    </link-entity>
       </entity>
      </fetch>
      ";


    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    sexta-feira, 22 de outubro de 2010 11:31
  • Então Tiago,

    Se você der uma olhada é como se você uma query sql... por exemplo:

    • Você vai fazer a busca na tabela estado e não país;
    • Se possui o id do país fica mais coerente a localização;
    • Não tem porque fazer um join (link) com usuario;
    • E nos itens que você quer retornar, coloque todos os atributos.

     

    Com os ajustes fica assim:

    var fetchxml = "
    <fetch mapping='logical'>
     <entity name=new_estado'>
      <all-attributes />
      <filter type='and'>
       <condition attribute='new_paisid' operator='eq' value='" + crmForm.all.new_paisid.DataValue + "' />
      </filter>
     </entity>
    </fetch>
     ";
    
    crmForm.all.new_estadoid.AddParam("search", fetchxml);
    crmForm.all.new_estadoid.lookupbrowse = 1;
    

     

    Entendeu?

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Sugerido como Resposta RicardoAlves sexta-feira, 22 de outubro de 2010 16:02
    sexta-feira, 22 de outubro de 2010 16:01
  • Sim, mas eu testei do jeito q vc falou teste desse jeito tb e ele traz tudo naum filtra

    var fetchxml = "" +
    "<fetch mapping='logical'>" +
     "<entity name=new_estado'>" +
      "<all-attributes />" +
      "<filter type='and'>" +
       "<condition attribute='new_paisid' operator='eq' value='" + crmForm.all.new_paisid.DataValue + "' /> "+
      "</filter>" +
     "</entity>" +
    "</fetch>" + "";

    crmForm.all.new_estadoid.AddParam("search", fetchxml);
    crmForm.all.new_estadoid.lookupbrowse = 1; 


    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    sexta-feira, 22 de outubro de 2010 18:07
  • O código tá certo... É que está faltando registrar um plugin...

     

    Tem o plugin pronto aqui:

    http://mscrmfilteredlookup.codeplex.com/releases/view/46051#DownloadId=124099

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    • Marcado como Resposta RicardoAlves quinta-feira, 28 de outubro de 2010 12:46
    sexta-feira, 22 de outubro de 2010 18:46
  • Coloquei, registrei o plugim e nada de filtra, sabe de mais um dica para que eu possa verificar?
    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    terça-feira, 26 de outubro de 2010 14:20
  • Tiago, você criou a chave do registro?

     

     

    1. Allow passing custom querystring values: Create a DWORD registry key named [DisableParameterFilter] under [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM], set the value to 1 , and IISReset (http://blogs.msdn.com/rextang/archive/2008/09/24/8962549.aspx).
    2. Now, Deploy the plugin, and register a step on Execute message, executing on pre-stage.
    3. Inside the entity form add line similar to this: crmForm.parentcustomerid.AddParam('filters', '<filters><filter entity="account"><condition attribute="name" operator="like" value="Agile Business Solutions%" /></filter></filters>');
    4. Don't forget to put Microsoft.crm.sdk in the GAC, or in the assembly folder, depending on your deployment method.
    5. Good luck.

     

     

     


    Ricardo Alves
    www.ricardoalves.me
    • Editado RicardoAlves quarta-feira, 27 de outubro de 2010 12:32 ajuste
    terça-feira, 26 de outubro de 2010 15:24
  • sim fiz isso ai.
    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    terça-feira, 26 de outubro de 2010 19:09
  • Tiago, pior que é só isso.

     

    Notei que na query está faltando uma aspa simples antes de new_estado. Ajusta e testa novamente...

     

     


    Ricardo Alves
    www.ricardoalves.me
    quarta-feira, 27 de outubro de 2010 12:43
  • Adicionei a linha no arquivo lookupsigle e a consulta Fetch funcionou corretamente. sem necessicade do plugin. obrigado

     

    void crmgrid_PreRender( object sender , EventArgs e )

    {

     

    // As we don't want to break any other lookups, ensure that we use workaround only if

     

    // search parameter set to fetch xml.

     

    if (crmGrid.Parameters["search"] != null && crmGrid.Parameters["search"].StartsWith("<fetch"))

    {

    crmGrid.Parameters.Add(

    "fetchxml", crmGrid.Parameters["search"]);

     

    // searchvalue needs to be removed as it's typically set to a wildcard '*'

    crmGrid.Parameters.Remove(

    "searchvalue");

     

    // Icing on a cake - ensure that user cannot create new contact outside of the account

     

    // and then select it.

     

    this._showNewButton = false;

    }

    }


    Tiago Henrique Consultor de Implantação Microssoft Dynamics CRM
    • Marcado como Resposta RicardoAlves quinta-feira, 28 de outubro de 2010 12:46
    quarta-feira, 27 de outubro de 2010 15:30
  • Maravilha Tiago...

     

    Só tome cuidado de documentar esse tipo de alteração, pois por não ser suportada ela pode ser defeita ou até complicar uma atualização do produto.

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    quinta-feira, 28 de outubro de 2010 12:49