Cuando se estamos desarrollando un software y se llega a la parte de reportes siempre surgen necesidades de Reportes Avanzados que estén organizados por Grupos.
Un ejemplo de esto es necesitar un reporte que Me liste un grupo de Clientes con las respectivas facturas que se le han realizado. Para esto se requiere tener el nombre del cliente como encabezado y las facturas como detalle.
Para realizar este reporte solo hay que agregar un Encabezado de Grupo a un reporte. Para esto damos clic derecho sobre el titulo que dice encabezado de Pagina y luego escogemos la opción Insertar encabezado de Grupo:
Ya con este encabezado de grupo agregado debemos configurar el reporte y agregar los campos que se van a mostrar en el reporte tanto en el encabezado como en el detalle.
Damos clic sobre la barra de titulo del reporte para que nos muestre en la ventana de propiedades, las propiedades del reporte y vamos a cambiar de la siguiente manera:
- LeftMargin: 0
- RightMargin: 0
- TopMargin: Margen Superior
- ReportWidth: 11607
- WindowsState: 2 -vbMaximized
- Icono : cambiar por el icono deseado
- Caption: El titulo que corresponda
Hay que tener cuidado con el ReportWidth porque si no lo cambiamos nos va a marca un error de Ancho de Reporte, no puede exceder el valor que les indico o va salir ese error, este error también puede salir en el caso de que la impresora no es una impresora de papel normal así que hay que tener como pregerminada una impresora si no tenemos podemos indicar una de las que Windows trae por default.
En la imagen se puede ver el reporte en vista Diseño.
Encabezado de Grupo
En el encabezado de grupo hay que colocar los campos que hacen parte de la consulta de encabezado (Ejemplo de la consulta: Cabecera = “SELECT tblClientes.IdCliente, tblClientes.NombreApellidos_cli, tblClientes.Identificacion_cli FROM tblClientes” )
Para mostrar cada campo debemos usar un control RptTextBox y modificar la propiedad DataField solo esa.
Detalle
Para el detalle hay que tener colocar los campos que queremos que se muestren en el detalle en mi caso muestro los datos de la factura y utilizó la siguiente consulta:
Detalle = “SELECT Num_Factura, FechaHora, IdCliente, Dias, TotalFactura, SaldoFactura FROM tblVentas Where EstadoFact = 1 and SaldoFactura > 0”
Cada uno de los campos de la consulta son lo que utilizo en el reporte deben colocarse solo los que se van a mostrar, A diferencia del encabezado en las propiedades de cada campo debes cambiar el DataField que es el nombre del campo como lo usamos en la base de datos y la propiedad DataMember que es el alias que usamos para el detalle que ahora le indico donde lo usamos en la consulta.
Código para mostrar el Reporte
Sub AbrirConexionAdoReport() DireccionDb = App.Path & "\Db\DbVentas.accdb" CadenaCompleta = "Provider=MSDataShape.1;Extended Properties=Jet OLEDB:Database Password=;Persist Security Info=False;Data Source=" & DireccionDb & ";Data Provider=Microsoft.ACE.OLEDB.12.0" ConexionADOReport.CursorLocation = adUseClient ConexionADOReport.Provider = "MSDataShape" 'la conexion es diferente a que se utiliza normalmente ConexionADOReport.CommandTimeout = 0 ConexionADOReport.Open CadenaCompleta ' conectamos la BD End Sub Private Sub cmdReporte_Click() Dim Mes, Año As Integer Dim RecorsetTemp As New ADODB.Recordset Cabecera = "SELECT tblClientes.IdCliente, tblClientes.NombreApellidos_cli, tblClientes.Identificacion_cli FROM tblClientes Order by tblClientes.NombreApellidos_cli ASC " Detalle = "SELECT Num_Factura, FechaHora, IdCliente, Dias, AS Fechav, TotalFactura, SaldoFactura FROM tblVentas Where EstadoFact = 1 and SaldoFactura > 0" 'para los reporte de grupo se utiliza SHAPE sql = "SHAPE {" & Cabecera & "} as Cabecera " & _ "APPEND ({" & Detalle & "} as Detalle " & _ "RELATE 'IdCliente' to 'IdCliente') as Deta" RecorsetTemp.CursorLocation = adUseClient RecorsetTemp.Open sql, ConexionADOReport Set dtrReporteClientes.DataSource = RecorsetTemp dtrReporteClientes.Sections("Sección2").Controls("Etq_Empresa").Caption = Glo_NombreEmpresa dtrReporteClientes.Sections("Sección2").Controls("Etq_Titulo").Caption = "Saldos de Clientes" dtrReporteClientes.Show End Sub
Lo primero que se ve en el código es una función de conexión para la base de datos porque para este tipo de reportes no se puede utilizar la conexión normal hay que agregarle unos parámetros adicionales como por ejemplo “ConexionADOReport.Provider = “MSDataShape” que permite utilizar SHAPE para el reporte.
Para mostrar el reporte vemos 2 consultas la de encabezado y la de detalle son 2 consultas distintas pero que tienen un campos que los relaciona en este caso es el IdCliente que esa en ambas tablas tanto en tblClientes como en tblVentas hay que tener esto en cuenta.
Luego el código mas importarte es el que relaciona ambas consultas:
sql = "SHAPE {" & Cabecera & "} as Cabecera " & _ "APPEND ({" & Detalle & "} as Detalle " & _ "RELATE 'IdCliente' to 'IdCliente') as Deta"
dentro de los corchetes le indicamos a SHAPE la consulta de encabezado y en APPEND la de detalle luego con RELATE indicamos los campos que los relacionan y si notas al final dice as Deta, este es el alias que se usa para el la propiedad DataMember en el reporte.
Las demás opciones ya las he explicado en la lección de Curso Software de Ventas Parte 21, Reporte con DataReport
Si notamos no es tan difícil hacer este tipo de reportes solo hay que sabes organizar las consultas que se le pasan a shape.
Proyecto de Ejemplo
Adjunto un proyecto de ejemplo que puedes descarga y probar: Proyecto Reporte de Grupo Visual Basic 6 (236 descargas )
VIDEO EXPLICATIVO