Ir para conteúdo
Fórum Script Brasil
  • 0

Soma mais de 9 campos falha!


Notax

Pergunta

Pessoal, bom dia.

Tenho esse codigo aqui:

function soma() {
document.getElementById('total').onblur = function() {

var st1 = document.getElementById('subtotal1').value;
st1 = st1.replace(",",".");
var st2 = document.getElementById('subtotal2').value;
st2 = st2.replace(",",".");
var st3 = document.getElementById('subtotal3').value;
st3 = st3.replace(",",".");
var st4 = document.getElementById('subtotal4').value;
st4 = st4.replace(",",".");
var st5 = document.getElementById('subtotal5').value;
st5 = st5.replace(",",".");
var st6 = document.getElementById('subtotal6').value;
st6 = st6.replace(",",".");
var st7 = document.getElementById('subtotal7').value;
st7 = st7.replace(",",".");
var st8 = document.getElementById('subtotal8').value;
st8 = st8.replace(",",".");
var st9 = document.getElementById('subtotal9').value;
st9 = st9.replace(",",".");

var resultado = parseFloat(st1) + parseFloat(st2) + parseFloat(st3) + parseFloat(st4) + parseFloat(st5) + parseFloat(st6) + parseFloat(st7) + parseFloat(st8) + parseFloat(st9);

resultado = resultado.toFixed(2);
this.value = resultado.replace(".",",");
}
}

até aqui tudo funcionando perfeito... no entanto quando eu tento incluir o st10 para de somar... na verdade essa soma precisaria ir até o st20... mas apartir do st10 ela para de funcionar... so funciona até o st9, como está acima... alguém poderia me ajudar?

Outra coisa que eu preciso é o seguinte:

Fazer um alert pra quando o valor que está no campo total for menor ou maior do que o valor total do somatorio acima... tipo... o valor de total tem que ser exatamente igual ao somatorio acima... só que como ele so faz a operação no onblur preciso garantir de alguma forma que o user não esqueça de clicar em cima do campo total antes de submeter... sacaram?

Será que rolam esses dois helps?

[]'s Notax

Editado por Notax
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Notax voce precisa pensar mais em simplificar porque se você tiver 50 campos você vai escrever os 50 campos um a um?

<script language="javascript">
function soma() {
var container = document.getElementById("container");
var inputs = container.getElementsByTagName("input");
var totalElementos = inputs.length;
var total = 0;

for (var i=0; i < totalElementos; i++)
{
    total += parseFloat(inputs[i].value);
}
document.getElementById("resultado").value = total.toFixed(2).replace(".",",");

}
</script>

<div id="container">
<input type="text" name="subtotal1" id="subtotal1">
<input type="text" name="subtotal2" id="subtotal2">
<input type="text" name="subtotal3" id="subtotal3">
<input type="text" name="subtotal4" id="subtotal4">
<input type="text" name="subtotal5" id="subtotal5">
<input type="text" name="subtotal6" id="subtotal6">
<input type="text" name="subtotal7" id="subtotal7">
<input type="text" name="subtotal8" id="subtotal8">
<input type="text" name="subtotal9" id="subtotal9">
<input type="text" name="subtotal10" id="subtotal10">
</div>
<input type="text" name="resultado" id="resultado">
<input type="button" value="Somar" onclick="soma()">

Link para o comentário
Compartilhar em outros sites

  • 0

Santa Andreia...

Ihhhh... num entendi...

To bem fraco em JS... admito...

var inputs = container.getElementsByTagName("input");

Andreia, o que eu não entendi é como que nesta função ele vai somar os inputs certos? tipo apenas os subtotal1 a subtotal20... aonde que faz essa diferenciação...

valeu a força...

ahhhh... to esperando o numero da sua Gerente pra exigir que ela te de um aumento!

[]'s Notax

Link para o comentário
Compartilhar em outros sites

  • 0

heheheheheheh ^^

