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
¿ .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.
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
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.
No veo la manera...
Hago lo siguiente:
Me.ControlSubformulario.Report. [...] y no me deja hacer referencia al control que genera la columna.
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
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.
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.
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