Foros del Web » Programando para Internet » PHP »

Sobre bucles while

Estas en el tema de Sobre bucles while en el foro de PHP en Foros del Web. Hola a todos/as Estoy un poco atascado con unos bucles while, os explico, tengo dos tablas un tiene el listado de trabajadores y otra tiene ...
  #1 (permalink)  
Antiguo 06/11/2008, 00:44
 
Fecha de Ingreso: septiembre-2004
Mensajes: 23
Antigüedad: 19 años, 7 meses
Puntos: 1
Sonrisa Sobre bucles while

Hola a todos/as

Estoy un poco atascado con unos bucles while, os explico, tengo dos tablas un tiene el listado de trabajadores y otra tiene el listado de facturas, necesito hacer que solo se pueda facturar un trabajador por día osea que solo me muestre en el select los trabajadores que quedan por facturar y no todos.

Actualmente tengo el siguiente codigo:

Código PHP:
<select name="id_operario" class="text_login" id="id_operario">
              <option>Selecciona un operario</option>
<?php

// Aqui compruebo si algun trabajador a sido facturado en la fecha

      
$operarios_facturadosmysql_query ("SELECT id_operario FROM prefactura WHERE id_delegacion='$id_delegacion' AND fecha='$fecha'")or die (mysql_error());

// Si no ha sido facturado ninguno en la fecha, imprimo todos los trabajadores en el combo select
if (mysql_num_rows($operarios_facturados) == 0){
     
$sacar_operario=mysql_query("SELECT id_operario,id_delegacion,cod_operario,apellido1,apellido2,nombre FROM operarios WHERE id_delegacion='$id_delegacion'");


while (
$row mysql_fetch_row($sacar_operario))
{
?>
         <option value="<?php echo $row[0]?>" >-> <?php echo $row[2]?>-<?php echo $row[5]?>-<?php echo $row[3]?>-<?php echo $row[4]?> </option>

              <?php
}

}
// Si hay algun trabajador facturado no lo deberia imprimir, solo imprimo los que estan pendientes de facturar en esta fecha. 
// Aqui es donde recorre dos veces el bucle, cuando hay mas de un trabajador facturado claro, y por lo tanto me devuelve lo que os comento mas abajo.
else

{

     while (
$operario_facturado=mysql_fetch_array ($operarios_facturados)){

         
$todos_operariosmysql_query ("SELECT id_operario,id_delegacion,cod_operario,apellido1,apellido2,nombre FROM operarios WHERE id_delegacion='$id_delegacion' AND id_operario!='$operario_facturado[0]'")or die (mysql_error());
    while (
$row mysql_fetch_array($todos_operarios))
    
{

?>
         <option value="<?php echo $row[0]?>" >-> <?php echo $row[2]?>-<?php echo $row[5]?>-<?php echo $row[3]?>-<?php echo $row[4]?> </option>

              <?php

}
}
?>
</select>
Este codigo funciona aparentemente bien, pero viene el problema cuando se ha facturado a dos trabajadores, puesto que el bucle recorre de nuevo todo y me devuelve esto:

<select name="id_operario" class="text_login" id="id_operario">

<option>Selecciona un operario</option>

<option value="2" >-> 00402-OSCAR </option>

<option value="3" >-> 00403-PATRICIA </option>

<option value="1" >-> 00401-MARCO </option>

<option value="3" >-> 00403-PATRICIA</option>

</select>

Habiendo ya facturado tanto a OSCAR como a MARCO me vuelven a salir puesto que el while, ignora a cada uno en una de sus pasadas y de ahi que me imprima dos veces PATRICIA.

¿Alguien me podria hechar un cable o una mano?, estoy bloqueado no se como continuar con ello, ¿alguna idea al respecto?.

Gracias por vuestro tiempo.
  #2 (permalink)  
Antiguo 06/11/2008, 02:40
Avatar de Deschamps  
Fecha de Ingreso: octubre-2008
Mensajes: 257
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: Sobre bucles while

Cuando haces el SELECT todos_operarios, pones como condición que sus ID sean distintos del ID del trabajador que estás tratando en cada momento (por el while anterior). Esa condición deberías cambiarla por otra que sea "que sus ID sean distintos a *todos* los que se han seleccionado en la consulta anterior".

Puedes utilizar el operador NOT IN en la cláusula WHERE para anidar una consulta en otra y resolver el problema. Además, deberás cambiar la estructura del algoritmo. No será necesario anidar los dos whiles (el primero de ellos sobrará).

Un saludo.
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 01:38.