** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Ocultar agrupamiento en Informe
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoOcultar agrupamiento en Informe

 Responder Responder
Autor
Mensaje
arodrigu Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 04/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 599
Enlace directo a este mensaje Tema: Ocultar agrupamiento en Informe
    Enviado: 27/Octubre/2020 a las 13:34
Buenos días:
A ver si me explico.
Tengo un informe agrupado en 4 niveles: Unidad1, Unidad2, Unidad3 y Unidad4
Dentro de cada nivel hay un campo que muestra el nombre de la Unidad y luego en el Detalle los campos con los datos de la Unidad.
Hasta aquí todo bien.
Lo que trato de hacer es que, si un nivel no tiene ninguna Unidad, el agrupamiento <<para esa Unidad>> desaparezca y vuelva a aparecer en el siguiente registro
que tenga Unidad. Es decir que no salga un espacio en blanco cada vez que no hay datos en un registro.
No sé si esto se puede hacer (seguro que sí). He probado a recorrer con un recordset la consulta en el evento <<al dar formato>> de la agrupación, de la configuración
de página, al abrir el informe.....en todas partes, y ocultar el campo, hacerle muy pequeño y nada.
A ver si se os ocurre algo.
Muchas gracias.

        Set rst = CurrentDb.OpenRecordset("MiConsulta")
             Do Until rst.EOF

                 If rst!Unidad1 = 0 OR rst!Unidad1 = "" OR IsNull(rst!Unidad1) Then
                    Me.EncabezadoGrupo1.Visible = False
                 Else
                    Me.EncabezadoGrupo1.Visible = True
                 End If
                                   
             rst.MoveNext
             Loop
             rst.Close
        Set rst = Nothing
Fuerza y honor.
Saludos de Arturo desde Madrid
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 27/Octubre/2020 a las 16:55
Hola!

No lo he probado, prueba poner en el evento al dar formato de cada agrupación:-

Private Sub EncabezadoDelGrupo0_Format(Cancel As Integer, FormatCount As Integer)
    Dim intCuenta As Integer
    intCuenta = DCount("Unidad1", "TuTabla", "Criterio")
    Me.EncabezadoDelGrupo0.Visible = intCuenta > 0
    Me.pieDelGrupo0.Visible = intCuenta > 0
End Sub
Un Saludo.
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 27/Octubre/2020 a las 18:04
Hola, sin entrar en la condición utilizada, yo optaría por la solución de monuir, solo que cambiando
Me.EncabezsdoDelgrupo0.Visible por Cancel=True

 y actuando en cada sección por separado

Private Sub EncabezadoDelGrupo0_Format(Cancel As Integer, FormatCount As Integer)
   Cancel = (Nz(Unidad1,"") = "") OR (Unidad1 = 0)
End Sub
 
y para el pie lo mismo
Private Sub PieDelGrupo0_Format(Cancel As Integer, FormatCount As Integer)
   Cancel = (Nz(Unidad1,"") = "") OR (Unidad1 = 0)
End Sub
 
Esto evitará que le sección aparezca en el informe y que se guarde el espacio que necesitaría si se imprimiera... eso si, sólo podrás ver el resultado en la vista preliminar o en el resultado impreso, ya que en las demás vistas, este evento no se produce



Editado por Dabellaso - 27/Octubre/2020 a las 18:11
El saber no ocupa lugar, sólo tiempo
Arriba
arodrigu Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 04/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 599
Enlace directo a este mensaje Enviado: 27/Octubre/2020 a las 18:18
Gracias chicos.
Lo probaré mañana y os cuento.
Fuerza y honor.
Saludos de Arturo desde Madrid
Arriba
arodrigu Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 04/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 599
Enlace directo a este mensaje Enviado: 28/Octubre/2020 a las 18:37
Hola.

He probado la solución de mounir. No da error, pero no hace lo que se supone que debería hacer. Simplemente oculta el grupo tenga o no datos.
Pongo un punto de interrupción para ir paso a paso a ver que devuelve la variable, pero en los informes no se para y no sé otra forma de verlo.

El código que he puesto es:

Private Sub EncabezadoDelGrupo3_Format(Cancel As Integer, FormatCount As Integer)
    Dim intCuenta As Integer
    intCuenta = DCount("Unidad1", "CIMultiple", "U3")
    If intCuenta = 0 Then
       Me.EncabezadoDelGrupo0.Visible = False
    End If
End Sub

O

Private Sub EncabezadoDelGrupo3_Click()
Dim intCuenta As Integer
    
    intCuenta = DCount("Unidad1", "CIMultiple2", "U3")
    Me.EncabezadoDelGrupo0.Visible = intCuenta > 0

End Sub
 
La solución de Dabellaso no la entiendo. No sé qué es lo que tengo que sustituir. He puesto el siguiente código (que no me cuadra) y lo mismo, no da error pero
no hace lo que tiene que hacer.

Private Sub EncabezadoDelGrupo3_Format(Cancel As Integer, FormatCount As Integer)
    Cancel = (Nz(Unidad1, "") = "") Or (Unidad1 = 0)
    Cancel = True
End Sub
Fuerza y honor.
Saludos de Arturo desde Madrid
Arriba
Chea1 Ver desplegable
Moderador
Moderador


Unido: 20/Noviembre/2005
Localización: España
Estado: Sin conexión
Puntos: 4143
Enlace directo a este mensaje Enviado: 28/Octubre/2020 a las 18:58
Ermm Algo me falla en ese informe. Sospecho que no es un verdadero informe de agrupamiento.

Para un diseño correcto, debería haber una única consulta origen de todo el informe ¿Lo estás haciendo así? ¿Puedes mostrar el diseño del informe y de la consulta origen del mismo?
Saludos
José Bengoechea Ibaceta
Mi página

Mi otra página
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 28/Octubre/2020 a las 21:33
No explicas que parte no entiendes de mi solución. Dime que parte no te cuadra e intentaré explicarme Wink

Como dice Chea1, mostrarnos el diseño y el origen de datos nos ayudará a ver el problema, quizás como creo que sospecha, si tienes subinformes en las secciones en lugar de datos agrupados el proceder, o al menos la condición será diferente

Edito:
Si colocas un punto de ininterrupción, el código si debería detenerse, pero recuerda que el evento al "dar formato" sólo se produce en la vista preliminar, no en la vista informe.

Para asegurarte, puedes poner Debug.Print y la condición que tengas para ver en la ventana de inmediato que devuelve, o un simple Debug.Print "Hola", pasa saber si el evento se ha producido o no


Editado por Dabellaso - 28/Octubre/2020 a las 21:46
El saber no ocupa lugar, sólo tiempo
Arriba
arodrigu Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 04/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 599
Enlace directo a este mensaje Enviado: 29/Octubre/2020 a las 10:22
Hola.
Chea1. 
El informe tiene varias agrupaciones y depende de una única consulta. No tiene subinformes ni nada raro.
Dabelloso.
La expresión "no me cuadra" no era correcta, debía ser "no lo entiendo". No utilizo nunca lo de Cancel y no lo entendía. Ahora pensándolo más detenidamente creo que ya lo entiendo. En cualquier caso, si el código que he puesto, está bien, sigue sin funcionar.
Lo del punto de interrupción no lo sabía. Efectivamente solo utilizaba la vista informe. Probaré con la otra vista y con lo ventana inmediato que, sinceramente, nunca he sido capaz de controlar.
Me gustaría mandaros el informe de alguna manera pero no sé cómo. ¿Se pueden adjuntar fotos al hilo?.
Muchas gracias por vuestro tiempo.
Fuerza y honor.
Saludos de Arturo desde Madrid
Arriba
Chea1 Ver desplegable
Moderador
Moderador


Unido: 20/Noviembre/2005
Localización: España
Estado: Sin conexión
Puntos: 4143
Enlace directo a este mensaje Enviado: 29/Octubre/2020 a las 19:06
Si el origen es una única consulta, creo que debería bastarte por filtrarla para que no salgan registros con Unidad en blanco.
Saludos
José Bengoechea Ibaceta
Mi página

Mi otra página
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 29/Octubre/2020 a las 19:39
Puedes colocar la imagen en tu Google Drive, Dropbox, OneDrive o similar y compartirla mediante un enlace que puedes poner aquí.

Para la consulta, bastará un copia pega aquí

Por lo de "Cancel", habrás visto que algunos eventos tienen parámetros, cada parámetro tiene una utilidad.

En los casos en los que el evento disponga de un parámetro llamado "Cancel", nos da la oportunidad de evitar que el evento se produzca, es decir, podemos cancelar el evento.

No tiene sentido cancelar un evento así, por que sí, por eso poner "Cancel=True" como indicas que pusiste sólo provocará que esa sección nunca se muestre (ya que la cancelas siempre) (Hablando siempre en la vista previa). por eso la idea de asignar a Cancel el resultado de tu condición es para que se muestro o no la sección según tus necesidades para cada registro de tu informe.

La condición que expuse es la misma que tenias en tu mensaje original:
If rst!Unidad1 = 0 OR rst!Unidad1 = "" OR IsNull(rst!Unidad1) Then ...

pero escrita de otro modo y asignando el resultado al parámetro "Cancel" directamente, suponiendo que el Campo "Unidad1" está en la consulta del informe:
Cancel = (Nz(Unidad1,"") = "") OR (Unidad1 = 0)
Es este punto, me surge la duda:
He supuesto, que tu informe está basado en la consulta "MiConsulta" o  sólo usas esa consulta para determinar en qué registros debe ocultarse la sección y tienes otra consulta como origen de datos para el informe?

Creo que lo que debemos determinar es la condición a usar. La solución de monuir parece más acertada en el segundo caso, pero creo que el criterio que pusiste no es correcto
en lugar de:
intCuenta = DCount("Unidad1", "CIMultiple", "U3")

prueba a poner algo como:
intCuenta = DCount("Unidad1", "CIMultiple", "Unidad1 = 'U3'")

prueba y nos comentas que talWink
El saber no ocupa lugar, sólo tiempo
Arriba
arodrigu Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 04/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 599
Enlace directo a este mensaje Enviado: 03/Noviembre/2020 a las 19:13
Hola de nuevo.

Chea1.
El origen es una consulta. He probado lo que dices de los nulos y no funciona. La consulta es ésta:

SELECT CAgenda.Contacto2 AS Contacto, CAgenda.IdContacto, CAgenda.IdEmpresa, TAgrupaciones.IdGrupo, TDepartamentos1.Activo, CAgenda.SituacionAdministrativa, CAgenda.Empresa, CAgenda.Cargo, CAgenda.IdOrdenD1, CAgenda.IdOrdenD2, CAgenda.IdOrdenD3, CAgenda.IdOrdenD4, CAgenda.IdOrdenD5, CAgenda.IdNivel1, CAgenda.IdNivel2, CAgenda.IdNivel3, CAgenda.IdNivel4, CAgenda.IdNivel5, CAgenda.Dependencia, CAgenda.Unidad, CAgenda.Unidad1, CAgenda.Unidad4, CAgenda.Unidad5, CAgenda.Prefijo, CAgenda.Fijo1, CAgenda.Movil1, CAgenda.MovilAbreviado, CAgenda.Interior, CAgenda.EMail, CAgenda.EMail1
FROM (CAgenda LEFT JOIN TDepartamentos1 ON CAgenda.IdNivel1 = TDepartamentos1.IdNivel1) INNER JOIN TAgrupaciones ON CAgenda.IdContacto = TAgrupaciones.IdContacto
WHERE (((CAgenda.IdEmpresa)=[TempVars]![IdEmpresa]) AND ((TAgrupaciones.IdGrupo)=113) AND ((TDepartamentos1.Activo)=True) AND ((CAgenda.SituacionAdministrativa)=1) AND ((CAgenda.Unidad1) Is Not Null))
ORDER BY CAgenda.Contacto2;

La variable temporal devuelve el identificador de la organización elegida en un formulario. El criterio 113 del campo IdGrupo corresponde al identificador del grupo de contactos correspondiente a este listado que son los integrantes del staff.

Dabellaso.

La consulta origen es la que he puesto antes.
He probado los siguientes códigos en el evento "Al dar formato del Encabezado IdNivel3" (que es con el que estoy haciendo las pruebas):

            Cancel = (Nz(Unidad1, "") = "") Or (Unidad1 = 0)
            Cancel = True

No funciona. No devuelve error pero oculta el campo U3 (con origen Unidad1), siempre, tenga o no datos.

            Dim intCuenta As Variant
            intCuenta = DCount("Unidad1", "CIMultiple", "Unidad1 = 'U3'")
            If intCuenta = 0 Or intCuenta = "" Or IsNull(intCuenta) Then
               Me.U3.Visible = False
            Else
               Me.U3.Visible = True
            End If

Mismo resultado que el anterior.

Voy a ver si soy capaz de poneros unos enlaces a unas fotos que le he hecho al Informe.
Si no es suficiente podría intentar hacer una pequeña base de ejemplo, aunque eso me va a costar más.
Ya me contáis si se os ocurre algo.


Fuerza y honor.
Saludos de Arturo desde Madrid
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 04/Noviembre/2020 a las 21:33
Hola, te cuento lo que veo:

En el código de evento "Al dar formato del Encabezado IdNivel3" (con el que estás haciendo las pruebas) has puesto:

            Cancel = (Nz(Unidad1, "") = "") Or (Unidad1 = 0)
            Cancel = True

Elimina la línea :
             Cancel = True

Esta línea como comenté antes, simplemente cancela el formato y por tanto nunca se muestra.
Deja sólo la primera línea, para que el formato se cancele sólo cuando "Unidad1" sea Nulo, "" o cero. Las demás veces se mostrará.

El otro código también esta bien, pero hay algunas cosas:

* La condición indica que se muestre sólo cuando el campo Unidad1 contenga el Valor "U3" (... , "Unidad1 = 'U3'"), si esa condición no se da en el registro en cuestión, la sección no se mostrará.
Creo que no es lo que buscas, si no recuerdo mal, querías ocultar la sección cuando no tenia datos, por tanto esa condición de buscar el valor "U3"no te vale

* No estas ocultando la sección, estas ocultando un control llamado U3 (no se cual será) en el informe
Me.U3.Visible= True o False

* Para ocultar la sección deberías usar Me.Section y el nombre de tu sección:
Me.Section("EncabezadoIdNivel3").Visible= True oFalse

Por otro lado
Viendo la consulta, veo que el campo "Unidad1" está incluido en ella, así que la función DCount en principio no me parece necesaria. Basta como mirar si "Unidad1" esta vacío.
puedes cambiar el segundo código por:

If (Nz(Me.Unidad1, "") = "") Or (Me.Unidad1 = 0) Then
               Me.Section("Aquí el nombre de tu sección").Visible = False
            Else
               Me.Section("Aquí el nombre de tu sección").Visible = True
End If

En este punto.
     El primer código evitará que la sección sea formateada cuando "Unidad1" este vacío
     El segundo código hará invisible la sección cuando "Unidad1" este vacío

La diferencia radica, en que sin formato, la sección no ocupa espacio en el informe, mientras que estando invisible, no se verá, pero el espacio que ocupa se mantiene igual
(Recuerda que siempre hablamos en vista Preliminar)

Prueba y comenta, seguro que pasito a pasito nos acercamos al éxito





Editado por Dabellaso - 04/Noviembre/2020 a las 21:44
El saber no ocupa lugar, sólo tiempo
Arriba
arodrigu Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 04/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 599
Enlace directo a este mensaje Enviado: 05/Noviembre/2020 a las 10:35
Buenos días Dabellaso.

He probado tus opciones y todo funciona.

Mi problema es que la denominación de los campos y los orígenes no siempre coinciden. Ésto se debe a que mi aplicación es muy antigua y voy adaptándola según voy sabiendo más, pero el diseño original de las tablas y la denominación de los campos... es mejorable. Pero ya es tan grande que no me compensa empezar desde cero, y voy parcheando como puedo.

El caso es que, gracias a vosotros (y en especial a ti), he conseguido lo que quería.

Pongo el código con el que me funciona
Private Sub EncabezadoDelGrupo3_Format(Cancel As Integer, FormatCount As Integer)            
            Cancel = (Nz(U3, "") = "") Or (U3 = 0)
End Sub

Éste también funciona

Private Sub EncabezadoDelGrupo3_Format(Cancel As Integer, FormatCount As Integer)           
            If (Nz(Me.U3, "") = "") Or (Me.U3 = 0) Then
               Me.Section("EncabezadoDelGrupo3").Visible = False
            Else
               Me.Section("EncabezadoDelGrupo3").Visible = True
            End If
End Sub

Muchísimas gracias y, por mi parte, podéis cerrar el hilo.
Fuerza y honor.
Saludos de Arturo desde Madrid
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 05/Noviembre/2020 a las 17:21
Perdón por escribir estando el tema resuelto.

Sólo como comentario, el segundo código, si quieres, puedes reducirlo como:

Private Sub EncabezadoDelGrupo3_Format(Cancel As Integer, FormatCount As Integer)

       Me.Section("EncabezadoDelGrupo3").Visible = NOT ((Nz(Me.U3, "") = "") Or (Me.U3 = 0) )

End Sub

o como:

Private Sub EncabezadoDelGrupo3_Format(Cancel As Integer, FormatCount As Integer)

       Me.Section("EncabezadoDelGrupo3").Visible = ((Nz(Me.U3, "") = "") Or (Me.U3 = 0) ) = False

End Sub

o como:

Private Sub EncabezadoDelGrupo3_Format(Cancel As Integer, FormatCount As Integer)

       Me.Section("EncabezadoDelGrupo3").Visible = (Nz(Me.U3, "") <>"") Or (Me.U3 <> 0) 

End Sub

Todos son lo mismo, pero escrito de formas diferentes, a ver si ves las diferencias Wink

Pueden cerrar el Hilo Embarrassed


Editado por Dabellaso - 05/Noviembre/2020 a las 17:25
El saber no ocupa lugar, sólo tiempo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable