Como usar en Access y VBA el comando DoCmd.OpenReport para abrir un Informe

Hace un tiempo hablábamos sobre como abrir un formulario utilizando el comando OpenForm, hoy hablaremos del primo hermano OpenReport que nos permitirá, mediante código VBA, abrir un informe.

La forma más sencilla de usarlo es así:

DoCmd.OpenReport “NombreDelInforme”

Con esta orden bastaría para abrir el informe, no obstante tenemos una serie de parámetros que podemos utilizar y que dotarán de más versatilidad a la orden, veámoslo como hacerlo y que beneficios obtendremos.

Pongámoslo en contexto. Tenemos un formulario con un botón que nos abrirá un informe de ventas, por ejemplo.

Microsoft Access Docmd.OpenReport

Automáticamente se nos abre el editor de VBA con el cursor en el sitio adecuado para escribir nuestra sentencia:

Microsoft Access - Comando VBA OpenReport

Nota: Como se puede observar, una cosa que nos ayuda enormemente a la hora de escribir código es la ayuda en pantalla. En este caso tras escribir “Docmd.OpenReport” y poner un espacio, Access nos presenta un letrero amarillo informando sobre como configurar el “OpenReport” y lo mejor de todo es que, en negrita, nos va marcando en qué posición de la sentencia nos encontramos.

Sigamos desglosando la sentencia, tras poner el nombre del informe que queremos abrir, lo que debemos hacer entre comillas dobles y justo después del OpenReport y un espacio, OpenReport tiene algunos parámetros opcionales separados por “,” que podemos cumplimentar, o no, para potenciar la apertura del informe. Si no necesitamos alguno de los parámetros simplemente lo dejamos en blanco pero hemos de poner la coma que lo separa con el siguiente. Veamos como utilizar estos parámetros:

View

Según la ayuda de Access, cada una de las vistas en las que podemos abrir un informe, hacen lo siguiente:

  • acViewDesign: El informe se abre en la vista Diseño.
  • acViewLayout : El informe se abre en la vista Presentación.
  • acViewNormal: (Valor predeterminado) El informe se abre en la vista Normal. Lo envía directamente a la impresora sin abrirlo.
  • acViewPivotChart: El informe se abre en la Vista Gráfico dinámico.
  • acViewPivotTable: El informe se abre en la Vista Tabla dinámica.
  • acViewPreview:  El informe se abre en la Vista preliminar de la impresión. Esta nos permite visualizarlo en pantalla antes de imprimirlo.
  • acViewReport: El informe se abre en la Vista Informe donde es posible realizar algunas acciones y ejecutar eventos.

Si no especificamos ninguno de estos parámetros, Access lo abrirá en vista acViewNormal por lo que directamente se enviará a la impresora sin dejarnos ver el informe. Según tus necesidades puedes dejar el parámetro por defecto o modificarlo para que te muestre en pantalla en informe acViewPreview antes de imprimirlo.

Si queremos dejar el valor por defecto simplemente podemos dejar el parámetro en blanco y, tal y como hemos comentado más arriba, hay que poner la coma del siguiente parámetro.

DoCmd.OpenReport “NombreDelInforme”, ,

En este ejemplo queremos que nos muestre en informe en pantalla, bien para imprimirlo o, simplemente, para consultar sus datos, así que vamos a dejarlo con el parámetro acViewPreview:

DoCmd.OpenReport “NombreDelInforme”, acViewPreview,

 FilterName

Permite asignar, entre comillas “”, el nombre de una consulta que tengamos guardada en  Microsoft Access y que filtre los datos del Informe.

Por ejemplo, tenemos el Informe “I_Ventas” que toma los datos de la tabla “T_Ventas” donde están todas las ventas del sistema. Supongamos que tenemos un botón en nuestro Informe que ponga “Ventas Juan” y otro que ponga “Ventas Luis”.  La finalidad sería que al pulsar cualquiera de ellos abriese el mismo Informe de Ventas pero filtrando por los datos solicitados.

Podemos tener las consultas guardadas que filtren esos datos y especificar en este parámetro cuál de ellas utilizar. Nuestro informe se abrirá mostrando los datos según la consulta.

NOTA: Aunque en el ejemplo que se muestra a continuación el nombre de los vendedores aparece como texto he de recordad que no es la forma correcta de implementarlo. Según las bases sobre bases de datos relacionales, la estructura correcta sería crear una tabla para dar de alta los vendedores y relacionarla con la de ventas por su ID. Este ejemplo que ha realizado incorrectamente para simplificarlo mucho y mostrar SÓLO lo que pretende enseñar. Puedes aprender más sobre relaciones en el artículo sobre las bases de datos relacionales.

Consultas en Microsoft Access

La consulta podría ser algo así:

Consulta Informe de Ventas Access

Y la sentencia para nuestro botón “Informe de ventas Juan” quedaría así:

DoCmd.OpenReport “NombreDelInforme”, acViewPreview, "C_VentasJuan"

De esta manera pulsando el botón “Informe de ventas Juan” le estaríamos dando la orden para que al abrir el Informe solo mostrase las ventas de nuestro querido vendedor Juan tal y como filtra la consulta. Como puedes observar podemos tener un solo Informe y abrirlo desde distintos botones con distintas configuraciones.

Pero no es el objetivo de este artículo profundizar en este parámetro así que, como en caso anterior, pondremos otra coma “,” dejando el parámetro sin configurar.

DoCmd.OpenReport “NombreDelInforme”, acViewPreview, ,

WhereCondition

Vamos al siguiente parámetro. Este es similar al anterior y su funcionalidad es la misma solo que vista desde un enfoque distinto.

Para el usuario novel de Access es más sencillo configurar una consulta para filtrar un formulario pero para el usuario avanzado puede resultar más práctico escribir la consulta directamente desde el código VBA.

Para ilustrar el parámetro ponemos a continuación el ejemplo de como utilizarlo pero explicar detalladamente la construcción de filtros mediante VBA da para varios artículos que, además, podéis encontrar en este blog en Filtrar Formularios usando VBA que, aunque estén escritos para formularios también se puede implementar en los informes:

DoCmd.OpenReport “NombreDelInforme”, acViewPreview, , "Vendedor='Juan'"

WindowsMode

Este parámetro nos permite controlar de que forma se abre la ventana del informe:

Access Informes WindowsMode

 

Entre los cuatro parámetros disponibles matizaría que, acDialog, lo abre de modo que no se puede hacer otra cosa en Access hasta que no cierres la ventana del Informe y que acWindowsNormal es el parámetro por defecto que utilizará sino ponemos nada. Aquí es interesante controlar, mediante acDialog, si no queremos que el usuario realice otras acciones sobre el programa hasta que no cierre el informe. Lo dejaremos en acDialog.

DoCmd.OpenReport “NombreDelInforme”, acViewPreview, , "Vendedor='Juan'", acDialog

Y nos queda el último parámetro.

OpenArgs

Y llegamos a nuestro último parámetro opcional. Este parámetro permite enviarle un dato al informe que estamos abriendo y que luego, desde este, podemos leer para actuar en consecuencia.

Este parámetro lo he usado en infinidad de casos, es utilísimo y, una vez que el lector descubre cómo utilizarlo se le pueden ocurrir tantos usos como imaginación tenga.

Por poner uno de tantos ejemplos y que sea simple, imaginemos que en el menú principal hemos guardado el nombre del usuario que ha abierto la aplicación y queremos pasarle ese nombre al informe que estamos abriendo para que este lo ponga en una etiqueta «lblUsuario» mostrando en el informe el usuario que lo ha abierto.

El parámetro podría quedar así:

DoCmd.OpenReport “NombreDelInforme”, acViewPreview, , "Vendedor='Juan'", acDialog, "Juan Martínez"

Y en el evento «Al abrir» del propio Informe, podríamos capturarlo de la siguiente manera y asignárselo a la etiqueta «lblUsuario» que hemos puesto en el informe.

Private Sub Report_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then
        Me.lblUsuario.Caption = Me.OpenArgs
    End If
End Sub

Y hasta aquí las posibles formas de programar mediante VBA el comando OpenReport, aunque no he querido profundizar mucho sobre ciertos aspectos yo animo al lector a que realice pruebas sobre su funcionamiento.

Otros artículos que te pueden interesar y que guardan relación con este:

8 comentarios

  1. Hola,
    Me parecen muy interesantes los temas expuestos en este blog, principalmente porque siendo neófito en estos menesteres, los temas que tratan me han sido de gran ayuda.

    Gracias!

  2. Muchas gracias. He llegado aquí porque dudaba de algo y no toco VBA desde hace unos 8 años. Tu artículo está tan bien explicado que podría seguirlo hasta mi abuela. Me gusta que además de explicarlo de forma clara y concisa lo explicas a fondo.
    Un saludo.

  3. Lo primero felicitarte
    Lo segundo una consulta
    Access. Tabla. Campos » nombre». «Dni» . «Numeros desde». «Hastaa q numero»

    Imagina que es del 1 al 7
    Hago consulta dime quien tiene el 6
    Es decir como le digo q esa persona tiene el 1,2,3,4,5,6,7. Para que al decirle dame el 5 me diga quien lo tiene
    Graciass

  4. Alguien sabe de pronto si hay como ver un informe en vista diseño dentro de un formulario es para modificar el lugar de los campos del informe en tiempo de ejecución he buscado pero no hallo en ningún lado.

    Gracias al que me pueda ayudar

  5. Mucho me quebré la cabeza con opción parecida, pero me daba un error, aca dejo la instrucción antigua, que está vinculada desde un formulario «Boton inprimir reporte» al reporte, osea desde mi formulario imprimo el reporte con el registro que actualmente estoy usando, dejo el viejo que me daba algunas veces error, no se por que, y el nuevo que me funcionó bien, talvez a alguien le sirve, muchas gracias de antemano. Viejo: Forms]![Frm_Facturar]![NumeroFactura], Nuevo: DoCmd.OpenReport «I_Facturar», AcViewPreview , , Forms]![Frm_Facturar]![NumeroFactura], cabe aclarar que para que funcione de la manera Vieja hay que tener una consulta para generar el reporte y ahi poner el argumento, también el campo NumeroFactura.

Responder a Juanma Cancelar respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.