Numerar grupos de páginas en un informe
Pregunta
¿Se puede numerar las páginas por los grupos de registros existentes en un informe?
Respuesta
En alguna ocasión podríamos necesitar numerar las páginas de un informe, pero no sobre el total de páginas en el informe (esto ya lo hacen las propiedades Page y Pages de un informe), sino numerar las páginas por los grupos de registros existentes en ese informe.
Este sería el caso, por ejemplo, de sacar un listado mensual con todos los pedidos o facturas de nuestra empresa y que estuviera agrupado por cliente, por zona, o algo similar. Cada pedido o factura ocuparía una página (haciendo servir un control Salto de página) y cada grupo estaría formado por el total de pedidos o facturas de ese cliente o zona. En esta situación sería normal que quisieramos un paginador del tipo (número_página de tantas_páginas) para cada uno de esos grupos.
Vamos a poner, como siempre, un supuesto. Este supuesto estará basado en la base de datos Neptuno.mdb, pero no es un informe que venga predeterminadamente en esa base de datos, así que tendremos que fabricarlo…
Manos a la obra, desde la base de datos Neptuno.mdb:
– Vamos a la ventana de informes y apretamos el botón Nuevo.
– Asistente para informes
– -> botón aceptar
– Seleccionamos la tabla Pedidos y añadimos los campos IdCliente y IdPedido
– Seleccionamos la tabla Detalles pedidos y añadimos los campos IdPedido, IdProducto, Cantidad y PrecioUnidad
– -> botón siguiente
– -> botón siguiente
– A la pregunta ¿Desea agregar algún nivel de agrupamiento? señalamos el campo IdCliente y lo agregamos
– Pulsamos el botón Finalizar.
– Volvemos a abrir el informe en vista diseño
– Menú – Ver – Ordenar y agrupar, y escogemos el campo Pedidos_IdPedido
– En la casilla Pie de grupo, seleccionamos Sí
– -> botón aceptar
– En la recién creada sección Pie Pedidos_IdPedido insertamos un cuadro de texto independiente al que daremos el nombre de txtPaginas y al final de esta sección insertaremos también un control Salto de página (de esta manera habrá una página para cada pedido).
– Seleccionamos la sección “Encabezado de página” (justo debajo de la cual, aparecen las etiquetas de los campos del informe) y en la ventana de propiedades le cambiamos el nombre a EncabezadoPagina.
Y ya tenemos el informe de ejemplo… Ojo! Este informe tendrá más de 800 páginas. Si queréis acortarlo un poco podeis ponerle algún criterio en el campo IdCliente del origen del registro del informe. Algo como Like “A*” Or Like “B*”, que nos mostrará sólo los clientes que empiecen por A y B (es una idea).
Después, en el módulo asociado a este informe pegaremos este código:
Codigo
' matriz de 2 dimensiones que contendrá el contador de páginas por grupo
' y el total de páginas por grupo
Dim ContadorPaginas() As Long
Private Sub EncabezadoPagina_Format(Cancel As Integer, FormatCount As Integer)
Static NumPagina As Long 'contador de páginas por grupo
Static NumPaginas As Long 'total páginas por grupo
Static GrupoAnterior As String 'grupo de registros
Dim cnt As Long, indice As Long
NumPagina = NumPagina + 1
' el informe dará una vuelta completa a todas las páginas
' para formatearlas en memoria, y aquí Me.Page coincidirá con
' NumPagina y nosotros contaremos las páginas por grupo
If NumPagina = Me.Page Then
' primera página
If Me.Page = 1 Then
GrupoAnterior = Me.IdCliente
NumPaginas = 1
Else
If GrupoAnterior <> Me.IdCliente Then
' el grupo ha cambiado, así que grabamos
' los valores en la matriz ContadorPaginas
Call LlenarMatriz(NumPagina, NumPaginas)
NumPaginas = 1
GrupoAnterior = Me.IdCliente
Else
' el grupo no ha cambiado, así que
' acumulamos el número de páginas
NumPaginas = NumPaginas + 1
End If
End If
Else
' esto se cumplirá cuando se haya pasado la última
' página del informe
If Me.Page = 1 Then
Call LlenarMatriz(NumPagina, NumPaginas)
End If
' aquí el informe está dando una segunda pasada a las
' páginas y las imprime en pantalla, y es donde
' nosotros escribimos los valores que hemos ido grabando,
' en la matriz ContadorPaginas
Me.txtPaginas = "Página " & ContadorPaginas(0, Me.Page) _
& " de " & ContadorPaginas(1, Me.Page)
End If
End Sub
Sub LlenarMatriz(NPagina As Long, NPaginas As Long)
Dim cnt As Long, indice As Long
' incrementamos los índices de la matriz
ReDim Preserve ContadorPaginas(1, NPagina - 1) As Long
' llenamos la matriz con el contador de páginas por grupo
' (ContadorPaginas(0, PaginaInforme)
' y el total de páginas por grupo
'(ContadorPaginas(1, PaginaInforme)
For cnt = 0 To NPaginas - 1
indice = NPagina - 1 - cnt
ContadorPaginas(0, indice) = NPaginas - cnt
ContadorPaginas(1, indice) = NPaginas
Next
End Sub
Este código aprovecha la característica del evento Format, el cual, en memoria, da una primera pasada formateando las páginas del informe. En esta primera pasada, nosotros contamos las páginas y almacenamos los valores en una matriz. Después, en una segunda pasada en la cual se presentan los datos en pantalla, es el momento en el que nuestro código va escribiendo los valores almacenados anteriormente en el cuadro de texto.
Si se da el caso de que esta explicación os suene algo confusa, sugiero seguir los pasos para crear el informe en la base Neptuno.mdb, pegar el código en el módulo del informe y poner ahí puntos de interrupción para seguir el funcionamiento del código, los valores que van tomando las variables y los elementos de la matriz, así como el momento en que se escribe en la matriz (antes de que se presente el informe en pantalla) y el momento en el que finalmente se escribe en el control del informe (al pasar de página a página).
Yo mismo he tenido que hacerlo un poco así para poder escribir estas líneas, ya que este código lo tenía preparado (sin comentarios :-S) desde hacía unos 3 o 4 meses y no recordaba muy bien cómo funcionaba.
Espero que os sirva.
Créditos
con el fin de dar a conocer el trabajo de uno de los más grandes en el mundo de Access en español, y tras solicitar su permiso, replico este artículo de Juan M Afán de Ribera. Todos los derechos y autoría corresponden a él. Access & VBA FAQ – Numerar grupos de páginas en un informe (archive.org)
Pregunta Sé cómo imprimir un informe mediante código y sé cómo hacer para que aparezca el cuadro de diálogo imprimir,…
Cómo conseguir en un informe calcular sólo el total para cada página