Como imprimir solo campos con datos en informe e ignorar campos vacíos. Dirigida a Sveinbjorn El Rojo

Tengo un informe para imprimir dibujos textiles, que esta basado en una tabla con 240 campos del tipo si/no en la cual creo dibujos textiles en forma de matriz activando y desactivando campos. En la tabla hay 240 campos porque es el tamaño máximo de columnas que pueden tener estos dibujos, pero en la mayoría de los casos solo se utilizan solo una parte de ellos (8 campos * 8 registros, 8 campos * 20 registros, etc). El problema que tengo es que para evitar que se impriman el dibujo y todo el resto de campos vacíos, he creado varios informes en los que cada uno tiene distinto tamaño del subinforme del dibujo y ejecuto uno u otro en función del tamaño del dibujo que necesite imprimir. De este modo evito que la mayoría de campos vacíos se imprima. Da risa, ya que considero que es una solución chuflatera y nada profesional, pero dado mi pobre nivel de programación es lo único que se me ha ocurrido. Necesitaría que alguna de las mentes preclaras que corren por aquí me aportase alguna solución para imprimir el dibujo solo con los campos que tengan algún registro activo (ojo, no solo imprimir los que tengan -1 y eliminar los 0, sino que si hago un dibujo con una matriz de 20 * 20 compuesto de casillas llenas y casillas vacías, que se impriman solo los campos del 1 al 20 y se eliminen los campos del 21 al 240).

1 Respuesta

Respuesta
1

He probado a hacer esto en tu formulario "SUBFORM DIBUJOS GRAFIC" (porque tiene menos columnas y me era más fácil verlo) y aparentemente funciona OK:

Private Sub Form_Load()
Dim i As Integer
For i = 24 To 23 Step -1
    If IsNull(DLookup("C" & i, "TABLA DIBUJOS", "C" & i & "= -1")) Then
        Me.Texto26.Visible = False
    Else
        Me.Texto26.Visible = True
    End If
Next i
End Sub

Con este procedimiento oculto en todo el subformulario el cuadro de texto Texto26, asociado al checkbox C24.

Para que lo puedas aplicar a toda el formulario, vas a tener que renombrar tus cuadros de texto, para que tengan el mismo número que los controles de los que "dependen". Por ejemplo txtC1, txtC2... txtC24 o Texto1, Texto2... Texto24 (será un buen rato de trabajo...)

Luego, el código que necesitas es este, suponiendo que optaras por la primera denominación:

Private Sub Form_Load()
Dim i As Integer
For i = 24 To 1 Step -1
    If IsNull(DLookup("C" & i, "TABLA DIBUJOS", "C" & i & "= -1")) Then
        Me.Controls("txtC" & i).Visible = False
    Else
        Me.Controls("txtC" & i).Visible = True
    End If
Next i
End Sub

En el otro formulario habrás de hacer lo mismo, cambiando el ciclo del for y los nombres de los controles

hola Svein. He probado tu código y mi primera reacción es de euforia total ya que en principio todo funciona bien, oculta todos los campos vacíos, pero por desgracia tiene una pega y es que al parecer actúa directamente sobre la tabla de origen y se pasa por el forro el filtro de formulario. o sea, en la tabla "tabla dibujos" de la que depende el "subform dibujos edit", están incluidos todos los dibujos entrados, cada uno con su código de dibujo y cada uno de ellos utiliza diferente numero de columnas (campos). hay de 4 columnas, de 8, de 12 etc. el problema es que cuando abro el formulario principal "subform general editar", ahí se presenta solo el dibujo que tiene asignado esa referencia, pero el código solo oculta los campos que realmente hay vacíos en toda la "tabla dibujos". o sea que si el dibujo que corresponde a una referencia es de 8 columnas, pero en la tabla dibujos existe un dibujo que ocupa 20 columnas, aunque no tenga nada que ver con esta referencia, en el "subform dibujos edit", solo se ocultan las columnas de la 21 a la 24. Entiendo que esto ocurra si se abre el subform directamente ya que no actúa ningún filtro y se representan todos los registros juntos, pero ejecutado dentro de otro form no debería ser así.

No se si me he explicado con la suficiente claridad, pero el problema es grave ya que en el caso de que la tabla contenga un dibujo que utilice todos los campos, el código quedaría inutilizado. Ya me dirás. Saludos.

Prueba con esta línea, para que te mire en la tabla sólo los que corresponden al código que te está mostrando el subformulario:

If IsNull(DLookup("C" & i, "TABLA DIBUJOS", "C" & i & "= -1 AND CODIGODIBUJO='" & Me.CODIGODIBUJO & "'")) Then


http://nksvaccessolutions.com/Foro/ 

Casi lo tenemos. en el formulario funciona perfecto y oculta los campos según el dibujo seleccionado, pero resulta que este mismo subformulario lo utilizo también como subinforme para imprimir la ficha de construcción de la referencia y ahí ya no funciona bien. Deja campos vacios sin ocultar aunque no se en base a que criterios.

Saludos

¿Te importa pasarme la BD de nuevo, porque imagino que ya habrás hecho los cambios en los nombres y así me facilita la tarea de probar cosas?


Hecho. saludos.

Pues no veo que funcione mal... pero igual no hago algo bien...

Al abrir la BD voy a "editar referencia", meto art 747 y color 0001 según tus instrucciones. El formulario sale y el subformulario muestra solamente 3 columnas (Correcto según el patron para el dibujo "PLA02100").

Como no sé como lanzar el informe desde el form, lo cierro y lo abro directamente (INFORME REFERENCIA grande), y en el subformulario me sale el mismo patrón con sólo e columnas.

Si cambio el tipo de dibujo en la consulta sobre la que haces el informe (C L1REF INFORME), y en "DIBUJO" de pongo otro existente en la tabla (A, B o C), al abrir el informe de nuevo van variando los patrones y columnas que se muestran...

Si hago algo "incorrecto", dime los pasos que debo seguir, porque no veo el problema...

tienes razón Svein he seguido tus pasos y efectivamente lanzando el informe directamente sale bien pero si se lanza desde dentro del formulario sale mal. los botones para imprimir los informes son unos que hay en la zona naranja marcados como 10, 20, 50, etc y cada uno de ellos lanza un informe distinto en cuanto al tamaño del gráfico del pasaje (el dibujo de hasta 240 campos). es mi sistema cutre.

Sigo haciendo pruebas y cada vez estoy mas asombrado. Si se lanza el informe directamente en vista informe, sale bien. y si una vez ya esta abierto, se pasa a vista preliminar, también sale bien. En cambio si se lanza directamente en vista preliminar, sale mal.

Desde dentro del formulario se lanza en vista preliminar. o sea mal rollo

Vale, el problema está en usar el subformulario dentro del informe, porque no se ejecuta, en vista prelimiar, el código del subformulario para ocultar las casillas.

La solución, programarle en el evento "Al dar formato" de la sección detalle de tus informes el mismo evento, pero adaptado a las circunstancias para hacer referencia al subformulario.

Private Sub Detalle_Format(Cancel As Integer, FormatCount As Integer)
Dim i As Integer
For i = 24 To 1 Step -1
    If IsNull(DLookup("C" & i, "TABLA DIBUJOS", "C" & i & "= -1 AND CODIGODIBUJO='" & Me.SUBFORM_DIBUJOS_GRAFIC.Form.CODIGODIBUJO & "'")) Then
        Me.SUBFORM_DIBUJOS_GRAFIC.Form.Controls("TC" & i).Visible = False
    Else
        Me.SUBFORM_DIBUJOS_GRAFIC.Form.Controls("TC" & i).Visible = True
    End If
Next i
End Sub

Si tienes tiempo y ganas, deberías probar a hacer subinformes en vez de subformularios para insertar en los informes. Has de tener en cuenta que debes usar el evento "Al dar formato" en vez de "al cargar".


http://nksvaccessolutions.com/Foro 

Tienes toda la razón del mundo Svein, lo hice para ahorrar tiempo y espacio pensando que en la practica serían igual de funcionales, pero una vez mas me he equivocado. Cada cosa es para lo que es y lo demás son ganas de complicarse la vida. seguiré tu consejo y haré subinformes y por falta de ganas no será, ya que en realidad me gusta y disfruto mucho haciéndolo y enfrentándome a los problemas que van surgiendo paso a paso.

Te estoy muy agradecido por la ayuda que me has prestado y sobretodo por haberlo hecho aparentemente tan de buen grado. Es muy agradable saber que hay personas como tu que dedican tanto esfuerzo y tiempo en ayudar desinteresadamente a otras personas con escasos conocimientos pero con ilusión, como yo.

Muchas gracias de nuevo y hasta la siguiente que seguro que la habrá.

Nada, un placer poder ayudarte, y me ha servido para aprender alguna cosilla. Saludos


Pásate por nuestro foro: http://nksvaccessolutions.com/Foro/ 

Hola Svein, vuelvo a la carga para rizar el rizo. Me explico: el código que hiciste para el form dibujos comprueba todos los campos del último al primero y los oculta o no en función de si estas vacíos o no. pues bien, lo que me interesa ahora es que actúe igual pero que en el momento de encontrar un campo lleno, se pare y deje de actuar sin dar error. Esto lo necesito para un form complementario del form pasajes que es dependiente de la "tabla línea pasajes" y que solo tiene un registro por dibujo. En esta línea hay agrupaciones consecutivas de campos llenos y vacíos (ejemplo. 4 vacíos, 4 llenos, 4 vacíos, 4 llenos), y tal como actúa ahora, borra todos los vacíos y pierdo la perspectiva del número de cuadrados vacíos que contiene la línea.

Ya se que soy pesadito pero es lo que hay, Saludos.

Private Sub Form_Load()
Dim i As Integer
For i = 24 To 1 Step -1
    If IsNull(DLookup("C" & i, "TABLA DIBUJOS", "C" & i & "= -1")) Then
        Me.Controls("txtC" & i).Visible = False
    Else
        Me.Controls("txtC" & i).Visible = True
        Exit For
    End If
Next i
End Sub

A ver si así te sirve, sólo has de añadirle "Exit For" después de la linea que pone visible la columna. Des esta manera, al llegar a la primera que tenga algo, debería parar.


Pues va a ser que no. He añadido la línea al código que ya había adaptado al form "subformulario pasajes grafic" y me hace cosas raras, ahora oculta campos que no vienen a cuento y que si que contienen datos, pero si quito la nueva línea actúa correctamente. Te vuelvo a enviar la BD para que te lo mires.

Saludos.

Cuando tenga un rato te respondo.

Después de muchas pruebas, creo que así ya es lo que buscas:

1º/ En el formulario "SUBFORM DIBUJOS GRAFIC", el código queda así:

Private Sub Form_Load()
Dim i As Integer
For i = 24 To 1 Step -1
  '  If IsNull(DLookup("C" & i, "TABLA DIBUJOS", "C" & i & "= -1")) Then
  'If IsNull(DLookup("C" & i, "TABLA DIBUJOS", "C" & i & "= -1 AND CODIGODIBUJO='" & Me.CODIGODIBUJO & "'")) Then
  If DCount("*", "TABLA DIBUJOS", "C" & i & "= -1 AND CODIGODIBUJO='" & Me.CODIGODIBUJO & "'") = 0 Then
        Me.Controls("TC" & i).Visible = False
        Me.Controls("TX" & i).Visible = False
    Else
        Me.Controls("TC" & i).Visible = True
        Me.Controls("TX" & i).Visible = True
    End If
Next i
End Sub

2º/ En el formulario "SUBFORM PASAJES GRAFIC", el código es:

Private Sub Form_Load()
Dim i As Integer
For i = 120 To 1 Step -1
     If DCount("*", "[TABLA PASAJES]", "A" & i & "= -1") = 0 Then ' AND [CODIGOPASAJE]='" & Me.[CODIGOPASAJE] & "'") = 0 Then
        Me.Controls("TA" & i).Visible = False
     Else
        Me.Controls("TA" & i).Visible = True
    End If
Next i
End Sub

Sigo sin entender por qué en anterior ocultaba columnas de más, pero aparentemente así funciona. En este segundo formulario, con la expresión anterior (con DLookup) si le quitaba la parte del filtro de CODIGOPASAJE (campo que por otro lado no está en el formulario) no salía nada, y tampoco logro entenderlo...

Ya me dirás.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas