Foros del Web » Programando para Internet » PHP »

While - Recorrer un recordset

Estas en el tema de While - Recorrer un recordset en el foro de PHP en Foros del Web. Hola amigo! Finalemente he tenido que postearlo, porque no me sale. Estoy haciendo una consulta al mysql de dos tablas, que me devuelve todo lo ...
  #1 (permalink)  
Antiguo 12/08/2009, 06:35
 
Fecha de Ingreso: marzo-2007
Mensajes: 538
Antigüedad: 17 años, 1 mes
Puntos: 0
While - Recorrer un recordset

Hola amigo!
Finalemente he tenido que postearlo, porque no me sale.
Estoy haciendo una consulta al mysql de dos tablas, que me devuelve todo lo que esta vinculado, no se si me explico. Esta es la query
Código:
SELECT midn.*, mid.* FROM mod_invoices_delivery_notes as midn LEFT JOIN mod_invoices_details as mid ON midn.id_delivery = mid.id_delivery WHERE midn.id_invoice = 12 ORDER BY midn.date_delivery
Esto me esta retornando una tabla de 22 columnas por 3 filas sin contar la cabecera
Supongamos que el resultado fuera de dos columnas, en la cual sus resultados fueran estos:
col1 - col2
1-1
1-2
1-3
2-1
3-1
3-2


Necesito un bucle que me recorra dicho resultado de la siguiente forma:
col1 = 1
col2 = 1
col2 = 2
col2 = 3
col1 = 2
col2 = 1
col1 = 3
col2 = 1
col2 = 2

no se si se entiende, pero para cada col1 que se la misma necesito saber todos sus col2.

Este es el codigo que tengo, pero no funciona bien:
Código:
	$index=$resultDND->fields[_GRID_HEADER_02_01];
	while ( !$resultDND->EOF ){
		// Pintem la capçalera del albarà
		echo 'Pintamos col1';
		while ($index == $resultDND->fields[_GRID_HEADER_02_01]){
			// Pintem detalls
             		echo'Pintamos col2';
			$resultDND->MoveNext();
			if (!$resultDND->EOF){
				echo $index." - ".$resultDND->fields[_GRID_HEADER_02_01];
				$index = $resultDND->fields[_GRID_HEADER_02_01];
			}
		}// Fin del segundo while
	} // Fin del primer while
Gracias anticipadamente!
  #2 (permalink)  
Antiguo 12/08/2009, 07:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: While - Recorrer un recordset

Vas a tener que explicar mejor. Si colocas mejor lo que recibes y como quieres que aparezca entiendo que te podriamos ayudar mejor.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 12/08/2009, 07:39
 
Fecha de Ingreso: marzo-2007
Mensajes: 538
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: While - Recorrer un recordset

Buenas abimaelrc y demás.

Creo que con el ejemplo se entiende bien, pero desde fuero veo que no. Me explicaré de nuevo:
Imaginemos que recibo una tabla de dos columnas con 6 filas
col1 - col2
1-A
1-B
1-C
2-A
3-A
3-B


Quisiera hacer un bucle que me imprimiera la tabla esta pero como si fuera en forma de arbol, es decir
1 - A
B
C
2 - A
3 - A
B

De esta forma, es decir me imprimirá 1 vez el nº 1 con sus 3 letras debajo, 1 vez el nº 2 con sus letras (en este caso solo una) y 1 vez el nº3 con sus dos letras.

Cada nº tendrá como mínimo una letra.

Espero haberme explicado ahora.

Gracias por la ayuda
  #4 (permalink)  
Antiguo 12/08/2009, 07:55
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: While - Recorrer un recordset

Ok en el while no creo que sea necesario crear otro porque ya los tienes declarados en un orden especifico con el ORDER BY.

Lo que necesitarias es una condicion. Mira este ejemplo

Código php:
Ver original
  1. $var  = "";
  2. $query = mysql_query("SELECT * FROM tabla ORDER BY col1");
  3. while($row = mysql_fetch_assoc($query)){
  4.   if($var != $row["col1"]){
  5.     $var = $row["col1"];
  6.     echo $row["col1"] . " = " . $row["col2"];
  7.   }else{
  8.     echo $row["col2"];
  9.   }
  10. }

Solo tienes que modificarlo a la forma como tu quieres.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 12/08/2009, 08:07
 
Fecha de Ingreso: marzo-2007
Mensajes: 538
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: While - Recorrer un recordset

Muchas grácias por la rapidez.
Mientras esperaba una solución creé un codigo que también me funciona, pero pòndré esl suyo ya que lo veo más claro.
Código:
	$indexAnterior=0;
	$indexActual=$resultDND->fields[_GRID_HEADER_02_01];
	while ( !$resultDND->EOF ){
		// Pintem la capçalera del albarà
		if ($indexActual != $indexAnterior){
	echo $col1;
		}
		// Igualamos valores para entrar por primera vez
		$indexActual = $indexAnterior;
		while ($indexActual == $indexAnterior){
			// Pintem detalls
             		echo $col2;
			$indexAnterior=$resultDND->fields[_GRID_HEADER_02_01];
			$resultDND->MoveNext();
			$indexActual=$resultDND->fields[_GRID_HEADER_02_01];
			$contador++;
		}// Fin del segundo while
	} // Fin del primer while
Gracias de todos modos!
  #6 (permalink)  
Antiguo 12/08/2009, 08:19
Avatar de GabrielAizcorbe  
Fecha de Ingreso: mayo-2009
Ubicación: En la luna.
Mensajes: 30
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: While - Recorrer un recordset

Hola Laufwerk, no entiendo bien que quieres hacer, pero si lo que quieres es pintar los registros de modo de "agruparlos por colores" pues aqui te paso un "pseudo-codigo" que lo he probado y de hecho funciona, da lo mismo lo que hagas con los datos de la columna dos (Col2), que los pintes que los guardes que los marques que los sumes tu haras con ellos lo que quieras, pero este ejemplo te da una idea clara de que hacer.



"Código del Bucle"

Código PHP:
LastRecord CurrentRecord

While CurrentRecord <> EOF
    PaintCol 1
    
While CurrentRecord <> EOF And LastRecord CurrentRecord
        PaintCol 2
        MoveNext
    Wend
    LastRecord 
CurrentRecord
Wend 
En todo caso si quieres ver funcionar ese bucle aquí te pego el código completo que es un macro de excel, debes poner los siguientes datos (los números nada más) en las
columnas A y B de una hoja excel.



"Datos para la planilla Excel"

Cita:
A | B
--------
1 1
1 2
1 3
2 1
3 1
3 2
luego te vas a la seccion de macros (Alt - F11) te creas un Modulo y pegas todo este código



"Código completo de los Bucles de Ejemplo para Macros de Excel"

Código PHP:
Const Verde 43
Const Naranjo 44
Const EOF ""
'
Global i As Integer
Global Alternar As Boolean

Sub Bucle()
'
Dim LastRecord As String
SetVariables

LastRecord 
CurrentRecord

While CurrentRecord <> EOF
    
If LastRecord CurrentRecord Then
        PaintCol 1
        PaintCol 2
    
Else
        
Alternar Not Alternar
        LastRecord 
CurrentRecord
        PaintCol 1
        PaintCol 2
    End 
If
    
MoveNext
Wend

End Sub

Sub Bucle2
()

Dim LastRecord As String
SetVariables

LastRecord 
CurrentRecord

While CurrentRecord <> EOF
    PaintCol 1
    
While CurrentRecord <> EOF And LastRecord CurrentRecord
        PaintCol 2
        MoveNext
    Wend
    LastRecord 
CurrentRecord
    Alternar 
Not Alternar
Wend

End Sub

Private Sub MoveNext()
    
1
    Range
("A" i).Select
End Sub

Private Function CurrentRecord() As String
    CurrentRecord 
ActiveCell.FormulaR1C1
End 
Function

Private 
Sub PaintCol(col As Integer)

If 
col 1 Then
    Range
("A" i).Select
ElseIf col 2 Then
    Range
("B" i).Select
Else
    
GoTo Error
End 
If

With Selection.Interior
    
.ColorIndex IIf(AlternarVerdeNaranjo)
    .
Pattern xlSolid
End With

Error
:

End Sub

Private Sub SetVariables()
    
Alternar True
    i 
1
    Range
("A" i).Select
End Sub 

Luego te vuelves a Excel y ejecutas el Macro (Alt-F8), encontraras DOS BUCLES, Bucle y Bucle2 hacen cosas diferentes, yo creo que el que a ti te va a servir es el Bucle2 que es el que de hecho te pegué aquí. El exceso de código que ves en funciones y subs los cree nada mas para usar "nombres de función" como MoveNext, CurrentRecord etc de modo que te resultara mas familiar de entender que la terrible notación que tiene excel.

Espero que te sirva y cualquier duda que tengas me avisas!!

Saludos
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 20:56.