Foros del Web » Programando para Internet » PHP »

Realizar Calculos en tabla con filas repetidas por bucle FOR de PHP

Estas en el tema de Realizar Calculos en tabla con filas repetidas por bucle FOR de PHP en el foro de PHP en Foros del Web. Saludos Estoy intentando crear una tabla cuyas filas provienen de una tabla de la base de datos, con eso no tengo problemas, pero cada fila ...
  #1 (permalink)  
Antiguo 08/11/2011, 10:31
Avatar de jmanuelprince  
Fecha de Ingreso: octubre-2011
Mensajes: 11
Antigüedad: 13 años, 1 mes
Puntos: 0
Realizar Calculos en tabla con filas repetidas por bucle FOR de PHP

Saludos

Estoy intentando crear una tabla cuyas filas provienen de una tabla de la base de datos, con eso no tengo problemas, pero cada fila tiene un conjunto de 13 campos INPUT, 12 que son los meses del año y uno de Resultados donde se debe totalizar la sumatoria de todos los meses del año, el problema es que tengo una función JavaScript que realiza la sumatoria y me funciona si la uso para una a sola fila, pero cuando se repiten los campos, es decir, 13 campos para cada fila, ya no me realiza los calculos, aqui les envio el código de este archivo.

Código PHP:
<?php
require_once "clases/clsProducto.php";
 
$objPdto = new clsProducto();
$listaPdtos $objPdto->listarProducto();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Table desde MySQL</title>
<link rel="stylesheet" href="css/style.css" type="text/css" />
<script>
function fncSumar(){
caja=document.forms["sumar"].elements;
var numero1 = Number(caja["numero1"].value);
var numero2 = Number(caja["numero2"].value);
var numero3 = Number(caja["numero3"].value);
var numero4 = Number(caja["numero4"].value);
var numero5 = Number(caja["numero5"].value);
var numero6 = Number(caja["numero6"].value);
var numero7 = Number(caja["numero7"].value);
var numero8 = Number(caja["numero8"].value);
var numero9 = Number(caja["numero9"].value);
var numero10 = Number(caja["numero10"].value);
var numero11 = Number(caja["numero11"].value);
var numero12 = Number(caja["numero12"].value);
resultado=numero1+numero2+numero3+numero4+numero5+numero6+numero7+numero8+numero9+numero10+numero11+numero12;
if(!isNaN(resultado)){
caja["resultado"].value=numero1+numero2+numero3+numero4+numero5+numero6+numero7+numero8+numero9+numero10+numero11+numero12;
}
}
</script>
</head>
<body>

