Seleccionar columnas visibles en un informe

9 envíos / 0 nuevos
Último envío
Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Seleccionar columnas visibles en un informe

Hola

Tengo una consulta que mezcla un montón de campos que vienen de varias tablas relacionadas. El resultado es una tabla (el query o consulta) con los campos que me interesan.

Para su impresión y consulta he creado un informe que está dentro de un objeto subformulario dentro de un formulario. Esto lo hago así porque quiero darle al usuario la opción de personalizar el informe.

Sin embargo, ¡Oh, cielos!, no encuentro la manera de hacerlo.

Por simplificar, vamos a suponer que tengo una consulta que se llama 'consulta', y tiene tres campos que se llaman 'Nombre', 'Título' y 'Descripción'. Mi informe creado en fase de diseño incluye los tres campos, y funciona perfectamente.

He creado tres marcas de verificación, de inicio marcadas, que se llaman V1, V2 y V3. Quiero que si V1 está desmarcada, entonces no aparezca en el informe el campo 'Nombre'. Lo mismo con las otras dos marcas de verificación y los otros campos. Esto lo hago con un código colocado en "Después de actualizar" de las casillas de verificación. Todas ejecutan una Sub que chequea si el valor de cada casilla es 1 o -1, o bien 0, y actúa en consecuencia.

He intentado hacerlo mediante la opción RecordSource del informe, haciendo una consulta sobre la consulta. Esto estaría bien si lo que quiero es filtrar, por ejemplo, por nombre. Pero no para hacer desaparecer un campo entero.

Cómo se puede hacer eso?


Muchas gracias

Etiquetas: 

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 19 horas 21 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
Visible

¿ .Visible=False ?

Estas cosas de quitar y poner en el informe lo pondría en el evento al cargar del informe

 

 

------
Ya sé Excel, pero necesito más.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Gracias... pero no era esoLo

Gracias

... pero no era eso

Lo primero: no sé cómo llegar a las columnas. En algún sitio he leído algo sobre report.column pero eso no funciona o no lo he sabido utilizar.

No sé cómo llegar a cada columna. Ni siquiera a las etiquetas de los títulos, o a los cuadros de texto. Al seleccionarlos tienen un nombre de control, pero al referirme a ellos así en el código me dice Access que a Parla.

En cualquier caso, no me bastaría con llegar al visible = true, porque el hueco que dejan habría que rellenarlo reestructurando las columnas y sus tamaños.

En cuanto a lo del evento Cargar del informe, no lo he utilizado por cómo quiero que funcione. La idea es que se cargue con el formulario, de manera que al marcar o desmarcar casillas de verificación se reorganice todo en consecuencia.

Pero si no hay más remedio...

Un saludo

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 19 horas 21 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
ColumnHidden

hablas de un informe en un subformulario.¿?

Supongo, cuando hablas de columnas, que lo estás mostrando en modo hoja de datos, es decir, que ves una cuadrícula con los datos ¿seguro que es un informe (report en inglés) y no un subformulario?

Mira a ver la propiedad ColumnHidden del control que quieres mostrar u ocultar. 

si lo llamas desde el formulario principal sería algo así:

Me.ControlSubformulario.Form.Controlquequieresocultar.ColumnHidden=True

Por supuesto el código lo puedes poner donde quieras, lo del evento Load era sólo una idea para cargar al inicio

 

------
Ya sé Excel, pero necesito más.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
No veo la manera...Hago lo

No veo la manera...

Hago lo siguiente:

Me.ControlSubformulario.Report. [...] y no me deja hacer referencia al control que genera la columna.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Sigo intentándolo

Al final he hecho un bucle entre los controles del reporte para localizar al "interesado", y cuando lo hago, le aplico .columnhidden = false/true

Resultado:

Se ha producido el error '2455' en tiempo de ejecución:

Ha especificado una expresión que contiene una referencia no válida a la propiedad ColumnHidden.

 

He cambiado el SQL de la consulta, pero los controles siguen pidiendo el dato, y en este caso lo piden presentando una ventanita de entrada de variables que no debe aparecerle al usuario. Y si no pones nada, te coloca la columna con los controles vacíos.

Saludos

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 19 horas 21 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
¿tiene que ser un informe?

Un informe no tiene columnas

El informe tiene controles independientes, aunque estén agrupados y aparezca uno encima de otro, no son columnas. un informe repite la sección de detalle para cada registro, es decir hay algo más parecido a filas (sin serlo) que a columnas.

Lo más parecido a las columnas es cuando muestras un formulario o subformulario en modo Hoja de datos. Los informes no tienen este modo de visualización.

¿Seguro que tienes que hacerlo con un subformulario que contiene un informe?

 

Esa ventanita que te pregunta, es porque al no tener el dato de origen lo interpreta como un parámetro, y eso es lo que te está preguntando, el valor del parámetro.

 

Pensando un poco en genérico. Por qué no creas un informe con n controles, que se llamen control1, control2, control3,... 

haz un bucle que los recorra y asígnales el campo de origen, y la propiedad visible, según lo que haya elegido el usuario en el formulario.

with tuinforme.controls("control1") 
  .visible = true 'bueno, lo que sea
  .recordsource="tucampodeorigen"  'o "" si no quieres
end with

Así puedes rellenar las primeras "columnas" y dejar vacías las que no necesites al final.

 

------
Ya sé Excel, pero necesito más.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Pues parece interesante,

Pues parece interesante, muchas gracias. Al fin has conseguido entender lo que yo torpemente intentaba explicar.

Sigue existiendo el problema de acceder a los controles desde el form. Lo lógico sería algo así como form.contenedor.report.control pero eso no funciona.

Quizás deba irme directamente al report_comosellame.control.

 

Bueno, ya mañana trasteo.

He encontrado algo en la web del Búho: http://www.mvp-access.es/buho/ficheros/informeadditem.zip

Es un poco lioso, pero entiendo que lo que hace es parecido a lo que me dices. Parece que asigna la propiedad visible true o false, y después lo coloca a la izquierda del todo, o a la izquierda del todo más el ancho del campo anterior más la separación. Tendré que hacer algo parecido.

 

Lo dicho, muchas gracias.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 2 días
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Lo he conseguido, aunque no

Lo he conseguido, aunque no estoy del todo contento con el método.

Como tengo un máximo de 9 columnas, y las que están en posición 3 y 6 corresponden a memos (pueden tener textos largos), lo que hago es distribuir los huecos que quedan al apagar controles entre estos dos en proporción 1/3 - 2/3 si están ambos encendidos. Si apago alguno, se distribuye entero al que esté encendido. Si están ambos apagados, no redistribuyo nada porque no me da la gana. Esto lo hago con las variables suma1 y suma2.

En el formulario hay casillas de verificación que se llaman V1, V2... hasta V9. Se corresponden con los títulos que se llaman lbl1, lbl2... hasta lbl9 y con los datos que se llaman txt1, txt2... hasta txt9.

Probé con cambiar la propiedad visible y left de los controles para ubicarlos en su sitio, pero no funciona. Creo que los controles txt y lbl están dentro de algún tipo de contenedor que se repite en encabezados, pies de página y cuerpo del informe, que sería lo que debería tocar si supiera cómo hacerle referencia.

Como a falta de pan buenas son tortas, lo que hago es tocar la propiedad .width de los controles, poniéndola a cero cuando no quiero que aparezcan.

 

Aquí el código por si le es útil a alguien, y por si hay sugerencias.

Public Sub Ordenar()

Dim a As Byte

Dim sum, suma1, suma2 As Long

Dim lbl As Label

Dim txt As TextBox

Dim V As CheckBox

 

With [Report_Encargos abiertos]

cont = 0

sum = 0

For a = 1 To 9

    Set V = Me.Controls("V" & a)

    Debug.Print V.Name

    If (V = 0) Then

        Set lbl = .Controls("lbl" & a)

        sum = sum + 60 + lbl.Width

    End If

Debug.Print "sum= "; sum

Next

If Me.V3 = 0 Then

 suma1 = 0

 If Me.V6 = 0 Then

 suma2 = 0

 Else

 suma2 = sum

 End If

Else

 If Me.V6 = 0 Then

 suma1 = sum

 suma2 = 0

 Else

 suma1 = sum \ 3

 suma2 = sum - suma1

 End If

End If

 

For a = 1 To 9

    Set lbl = .Controls("lbl" & a)

    Debug.Print CStr(lbl.Left) & " x " & CStr(lbl.Width)

    Set V = Me.Controls("V" & a)

    Set txt = .Controls("txt" & a)

    lbl.Visible = V

    txt.Visible = V

    

    Select Case a

    Case 1, 7, 8

      lbl.Width = 1425

      txt.Width = 1425

    Case 2

      lbl.Width = 2155

      txt.Width = 2155

    Case 3

      lbl.Width = 2400 + suma1

      txt.Width = lbl.Width

    Case 4

      lbl.Width = 1365

      txt.Width = 1365

    Case 5

      lbl.Width = 1080

      txt.Width = 1080

    Case 6

      lbl.Width = 2535 + suma2

      txt.Width = lbl.Width

    Case 9

      lbl.Width = 1575

      txt.Width = 1575

    End Select

    

    If (V = 0) Then

        lbl.Width = 0

        txt.Width = 0

    End If

    

Next

End With

Debug.Print "FIN"

 

Set lbl = Nothing

Set txt = Nothing

Set V = Nothing

 

End Sub

 

Un saludo