Foros del Web » Programando para Internet » Javascript »

Calcular importe de un listado dinamico en base a un select

Estas en el tema de Calcular importe de un listado dinamico en base a un select en el foro de Javascript en Foros del Web. Hola, os cuento lo que tengo. Tengo un pagina hecha en php con un listado de productos que los coge de la base de datos ...
  #1 (permalink)  
Antiguo 02/01/2015, 05:51
Avatar de neoarcangel  
Fecha de Ingreso: enero-2005
Ubicación: España
Mensajes: 566
Antigüedad: 19 años, 9 meses
Puntos: 5
Calcular importe de un listado dinamico en base a un select

Hola, os cuento lo que tengo.

Tengo un pagina hecha en php con un listado de productos que los coge de la base de datos en la cual al lado del producto aparece el precio y al lado de este un select para poder seleccionar entre 1 y 10 productos, todo esto funciona perfecto, el problema esta en que quiero que al lado de el select aparecezca el total de lo que cuesta lo que haya seleccionado el cliente, es decir, si el producto vale 100 y el cliente selecciona en el select 3, inmediatamente el campo total deberia actualizarse en 300.
Me gustaria hacerlo en javascript

Este es el codigo php
Código PHP:
    <?php
$trabajoinstan
=new Trabajo();
                    
$listandoproductos=$trabajoinstan->listaSoloProductosporId($_GET["categoriaxjavascript"]);
                   for (
$i 0$i count($listandoproductos); $i++)
                    {
                      
?>
                   
                    <tr class="fuenteParisian fuente20">
                        <td class=" centradovertical"><?php echo ucfirst($listandoproductos[$i]["producto"]);?></td>
                        <td id="precio"><?php echo ucfirst($listandoproductos[$i]["precio"]);?>&nbsp; €</td>
                       <td id="cantidad">
                            <div class="selectcantidad">
                              
                                 <select id="cantidad"  >
                                     <?php
                                        
for ($j 1$j <= 10$j++) 
                                        {
                                     
?>  
                                    <option value="<?php echo $j?>"> <?php echo $j?>  </option>
                                    <?php
                                     
                                        
}
                                     
?> 
                                 </select>
                            </div>
                       </td>
                       <td>
                           <div class="form-group">
                               <input type="checkbox" class="form-control"/>
                           </div>
                       </td>
                      
                       
                       <td>
                           <input type="text" onmouseover="calculaTotal();" />
                       </td>
                      
                   </tr>
                   <?php                   
}
                   
?>

y esta es la funcion javascript que he hecho

Código:
function calculaTotal()
{
   var total;
   var precio;
   var cantidad;
   precio=document.getElementById('precio').value;
   cantidad=document.getElementById('cantidad').value;
   total=precio*cantidad;
   return total;
}
no me funciona, pero pienso que es por que no se integrarla bien, y ademas al tener que coger el valor a multiplicar de un bucle for, pienso que no lo estoy haciendo correctamente, la idea es que al mover el select, el total se incremente.

Si me pudierais echar una mano, me ayudaria bastante

Gracias.
__________________
Mi equipo

Gigabyte GA-MA770T-UD3P Socket AM3|OZC StealthxStream 600 w | Gigabyte Radeon HD 4770 512MB GDDR5| AMD Phenom II 945 X4 Quad Core 3.0Ghz| Memoria Kingston 6GB DDR3 1333
  #2 (permalink)  
Antiguo 04/01/2015, 02:02
 
Fecha de Ingreso: diciembre-2014
Ubicación: montería
Mensajes: 33
Antigüedad: 9 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Calcular importe de un listado dinamico en base a un select

Primero que todo quite los atributos de clase para que se visualice mejor, ya eso es cuestión de maquetación y carpintería.

Suponiendo que tienes 3 productos:
Producto 1 | 1000
Producto 2 | 5000
Producto 3 | 3000

al ejecutarse tu PHP este seria mas o menos el resultado:

Código HTML:
Ver original
  1.     <tr>
  2.         <td >Producto 1</td>
  3.         <td id="precio">1000</td>
  4.         <td id="cantidad">
  5.             <select id="cantidad"  >
  6.                 <?php
  7.                for ($j = 1; $j <= 10; $j++) {
  8.                    ?>  
  9.                     <option value="<?php echo $j; ?>"> <?php echo $j; ?>  </option>
  10.                     <?php
  11.                }
  12.                ?>
  13.             </select>
  14.         </td>
  15.         <td>
  16.             <input type="checkbox" class="form-control"/>
  17.         </td>
  18.         <td>
  19.             <input type="text" onmouseover="calculaTotal();" />
  20.         </td>
  21.     </tr>
  22.         <tr>
  23.         <td >Producto 2</td>
  24.         <td id="precio">5000</td>
  25.         <td id="cantidad">
  26.             <select id="cantidad"  >
  27.                 <?php
  28.                for ($j = 1; $j <= 10; $j++) {
  29.                    ?>  
  30.                     <option value="<?php echo $j; ?>"> <?php echo $j; ?>  </option>
  31.                     <?php
  32.                }
  33.                ?>
  34.             </select>
  35.         </td>
  36.         <td>
  37.             <input type="checkbox" class="form-control"/>
  38.         </td>
  39.         <td>
  40.             <input type="text" onmouseover="calculaTotal();" />
  41.         </td>
  42.     </tr>
  43.         <tr>
  44.         <td >Producto 3</td>
  45.         <td id="precio">3000</td>
  46.         <td id="cantidad">
  47.             <select id="cantidad"  >
  48.                 <?php
  49.                for ($j = 1; $j <= 10; $j++) {
  50.                    ?>  
  51.                     <option value="<?php echo $j; ?>"> <?php echo $j; ?>  </option>
  52.                     <?php
  53.                }
  54.                ?>
  55.             </select>
  56.         </td>
  57.         <td>
  58.             <input type="checkbox" class="form-control"/>
  59.         </td>
  60.         <td>
  61.             <input type="text" onmouseover="calculaTotal();" />
  62.         </td>
  63.     </tr>

¿Has notado los problemas? Seguro te habras dado cuenta que:
1ro: Los id: Precio e id: Cantidad se repiten en cada iteración del PHP «Los id son únicos»
2do: Intentas acceder a precio como si se tratase de un input;
precio=document.getElementById('precio').value
esta forma de acceder es incorrecta, en este caso puedes usar un innerHTML
precio=document.getElementById('precio').innerHTML ;
3ro: Quieres asignar un id tanto al campo de la tabla al cual defines cantidad como al select, ambos los identificas como id:Cantidad, «recuerda que el que contiene el valor es el select en este caso, puesto que el td contiene es al select (un objeto)»
4to: Usas el evento onmouseover sobre la casilla del total cuando el evento que te intereza es el onchange del select, puesto que solo realizaras un calculo si el valor del select cambia.

Soluciones Posibles

1ro:
Usa un contador: $contador = $contador + 1;
Este lo aplicas para la declaración de identificadores id="precio<?php echo $contador; ?" así obtendrías algo como:
precio1
precio2
precio3

2do:
Si deseas usar el campo <td id="precioN">numero</td> para acceder al contenido osea el texto (numero) lo haces con la propiedad innerHTML como lo indique arriba, sin embargo me doy cuenta que tienes una sintaxis mas o menos así:
Código HTML:
Ver original
  1. <td id="precio2">5000 </td>
5000 € no es un numero propiamente dicho así que primero tendrías que crear una función formato(valor) que elimine los caracteres no numéricos.

3ro:
Solo asignale un id al select, el campo (td) no es de tu importancia aquí.
Código HTML:
Ver original
  1. <td><select id="Cantidad<?php echo $contador; ?>"><?php ... ?></select>

4to:
Usa el atributo onchange del select así cada cambio que hagas ejecutara la función CalcularTotal();
Código HTML:
Ver original
  1. <td><select id="Cantidad1" onchange="CalcularTotal();">9</select>

Sugerencia usa un parámetro en la función CalcularTotal(parametro) así sabrás cual input id:totalN afectaras así:
codigo del input:
Código HTML:
Ver original
  1. <input id="total<?php echo $contador; ?>" type="number"/>
ejemplo de resultado esperado:
Código HTML:
Ver original
  1. <input id="total3" type="number"/>

idea de una función:
Código Javascript:
Ver original
  1. function calculaTotal(posicion)
  2.         {
  3.             //Rescatas el valor del elemento con el id indicado
  4.             var precio = document.getElementById('precio'+posicion).innerHTML;
  5.             var cantidad = document.getElementById('cantidad'+posicion).value;
  6.             //Eliminas los caracteres no numericos y retornas un numero real
  7.             precio = formatearMoneda(precio);
  8.             //El resultado lo escribes en el input con el id indicado
  9.             document.getElementById("total"+posicion).value = precio * cantidad;
  10.         }
No falta decir que la función formatearMoneda la debes crear previamente y que la nueva forma de llamar a la funcion CalcularTotal es:

Código HTML:
Ver original
  1. <td><select id="Cantidad<?php echo $contador; ?>"><?php ... ?></select>
Código HTML:
Ver original
  1. <td><select id="Cantidad1" onchange="CalcularTotal(1);">9</select>

En todo caso hay varias pautas que mejorar, mucha suerte con tu proyecto...

Última edición por NeaFan; 04/01/2015 a las 02:08
  #3 (permalink)  
Antiguo 08/01/2015, 12:02
Avatar de neoarcangel  
Fecha de Ingreso: enero-2005
Ubicación: España
Mensajes: 566
Antigüedad: 19 años, 9 meses
Puntos: 5
Respuesta: Calcular importe de un listado dinamico en base a un select

Antes que nada lamento la tardanza en responder, he estado bastante liado.
Por otro lado agradecerte muchisimo tu respuesta, la verdad que respuestas tan concisas y explicativas como la tuya cuesta muchisimo verlas, me ha gustado mucho.

Al final he tenido que retocar un poquitin el codigo, de hecho pero al final he conseguido que me funcionase.
No obstante tu ayuda ha sido imprescindible para ello, asi pues al final ha quedado asi
Código:
 function calculaTotal(posicion)
 {
                 precio=document.getElementById('precio'+posicion).innerHTML;
                 cantidad=document.getElementById('cantidad'+posicion).value;
     
            document.getElementById('totales'+posicion).innerHTML=precio*cantidad;
            
 }
No obstante ahora me queda un ultimo toque que no se muy bien como enfocarlo, calcultaTotal, va calculando el total de cada registro asociado a la base de datos.

La idea es que haya otro campo ya sea en un tr, o en un div, que vaya almacenando el total de totales, es decir

Primero tu seleccionas un numero en el select, digamos el 5, ese 5 automaticamente se multiplica por el valor del producto, digamos 100, automaticamente en el campo total aparece 500
, todo esto iria en el div dinamico que creamos antes que tiene el nombre de "totalesregistro+posicion"

Este div se genera en base a la cantidad de registros que haya en la base de datos, es decir totalesregistro es donde va el total de cada registro, que podrá ser
totalesregistro1, totalesregistro2, totalesregistro3.

El problema viene ahora, si quiero sumar el contenido del todos los totalesregistro
Tengo algo asi.
Código:
function TotaldeTotales()
 {
     //Cuenta de totales de registro(aun no sé como hacerlo)
   totalesregistro=document.getElementById('totales'+posicion).innerHTML;
   for (i=1;i<count(cuentadetotales);i++)
     {
        totaldetotales+=totalesregistro;
    }
 }
Me falta la cuenta de totalesregistro, y no sé como hacerlo ya que "posicion" es un campo dinamico, y no sé muy bien como contar el total de campos "Totalesregistro"


¿Alguna idea?
__________________
Mi equipo

Gigabyte GA-MA770T-UD3P Socket AM3|OZC StealthxStream 600 w | Gigabyte Radeon HD 4770 512MB GDDR5| AMD Phenom II 945 X4 Quad Core 3.0Ghz| Memoria Kingston 6GB DDR3 1333

Etiquetas: calcular, dinamico, funcion, input, listado, php, select, valor
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 06:05.