Comunidad de diseño web y desarrollo en internet online

Iterator PHP

Citar            
MensajeEscrito el 16 Nov 2006 05:42 pm
Hola a todos, he encontrado este codigo en : http://www.devarticles.com/c/a/PHP/Building-an-Iterator-with-PHP/1/.

Código :

<?php
function Iterator($array) // Constructor. Takes array to be traversed as a parameter.
function reset() // Sets internal pointer to the first element
function end() // Sets internal pointer to the last element
function seek($position) // Sets internal pointer to desired position
function next() // Returns next element in the iteration
function previous() // Returns previous element in the iteration
?>


Tengo estas tres tablas:
clientes (id_cliente, nombre_cliente)
pedidos(id_pedido,nombre_cliente,id_vendedor)// [creo que en esta parte deberia sólo tener id_cliente en vez de nombre_cliente]//
articulos(id_articulo,id_pedido,nombre_articulo,descripcion_articulo)
vendedores(id-vendedor,nombre_vendedor).

Bueno a parte de que tengo que cambiar de tipo de tablas de YSAM a InnoB...(será necesario?)

Quiero hacer lo siguiente con la clase Iterator arriba mencionada.
Considerando que cada cliente tiene asignado un determinado vendedor ( o mejor dicho cada vendedor tiene sus propias "cuentas") Necesito exponer una tabla de reporte mensual que contega la siguiente estructura:

Vendedor: Id_vendedor | Nombre de vendedor.----------------------|Clientes Vendidos x Mes [2]

idCliente1 |Nombre de Cliente 1 |
-----------------------------------------------------------------------------------------
-------------|Nro de Pedidos:[ 2 ]-----------------------------------------------|
--------------idpedido01---------Articulo 1- descripcion de articulo |
--------------------------------------Articulo 2- descripcion de articulo 2 |
--------------------------------------Articulo 3- descripcion de articulo 3 |
--------------idpedido02---------Articulo 1- descripcion de articulo 1 |
--------------------------------------Articulo 2- descripcion de articulo 2 |
--------------------------------------Articulo 3- descripcion de articulo 3 |
idCliente2 |Nombre de Cliente 2 |
-----------------------------------------------------------------------------------------
-------------|Nro de Pedidos:[ 1 ]-----------------------------------------------|
--------------idpedido01---------Articulo 1- descripcion de articulo |
--------------------------------------Articulo 2- descripcion de articulo 2 |
--------------------------------------Articulo 3- descripcion de articulo 3 |..etc, etc, etc.

Me resulta muy complicado a parte que no me liga aún utlizar foreach. (Array as objetoArray)... ; quisiera saber antes de empezar si es posible utlizar esta clase que me resulta muy interesante.
Espero sus comentarios.

Gracias.

Por juce2005

100 de clabLevel



 

msie
Citar            
MensajeEscrito el 17 Nov 2006 06:43 am
bueno más datos sobre el tema:
He aquí el fichero php, utilizando foreach, no me arroja algo bueno por que el resultado $Pedidos se duplica , Si el cliente tiene por decir 5 pedidos al mes. Me lista los "10 pedidos"
( 001,020,030,031,040,001,020,030,031,040) :

Código :

<?
//conecto con la base de datos
$conn = mysql_connect("localhost","user","pass");
mysql_select_db("dbase",$conn);
//Primera Consulta:
$ssql = "Select distinct clientes.idcliente, clientes.ncliente From clientes,pedidos Where pedidos.idcliente=clientes.idcliente and estado='TERMINADA' ORDER BY pedidos.ncliente";
$rs = mysql_query($ssql,$conn);
while ($rsClientes = mysql_fetch_object($rs)){
array_pop($rsClientes);
echo"<table width=700 border=1 align=center>";
   echo "<tr> \n";   
   echo "<td width=20> <font size=2 >$lista->idcliente </font></td>\n";//id-cliente (codigo)
   echo "<td width=680> <font size=2 >$lista->ncliente </font></td>\n";//Nombre del cliente
   echo"<table width=680 border=1 align=center>\n";               
         echo "<tr>";
               echo "<td width=50> <font color='#111111' size=2 >Serie:Pedido Nro</font></td> \n";   
               echo "<td width=315> <font color='#111111' size=2 >Nro de Productos</font> </td> \n";
               echo "<td width=315> <font color='#111111' size=2 >Vendedor</font> </td> \n";
         echo "</tr>";
         //Subconsulta ? 
         foreach($rsClientes as $oClientes){                                       
                     $sqlQry = 'select * from pedidos';
                     $sqlQry .= sprintf(' where idcliente = %d',$rsClientes->idcliente);
                     $rstOrdenes = mysql_query($sqlQry,$conn);                        
                     if (!$rstPedidos) {
                      echo "No pudo ejecutarse satisfactoriamente la consulta ($sql) " .
                        "en la BD: " . mysql_error();
                      exit;
                     }
                     if (mysql_num_rows($rstPedidos) == 0) {
                      echo "No se han encontrado filas, nada a imprimir, asi que voy " .
                       "a detenerme.";
                     exit;
                     }         
         while ($Pedidos= mysql_fetch_row($rstPedidos)) {
                     //array_pop($Ordenes);
                     //**********
                     // EL PROBLEMA OCURRE AQUÍ***********************
                     //SE DUPLICA LA LISTA DE PEDIDOS.!!!!
                     
         echo "<tr>";                                                                
                     echo "<td width=50> <font color='#111111' size=2 ></font>$Pedidos[0]</td> ";//id_pedido                  
                     echo "<td width=315> <font color='#111111' size=2 ></font>$Pedidos[5] </td> ";//nro de productos
                     echo "<td width=315> <font color='#111111' size=2 ></font>$Pedidos[6] </td> "; //Vendedor (id_vendedor)                     
                                 }         
         mysql_free_result($rstOrdenes);
         echo "</tr> ";         
                           }               
                                                   
                     
               echo "</table>\n";                        
   echo "</tr> \n";   
echo "</table> \n";   
}
?>