então, vo explicar.. eu criei um container (DIV) que dentro tem todos os inputs que devem passar pelo FOR. O que estiver fora da DIV não será visto.

Caso voce tenha a necessidade de outros inputs text junto destes, pra diferenciar você poe então uma ID somente nos inputs q devem passar pela funcao.

resumindo, você precisa de algo pra diferenciar. Ou coloca uma ID em cada (id igual para todos para formar um grupo) ou então coloca num container

var inputs = container.getElementsByTagName("input");

justamente, eu pego o div (container) e só tiro de lá os inputs

Link para o comentário
Compartilhar em outros sites

  • 0

Poisé minha amiga... agora eu te entendi...

mas fiquei agora com novas dúvidas...

Tentei dessa forma mas não consegui porque esses inputs estão em uma tabela... então tive que criar varias divs com o mesmo id... não sei se é por isso... mas defato não funcionou... ele só soma a primeira div...

Eu não posso mudar o id porque já uso os id's para fazer outras coisas... e cada um tem um id diferente mesmo...

vou explicar melhor...

cada subtotal é resultado de uma operação... da seguinte forma:

document.getElementById('subtotal20').onblur = function(){
var q = document.getElementById('qtde20').value;
var v = document.getElementById('valor20').value;
v = v.replace(",",".");
q = q.replace(",",".");
v = parseFloat(q)*parseFloat(v);
v = v.toFixed(2);
this.value = v.replace(".",",");
}

como pode ver eu tenho 20 campos subtotal, 20 campos qtde e 20 campos valor...

sempre valor*qtde = subtotal... fiz a mesma coisa cansativas 20 vezes...

agora a univca coisa que eu preciso é somar todos os subtotais... sendo que preciso ainda de um alerta para que se o user tentar submeter e o total for maior ou menor que a soma de todos os subtotais é porque ele esqueceu de passar o mouse pelo total, visto que executa a função por onblur...

será que tem outro jeito pra eu conseguir isso?

[]'s Notax

Link para o comentário
Compartilhar em outros sites

  • 0

Andréia eu não to postando o código todo porque é bem grande e a maior parte não tem nada a ver com isso aqui... mas se precisar eu posto sem problema algum... vou postar como o código estava originalmente... sem as suas sugestões de alteração...

seguem trechos:

<script>
function calculo() {
document.getElementById('subtotal1').onblur = function(){
var q = document.getElementById('qtde1').value;
var v = document.getElementById('valor1').value;
v = v.replace(",",".");
q = q.replace(",",".");
v = parseFloat(q)*parseFloat(v);
v = v.toFixed(2);
this.value = v.replace(".",",");
}
//repete até subtotal20, qtde20 e valor20

function soma() {
document.getElementById('total').onblur = function() {

var st1 = document.getElementById('subtotal1').value;
st1 = st1.replace(",",".");
var st2 = document.getElementById('subtotal2').value;
st2 = st2.replace(",",".");
//repete até st20 e subtotal20

var resultado = parseFloat(st1) + parseFloat(st2) + parseFloat(st3) + parseFloat(st4) + parseFloat(st5) + parseFloat(st6) + parseFloat(st7) + parseFloat(st8) + parseFloat(st9) + parseFloat(st10) + parseFloat(st11) + parseFloat(st12) + parseFloat(st13) + parseFloat(st14) + parseFloat(st15) + parseFloat(st16) + parseFloat(st17) + parseFloat(st18) + parseFloat(st19) + parseFloat(st20);

resultado = resultado.toFixed(2);
this.value = resultado.replace(".",",");
}
}

window.onload = function(){
    calculo(); soma();
}


</script>

<html>

    <td>        <div align="center">
      <input name="qtde1" type="text" id="qtde1" value="0" size="10">
    </div></td>
    <td><div align="center">
      <input name="valor1" type="text" id="valor1" onkeypress="return blokletras(event)" value="0,00" size="13">
    </div></td>
    <td><div align="center">
      <input name="subtotal1" type="text" id="subtotal1" value="0,00" size="13">    
    </div></td>
    </tr>
  <tr>
    <td><div align="center">
      <input name="codproduto2" type="text" id="codproduto2" size="12">
    </div></td>
    <td><div align="center">
      <input name="descr2" type="text" id="descr2" size="40">
    </div></td>
    <td><div align="center">
      <input name="qtde2" type="text" id="qtde2" value="0" size="10">
    </div></td>
    <td><div align="center">
      <input name="valor2" type="text" id="valor2" onkeypress="return blokletras(event)" value="0,00" size="13">    
    </div></td>
    <td><div align="center">
      <input name="subtotal2" type="text" id="subtotal2" value="0,00" size="13"  >
    </div></td>

//repete ate 20...

      <input name="total" type="text" id="total" value="0,00" size="13" onkeypress="return blokletras(event)">    


</html>

acho que era isso...

desta forma... soma legal se eu coloca até o numero 9... se vai mais para de funcionar a funcao toda...

valeu a força minha amiga!

[]'s Notax

Editado por Notax
Link para o comentário
Compartilhar em outros sites

  • 0

Eita, notax e os html´s perdidos dele rsrsrs.

Eu de você colocava uma classe para elementos do tipo subtotal. Independente de onde eles estejam, fará a soma apenas com aqueles elementos que deseja somar.

Função que irá somar:

function soma(total, subtotal, contexto){
    contexto = contexto?contexto:document
    total["onblur"] = function(){
        var objs = contexto.getElementsByTagName("input")
        var E = 0
            for(var x=0; x<objs.length; x++)
                if(objs[x].className && objs[x].className == subtotal)
                    E += parseInt( objs[x].value?objs[x].value.replace(/\D/, 0):0 )
                
        total.value = E
    }            
}
Aqui eu criei uma função para criar vários inputs da classe que eu desejo somar, não é recomendado fazer isso no js, é interessante usar uma linguagem de servidor para criar dinamicamente os campos, se forem muitos.
function inputs
                (classe, form, qtd){
                var aux = ""
                    for(var x=0; x<qtd; x++)
                        aux +=  "<input type='text' class='"+classe+"' />" 
                form.innerHTML = aux + "<input type='text' class='total' name='total' value='Total'>"            
            }
o Html:
<form id="form1" name="form1"></form>
Crio 50 campos de soma de classe "subtotal1" para o form1, depois eu digo para o elemento de classe "total" daquele form, faça a soma de todos os outros subtotais quando estiver sem foco. Então:
window.onload = function (){
    inputs("subtotal1", document.form1, 50)
    soma(document.form1.total, "subtotal1")
}

Beleza? Melhora seu html garoto....

Link para o comentário
Compartilhar em outros sites

  • 0

Kakarotto... valeu a força... uma hora vou postar um script aqui html depois de pronto pra você ver como fica... não sou nem louco de colocar algo como coloquei aqui... tipo... to em testes ainda nesse troço... além de colocar apenas trechos como coloquei acima, os coloco ainda crus... da forma como o dreamweaver faz mesmo... depois deixo tudo gabaritado e certinho... mas valeu a dica mesmo!

Cara... só que assim... meu problema com a sua dica está exatamente nesta parte:

EDITANDO AQUI porque CONSEGUI SOLUCIONAR PARTE DO PROBLEMA:

O somatório ficou assim:

function soma() {
document.getElementById('total').onblur = function() {
var st1 = document.getElementById('subtotal1').value;
st1 = st1.replace(",",".");
var st2 = document.getElementById('subtotal2').value;
st2 = st2.replace(",",".");
var st3 = document.getElementById('subtotal3').value;
st3 = st3.replace(",",".");
var st4 = document.getElementById('subtotal4').value;
st4 = st4.replace(",",".");
var st5 = document.getElementById('subtotal5').value;
st5 = st5.replace(",",".");
var st6 = document.getElementById('subtotal6').value;
st6 = st6.replace(",",".");
var st7 = document.getElementById('subtotal7').value;
st7 = st7.replace(",",".");
var st8 = document.getElementById('subtotal8').value;
st8 = st8.replace(",",".");
var st9 = document.getElementById('subtotal9').value;
st9 = st9.replace(",",".");
var st10 = document.getElementById('subtotal10').value;
st10 = st10.replace(",",".");
var st11 = document.getElementById('subtotal11').value;
st11 = st11.replace(",",".");
var st12 = document.getElementById('subtotal12').value;
st12 = st12.replace(",",".");
var st13 = document.getElementById('subtotal13').value;
st13 = st13.replace(",",".");
var st14 = document.getElementById('subtotal14').value;
st14 = st14.replace(",",".");
var st15 = document.getElementById('subtotal15').value;
st15 = st15.replace(",",".");
var st16 = document.getElementById('subtotal16').value;
st16 = st16.replace(",",".");
var st17 = document.getElementById('subtotal17').value;
st17 = st17.replace(",",".");
var st18 = document.getElementById('subtotal18').value;
st18 = st18.replace(",",".");
var st19 = document.getElementById('subtotal19').value;
st19 = st19.replace(",",".");
var st20 = document.getElementById('subtotal20').value;
st20 = st20.replace(",",".");
var resultado = eval(st1)+eval(st2)+eval(st3)+eval(st4)+eval(st5)+eval(st6)+eval(st7)+eval(st8)+eval(st9)+eval(st10)+eval(st11)+eval(st12)+eval(st13)+eval(st14)+eval(st15)+eval(st16)+eval(st17)+eval(st18)+eval(st19)+eval(st20);

resultado = resultado.toFixed(2);
this.value = resultado.replace(".",",");
}
}


window.onload = function(){
    calculo(); soma();
}
Ficou meio tosco, não? poisé... aceito ideias melhores... mas como já está funcionando... meu próximo problema é em criar um alert pra quando o valor em total (faz os somatorios em onblur) for menor ou maior que o somatorio acima tem que dar um alert... tentei assim e não funcionou:
function valida_campo()
{
var total = document.form.total;

    if (total.value<>eval(st1)+eval(st2)+eval(st3)+eval(st4)+eval(st5)+eval(st6)+eval(st7)+eval(st8)+eval(st9)+eval(st10)+eval(st11)+eval(st12)+eval(st13)+eval(st14)+eval(st15)+eval(st16)+eval(st17)+eval(st18)+eval(st19)+eval(st20)){
        alert("Digite o dia!");
        total.focus()
        return false
        }

alguém sabe como fazer isso funcionar?

[]'s Notax

Editado por Notax
Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal, beleza?

Bah... tentei hoje o dia todo... mas não rolou...

só falta pra mim fazer um alert, porque assim:

essa função de soma, que agora está funcionando, ela é executada atraves de um onblur em cima do campo "total"... só que se o user esquecer de clicar ou passar ali por cima de total não faz a soma...

então preciso de uma forcinha aqui nas seguintes dúvidas:

1)tem como fazer um alert para que se o valor do input total for diferente do valor da variavel resultado da um alert... tentei assim mas não rolou:

if (total.value != resultado.value){
        alert("Não esqueça de clicar em TOTAL antes de incluir a venda!");
        total.focus()
        return false
        }

obs.: no post acima tem exatamente daonde se origina essa variavel resultado...

2) fazer com que sempre ao pressionar o submit tb execute a função soma!

3) aproveitando um post preciso fazer alguma interligações entre um input e outro... tipo: se o input data5 tiver algum digito ou algum caracter qualquer então da um alert se o input valor5 stiver vazio...

Será que rolam essas dúvidas?

[]'s Notax

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...