CRM 2011 – Onclick no Subgrid


Se tem um tipo de conversa que eu gosto e costume ter, é sobre a suportabilidade ou não suportabilidade das customizações que precisamos fazer no Dynamics, as coisas evoluíram bastante nas duas últimas versões (4 e 2011), muita coisa que fazíamos de forma totalmente errada e intrusiva tornou-se algo default da ferramenta como o caso dos filters lookups.

Porém, ainda temos alguns gaps, principalmente nos novos recursos disponibilizados, como o Subgrid e os Diálogos, assim, nós desenvolvedores precisamos fazer algo além do default, tomando sempre o cuidado com a suportabilidade.

Bom com essa introdução, posso ir ao ponto do post! rs

Nativamente não existe o evento onclick para as linhas do subgrid, e em alguns casos precisamos processar algo ao clicar nas linhas, como alimentar algum campo ou chamar um serviço. Assim, crio este post para dar um exemplo de como implementar, já avisando que é algo “Não Suportado”(Unsupported), mesmo assim, procurei ter cuidado e pensar no crossbrowser, mas a garantia de funcionalidade nas novas versões, fica em aberto.

O resultado final será este:

Podemos descrever tudo em 3 passos:

  1. A inserção do evento click deve ser feita no load do formulário, assim devemos ter uma função no evento OnLoad. Devido o SubGrid só ficar ativo quando o registro já exista, tive que forçar o salve do formulário quando for um novo registro:
    // FORM TYPE's
    var FORM_TYPE_CREATE = 1;
    var FORM_TYPE_UPDATE = 2;
    var FORM_TYPE_READ_ONLY = 3;
    var FORM_TYPE_DISABLED = 4;
    var FORM_TYPE_QUICK_CREATE = 5;
    var FORM_TYPE_BULK_EDIT = 6;
    
    // FUNCTION: OnLoad
    function OnLoad() {
        var nomeSubGrid = "EntidadeSubGrid";
    
        // Obtém o Type do Form
        var formType = Xrm.Page.ui.getFormType();
    
        // Verifica o Tipo(estágio) em que o registro está sendo requisitado
        switch (formType) {
            case FORM_TYPE_CREATE:
                {
                    // *** Quando for uma novo formulário o SugGrid aparece desabilitado, para isso forçamos um Save para depois utilizar o form ***
    
                    // Salva Formulário
                    Xrm.Page.data.entity.save();
    
                    break;
                }
            default:
                {
                    // Attach o evento Refresh no SubGrid
                    setTimeout("AttachOnRefreshSubGrid('" + nomeSubGrid + "');", 1000);
    
                    // Attach o evento Click no SubGrid
                    setTimeout("AttachOnClickSubGrid('" + nomeSubGrid + "')", 1500);
    
                    break;
                }
        }
    }
    
  2. No código acima, note que existem dois eventos sendo adicionados, um no refresh e o outro no click, o refresh só existe para que na paginação do SubGrid a inserção do click das linhas seja atualizada. A função de cada um é apenas “injetar” um javascript com o evento desejado, vejam:
    /// FUNCTION: AttachOnClickSubGrid
    /// DESCRIPTION: Adiciona o evento Click no SubGrid para capturar o click das linhas
    function AttachOnClickSubGrid(subgridname) {
        var gridControl = document.getElementById(subgridname).control;
        var recordsFromInnerGrid;
    
        // Tenta recuperar os registros do Grid
        try {
            // *** PRÉ POLARIS ***
            recordsFromInnerGrid = gridControl.getRecordsFromInnerGrid();
        } catch (e) {
            // *** POLARIS ***
            recordsFromInnerGrid = gridControl.GetRecordsFromInnerGrid();
        }
    
        // Percorre por todas as linhas do subgrid adicionando evento onclick
        for (var rowNo = 0; rowNo < recordsFromInnerGrid.length; rowNo++) {
            var linha = recordsFromInnerGrid[rowNo][3];
    
            // Oculta checkbox
            linha.cells[0].getElementsByTagName("input")[0].style.display = "none";
    
            // IE 9
            if (linha.attachEvent) {
                linha.attachEvent("onclick", (function (that, handler_ary) {
                    return function () {
                        SelecionarLinhaGrid(that, handler_ary);
                        return false;
                    }
                })(subgridname, linha));
            }
            // Todos os navegadores, menos o IE 9
            else {
                linha.addEventListener("click", (function (that, handler_ary) {
                    return function () {
                        SelecionarLinhaGrid(that, handler_ary);
                        return false;
                    }
                })(subgridname, linha), false);
            }
        }
    }
    
    /// FUNCTION: AttachOnRefreshSubGrid
    /// DESCRIPTION: Adiciona o evento Refresh no SubGrid para que na paginação do SubGrid seja adicionado o evento Click nas linhas
    function AttachOnRefreshSubGrid(subgridname) {
        var subgrid = document.getElementById(subgridname);
    
        if (subgrid) {
            // Tenta recuperar os registros do Grid
            try {
                // *** POLARIS ***
                subgrid.control.add_onRefresh((function (that, handler_ary) {
                    return function () {
                        AttachOnClickSubGrid(that, handler_ary);
                        return false;
                    }
                })(subgridname));
            } catch (e) {
                // *** PRÉ POLARIS ***
                subgrid.attachEvent("onrefresh", (function (that, handler_ary) {
                    return function () {
                        AttachOnClickSubGrid(that, handler_ary);
                        return false;
                    }
                })(subgridname));
            }
        }
    }
    
  3. Por fim, vamos a onde a “mágica” acontece, a função “SelecionarLinhaGrid”, lá colocaremos a inteligência do click, criei um campo no formulário para armazenar uma coluna do SubGrid:
    /// FUNCTION: SelecionarLinhaGrid
    /// DESCRIPTION: Realiza as ações necessárias ao clicar em uma linha do SubGrid
    function SelecionarLinhaGrid(subgridname, linha) {
        // *** Aqui use o "debugger;" para entender melhor o HTML, como a posição das células e ID ***
        // debugger;
        // EXEMPLO:
    
        var ID = linha.cells[0].getElementsByTagName("input")[0].id.replace("checkBox_{", "").replace("}", "");
    
        // Verifica se a Coluna está em branco
        if (linha.cells[1].innerText != "") {
            // *** POLARIS ***
            var nomeLinhaSubGrid = linha.cells[1].innerText;
        }
        else {
            // *** PRÉ POLARIS ***
            var nomeLinhaSubGrid = linha.cells[2].innerText;
        }
    
        Xrm.Page.getAttribute("new_nomelinhasubgrid").setValue(nomeLinhaSubGrid);
    }
    

Exportei a solução completa (não esqueça de alterar a extensão para “ZIP”):
OnclickSubgrid_1_1_0_0 (ALTERAR A EXTENSÃO PARA “ZIP”)

PS: Atualizado para funcionar com o Polaris.

Espero ter ajudado!

[]’s,

Tiago Cardoso

2 comentários em “CRM 2011 – Onclick no Subgrid

  1. Olá Tiago,

    Eu tentei utilizar o seu código, pois o único diferente que eu encontrei comparado aos demais disponíveis. Mesmo assim eu ainda não consegui fazer o refresh de subgrid funcionar com o rollup 12.

    Você já conseguiu fazer isso?

    Obrigado,
    Diego

    Curtir

    1. Diego,

      Como eu mesmo havia alertado o problema de fazer algo não suportado é este… Com o R12 tudo parou de funcionar certo? Agora, temos a preocupação de ser crossbrowser… Imagine o trabalho de fazer isso?

      Bom, eu consegui fazer funcionar no R12 para IE 9 e Chrome, não tenho outros browser aqui, mas acredito que deva funcionar.

      Veja o post, eu fiz uma atualização:

      https://tiagomcardoso.wordpress.com/2012/10/25/crm-2011-onclick-no-subgrid/

      Att,
      Tiago Cardoso

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.