Foros del Web » Programando para Internet » Javascript »

Sumando valores

Estas en el tema de Sumando valores en el foro de Javascript en Foros del Web. Buenas compañeros de regreso por aqui para buscar una respuesta a mi duda, tengo el siguienta funcion Código: function calcular_precio() { var total_precio = 0; ...
  #1 (permalink)  
Antiguo 20/09/2006, 12:01
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 1 mes
Puntos: 406
Sumando valores

Buenas compañeros de regreso por aqui para buscar una respuesta a mi duda, tengo el siguienta funcion

Código:
function calcular_precio() {    
    var total_precio = 0;
    
    for (i=1; i<num_fila; i++) {
        total_precio = total_precio + document.getElementById("total" + i).value;
    }
    
    alert(total_precio);
}
la cual en un principio suma el contenido de un campo llamado total el cual se va a gregando de forma dinamica un nuevo campo pero se le suma a 1 para diferenciarlos ejem

total1
total2
total3
etc...

la idea es que la funcion anterior sume cada ves que se agrega un nuevo campo sume los valores de los campos anteriores, ejem: si hay 5 campos que sume los primeros 4 y arroje un total, cuando se agrege una sexta fila se sumen las anteriores 5 filas y asi sucesibamente...

el problema que tengo es que la funcion anterior concatena (esto es asi, todabia no lo sumo) solo los primeros 2 campos de 4, osea tengo 4 campos, y tendira que concatenar los tres primeros, pero concatena los campos total1 y total2, pero total3 lo salta, sin embargo si pongo un alert antes de concatenar los campos si los concatena bien, ejemplo

Código:
function calcular_precio() {    
    var total_precio = 0;
    
    for (i=1; i<num_fila; i++) {
        //si agrego este alert si hace lo que deberia hacer, concatenar los campos anteriores
        alert(document.getElementById("total" + i).value);
        total_precio = total_precio + document.getElementById("total" + i).value;
    }
    
    alert(total_precio);
}
espero me puedan ayudar a arreglar esto, de antemano gracias
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #2 (permalink)  
Antiguo 20/09/2006, 17:30
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola:

Te paso unos datos teóricos:

"1" + "1" = "11"

y
1 + 1 = 2;

Si tienes una cadena de texto (aunque los caracteres sean números) y usas el operador "+" con otra cadena el único resultado posible es una tercera cadena...

Si por lo contrario usas el mismo operador con números, el resulatado será otro número.

Los formularios solo conocen (o reconocen) cadenas, y para convertirlas en números deberías usar parseInt para convertir a enteros o parseFloat para números reales...

Dinos tus progresos, por si necesitas más orientación.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 20/09/2006, 17:35
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 1 mes
Puntos: 406
gracias caricatos por responder, sin embargo, ese no es el problema, de hecho a proposito lo he puesto asi para checar los valores que se agregan, la razon de todo esto es para saber porque no agrega el valor del campo total3, si checaste mi post anterior la funcion solo concatena los 2 primeros valores teniendo que concatenar los tres primeros (en el caso de que sean solo cuatro campos) pero se salta el tercero, y mi duda es el porque pero creeme que te agradesco mucho tu respuesta
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #4 (permalink)  
Antiguo 20/09/2006, 17:50
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola:

Es que con los datos que das es difícil...

Si el alert sirve para que funcione, debe tratarse de un problema de retardo... tal vez no ha llegado a crearse el nuevo elemento (dices que lo creas dinámicamente...)

En vez de un alert, prueba poner la última instrucción con un retardito... o mejor, llamar a la función con ese reatardo... donde tengas: calcular_precio(), pon:
setTimeout("calcular_precio()", 100)

Es por probar...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 20/09/2006, 18:01
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 1 mes
Puntos: 406
no, de hecho no es problema por que se crea el campo, de hecho tratare de explicartelo, en si tengo una tabla que a su ves tiene 4 campos, en uno va un campo el cual es para indicar una cantidad, en el segundo va un selec que es donde se selecciona un producto (aqui con ajax cargo un dato que es el precio unitario), el tercer campo es un text que es donde se indica el precio unitario y el ultimo campo es el de total, ahora cuando se cambia el valor del primer campo (cantidad) llama a una funcion que agrega una nueva fila a la tabla con los respectivos campos y selec, ahora cuando cambia el valor de segundo campo (productos) se hace la llamada a una funcion que carga un dato de una base de datos para calcular el total multiplicando la cantidad por el precio unitario para obtener el total por el producto, al final esta funcion hace un llamado a otra funcion la cual suma todos los totales de los productos para sacar un total general y es aqui donde tengo el problema, a continuacion te pongo el codigo que utilizo para crear las filas asi como los campos

Código:
function agrega_fila_producto(numero) { 
 if (document.getElementById("estado" + numero).value == 1) {
  info_productos(numero);
  return (false);
 }
  var tabla = document.getElementById("fila_productos");
  
  var fila = document.createElement("tr");
  
  var campo_uno = document.createElement("td");
  campo_uno.setAttribute("align","center");
  fila.appendChild(campo_uno);
  
  var cantidad = document.createElement("input");
  cantidad.type = "text";
  cantidad.value = 1;
  cantidad.size = 3;
  cantidad.id = "cantidad" + num_fila;
  cantidad.setAttribute("NAME", "cantidad" + num_fila);
  cantidad.setAttribute("onchange","agrega_fila_producto(" + num_fila + ")");
  
  campo_uno.appendChild(cantidad);
  
  var campo_dos = document.createElement("td");
  campo_dos.setAttribute("align","center");
  fila.appendChild(campo_dos);
  
  var estado = document.createElement("input");
  estado.type = "hidden";
  estado.id="estado" + num_fila;
  estado.setAttribute("NAME","estado" + num_fila);
  estado.value = 0;
  
  campo_dos.appendChild(estado);
  
  var lista = document.createElement("select");
  lista.id = "productos" + num_fila;
  lista.setAttribute("NAME","productos" + num_fila);
  lista.setAttribute("onchange","info_productos(" + num_fila + ")");
  
  campo_dos.appendChild(lista);
  
  var bodega = "1";
  
  var ajax=nuevoAjax();
  ajax.open("GET","pedido/cargar_productos.php?bodega=" + bodega,true);
  ajax.onreadystatechange=function() {
   if (ajax.readyState == 4) {
    xml = ajax.responseXML;
    
    total = xml.getElementsByTagName("total")[0].childNodes[0].data; 
    for (i=0; i<total; i++) {
     var opcion = document.createElement("option");
     opcion.value = xml.getElementsByTagName("valor")[i].childNodes[0].data;
     opcion.innerHTML = xml.getElementsByTagName("producto")[i].childNodes[0].data;
     
     lista.appendChild(opcion);
    }
   }
  }
  ajax.send(null);
  
  var opcion = document.createElement("option");
  opcion.value = "";
  opcion.innerHTML = "Selecciona un producto...";
  lista.appendChild(opcion);
  
  var campo_tres = document.createElement("td");
  campo_tres.setAttribute("align","center");
  campo_tres.innerHTML = "$";
  fila.appendChild(campo_tres);
  
  var uni = document.createElement("input");
  uni.type = "text";
  uni.size = 4;
  uni.id = "uni" + num_fila;
  uni.setAttribute("NAME","uni" + num_fila);
  uni.readOnly = !this.readOnly;
  
  campo_tres.appendChild(uni);
  
  var campo_cuatro = document.createElement("td");
  campo_cuatro.setAttribute("align","center");
  campo_cuatro.innerHTML = "$";
  fila.appendChild(campo_cuatro);
  
  var total = document.createElement("input");
  total.type = "text";
  total.size = 4;
  total.id = "total" + num_fila;
  total.setAttribute("NAME","total" + num_fila);
  total.readOnly = !this.readOnly;
  
  campo_cuatro.appendChild(total);
  
  tabla.appendChild(fila);
  
  document.getElementById("estado" + numero).value = 1;
  
  num_fila++;
}
la variable num_fila es global, osea, se definio fuera de toda funcion

ahora la funcion que calcula el total por producto

Código:
function info_productos(numero) {
 var cantidad = document.getElementById("cantidad" + numero).value;
 var producto = document.getElementById("productos" + numero).value;
 
 var ajax=nuevoAjax();
 ajax.open("GET","pedido/info_producto.php?producto=" + producto,true);
 ajax.onreadystatechange=function() {
  if (ajax.readyState == 4) {
   var uni = ajax.responseText;
   document.getElementById("uni" + numero).value = uni;
   var total = eval(cantidad * uni);
   document.getElementById("total" + numero).value = total;
   calcular_precio(); //aqui es cuando llamo a la funcion donde tengo problemas
  }
 }
 ajax.send(null);
}
como puedes ver aqui es donde llamo a la funcion donde tengo problemas de que no suma todos los campos :p, por ejemplo de 5 campos creados tendria que sumar los 4 primeros (que ya tienen valor) pero solo suma los 3 primeros, ese es mi problema :D

PD creo que me alarge mucho, bueno de antemano gracias por tu interes
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:58.