Activar subinformes de un informe con cuadro dialo

He hecho una base en Access 2007 y lo que necesito es en un informe que es muy extenso poder elegir antes de imprimir qué partes del mismo quiero que aparezcan.
Mi idea es hacer el informe mediante una serie de subinformes y que al imprimir primero salga un formulario en el que con unos selecctores si/no puedas elegir que partes se imprimirán. Parte 1, Parte 2, etc
Si activas en el formulario parte 1 si y parte 2 no al imprimir el informe termina en parte 1.
Sé hacer el informe con subinformes.
No sé como hacer el formulario (se hacer formulario pero no sé como hacer para que las elecciones que hagas en él luego te sirvan)
Tampoco sé como hacer que el informe compruebe las elecciones hechas en el formulario y en función de ellas active o desactive los subinformes correspondientes.

1 Respuesta

Respuesta
1
Veo que tu consulta es de hace ya un par de días. ¿Sigues interesado en obtener una solución?
Ya me dirás cosas.
La verdad es que sigo interesado en una respuesta.
Gracias.
Tienes dos maneras de hacerlo, una un poco más "elegante" que la otra, pero ambas igual de efectivas. Depende del nivel de conocimientos que tengas (o de lo que quieras complicarte la vida) ;)
Ambas parten de un inicio común, que es crear un formulario con las opciones a elegir por el usuario. Te lo voy a explicar a través de un ejemplo, y después tu lo adaptas y completas según tus circunstancias. En el ejemplo te pondré tres opciones.
A) Inicio común
Creas un formulario e insertas tres checkbox, uno debajo del otro. Al primero le pones de etiqueta "Imprimir todo", al segundo "Imprimir sólo parte 1" y al tercero "Imprimir sólo parte 2". Ahora les ponemos los nombres (Propiedades->Pestaña Otros->Nombre). Al primero lo llamaremos (sin comillas) "chkTodo", al segundo "chkParte1" y al tercero "chkParte2". Situamos los valores predeterminados de los tres (Propiedades->Pestaña Datos->Valor predeterminado) en FALSO.
Ahora añadimos un botón de comando y le ponemos de nombre (sin comillas) "cmdImprime". Nos vamos, en sus propiedades, a la pestaña Eventos y le decimos, al evento "Al hacer click", que queremos generar código. Pero antes de generar el código te explico los sistemas
B) SISTEMA 1: menos "elegante"
Siguiendo el ejemplo deberíamos crear tres informes: uno con todos los subformularios (lo llamamos, por ejemplo, "InformeTodo", otro sólo con el subformulario correspondiente a la parte uno, y llamamos al informe "InformeParte1" y otro sólo con el subformulario correspondiente a la parte dos, y llamamos al informe "InformeParte2".
Cuando generamos el código en el botón que comentábamos anteriormente escribimos el siguiente código:
---
Private Sub cmdImprime_Click()
    If chkTodo = True Then
        DoCmd.OpenReport "Informe", acViewPreview
        Exit Sub
    End If
    If chkParte1 = True Then
        DoCmd.OpenReport "InformeParte1", acViewPreview
        Exit Sub
    End If
     If chkParte = True Then
        DoCmd.OpenReport "InformeParte2", acViewPreview
        Exit Sub
    End If
End Sub
---
El argumento acViewPreview te saca una vista previa del informe. Si lo quieres sacar directamente a la impresora tienes que cambiarlo por acViewNormal
C) Sistema B: más "elegante" pero más laborioso
Creas el informe (lo llamaremos simplemente "Informe") con los subinformes a los que, para el ejemplo, yo he llamado "subParte1" y "subParte2".
Cuando generas el código del botón, en el editor de VBA, escribes lo siguiente:
---
Private Sub cmdImprime_Click()
    If chkTodo = True Then
        DoCmd.OpenReport "Informe", acViewPreview
        Exit Sub
    End If
    If Me.chkParte1.Value = True Then
        DoCmd.OpenReport "Informe", acViewPreview
        Reports!Informe.subParte2.Visible = False
        Exit Sub
    End If
    If Me.chkParte2.Value = True Then
        DoCmd.OpenReport "Informe", acViewPreview
        Reports!Informe.subParte1.Visible = False
        Reports!Informe.subParte2.Left = <aquí tienes que hacer pruebas>
        Reports!Informe.lblsubParte2.Left = <mismo valor que pongas en la línea anterior>
        Exit Sub
    End If
End Sub
---
Te lo explico:
- Si está marcado el chkTodo te imprime el informe normal
- Si está marcado el chkParte1 abre el informe y establece la propiedad "Visible" como FALSO a subParte2, con lo que no se verá en el informe
- Si está marcado el chkParte2 abre el informe y establece la propiedad "Visible" como FALSO a subParte1, con lo que no se verá en el informe. Pero ahora el informe nos saldrá desconfigurado. Para eso tenemos que operar con las líneas "Reports!Informe.subParte2.Left = <aquí tienes que hacer pruebas>". El left te indica la distancia en la que tiene que desplazarse el formulario desde el margen izquierdo. Es un valor numérico que establece la distancia en twips. Por ejemplo, prueba "Reports!Informe.subParte2.Left = 10". Vas jugando con ese valor hasta que te quede ubicado donde quieras.
La siguiente línea lo que hace es mover la etiqueta correspondiente al subinforme (porque si no se quedaría donde la has dejado cuando diseñaste el formulario).
Si lo que necesitas es también moverlo verticalemente (left lo mueve horizontalmente) tendrás que añadir dos líneas más de código, con el método Top, tanto para el subinforme como para su etiqueta. Por ejemplo:
"Reports!Informe.subParte2.Top = <aquí tienes que hacer pruebas>"
El trabajazo es hacer pruebas y pruebas hasta que te quede ubicado correctamente en el informe.
Si tuvieras tres subinformes (subParte3), y quisieras imprimir la parte 1 y la 3 (la 2 no), tendrías que indicárselo al IF de la siguiente manera
If Me.chkParte1.Value = True And Me.chkParte3.Value = True Then
Como ves, las combinaciones se multiplican ;)
D) Una última observación
No he establecido ningún código de control para los checkbox del principio. Podrías establecer, para cada checkbox, un control para evitar "resultados inesperados". Te pongo un ejemplo para el chkTodo. La idea es que si se marca este el resto de chk's no esté marcado. Para ello, en las propiedades de chkTodo, generas el siguiente código asociado al evento "Después de actualizar":
---
Private Sub chkTodo_AfterUpdate()
    If chkTodo = True then
        chkParte1.Value = False
        chkParte2.Value = False
    End if
End Sub
---
Si tuvieras más de 3 partes tendrías que jugar un poco con estas opciones de control hasta conseguir la combinación óptima.
Y eso es todo. Si tienes algún problema o no entiendes alguna cosa de este "rollazo" que te he pegado me lo comentas e intento explicártelo con más detalle.
Hola Experto.
Me dejas sin palabras. La solución que me propones me parece excelente. Desde luego la que llamas "más elegante" me parece espectacular. El informe que tengo que hacer consta de muchas partes así que me llevará un tiempo tenerlo listo pero ten por seguro que seguiré los pasos que me indicas.
Cierro la pregunta por ahora y si no tienes inconveniente, si me surgen dudas te escribiré de nuevo.
Muchas gracias por tu ayuda y por tu fantástica respuesta.
Un saludo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas