Condiciones para abrir/cerrar un informe en un módulo

Diego.
El siguiente módulo muestra un mensaje de texto que indica que el dato introducido en un informe con parámetros no se encuentra en la base de datos, y ofrece la posibilidad de volver a introducir el dato (botón 'Sí') o de renunciar (botón 'No'). Me lo he copiado de la Ayuda de Access y funciona perfectamente. Lo que no encuentro en la Ayuda es qué líneas de código debo añadir para que cuando pincho en 'Sí' me vuelva a mostrar el cuadro para volver a introducir el parámetro (es decir, me vuelva a abrir el informe) y para que cuando pinche en 'No' me cierre el informe.
Correspondería a lo que en el ejemplo de la Ayuda llaman "Perform some action". ¿Cuáles son esas dos acciones?
Private Sub Report_NoData(Cancel As Integer)
Dim Msg, Style, Title, Response, MyString
Msg = "No hay datos. ¿Quiere reintentarlo?"
Style = vbYesNo + vbQuestion + vbDefaultButton1 + vbApplicationModal
Title = "Lo siento"
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then    ' User chose Yes.
    MyString = "Yes"    ' Perform some action.
Else    ' User chose No.
    MyString = "No"    ' Perform some action.
End If
End Sub

1 respuesta

Respuesta
1
Supongamos que tengas un formulario ('Form1' con un textbox llamado 'txtnumero')de donde tomas los datos que quieres filtrar, entonces tu código lo cambiaríamos así:
'--------------------------------------
Private Sub Report_NoData(Cancel As Integer)
Dim Msg, Style, Title, Response, MyString
Msg = "No hay datos. ¿Quiere reintentarlo?"
Style = vbYesNo + vbQuestion + vbDefaultButton1 + vbApplicationModal
Title = "Lo siento"
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then    ' User chose Yes.
    DoCmd.Close acForm, "Form1", acSaveNo
    MyString = "Yes"    ' Perform some action.
    DoCmd. CancelEvent 'cancel evento de abrir report para abrir form e introducir nuevo
    DoCmd.OpenForm "Form1", acNormal, , , acFormEdit, acDialog

Else    ' User chose No.
    MyString = "No"    ' Perform some action.
    DoCmd.CancelEvent 'si no reintenta...cancela evento y limpia el form
    Forms!Form1!txtnumero = ""
End If
End Sub
'---------------------------------------
En tu formulario "Form1" podrías utilizar el siguiente código en el evento click de un botón
'-------------------------------
Dim stDocName As String
    If IsNull(Me.txtnumero) Or Me.txtnumero = "" Then
        MsgBox "No hay numero!", vbCritical, "Error"
    Exit Sub
    End If
    stDocName = "Informe"
    DoCmd.OpenReport stDocName, acPreview, , "Numero=" & Forms!Form1!txtnumero & "", acDialog
'-----------------------------
Lo que faltaría es que coloques los controles de error al iniciar.
Te proporciono más datos para que me indiques si sigo haciendo caso a tu respuesta (porque me confunde lo del formulario) o me modificas algo.
El INFORME de parámetros tiene como Origen del registro una consulta de parémetros. Me confunde lo del formulario porque no veo que intervenga ningún formulario en todo este proceso. Tú dirás.
Ok, si quieres puedes utilizar tus parámetros y te propongo el siguiente código para controlar los Yes/No del style de tu msgbox:
'------------------------------
Private Sub Report_NoData(Cancel As Integer)
Dim Msg, Style, Title, Response, MyString
Msg = "No hay datos. ¿Quiere reintentarlo?"
Style = vbYesNo + vbQuestion + vbDefaultButton1 + vbApplicationModal
Title = "Lo siento"
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then    ' User chose Yes.
    MyString = "Yes"    ' Perform some action.
    DoCmd.CancelEvent 'cancel evento de abrir report para abrir form e introducir nuevo
    DoCmd.openreport 'abrir nuevamente el mismo informe
Else    ' User chose No.
    MyString = "No"    ' Perform some action.
    DoCmd.CancelEvent 'si no reintenta...cancela evento y limpia el form