Bueno, alguna sugerencia.? Muchas gracias.
PD: Aún queda pendiente lo de Iterator....

Por juce2005

100 de clabLevel



 

msie
Citar            
MensajeEscrito el 17 Nov 2006 11:40 am
Hola,

en cuanto a tu 2do post yo creo que el error lo tienes en la 1era consulta SQL. Revísala porque creo que te devuelve dos veces el id del cliente y por eso te sale duplicado después. Muestra el resultado de la primera consulta para ver que devuelve :)

Con lo de Iterator, ni idea :crap:

Un saludo.

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox
Citar            
MensajeEscrito el 17 Nov 2006 02:35 pm
hola dmvalverde; gracias por tu sugerencia, todo bien sólo con el primer query.:
"Seleccionar DISTINTAMENTE 'id_cliente' y 'nombre de cliente' de las tabla clientes, y pedidos cuyos id-clientes sean iguales.
$lista= Lista de clientes que tienen pedidos.
0101 Ambrosia S.A
0099 Barramonte EIRL.
0103 Casanova Servicios.
0102 Dossier Employed S.A.C.

SIN EMBARGO en el PRIMER QUERY:
si hago:"Select distinct ncliente from pedidos where estado='TERMINADA' order by ncliente" ; me arroja sin el id_cliente:
[ ] |Ambrosia S.A
[ ] |Barramonte EIRL.
[ ] |Casanova Servicios.
[ ] |Dossier Employed S.A.C.
pero...
en el SEGUNDO QUERY:
quedo sin $lista->idcliente para volverlo a comparar.. ah no ser...., que autocompare.....$lista->ncliente=pedidos.ncliente

me dejé entender.?

Pero aun me quedaría la celda correspondiente al idcliente "vacía".
gracias.. nuevamente.

PD: ++Info sobre Iterator: http://weblogs.javahispano.org/page/vitxo/?
anchor=implementado_iteradores_en_php
y una plantilla para bajarse: http://www.phppatterns.com/docs/design/the_iterator_pattern

Por juce2005

100 de clabLevel



 

msie
Citar            
MensajeEscrito el 17 Nov 2006 02:59 pm
:? Es que me hago un lío. ¿De donde se obtiene $rstPedidos? ¿No debería ser $rstOrdenes?

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox
Citar            
MensajeEscrito el 17 Nov 2006 04:55 pm
Lo siento :oops: ; es que estoy tratando de hacer esto para 2 dbases..muy similares......y se me olvidó cambiar "ese detalle". , please; cambia:
$rstOrdenes = mysql_query($sqlQry,$conn); por $rstPedidos = mysql_query($sqlQry,$conn);

Así cualquiera se confunde....
Gracias por la observación. :wink:

hasta ahora va bien con esto: excepto que no sé como podría "capturar" el id_cliente. para cada cliente:

Código :

$conn = mysql_connect("localhost","user","pass");
mysql_select_db("dbase",$conn);
$ssql = "Select distinct ncliente from pedidos order by ncliente";
$rs = mysql_query($ssql,$conn);
while ($clientes= mysql_fetch_object($rs)){
array_pop($clientes);
echo"<table width=700 border=1 align=center>";
   echo "<tr> \n";   
   echo "<td width=20> <font size=2 >Necesito ésto!!!</font></td>\n";
   echo "<td width=680> <font size=2 >$clientes->ncliente </font></td>\n";
   echo"<table width=680 border=1 align=center>\n";               
         echo "<tr>";
               echo "<td width=50> <font color='#111111' size=2 >Pedido Nro</font></td> \n";   
               echo "<td width=30> <font color='#111111' size=2 > Articulo</font> </td> \n";
               echo "<td width=50> <font color='#111111' size=2 >Cantidad</font> </td> \n";
               echo "<td width=100> <font color='#111111' size=2 >F_requerida</font> </td> \n";
               echo "<td width=100> <font color='#111111' size=2 >Estado</font> </td> \n";
         echo "</tr>";
         foreach($clientes as $oClientes){                                       
                     $sqlQry = 'select * from pedidos';
                     $sqlQry .= ' where pedidos.ncliente ="'.$clientes->ncliente.'" order by pedidos.id_pedido ';
                     $rstPedidos = mysql_query($sqlQry,$conn);                        
                     if (!$rstPedidos) {
                      echo "No pudo ejecutarse satisfactoriamente la consulta ($sql) " .
                        "en la BD: " . mysql_error();
                      exit;
                     }
                     if (mysql_num_rows($rstPedidos) == 0) {
                      echo "No se han encontrado filas, nada a imprimir, asi que voy " .
                       "a detenerme.";
                     exit;
                     }         
         while ($Pedidos= mysql_fetch_row($rstPedidos)) {
                     //array_pop($Pedidos);
         echo "<tr>";                                                                
                     echo "<td width=50> <font color='#111111' size=1 ></font>$Pedidos[0]</td> ";                  
                     echo "<td width=30> <font color='#111111' size=1 ></font>$Pedidos[1] </td> ";
                     echo "<td width=50> <font color='#111111' size=1 ></font>$Pedidos[2] </td> "; 
                     echo "<td width=100> <font color='#111111' size=1 ></font>$Pedidos[3] </td> ";
                     echo "<td width=100> <font color='#111111' size=1 ></font>$Pedidos[4] </td> ";                     
                                 }         
         mysql_free_result($rstPedidos);
         echo "</tr> ";         
                           }               
                                                   
                     
               echo "</table>\n";                        
   echo "</tr> \n";   
echo "</table> \n";   
}
?>

El resultado esta yendo más menos asi:
____________________________________________________________
Necesito ésto!! |Ambrosia S.A. |
-----------------------------------------------------------------------------------------
Pedido Nro |Articulo | Cantidad| F_requerida |Estado
---------------------------------------------------------------------------------------
11105 | articulo 01|10 |2006-11-05 |vendido
11110 |articulo 02 |05 |2006-11-05 |pendiente
11125 |articulo 03| 10 |2006-12-05 |pendiente
_____________________________________________________________
Necesito esto!! |Barramonte EIRl |
-----------------------------------------------------------------------------------------
Pedido Nro |Articulo | Cantidad| F_requerida |Estado
---------------------------------------------------------------------------------------
11115 | articulo 02|20 |2006-11-25 |pendiente
11120 |articulo 03 |07 |2006-11-30 |pendiente
11140 |articulo 04| 15 |2006-12-05 |pendiente..etc, etc, etc..

Por juce2005

100 de clabLevel



 

msie
Citar            
MensajeEscrito el 17 Nov 2006 05:53 pm
:D Ok!

Otra cosa: para un id_cliente siempre tendrá el mismo ncliente guardado en la tabla pedidos, no? Te lo digo porque con que la primera consulta sea:

Código :

$ssql = "Select distinct id_cliente, ncliente from pedidos order by ncliente";


funcionaría. Vamos, porque había un id_cliente en pedidos, no?

PD: Un consejo sobre el diseño de la base de datos: Yo no pondría ncliente en la tabla pedidos, sólamente en clientes y la tabla pedidos se enlazaría con clientes por medio de la clave externa id_cliente. Esta es una buena forma para mantener consistente la BD y no tener redundancia de datos. Pero vamos, que solo es un consejo... :wink:

Un saludo.

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox
Citar            
MensajeEscrito el 17 Nov 2006 07:55 pm
Si tienes razón sólo debe existir , "por buena salud"; "idcliente" en la tabla pedidos. De eso no hay duda.
Si hago el Query como me lo planteas:
$ssql = "Select distinct id_cliente, ncliente from pedidos order by ncliente"
todo bien , obtengo idcliente-nombre de cliente. , pero******
al hacer el foreach.....
regreso a lo mismo:.. la lista de pedidos por cada cliente se "duplica".

Si el cliente tiene por decir 5 pedidos me arroja lo giguiente:
( 001,020,030,031,040,001,020,030,031,040) .

Nuevamente Muchas gracias por tu tiempo en verdad.

Por juce2005

100 de clabLevel



 

msie
Citar            
MensajeEscrito el 17 Nov 2006 08:24 pm
:shock: Se me estaba yendo la olla :lol:

Necesitas el foreach para algo? Quítalo y verás como te funciona bien, añadiendo lo del Select que te indique en el último post:

Código :

