Suma y Resta
Buenas!!!
No se muy bien como explicar el tema asi que les explico lo que tengo y lo que necesito sacar de ahi.
tengo una serie de filas en una tabla que es dinamica con respecto a una vase de datos entonces en cada fila tengo:
1º checkbox, name=chk, value=Id (correspondiente al Id de la bd)
2º textbox, name=Id, value=Monto (correspondiente al monto de la Bd)
todos los checkbox se llaman igual, y ademas tengo un unico textbox name=Suma, value=0
lo que necesito hacer es que cuando activen un checkbox me sume el monto en el campo suma y cuando lo desactiven lo reste.
Espero haberme explicado bien...
Saludos y desde ya muchas gracias por su tiempo!!!
No se muy bien como explicar el tema asi que les explico lo que tengo y lo que necesito sacar de ahi.
tengo una serie de filas en una tabla que es dinamica con respecto a una vase de datos entonces en cada fila tengo:
1º checkbox, name=chk, value=Id (correspondiente al Id de la bd)
2º textbox, name=Id, value=Monto (correspondiente al monto de la Bd)
todos los checkbox se llaman igual, y ademas tengo un unico textbox name=Suma, value=0
lo que necesito hacer es que cuando activen un checkbox me sume el monto en el campo suma y cuando lo desactiven lo reste.
Espero haberme explicado bien...
Saludos y desde ya muchas gracias por su tiempo!!!
Bueno lo primero necesitas una variable para calcular
la suma porque la propiedad value del textBox se trata
como una cadena de texto y si usas el operador +
seguramente lo que hará es concatenar y no sumar.
Además necesitas alguna forma de relacionar cada
checkBox con el valor que representan, y eso no lo
has explicado así que no sé como ayudarte.
Identificar a un checkBox en concreto es muy fácil,
aunque todos se llamen igual, él objeto event tiene
la propiedad srcElement que es una referencia al
objeto que disparó el evento. Pero como te he dicho
hace falta una manera de relacionar a dicho elemento
con el valor que se quiere sumar o restar.
la suma porque la propiedad value del textBox se trata
como una cadena de texto y si usas el operador +
seguramente lo que hará es concatenar y no sumar.
Además necesitas alguna forma de relacionar cada
checkBox con el valor que representan, y eso no lo
has explicado así que no sé como ayudarte.
Identificar a un checkBox en concreto es muy fácil,
aunque todos se llamen igual, él objeto event tiene
la propiedad srcElement que es una referencia al
objeto que disparó el evento. Pero como te he dicho
hace falta una manera de relacionar a dicho elemento
con el valor que se quiere sumar o restar.
lo que me faltaria es eso exactamente, como saber que check es si todos se llaman igual. La relacion esta en el valor del chek que es el name del text que tiene el valor, de todas formas yo puedo pasarle el valor a la funcion que realice la suma pero lo que no se es como pasarle el estado del check o como hacer, si todos se llaman igual, para buscarlo y ver el estado.
Y otra vez muchas gracias por tu tiempo y por la de los frames
Saludos
Y otra vez muchas gracias por tu tiempo y por la de los frames
Saludos
Pues saber el estado es muy fácil, prueba esta función:
function sumar(){
var elCheck;
elCheck=window.event.srcElement:
if(elCheck.checked){
//Aqui el codigo que suma
}
else{
//Aqui el codigo que resta
}
}
Esta funcion debes llamarla en el evento onChange de
los checkBox.
Espero que te sirva.
function sumar(){
var elCheck;
elCheck=window.event.srcElement:
if(elCheck.checked){
//Aqui el codigo que suma
}
else{
//Aqui el codigo que resta
}
}
Esta funcion debes llamarla en el evento onChange de
los checkBox.
Espero que te sirva.
Muy buena la de checked, gracias por la info
sabes que poniendo el llamado en onchange no hacia nada hasta que perdia el foco asi que lo resolvi con un onclik="Suma(this)" y me trae el objeto
mi problema ahora es que no puedo actualizar el campo donde muestro el total, intente hacer un
document.frmSuma.Suma.Value = Valor pero no pasa nada e hice tambien un document.write(valor) para ver lo que me traia y me trae NaN que es un flotante pero no me da el valor trate con un valor.tostring pero me dice undefined
Me parece que no voy a tener mas remedio que actualizar la pagina y pasarle los valores
Saludos y otra vez muchas gracias por tu tiempo
sabes que poniendo el llamado en onchange no hacia nada hasta que perdia el foco asi que lo resolvi con un onclik="Suma(this)" y me trae el objeto
mi problema ahora es que no puedo actualizar el campo donde muestro el total, intente hacer un
document.frmSuma.Suma.Value = Valor pero no pasa nada e hice tambien un document.write(valor) para ver lo que me traia y me trae NaN que es un flotante pero no me da el valor trate con un valor.tostring pero me dice undefined
Me parece que no voy a tener mas remedio que actualizar la pagina y pasarle los valores
Saludos y otra vez muchas gracias por tu tiempo
NaN no es un flotante, me da error de tipo de dato!!!
te pego la funcion para que la mires
function Suma(obj,Monto)
{
var T;
var Temp;
var elCheck;
T = Number(document.frmSuma.Suma.Value);
Temp = Number(Monto);
elCheck=obj;
if(elCheck.checked == true){
//Aqui el codigo que suma
T += Temp;
}
else{
//Aqui el codigo que resta
T -= Temp;
}
//document.Suma.Value = Total;
document.write(T);
}
igual sigo sin poder actualizar el textbox
te pego la funcion para que la mires
function Suma(obj,Monto)
{
var T;
var Temp;
var elCheck;
T = Number(document.frmSuma.Suma.Value);
Temp = Number(Monto);
elCheck=obj;
if(elCheck.checked == true){
//Aqui el codigo que suma
T += Temp;
}
else{
//Aqui el codigo que resta
T -= Temp;
}
//document.Suma.Value = Total;
document.write(T);
}
igual sigo sin poder actualizar el textbox
Sabes que segui sus consejos y logre armar una funcion pero tengo unos problemitas con los numeros de mas de 3 cifras con decimales por ejemplo si tengo 300.54 todo bien pero cuando pongo 3000.54 todo mal. Les paso el codigo de la pagina completa para que lo vean
Saludos y muchas gracias por tu tiempo
<%@LANGUAGE="VBSCRIPT"%>
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/JavaScript">
function fSuma(obj,monto)
{
var t; var temp;
t = txtSuma.value;
temp = 0;
if (obj.checked == true){
temp = parseFloat(t) + parseFloat(monto);}
else
{temp = parseFloat(t) - parseFloat(monto);}
txtSuma.value = temp;
}
</script>
</head>
<body>
<div id="Layer1" style="position:absolute; left:314px; top:11px; width:80px; height:8px; z-index:1">
<table width="155" border="1">
<tr>
<td><input name="txtSuma" type="text" id="txtSuma" value="0"></td>
</tr>
</table>
</div>
<p> </p>
<form name="form2" method="post" action="">
<table width="193" border="1" align="center">
<tr>
<td width="78"><div align="center">
<input name="chk" type="checkbox" id="chk11" value="1" onClick="fSuma(this,'2000.2')">
</div></td>
<td width="99">2000.2</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="2" onClick="fSuma(this,'2000.1')">
</div></td>
<td>2000.1</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="3" onClick="fSuma(this,'2345.22')">
</div></td>
<td>2345.22</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="4" onClick="fSuma(this,'2000.01')">
</div></td>
<td>2000.01</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="5" onClick="fSuma(this,'3000.42')">
</div></td>
<td>3000.42</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="6" onClick="fSuma(this,'20000.01')">
</div></td>
<td>20000.01</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="7" onClick="fSuma(this,'2000.4')">
</div></td>
<td>2000.4</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="8" onClick="fSuma(this,'35400.03')">
</div></td>
<td>35400.03</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="9" onClick="fSuma(this,'2000.23')">
</div></td>
<td>2000.23</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="10" onClick="fSuma(this,'2000.12')">
</div></td>
<td>2000.12</td>
</tr>
</table>
</form>
<p> </p>
</body>
</html>
Saludos y muchas gracias por tu tiempo
<%@LANGUAGE="VBSCRIPT"%>
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/JavaScript">
function fSuma(obj,monto)
{
var t; var temp;
t = txtSuma.value;
temp = 0;
if (obj.checked == true){
temp = parseFloat(t) + parseFloat(monto);}
else
{temp = parseFloat(t) - parseFloat(monto);}
txtSuma.value = temp;
}
</script>
</head>
<body>
<div id="Layer1" style="position:absolute; left:314px; top:11px; width:80px; height:8px; z-index:1">
<table width="155" border="1">
<tr>
<td><input name="txtSuma" type="text" id="txtSuma" value="0"></td>
</tr>
</table>
</div>
<p> </p>
<form name="form2" method="post" action="">
<table width="193" border="1" align="center">
<tr>
<td width="78"><div align="center">
<input name="chk" type="checkbox" id="chk11" value="1" onClick="fSuma(this,'2000.2')">
</div></td>
<td width="99">2000.2</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="2" onClick="fSuma(this,'2000.1')">
</div></td>
<td>2000.1</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="3" onClick="fSuma(this,'2345.22')">
</div></td>
<td>2345.22</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="4" onClick="fSuma(this,'2000.01')">
</div></td>
<td>2000.01</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="5" onClick="fSuma(this,'3000.42')">
</div></td>
<td>3000.42</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="6" onClick="fSuma(this,'20000.01')">
</div></td>
<td>20000.01</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="7" onClick="fSuma(this,'2000.4')">
</div></td>
<td>2000.4</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="8" onClick="fSuma(this,'35400.03')">
</div></td>
<td>35400.03</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="9" onClick="fSuma(this,'2000.23')">
</div></td>
<td>2000.23</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="10" onClick="fSuma(this,'2000.12')">
</div></td>
<td>2000.12</td>
</tr>
</table>
</form>
<p> </p>
</body>
</html>
Bien, el fallo no era de tu código sino de las limitaciones
de la aritmética de coma flotante.
Para solucionarlo he cambiado todos los montos por
un valor numérico entero,la cuestión es sumar números enteros
y después dividir por 100 a la hora de mostrar el resultado.
La transformación se hace multiplicando los valores
iniciales(que tienen como mucho 2 decimales) por 100.
Además he hecho algunos cambios en la función simplificando el código,
y en las llamadas a la misma pues el monto lo paso
como dato numérico(sin commillas) para no tener que
transformar texto a número. Aqui está el resultado:
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/JavaScript">
var t = 0;
function fSuma(obj,monto)
{
if (obj.checked){t += monto;}
else
{t -= monto;}
txtSuma.value = t/100;
}
</script>
</head>
<body>
<div id="Layer1" style="position:absolute; left:314px; top:11px; width:80px; height:8px; z-index:1">
<table width="155" border="1">
<tr>
<td><input name="txtSuma" type="text" id="txtSuma" value="0"></td>
</tr>
</table>
</div>
<p> </p>
<form name="form2" method="post" action="">
<table width="193" border="1" align="center">
<tr>
<td width="78"><div align="center">
<input name="chk" type="checkbox" id="chk11" value="1" onClick="fSuma(this,200020)">
</div></td>
<td width="99">2000.2</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="2" onClick="fSuma(this,200010)">
</div></td>
<td>2000.1</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="3" onClick="fSuma(this,234522)">
</div></td>
<td>2345.22</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="4" onClick="fSuma(this,200001)">
</div></td>
<td>2000.01</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="5" onClick="fSuma(this,300042)">
</div></td>
<td>3000.42</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="6" onClick="fSuma(this,2000001)">
</div></td>
<td>20000.01</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="7" onClick="fSuma(this,200040)">
</div></td>
<td>2000.4</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="8" onClick="fSuma(this,3540003)">
</div></td>
<td>35400.03</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="9" onClick="fSuma(this,200023)">
</div></td>
<td>2000.23</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="10" onClick="fSuma(this,200012)">
</div></td>
<td>2000.12</td>
</tr>
</table>
</form>
<p> </p>
</body>
</html>
de la aritmética de coma flotante.
Para solucionarlo he cambiado todos los montos por
un valor numérico entero,la cuestión es sumar números enteros
y después dividir por 100 a la hora de mostrar el resultado.
La transformación se hace multiplicando los valores
iniciales(que tienen como mucho 2 decimales) por 100.
Además he hecho algunos cambios en la función simplificando el código,
y en las llamadas a la misma pues el monto lo paso
como dato numérico(sin commillas) para no tener que
transformar texto a número. Aqui está el resultado:
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/JavaScript">
var t = 0;
function fSuma(obj,monto)
{
if (obj.checked){t += monto;}
else
{t -= monto;}
txtSuma.value = t/100;
}
</script>
</head>
<body>
<div id="Layer1" style="position:absolute; left:314px; top:11px; width:80px; height:8px; z-index:1">
<table width="155" border="1">
<tr>
<td><input name="txtSuma" type="text" id="txtSuma" value="0"></td>
</tr>
</table>
</div>
<p> </p>
<form name="form2" method="post" action="">
<table width="193" border="1" align="center">
<tr>
<td width="78"><div align="center">
<input name="chk" type="checkbox" id="chk11" value="1" onClick="fSuma(this,200020)">
</div></td>
<td width="99">2000.2</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="2" onClick="fSuma(this,200010)">
</div></td>
<td>2000.1</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="3" onClick="fSuma(this,234522)">
</div></td>
<td>2345.22</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="4" onClick="fSuma(this,200001)">
</div></td>
<td>2000.01</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="5" onClick="fSuma(this,300042)">
</div></td>
<td>3000.42</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="6" onClick="fSuma(this,2000001)">
</div></td>
<td>20000.01</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="7" onClick="fSuma(this,200040)">
</div></td>
<td>2000.4</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="8" onClick="fSuma(this,3540003)">
</div></td>
<td>35400.03</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="9" onClick="fSuma(this,200023)">
</div></td>
<td>2000.23</td>
</tr>
<tr>
<td><div align="center">
<input name="chk" type="checkbox" id="chk11" value="10" onClick="fSuma(this,200012)">
</div></td>
<td>2000.12</td>
</tr>
</table>
</form>
<p> </p>
</body>
</html>
Un capo Juan!!! anda a la perfección!!!
Muchas gracias por todo y gracias tambien a Cristian por la colaboración!!!
Un abrazo
Pablo
Muchas gracias por todo y gracias tambien a Cristian por la colaboración!!!
Un abrazo
Pablo
Bueno así de entrada la función Number() no la he visto
en mi vida, y en mi referencia no aparece, prueba usando
parseFloat().
Para hacer referencia al textBox prueba a poner simplemente
Suma.value, y cambia el nombre de la función para
evitar confusiones (tiene el mismo nombre que el textBox).
Para terminar si pasas el objeto como parámetro no
hace falta que declares la variable elCheck, simplemente
usa obj.
en mi vida, y en mi referencia no aparece, prueba usando
parseFloat().
Para hacer referencia al textBox prueba a poner simplemente
Suma.value, y cambia el nombre de la función para
evitar confusiones (tiene el mismo nombre que el textBox).
Para terminar si pasas el objeto como parámetro no
hace falta que declares la variable elCheck, simplemente
usa obj.