Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

edgarzin

Calcular colunas de uma Tabela

Recommended Posts

Preciso multiplicar a coluna 'quantidade' pela coluna 'valor' de uma linha e somar com a outra linha e assim por diante...

 

As linhas da minha tabela são inseridas dinamicamente a parti de um botão.

 

Segue o código de soma da coluna 'valor'

function somaTotal(){
	var soma = 0;

	$('#tabela > tbody tr .idValor').each(function(i){ 

	var temp = $(this).val().toString().replace(",","");
	var temp2 = temp.replace(".","");
  	soma += parseInt(temp2); 

	}); 
		
	
        soma = soma.toString().replace(/(\d)(\d{8})$/,"$1.$2");//coloca o ponto dos milhões
        soma = soma.toString().replace(/(\d)(\d{5})$/,"$1.$2");//coloca o ponto dos milhares
        soma = soma.toString().replace(/(\d)(\d{2})$/,"$1,$2");//coloca a virgula antes dos 2 últimos dígitos

	
	$("#resultado").val("Total: R$ " + soma);
	} 

essa gambiarra de replace é apenas para retirar a mascara para o calculo da soma sair correto.

 

Teria alguma forma de embuti essa funcionalidade nessa função?

 

linha 1 ( 'quantidade' x 'valor' ) + linha 2 ( 'quantidade' x 'valor' ) + linha 3 ( 'quantidade' x 'valor' ) + linha n ( 'quantidade' x 'valor' ) ...

 

 

agradeço e aguardo

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque seu código no jsfiddle ou jsbin. Fica mais fácil pra ajudar.

 

É muito código cara...

 

o que estou querendo é descobrir um modo de conseguir pegar o valor da outra coluna 'quantidade' e manipula-lo junto com a coluna 'valor'

 

algo do tipo:

$('#tabela > tbody tr .idValor, .idQtd').each(function(i){ 
 
	var valor = $ .idValor.val();
        var quantidade =  $ .idQtd.val();

});

Não intendo muito da linguagem :blush:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem o código, vai ser preciso abstrair pra te explicar, porque eu precisaria saber como ta tua estrutura. Mas, la vai...

Pra pegar o conteudo textual de um elemento (com jQuery)

var texto = $('seletor').text();

Agora, pra fazer o que você quer... Levando em consideração o HTML:

<table>
  <tr>
    <td class="valor">10</td>
    <td class="quantidade">20</td>
    <td class="total"></td>
  </tr>
  <tr>
    <td class="valor">13</td>
    <td class="quantidade">43</td>
    <td class="total"></td>
  </tr>
</table>

E utilizando .each() pra pegar o .valor e .quantidade de cada linha, soma-los e inserir na coluna .total

$("table tr").each(function() {
  var total = $(this).find('.valor').text(),
      qtd = $(this).find('.quantidade').text();

  $(this).find('.total').text(totaç+qtd);
});

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rafael Sirotheau,

 

Consegui fazer o que eu queria nao com seu código... mas depois que eu li e fiquei pensando sobre ele

 

as ideias fluíram :D

 

Segue a minha solução:

function somaTotal(){
	var soma = 0;
	var k = 0; // variavel para o for realizar a soma do produto das linhas.
	var j = 0; // variavel para percorrer e preencher os dois vetores corretamente
	
	vetorQtd = new Array();
	vetorValor = new Array();

	$('#tabela > tbody tr .idValor, .idQtd').each(function(i){ 
        // retiro a mascara do input
	var temp = $(this).val().toString().replace(",",""); 
	var temp2 = temp.replace(".","");
	
	 j++;
	 if(i % 2 == 0) // se i for par estou na coluna quantidade .idQtd logo preencho o vetorQtd
	 {
	  vetorQtd[j] = temp2;
	 }
	 else // se for impar estou na coluna valor .idValor logo preencho o vetorValor
	 {
	  vetorValor[j-1] = temp2;
	  j--; // decremento a varial j para manter numero da linha para as duas colunas
	 }

		}); 
		
		
	for(k = 1; k < vetorV.length; k++) // k = 1 pois comecei a inserir nos vetores
	 {                                 // a parti do indice 1 por motivos de logica ;D

	  soma = soma + (vetorQ[k] * vetorV[k]); // faço a soma do produto de cada linha *-*
	  alert(soma);

	 }
		
	// apenas devolvendo a mascara
	soma = soma.toString().replace(/(\d)(\d{8})$/,"$1.$2");
        soma = soma.toString().replace(/(\d)(\d{5})$/,"$1.$2");
        soma = soma.toString().replace(/(\d)(\d{2})$/,"$1,$2");

	
	$("#resultado").val("Total: R$ " + soma);
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom, cara! :yes:

Só uma dica: Recomendo revisar teu código... Você está perdendo performance em alguns pontos...

 

Por exemplo, no .each(), você esta fazendo buscas ao DOM desnecessariamente dessa forma se .idValor e .idQuantidade forem 'irmãos'. Ao invés de buscar em toda página, é melhor buscar cada <tr> e, então, localizar os filhos. Imaginando que sua estrutura esta algo como

<tr>
  ...
  <td class="idValor">...</td>
  ...
  <td class="idQuantidade">...</td>
  ...
</tr>

É melhor fazer um .each() mais ou menos assim

$('#tabela > tbody tr').each(function(i){ 
    var valor = $(this).find('.idValor').val().toString().replace(",","").replace(".","");
    var qtd = $(this).find('.idQtd').val().toString().replace(",","").replace(".",""); 
    
    vetorQtd[i] = qtd;
    vetorValor[i] = valor;

});

Analise se, realmente, é necessário utilizar essa array. Se essa soma já não pode ser feita dentro do each(), para evitar processamento desnecessário. Enfim, tenta dar uma enxugada no código.

Abs!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.