$ssql = "Select distinct id_cliente, ncliente from pedidos order by ncliente";



Ya me contarás... :wink:

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox
Citar            
MensajeEscrito el 17 Nov 2006 09:25 pm
Claro que necesito el foreach:
Por cada idcliente "existen "n pedidos".

con tu último post, sólo obtengo:

idcliente2 Nombre del cliente A
idcliente1 Nombre del cliente B
idcliente3 Nombre del cliente C

No sé si me entiendes, la gracia está en presentar ordenadamente la tabla pedidos de éste modo:

idcliente2-Nombre del clienteA:
--Listar Pedidosdel idcliente2
idciente1-nombre de ClienteB:
--listar pedidos del idcliente 1
idciente3-nombre de ClienteC:
--Listar pedidos del idcliente3

y le sigo dando al asunto..../ a no ser que esté demasiado cegato , por fis , extiende el codigo.

Por juce2005

100 de clabLevel



 

msie
Citar            
MensajeEscrito el 17 Nov 2006 09:46 pm
:) No, a lo que me refería era solo a eliminar la linea del foreach, no su contenido. Te indico el código completo:

Código :

$conn = mysql_connect("localhost","user","pass");
mysql_select_db("dbase",$conn);
$ssql = "Select distinct id_cliente, ncliente from pedidos order by ncliente";
$rs = mysql_query($ssql,$conn);
while ($clientes= mysql_fetch_object($rs)){
array_pop($clientes);
echo"<table width=700 border=1 align=center>";
   echo "<tr> \n";   
   echo "<td width=20> <font size=2 >$clientes->id_cliente</font></td>\n";
   echo "<td width=680> <font size=2 >$clientes->ncliente </font></td>\n";
   echo"<table width=680 border=1 align=center>\n";               
         echo "<tr>";
               echo "<td width=50> <font color='#111111' size=2 >Pedido Nro</font></td> \n";   
               echo "<td width=30> <font color='#111111' size=2 > Articulo</font> </td> \n";
               echo "<td width=50> <font color='#111111' size=2 >Cantidad</font> </td> \n";
               echo "<td width=100> <font color='#111111' size=2 >F_requerida</font> </td> \n";
               echo "<td width=100> <font color='#111111' size=2 >Estado</font> </td> \n";
         echo "</tr>";
         //foreach($clientes as $oClientes){                                       
                     $sqlQry = 'select * from pedidos';
                     $sqlQry .= ' where pedidos.ncliente ="'.$clientes->ncliente.'" order by pedidos.id_pedido ';
                     $rstPedidos = mysql_query($sqlQry,$conn);                        
                     if (!$rstPedidos) {
                      echo "No pudo ejecutarse satisfactoriamente la consulta ($sql) " .
                        "en la BD: " . mysql_error();
                      exit;
                     }
                     if (mysql_num_rows($rstPedidos) == 0) {
                      echo "No se han encontrado filas, nada a imprimir, asi que voy " .
                       "a detenerme.";
                     exit;
                     }         
         while ($Pedidos= mysql_fetch_row($rstPedidos)) {
                     //array_pop($Pedidos);
         echo "<tr>";                                                                
                     echo "<td width=50> <font color='#111111' size=1 ></font>$Pedidos[0]</td> ";                  
                     echo "<td width=30> <font color='#111111' size=1 ></font>$Pedidos[1] </td> ";
                     echo "<td width=50> <font color='#111111' size=1 ></font>$Pedidos[2] </td> "; 
                     echo "<td width=100> <font color='#111111' size=1 ></font>$Pedidos[3] </td> ";
                     echo "<td width=100> <font color='#111111' size=1 ></font>$Pedidos[4] </td> ";                     
                                 }         
         mysql_free_result($rstPedidos);
         echo "</tr> ";         
                           //}               
                                                   
                     
               echo "</table>\n";                        
   echo "</tr> \n";   
echo "</table> \n";   
}
?>


Así se muestran los datos como indicas

idcliente2-Nombre del clienteA:
--Listar Pedidosdel idcliente2
idciente1-nombre de ClienteB:
--listar pedidos del idcliente 1
idciente3-nombre de ClienteC:
--Listar pedidos del idcliente3


Un saludo.

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox
Citar            
MensajeEscrito el 17 Nov 2006 11:48 pm
Como te decía, estoy demasiado cegato...., cualquiera ya me habría mandado a ordeñar cabras....;
Gracias , muchas gracias!!!. :)
LA pregunta es...., cuando debería entonces utlizar le bendito foreach.? ja, j,aja!!!

..
Espero no perder contacto.

Por juce2005

100 de clabLevel



 

msie
Citar            
MensajeEscrito el 18 Nov 2006 12:29 am
:lol: :lol: Para eso estamos, otro día me tendrás que ayudar tú :wink:

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.