<?php
if (is_array($listaPdtos)) {
?>
<form method="post" name="sumar">
<table border="1" cellspacing="0" cellpadding="0">
    <caption ><h1>Productos a Programar</h1></caption>
    <thead>
        <tr>
            <th scope="col">Producto</th>
            <th scope="col">Ene</th>
            <th scope="col">Feb</th>
        <th scope="col">Mar</th>
        <th scope="col">Abr</th>
        <th scope="col">May</th>
        <th scope="col">Jun</th>
        <th scope="col">Jul</th>
        <th scope="col">Ago</th>
        <th scope="col">Sep</th>
        <th scope="col">Oct</th>
        <th scope="col">Nov</th>
        <th scope="col">Dic</th>
        <th scope="col">Total</th>
        </tr>
    </thead>
    <tbody>

<?php
    
for ($i 0$i count($listaPdtos); $i++) {
?>
        <tr<?php echo ($i == 0) ? " class=\"impar\"" "" ?>>
            <td class="text"><?php echo $listaPdtos[$i]["name"?></td>
            <td class="number"><input type="text" name="numero1" size="2" onKeyUp="fncSumar()" /></td>
            <td class="number"><input type="text" name="numero2" size="2" onKeyUp="fncSumar()" /></td>
        <td class="number"><input type="text" name="numero3" size="2" onKeyUp="fncSumar()" /></td>
        <td class="number"><input type="text" name="numero4" size="2" onKeyUp="fncSumar()" /></td>
            <td class="number"><input type="text" name="numero5" size="2" onKeyUp="fncSumar()" /></td>
        <td class="number"><input type="text" name="numero6" size="2" onKeyUp="fncSumar()" /></td>
        <td class="number"><input type="text" name="numero7" size="2" onKeyUp="fncSumar()" /></td>
            <td class="number"><input type="text" name="numero8" size="2" onKeyUp="fncSumar()" /></td>
        <td class="number"><input type="text" name="numero9" size="2" onKeyUp="fncSumar()" /></td>
        <td class="number"><input type="text" name="numero10" size="2" onKeyUp="fncSumar()" /></td>
            <td class="number"><input type="text" name="numero11" size="2" onKeyUp="fncSumar()" /></td>
        <td class="number"><input type="text" name="numero12" size="2" onKeyUp="fncSumar()" /></td>
        <td class="number"><input type="text" name="resultado" size="4" /></td>
        </tr>
<?php
    
}
?>

 </tbody>
</table>
</form>
<?php
}
else {
?>
    <p><?php echo $listaPdtos ?></p>
<?php
}
?>
</body>
</html>
  #2 (permalink)  
Antiguo 08/11/2011, 18:21
 
Fecha de Ingreso: julio-2011
Mensajes: 220
Antigüedad: 13 años, 4 meses
Puntos: 72
Respuesta: Realizar Calculos en tabla con filas repetidas por bucle FOR de PHP

El problema es que los nombres de los campos de texto se repiten dependiendo de la cantidad de productos, por ejemplo, si se tienen 5 productos entonces se tendra 5 INPUT con name="numero1", 5 con name="numero2", 5 con name="numero3", etc. entonces cuando se llama a la función fncSumar() javascript no sabe cuales campos debe utilizar ya que hay varios que tienen el mismo atributo name. Es mejor utilizar los metodos DOM para asi indicar que se tomen en cuenta solo los campos de la misma fila. Prueba esta función que sirve bien.

Código Javascript:
Ver original
  1. <script>
  2. function fncSumar(elem){
  3. var caja= document.forms["sumar"].elements;
  4. var fila= elem.parentNode.parentNode;
  5. var numeros= fila.getElementsByTagName('input');
  6. var resultado= 0;
  7. for(i=0; i<numeros.length-1; i++)
  8. {
  9.   resultado+= Number(numeros[i].value);
  10. }
  11.  
  12. if(!isNaN(resultado)){
  13. numeros[numeros.length-1].value= resultado;
  14. }
  15. }
  16. </script>

Para llamarla se debe pasar la palabra clave this como parametro.

Código javascript:
Ver original
  1. <?php
  2.     for ($i = 0; $i < count($listaPdtos); $i++) {
  3. ?>
  4.         <tr<?php echo ($i % 2 == 0) ? " class=\"impar\"" : "" ?>>
  5.             <td class="text"><?php echo $listaPdtos[$i] ?></td>
  6.             <td class="number"><input type="text" name="numero1"
  7.  
  8. size="2" onKeyUp="fncSumar(this)" /></td>
  9.             <td class="number"><input type="text" name="numero2"
  10.  
  11. size="2" onKeyUp="fncSumar(this)" /></td>
  12.         <td class="number"><input type="text" name="numero3" size="2"
  13.  
  14. onKeyUp="fncSumar(this)" /></td>
  15.         <td class="number"><input type="text" name="numero4" size="2"
  16.  
  17. onKeyUp="fncSumar(this)" /></td>
  18.             <td class="number"><input type="text" name="numero5"
  19.  
  20. size="2" onKeyUp="fncSumar(this)" /></td>
  21.         <td class="number"><input type="text" name="numero6" size="2"
  22.  
  23. onKeyUp="fncSumar(this)" /></td>
  24.         <td class="number"><input type="text" name="numero7" size="2"
  25.  
  26. onKeyUp="fncSumar(this)" /></td>
  27.             <td class="number"><input type="text" name="numero8"
  28.  
  29. size="2" onKeyUp="fncSumar(this)" /></td>
  30.         <td class="number"><input type="text" name="numero9" size="2"
  31.  
  32. onKeyUp="fncSumar(this)" /></td>
  33.         <td class="number"><input type="text" name="numero10" size="2"
  34.  
  35. onKeyUp="fncSumar(this)" /></td>
  36.             <td class="number"><input type="text" name="numero11"
  37.  
  38. size="2" onKeyUp="fncSumar(this)" /></td>
  39.         <td class="number"><input type="text" name="numero12" size="2"
  40.  
  41. onKeyUp="fncSumar(this)" /></td>
  42.         <td class="number"><input type="text" name="resultado" size="4"
  43.  
  44. /></td>
  45.         </tr>
  46. <?php
  47.     }
  48. ?>
  #3 (permalink)  
Antiguo 09/11/2011, 07:04
Avatar de jmanuelprince  
Fecha de Ingreso: octubre-2011
Mensajes: 11
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Realizar Calculos en tabla con filas repetidas por bucle FOR de PHP

Muchas gracias, me funciono muy bien
  #4 (permalink)  
Antiguo 09/11/2011, 07:52
Avatar de jmanuelprince  
Fecha de Ingreso: octubre-2011
Mensajes: 11
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Realizar Calculos en tabla con filas repetidas por bucle FOR de PHP

Muchas gracias, me funciono muy bien, pero tengo otro problema como hago para recibir los datos en otro archivo php y guardarlos en una base de datos, lo estoy intentando con un arreglo y el tamaño del arreglo lo envio con el formulario en un campo oculto pero al asignarle el valor a el arreglo no lo toma me imagino que ocurre el mismo problema, no logra identificar de que campo viene el valor ya que todos se llaman igual

Código PHP:
$tam $_POST['tam']; //Aqui recivo el tamaño del arreglo, esto me funciona
    
for ($i 0$i $tam$i++)
    {    
        
$ene[$i] =$_POST['numero1'];//Este seria uno de los 12 campos que hay que recivir 
    

  #5 (permalink)  
Antiguo 09/11/2011, 10:51
Avatar de jmanuelprince  
Fecha de Ingreso: octubre-2011
Mensajes: 11
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Realizar Calculos en tabla con filas repetidas por bucle FOR de PHP

Listo lo hice de esta manera:

Primero en el formulario donde declaro los campos les puse los nombres de los meses seguidos de un id para que a medida que avance el indice cambie el nombre del campo:

Código PHP:
<tr<?php echo ($i == 0) ? " class=\"impar\"" "" ?>>
            <td class="text"><?php echo $listaPdtos[$i]["name"?></td>
            <td class="number"><input type="text" name="ene<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="feb<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="mar<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="abr<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="may<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="jun<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="jul<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="ago<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="sep<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="oct<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="nov<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="dic<?php print $i?>" size="2" onKeyUp="fncSumar(this)"/></td>
            <td class="number"><input type="text" name="resultado<?php print $i?>" size="4" value="0"/></td>
Luego en el archivo que recibe ya que se estan enviando como un arreglo se debe recibir tambien como un arreglo, el tamaño del arreglo lo envie en un campo oculto asi que lo recibo de primero antes de recibir los meses

Código PHP:
for ($i 0$i $tam$i++)
    {    
        
$ene[$i] = $_POST['ene'.$i];
        
$feb[$i] = $_POST['feb'.$i];
        
$mar[$i] = $_POST['mar'.$i];
        
$abr[$i] = $_POST['abr'.$i];
        
$may[$i] = $_POST['may'.$i];
        
$jun[$i] = $_POST['jun'.$i];
        
$jul[$i] = $_POST['jul'.$i];
        
$ago[$i] = $_POST['ago'.$i];
        
$sep[$i] = $_POST['sep'.$i];
        
$oct[$i] = $_POST['oct'.$i];
        
$nov[$i] = $_POST['nov'.$i];
        
$dic[$i] = $_POST['dic'.$i];
      } 
Muchas Gracias por la ayuda, y espero esto les pueda servir

Etiquetas: html, javascript
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 13:07.