none
Calculando a soma dos produtos da cotação (usando os valores de uma subGrid) RRS feed

  • Pergunta

  • function GetSubGridCellValues() {
        if (document.getElementById("Produtos")) {
            var gridControl = document.getElementById("Produtos").control;
            var ids = gridControl.get_allRecordIds();
            for (i = 0; i < ids.length; i++) {
                var cellValue = gridControl.getCellValue('extendedamount', ids[i]);
                var sum = sum + cellValue ;
            }
    alert(typeof(sum));
        }
        else {
            setTimeout("GetSubGridCellValues();", 2500);
        }
    }
    

    Este código está me retornando o tipo "String" , como eu faço para que ele realize a busca e me retorne o resultado do tipo Float ?

    Eu tentei fazer uma sugestão que vi em outro tópico, porem não deu certo;

    var cellValue = parseFloat(gridControl.getCellValue('extendedamount', ids[i]));

    até que o valor de cellValue se torna "Number", porem ao verificar o resultado de "Sum" ele me retorna um NaN.

    terça-feira, 29 de julho de 2014 18:51

Respostas

  • Boas Pedro, consegui resolver o Código da seguinte forma;

    function timeout(){
     setTimeout(calcCostoTotal, 3000);
    }
    
    function calcCostoTotal() {
    
    var grid = document.getElementById('ProdutoDaCotacao'); 
    var ids = grid.control.get_allRecordIds();
    var sum = 0.00;
    var cellValue;
    
    for(i = 0; i < ids.length; i++) {
    
      cellValue = grid.control.getCellValue('extendedamount',ids[i]);
      var number = Number(cellValue.replace(/[^0-9]+/g,"")) /100;
      sum = sum + number;
    }
    
    Xrm.Page.data.entity.attributes.get("CAMPO").setValue(sum);
    Xrm.Page.data.entity.save();
    
    }

    ficou 100% :D , obrigado pela atenção

    • Marcado como Resposta Thiago_Lima segunda-feira, 18 de agosto de 2014 18:45
    segunda-feira, 18 de agosto de 2014 17:42
  • Boas Thiago,

    Eu testei no meu ambiente online e o que ele retorna não é o valor mas sim, o nome do campo + o valor. Por isso alterei o código para ter em conta este facto:

    function GetSubGridCellValues() {
        if (document.getElementById("quotedetailsGrid")) {
            var gridControl = document.getElementById("quotedetailsGrid").control;
            var ids = gridControl.get_allRecordIds();
    		var sum = 0;
            for (i = 0; i < ids.length; i++) {
    			var cellName = "extendedamount";
    			var cellValue = gridControl.getCellValue(cellName, ids[i]);
    			var numericValue = cellValue.substr(cellName.length, cellValue.length - cellName.length - 2);
    			
                sum = sum + parseFloat(numericValue);
            }
        }
        else {
            setTimeout("GetSubGridCellValues();", 2500);
        }
    }

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quarta-feira, 30 de julho de 2014 12:05
    • Marcado como Resposta Thiago_Lima quarta-feira, 30 de julho de 2014 17:45
    quarta-feira, 30 de julho de 2014 12:05

Todas as Respostas

  • var cellValue = parseFloat(gridControl.getCellValue('extendedamount', ids[i]));


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

    terça-feira, 29 de julho de 2014 22:58
    Moderador
  • Ola Tiago bom dia, obrigado por responder !

    eu já tinha tentando esta linha de código que você sugeriu e verifiquei que o calor de cellValue passa a ser number, porem quando vou realizar a soma "var sum = sum+cellValue;" e um alert no "sum" ele me retorna um NaN , sabe me dizer o porque que não está me retornando um Float ??

    quarta-feira, 30 de julho de 2014 11:18
  • Thiago,

    Notei que você está criando a variável sum dentro da estrutura de repetição, nesse caso toda vez que você iterar entre as posições do array você estria zerando a variável sum, tenta criar essa variável fora do for.


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 30 de julho de 2014 11:48
  • Boas Thiago,

    Eu testei no meu ambiente online e o que ele retorna não é o valor mas sim, o nome do campo + o valor. Por isso alterei o código para ter em conta este facto:

    function GetSubGridCellValues() {
        if (document.getElementById("quotedetailsGrid")) {
            var gridControl = document.getElementById("quotedetailsGrid").control;
            var ids = gridControl.get_allRecordIds();
    		var sum = 0;
            for (i = 0; i < ids.length; i++) {
    			var cellName = "extendedamount";
    			var cellValue = gridControl.getCellValue(cellName, ids[i]);
    			var numericValue = cellValue.substr(cellName.length, cellValue.length - cellName.length - 2);
    			
                sum = sum + parseFloat(numericValue);
            }
        }
        else {
            setTimeout("GetSubGridCellValues();", 2500);
        }
    }

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quarta-feira, 30 de julho de 2014 12:05
    • Marcado como Resposta Thiago_Lima quarta-feira, 30 de julho de 2014 17:45
    quarta-feira, 30 de julho de 2014 12:05
  • Ola Pedro e Marco, obrigado por responderem !

    fiz a sugestão proposta por vocês e nos 2 casos o retorno é sempre "NaN" para sum

    pedro com você deu tudo certo ? colei o seu código e não consegui, eu cheguei neste codigo que colei baseado neste tópico 

    http://social.microsoft.com/Forums/en-US/34c1f094-6690-4e4a-97e5-0947d182f092/calculate-total-cost-from-sub-grid-with-column-cost

    mas no codigo que esta neste forum ele ate faz a soma porem como ele retorna uma string é dificil de fazer a mascara de moeda porque estou trabalhando com valores decimais ai fica assim "R$ 3.87993" onde deveria ficar assim "R$ 3.879,93" , e o resultado varia muito dependendo dos valores que ele calcula depois da ","


    • Editado Thiago_Lima quarta-feira, 30 de julho de 2014 13:07 .
    quarta-feira, 30 de julho de 2014 12:46
  • Boas Tiago,

    Pois como eu trabalho com € a mim aparece-me 1000€. Para funcionar então vais ter que mexer nesta linha:

    var numericValue = cellValue.substr(cellName.length, cellValue.length - cellName.length - 2);

    Onde terás que colocar algo do género:

    var numericValue = cellValue.substr(cellName.length + 3, cellValue.length - cellName.length);

    Se não der vai fazendo alert do numericValue até conseguires apanhar apenas o valor. A função substr é uma função do Javascript em que o primeiro parâmetro tem o índice do inicio da string que queres considerar e o segundo parâmetro quantos caracteres queres copiar para a nova string.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quarta-feira, 30 de julho de 2014 14:41
    quarta-feira, 30 de julho de 2014 14:41
  • Boas Pedro, consegui resolver o Código da seguinte forma;

    function timeout(){
     setTimeout(calcCostoTotal, 3000);
    }
    
    function calcCostoTotal() {
    
    var grid = document.getElementById('ProdutoDaCotacao'); 
    var ids = grid.control.get_allRecordIds();
    var sum = 0.00;
    var cellValue;
    
    for(i = 0; i < ids.length; i++) {
    
      cellValue = grid.control.getCellValue('extendedamount',ids[i]);
      var number = Number(cellValue.replace(/[^0-9]+/g,"")) /100;
      sum = sum + number;
    }
    
    Xrm.Page.data.entity.attributes.get("CAMPO").setValue(sum);
    Xrm.Page.data.entity.save();
    
    }

    ficou 100% :D , obrigado pela atenção

    • Marcado como Resposta Thiago_Lima segunda-feira, 18 de agosto de 2014 18:45
    segunda-feira, 18 de agosto de 2014 17:42