Listado agrupado

Jos?
19 de Julio del 2002
Hola a todos,

Alguien tiene algn ejemplo de cmo hacer un listado en ASP, donde se muestre (al estilo de los informes de Access) una relacin de informacin agrupada. Por ejemplo, es una relacin de Clientes y Pedidos, que se vea cada lnea de Cliente y debajo de cada cliente todos los pedidos del cliente.

Gracias de antemano

rivelo
19 de Julio del 2002

<%
While ((Repeat1__numRows <> 0) AND (NOT rsTorres.EOF))
%>
<tr>
<td><%=(rsTorres.Fields.Item("torre").Value)%></td>
<td><%=(rsTorres.Fields.Item("antena").Value)%></td>
</tr>
<%
Repeat1__index=Repeat1__index+1
Repeat1__numRows=Repeat1__numRows-1
rsTorres.MoveNext()
Wend
%>

que dara algo como esto
torre1 antena1
torre1 antena2
torre2 antena1
torre2 antena2
blah blah


bsicamente lo que se ocupa es un espia que nos diga cuando cambiamos de torre,para esto usaremos dos variables newTorre y oldTorre,esto antes del while, luego justo despus del while le asignamos a newTorre el valor de la torre acual en ese momento en el while, a la hora de dezplegar la torre ponemos un if que pregunte si newTorre es diferente a oldTorre entonces esto indicar que estamos cambiando de torre, por lo que la autorizamos a poner el nombre de la nueva torre, si la torre es la misma no ocupamos que escriba nada. Justo al final del if le asignamos a oldTorre el valor de newTorre para que en la siguiente vuelta compare valores de nuevo, dale vuelta un rato en la cabeza y te llegar.

{ en negrita lo que modifiqu/agregu }

<%
dim newTorre,oldTorre
While ((Repeat1__numRows <> 0) AND (NOT rsTorres.EOF))
newTorre= rsTorres.Fields.Item("torre")
%>

<tr>
<td><%if(newTorre <> oldTorre) Then Response.Write(rsTorres.Fields.Item("torre").Value)%></td>
<td><%=(rsTorres.Fields.Item("antena").Value)%></td>
</tr>
<%
oldTorre=newTorre
Repeat1__index=Repeat1__index+1
Repeat1__numRows=Repeat1__numRows-1
rsTorres.MoveNext()
Wend
%>

salida.
torre1 antena1
antena2
torre2 antena1
antena2
etc.

el recorset lo hice as.
SELECT * FROM torresDetail ORDER BY torre,antena ASC

rapomon
19 de Julio del 2002
Aqu va otro ejemplo muy sencillo:

strConexion = "cadena_de_conexion"
Set rsClientes = Server.CreateObject("ADODB.Recordset")
rsClientes.Open "select * from clientes", strConexion
If Not rsClientes.EOF Then
Set rsPedidos = Server.CreateObject
Do Until rsClientes.EOF 'Todos los clientes
Response.Write "<b>" & rsClientes("nombre_cliente") & "</b><br>"
rsPedidos.Open "select * from pedidos where id_cliente = " & rsClientes("id_cliente"), strConexion
If Not rsPedidos.EOF Then
Do Until rsPedidos.EOF 'Por cada cliente todos sus pedidos
Response.Write rsClientes("pedido") & "<br>"
rsPedidos.MoveNext
Loop
Else
Response.Write "(El cliente no ha realizado ningn pedido.)<br>"
End If
rsPedidos.Close
rsClientes.MoveNext
Loop
Set rsPedidos = Nothing
End If
rsClientes.Close
Set rsClientes = Nothing

rapomon
19 de Julio del 2002
Esto de hacer las cosas deprisa...
He cometido unos errores en el ejemplo anterior, aqu va el cdigo bueno:


strConexion = "cadena_de_conexion"
Set rsClientes = Server.CreateObject("ADODB.Recordset")
rsClientes.Open "select * from clientes", strConexion
If Not rsClientes.EOF Then
Set rsPedidos = Server.CreateObject("ADODB.Recordset")
Do Until rsClientes.EOF 'Todos los clientes
Response.Write "<b>" & rsClientes("nombre_cliente") & "</b><br>"
rsPedidos.Open "select * from pedidos where id_cliente = " & rsClientes("id_cliente"), strConexion
If Not rsPedidos.EOF Then
Do Until rsPedidos.EOF 'Por cada cliente todos sus pedidos
Response.Write rsPedidos("pedido") & "<br>"
rsPedidos.MoveNext
Loop
Else
Response.Write "(El cliente no ha realizado ningn pedido.)<br>"
End If
rsPedidos.Close
rsClientes.MoveNext
Loop
Set rsPedidos = Nothing
End If
rsClientes.Close
Set rsClientes = Nothing