Listado agrupado

Jos?
19 de Julio del 2002
Hola a todos,

Alguien tiene algún ejemplo de cómo hacer un listado en ASP, donde se muestre (al estilo de los informes de Access) una relación de información agrupada. Por ejemplo, es una relación de Clientes y Pedidos, que se vea cada línea 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 daría algo como esto
torre1 antena1
torre1 antena2
torre2 antena1
torre2 antena2
blah blah


básicamente 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 después 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 ningún 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 código 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 ningún pedido.)<br>"
End If
rsPedidos.Close
rsClientes.MoveNext
Loop
Set rsPedidos = Nothing
End If
rsClientes.Close
Set rsClientes = Nothing