End If
End Sub
'---------------------------------
Sin embargo, si quieres puedes también utilizar el formulario que te indiqué en el tip anterior para obtener desde ahí tu parámetro. Me explico, en vez de colocar en tu consulta el parámetro o criterio [INGRESE NUMERO DE ID], directamente lo colocas en un formulario dentro de un textbox y en un evento click tomas los datos del textbox para abrir el informe respectivo. A eso me refiero.
Esto no funciona.
El código propuesto para controlar los Sí/No me produce este error en tiempo de ejecución: "no hay ningún registro activo", al tiempo que me abre el software de la impresora. Cuando voy al Depurador me muestra un error en esta línea:
DoCmd.openreport "AQUÍ_NOMBRE_DEL_INFORME" 'abrir nuevamente el mismo informe
Y al cerrar el Depurador, Access se me cuelga.
Respecto al otro método, el del formulario, no tengo claro si lo que he de colocar dentro del textbox es el criterio de consulta o el dato que busco, ni si el evento click se refiere al textbox o a un botón de comando, ni si el código que me ofreces para el evento click funciona también con texto, además de con número (id).
Disculpa mi ignorancia. Como ves, necesito las cosas muy claras.
Enviame tu correo, te envío un ejemplo que tengo con ambos casos, con formulario y con criterio de consulta.
l.figaaquí_la_arrobayahoopuntoes
Te he enviado el ejemplo.
Recibido ejemplo. Lo pruebo y te cuento. Gracias.
Ok.
Desde luego tu ejemplo funciona perfectamente. Ahora bien, trasladarlo a mi base eso es otra historia y no lo he conseguido después de muchos intentos. Tus informes están basado en tablas; los míos, en consultas de parámetros. Tal vez más adelante lo intente.
Si no te importa, vuelvo a la pregunta de origen antes de cerrar y puntuar. Parece que este código funciona para controlar los Yes/No. Pero ¿me puedes dar una idea de por qué cuando no hay datos y quiero volver a intentarlo (cuando pincho en 'Sí') me manda el informe a la impresora? ¿Hay algo en este código que dé esa orden y que pueda eliminar?
Private Sub Report_NoData(Cancel As Integer)
Dim Msg, Style, Title, Response, MyString
Msg = "No hay datos coincidentes. ¿Quiere reintentarlo?"
Style = vbYesNo + vbQuestion + vbDefaultButton1 + vbApplicationModal
Title = "Lo siento"
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then    ' User chose Yes.
    DoCmd.Close acReport, "TÍTULOS", acSaveNo
    MyString = "Yes"    ' Perform some action.
    DoCmd.CancelEvent
    DoCmd.OpenReport "TÍTULOS"
Else    ' User chose No.
    MyString = "No"    ' Perform some action.
    DoCmd.CancelEvent
End If
End Sub
Hola, Diego.
En la ayuda de Access he encontrado en parte respuesta a mi última pregunta. Por lo visto, el OpenReport se usa para imprimir un informe. Pero entonces, ¿qué hay que hacer para que simplemente se abra en pantalla? Te transcribo el texto de la ayuda:
Comentarios
Puede usar el método OpenReport para abrir un informe en la vista Diseño o la Vista preliminar, o para imprimir el informe inmediatamente. También puede restringir los registros que se imprimen en el informe.
Ejemplo
El siguiente ejemplo imprime el Informe Ventas mientras utiliza la consulta existente Filtro Informe.
Visual Basic para aplicaciones
DoCmd.OpenReport "Sales Report", acViewNormal, "Report Filter"
Saludos.
En función a tu penúltima pregunta, estás utilizando DoCmd. OpenReport directamente sobre tu informe para imprimirlo. Debes cambiar y hacer un previo para ver el informe si así lo deseas, el siguiente código te puede ayudar:
DoCmd. OpenReport "TUREPORTE", acPreview,,"CRITERIOS", acDialog
Lo que hace es abrir tu reporte en modo previo conforme algunos criterios en vista ' de cuadro de diálogo'.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas