Problema con el ribbon en los informes en que oculto/muestro partes del mismo

He creado dos ribbons personalizados: uno para la base de datos, y otro específico para informes.

Me he dado cuenta de que en ciertos informes, al cerrarlos y volver al formulario desde donde se abrió ese informe, me bloquea toda la base de datos.

El problema está en los campos y secciones del informe que muestro/oculto. Por ejemplo, este es el código que tengo para abrir un informe con la factura del registro seleccionado:

Private Sub Factura_Click()
On Error Resume Next
Form.Refresh
DoCmd.OpenReport "04-E Factura", acPreview, , "[CodTicket]='" & Me.CodTicket & "'"
    If IsNull([CodPresupuesto]) Then
        Reports("04-E Factura").CodPresupuesto.Visible = False
        Reports("04-E Factura").CodPreEt.Visible = False
    Else
        Reports("04-E Factura").CodPresupuesto.Visible = True
        Reports("04-E Factura").CodPreEt.Visible = True
    End If
    If IsNull(Me.Observaciones) Then
        Reports("04-E Factura").NotEt.Visible = False
        Reports("04-E Factura").Nota.Visible = False
    End If
    If Me.Cuenta = 0 Then
        Reports("04-E Factura").Cuenta.Visible = False
    End If
    If VerDep = -1 And FinDep = -1 Then
        Reports("04-E Factura").Entrega.Visible = True
        Reports("04-E Factura").Etiqueta186.Visible = True
        Reports("04-E Factura").Calc.Visible = True
        Reports("04-E Factura").Línea188.Visible = True
    Else
        Reports("04-E Factura").Entrega.Visible = False
        Reports("04-E Factura").Etiqueta186.Visible = False
        Reports("04-E Factura").Calc.Visible = False
        Reports("04-E Factura").Línea188.Visible = False
    End If
End Sub

Si solo dejo la primera parte, donde abre el informe, funciona todo bien y no me bloquea nada. Es decir, esto:

Private Sub Factura_Click()
On Error Resume Next
Form.Refresh
DoCmd.OpenReport "04-E Factura", acPreview, , "[CodTicket]='" & Me.CodTicket & "'"
End Sub

¿Alguien sabe por qué pasa esto? ¿Y cómo puedo arreglarlo?

1 respuesta

Respuesta
2

El por qué ni idea, aunque puedo imaginar alguna cosa, pero cómo arreglarlo es muy sencillo:

Cambia todas esas lineas de código que te muestran/ocultan campos del informe y ponlas en la sección "Al dar formato" de la sección de tu informe en el que estén ubicados (sección detalle o la que sea)

Hola. En este caso, sí. Sin embargo, tengo informes que abro a través de un diálogo, y tomo referencias de ese diálogo, el cual cierro posteriormente. Por ejemplo, este código:

Private Sub Etiqueta30_Click()
Dim MiAño As String
Dim MiTrimestre As String
Dim MiArgumento As String
If Me.Año.Value <> 1 Then
    MiAño = Me.acc.Value
    miFiltro = "[Año]='" & MiAño & "'"
    MiArgumento = " - " & Me.acc
End If
If Me.Trimestre <> 1 Then
    MiTrimestre = Me.tcc.Value
    miFiltro = miFiltro & "[Trimestre1]='" & MiTrimestre & "'"
    MiArgumento = " - " & "T" & Me.tcc
End If
If Me.Trimestre <> 1 And Me.Año.Value <> 1 Then
    MiAño = Me.acc.Value
    miFiltro = "[Año]='" & MiAño & "'"
    MiTrimestre = Me.tcc.Value
    miFiltro = miFiltro & "AND [Trimestre1]='" & MiTrimestre & "'"
    MiArgumento = " - " & Me.acc & " T" & Me.tcc
End If
DoCmd.OpenReport "04-G Resultado trimestral", acViewPreview, , miFiltro, , MiArgumento
If Me.Año.Value = 2 Then
Reports("04-G Resultado trimestral").PieAño.Visible = True
End If
If Me.Año.Value = 2 And Me.Trimestre.Value = 2 Then
Reports("04-G Resultado trimestral").PieAño.Visible = False
End If
If Me.Trimestre.Value = 2 Then
If Reports("04-G Resultado trimestral").Texto73.Value > 0 Then
Reports("04-G Resultado trimestral").Texto73.Visible = True
Reports("04-G Resultado trimestral").Etiqueta72.Visible = True
End If
End If
DoCmd.Close acForm, Me.Name
End Sub

¿Cómo lo soluciono?

¡Gracias!

Pues tendrías que solucionarlo igual (o casi). Cuando abres algo (un formulario o un informe) en modo Dialogo, se detiene la ejecución del código existente en el procedimiento desde el que lo abres hasta que lo cierras.

En el caso que comentas, al clicar la Etiqueta30, si el informe "04- G Resultado trimestral" lo abres como dialogo (lo tendrás puesto en sus propiedades), todas las lineas que siguen al DoCmd. OpenReport no se ejecutan hasta que cierres ese informe.

La solución pasaría por terminar ese código de la etiqueta en el Docmd. OpenReport, y mover el resto del código a "Al dar formato" de la sección del informe y desde el informe, cerrar el formulario. Obviamente tendrás que cambiar la forma de referirte a los controles: los Me que hacen referencia al formulario por Forms("NombreFormulario") y los Report("...") por Me, y poner el nombre del formulario a cerrar en vez de Me. Name en la última linea.

Discúlpame, pero no me expliqué bien. 

Ese código que te he copiado pertenece a un botón que está en un formulario en forma de diálogo. En el código, voy comparando qué opción se ha escogido en ese diálogo para montar un filtro que aplicar al informe, y, una vez abierto el informe, en función de los valores de las opciones del formulario en forma de diálogo, pongo un formato u otro.

Entonces, no puedo hacer referencia a campos que están en un formulario cerrado si aplico formato en la sección del informe, tal y como tú dices.

¡Gracias!

Vaya, no te había entendido... y claro, si cierras el formulario no puedes acceder a sus controles...

Puedes usar la propiedad OpenArgs del método Docmd. OpenReport para pasarle los valores del formulario, separados por un guion (-) o cualquier otro separador y luego desde el informe, separarlos y analizarlos: https://support.office.com/es-es/article/openargs-propiedad-c8616938-cd58-4b1a-84cf-3d043f59e13b

La pregunta no admite más respuestas

Más respuestas relacionadas