Ocultar campos vacíos y recolocar el resto
Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=85969
Fecha de impresión: 26/Marzo/2026 a las 17:41
Tema: Ocultar campos vacíos y recolocar el resto
Publicado por: a.alf
Asunto: Ocultar campos vacíos y recolocar el resto
Fecha de publicación: 27/Abril/2021 a las 19:17
|
Hola, buenas tardes. He hecho una aplicación para imprimir unas etiquetas, las cuales a veces tienen algún campo vacío. Me gustaría ocultar este campo con su etiqueta correspondiente y recolocar los que tienen datos para que no queden huecos . Lo he intentado haciendo los campos de altura 0 y usar la propiedad autoextensible, pero no logro que funcione. Adjunto imagen de la etiqueta.
Gracias.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Respuestas:
Publicado por: LuisR
Fecha de publicación: 27/Abril/2021 a las 20:01
|
En propiedades de las etiquetas (supongo que son un informe) -> eventos -> al cargar -> generador de código -> escribes....
Private Sub Report_Load()
If Me.[año fabricación] = "" Then Me.[año fabricación].Visible = false Else Me.[año fabricación].visible = true End If
End Sub
Otra opción es la función ISNULL.
-------------
|
Publicado por: a.alf
Fecha de publicación: 27/Abril/2021 a las 20:17
Buenas tardes y gracias por tu tiempo. Tu código funciona , pero se quedan los huecos de los campos ocultados y eso queda feo, Lo que busco es ocultar y reposicionar los campos que quedan visibles para que no queden huecos entre ellos Las etiquetas están en un informe.
Gracias
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: a.alf
Fecha de publicación: 27/Abril/2021 a las 20:22
Hola otra vez. Los campos vacios no son siempre los mismos. Y a veces estan todos llenos.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: LuisR
Fecha de publicación: 27/Abril/2021 a las 20:30
|
Entonces ya lo complicamos. Habría varias opciones, la más simple (y laboriosa):
En propiedades del campo "Voltaje" -> eventos -> al cargar etc etc
If Me.[año fabricación] = "" Then DoCmd.MoveSize 3480, 1800, 200, 300 Else End If
* derecha, abajo, ancho, alto
-------------
|
Publicado por: xavi
Fecha de publicación: 27/Abril/2021 a las 22:45
|
Hasta dónde a mi me consta, MoveSize es para mover formularios. Para mover controles se deben establecer las propiedades Left y Top de cada uno de ellos.
Como yo lo haría - Ocultar todos los controles implicados - Crear una cadena con todos los nombres de los controles que debes MOSTRAR - Convertir esa cadena en un Array - Establecer la misma altura para todos los controles - Establecer cual será el "interlineado" para la separación de los controles - Establecer la altura del primer control
Llegado el momento recorrer el Array y posicionar los controles utilizando un bucle que, en cada iteración, calcule el Top utilizando la altura inicial + (la altura del control x el número de iteración) + (interlineado x el número de iteración) For i = 0 To Ubound(arrControles) Me(arrControles(i)).Top = lngAlturaInicial + (Me(arrControles(i)).Height * i) + (lngInterlineado * i) Me(arrControles(i)).Visible = True Next Que conste que no lo he probado. Es solo teoria
Un saludo
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: xavi
Fecha de publicación: 27/Abril/2021 a las 22:46
Por cierto, dices que has utilizado "autoextensible" pero... ¿y autocomprimible?
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: a.alf
Fecha de publicación: 28/Abril/2021 a las 07:42
Buenas y gracias por vuestro tiempo. He husado los dos . Con el diseño de todos los campos agrupados en modo apilado y primero con autoextensible y después con autocomprimible y con los dos. Pero seguro que algo haría mal por que no me ocultaba nada. Seguiré intentandolo de esta manera ya que por código, como dices (Xavi), no estoy preparado para realizarlo. Gracias
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: a.alf
Fecha de publicación: 28/Abril/2021 a las 12:52
|
Hola de nuevo. Ayer no me di cuenta, el autocomprimir si que oculta el campo, lo que no oculta es la etiqueta de dicho campo, entonces el hueco sigue estando ahí por culpa de la etiqueta. No se si esto tendrá solución.
Gracias
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: a.alf
Fecha de publicación: 28/Abril/2021 a las 13:01
Adjunto imagen
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: a.alf
Fecha de publicación: 28/Abril/2021 a las 18:38
|
Hola. He estado mirando las posibilidades de campos vacíos que hay, y solo puedo tener tres casos diferentes, de esta manera opto por lo mas fácil, tener 3 informes y según la etiqueta imprimir uno u otro.
Gracias y se puede cerrar el hilo.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: fcoval
Fecha de publicación: 28/Abril/2021 a las 19:40
He estado mirando las posibilidades de campos vacíos que hay, y solo puedo tener tres casos diferentes,
de esta manera opto por lo mas fácil, tener 3 informes y según la etiqueta imprimir uno u otro.
|
No me gusta esa idea de varios informes, la verdad. ¿ Por que no estas preparado para usar código ? ¿ te has metido alguna vez a programar aunque sea algo sencillo ?
https://drive.google.com/file/d/162B5JTRlbQk5VRXjasE5rMkittG5xGrS/view?usp=sharing" rel="nofollow - Quiero entender que el formato que buscas es el mostrado en el Informe2 y no en el Informe1
NO CERREIS EL HILO TODAVIA.
|
Publicado por: a.alf
Fecha de publicación: 28/Abril/2021 a las 20:40
Si que me he metido a programar, pero cosas pequeñas y fáciles. Lo que necesito ahora me supera y con dos informes mas lo tengo solucionado.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: Mihura
Fecha de publicación: 28/Abril/2021 a las 20:40
|
Otro posible camino sería borrar las etiquetas / campos que no se utilizan ... seleccionar los controles y lanzar el comando igualar en vertical ... ahora, habrá que buscar como se llama ese comando .. y como se seleccionan varios controles a la vez.
Suponiendo que se pueda poner el informe en modo diseño (no valdría una accde / accdr).
------------- Jesús Mansilla Castells. Saludos desde Móstoles.
http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones http://www.tecsys.es" rel="nofollow - Tecsys.es
|
Publicado por: a.alf
Fecha de publicación: 28/Abril/2021 a las 22:17
|
Perdona fcoval estaba mirando el foro en el movil y el enlace a las imagenes no me sale. Si lo que buscaba era lo mostrado en el informe 2.
gracias
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: pitxiku
Fecha de publicación: 28/Abril/2021 a las 22:22
También puedes convertir las etiquetas en cuadros de texto, y colocar un Siinm:
=Siinm(Nz(Campo,"")<>"", "Nombre",Null)
Y luego ya es cuestión de usar el Autocomprimible y Autoextensible.
Otra posibilidad es preparar una consulta que devuelva los títulos y valores, pero para hablar sobre eso hay que saber cómo tienes los datos en las tablas.
|
Publicado por: fcoval
Fecha de publicación: 29/Abril/2021 a las 07:57
a.alf escribió:
Si que me he metido a programar, pero cosas pequeñas y fáciles. Lo que necesito ahora me supera y con dos informes mas lo tengo solucionado. |
No creo que te supere si ya has programado anteriormente, al menos eso creo porque la programación que he usado no es nada complicada.
Aunque ya lo tengas solucionado, te voy a dar detalle de como lo he hecho por si quieres intentarlo. Te aconsejo que lo hagas, que lo intentes al menos, y si algo no entiendes, pregunta que en este foro se ayuda y mucho.
Te voy a dar detalle de como lo he hecho yo y que mas o menos es como te ha indicado Xavi.
Suponiendo que SOLO tienes 7 cuadros de texto, yo en mi ejemplo he usado los siguientes:
modelo n_fabricacion año_fabricacion voltaje potencia volt_salida frecuencia
Y he definido sus etiquetas así …
Etiq_modelo Etiq_n_fabricacion Etiq_año_fabricacion Etiq_voltaje Etiq_potencia Etiq_volt_salida Etiq_frecuencia
El codigo completo queda así :
Option Compare Database
Dim arrPosiciones(6) As Variant '-- Dimensionamos la matriz para 7 cuadros de texto (desde modelo a frecuencia)
Private Sub Report_Open(Cancel As Integer) '-- Averiguamos las posiciones de cada etiqueta (con .TOP) -- Dim x As Integer x = 0
Dim ctl As Control For Each ctl In Me.Controls '-- Recorremos todos los controles del Informe
With ctl Select Case .ControlType Case acLabel Case acTextBox '-- Metemos dentro de la matriz, SOLO los valores de las posiciones de TODOS los cuadros de texto, si en la etiqueta ' hubieran otros cuadros de texto, los deberiamos de excluir haciendo uso de .Name por ejemplo 'Debug.Print "Name: " & .Name 'Debug.Print "Posicion_Top: " & .Top arrPosiciones(x) = .Top '-- Guardamos los 7 valores de la propiedad .Top de cada cuadro de texto x = x + 1 End Select End With Next ctl
End Sub
Private Sub Detalle_Format(Cancel As Integer, FormatCount As Integer) '-- Vamos a determinar en que posición pondremos cada etiqueta --
Dim pos As Integer pos = 0
If IsNull(Me.[n_fabricacion]) Then pos_n_fabricacion = 0 Else pos = pos + 1 pos_n_fabricacion = pos End If
If IsNull(Me.[año_fabricacion]) Then pos_año_fabricacion = 0 Else pos = pos + 1 pos_año_fabricacion = pos End If
If IsNull(Me.[voltaje]) Then pos_voltaje = 0 Else pos = pos + 1 pos_voltaje = pos End If
If IsNull(Me.[potencia]) Then pos_potencia = 0 Else pos = pos + 1 pos_potencia = pos End If
If IsNull(Me.[volt_salida]) Then pos_volt_salida = 0 Else pos = pos + 1 pos_volt_salida = pos End If
If IsNull(Me.[frecuencia]) Then pos_frecuencia = 0 Else pos = pos + 1 pos_frecuencia = pos End If
Select Case pos_n_fabricacion: '-- En los Case Else, recojo todos los valores distintos a Cero. Case 0: Me.[n_fabricacion].Visible = False Me.[Etiq_n_fabricacion].Visible = False Case Else: Me.[Etiq_n_fabricacion].Top = arrPosiciones(pos_n_fabricacion) Me.[Etiq_n_fabricacion].Visible = True Me.[n_fabricacion].Top = arrPosiciones(pos_n_fabricacion) Me.[n_fabricacion].Visible = True End Select
Select Case pos_año_fabricacion: Case 0: Me.[año_fabricacion].Visible = False Me.[Etiq_año_fabricacion].Visible = False Case Else: Me.[Etiq_año_fabricacion].Top = arrPosiciones(pos_año_fabricacion) Me.[Etiq_año_fabricacion].Visible = True Me.[año_fabricacion].Top = arrPosiciones(pos_año_fabricacion) Me.[año_fabricacion].Visible = True End Select
Select Case pos_voltaje: Case 0: Me.[voltaje].Visible = False Me.[Etiq_voltaje].Visible = False Case Else: Me.[Etiq_voltaje].Top = arrPosiciones(pos_voltaje) Me.[Etiq_voltaje].Visible = True Me.[voltaje].Top = arrPosiciones(pos_voltaje) Me.[voltaje].Visible = True End Select
Select Case pos_potencia: Case 0: Me.[potencia].Visible = False Me.[Etiq_potencia].Visible = False Case Else: Me.[Etiq_potencia].Top = arrPosiciones(pos_potencia) Me.[Etiq_potencia].Visible = True Me.[potencia].Top = arrPosiciones(pos_potencia) Me.[potencia].Visible = True End Select
Select Case pos_volt_salida: Case 0: Me.[volt_salida].Visible = False Me.[Etiq_volt_salida].Visible = False Case Else: Me.[Etiq_volt_salida].Top = arrPosiciones(pos_volt_salida) Me.[Etiq_volt_salida].Visible = True Me.[volt_salida].Top = arrPosiciones(pos_volt_salida) Me.[volt_salida].Visible = True End Select
Select Case pos_frecuencia: Case 0: Me.[frecuencia].Visible = False Me.[Etiq_frecuencia].Visible = False Case Else: Me.[Etiq_frecuencia].Top = arrPosiciones(pos_frecuencia) Me.[Etiq_frecuencia].Visible = True Me.[frecuencia].Top = arrPosiciones(pos_frecuencia) Me.[frecuencia].Visible = True End Select
End Sub
|
Saludos.
|
Publicado por: xavi
Fecha de publicación: 29/Abril/2021 a las 09:13
|
Solo por recordar algo sobre las etiquetas asociadas a controles que no todo el mundo sabe y/o recuerda.
Se puede acceder a la etiqueta asociada al control utilizando la colección Controls del control con su índice 0.
Me!miTextBox.Controls(0).Name
Nos devolverá el nombre de la etiqueta asociada al cuadro de texto miTextBox. De ese modo nos podemos ahorrar algo de tiempo en el nombrado de controles.
Un saludo
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: Mihura
Fecha de publicación: 29/Abril/2021 a las 11:27
¿Recordar? ... mira yo esa no me la sabía ... 
Siempre suelo nombrar la etiqueta de un control como Et_NombreControl.
Y por cierto, si tienes etiqueta + control asociados, al volver invisible el control también se vuelve invisible la etiqueta.
------------- Jesús Mansilla Castells. Saludos desde Móstoles.
http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones http://www.tecsys.es" rel="nofollow - Tecsys.es
|
Publicado por: xavi
Fecha de publicación: 29/Abril/2021 a las 11:55
|
Existe otra forma de acceder al nombre de la etiqueta asociada a un control, pero tiene truco.
Si vamos a un formulario en diseño y miramos las propiedades de un control, en la pestaña "Otras", aparece la propiedad "Nombre de etiqueta".
Si analizamos con la ventana de inspección, esa propiedad no aparece. Si hacemos una pequeña función para recuperar las propiedades de un control, una tontería como esta:
Function TestPropiedades() Dim prp As Property Dim ctl As Control Set ctl = Me!MiControl For Each prp In ctl.Properties Debug.Print prp.Name & ": " & prp.Value Next End Function
|
Obtenemos en la ventana de inmediato todas las propiedades con sus valores (casca al llegar a la Text por enfoque pero da lo mismo)
Entre las propiedades hay una llamada LabelName que equivale al "nombre de etiqueta" de la ventana.
Pero si preguntamos por Me!miControl.LabelName obtenemos un error 438. De hecho, LabelName ni siquiera aparece en el IntelliSense.
Para acceder a la propiedad se debe hacer así:
Me!miControl.Properties("LabelName")
¡¡Manda güevos!! (con perdón)
------------- Xavi, un minyó de Terrassa http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: a.alf
Fecha de publicación: 29/Abril/2021 a las 21:07
|
Hola. He estado aplicando el código de "fcoval" y me ha funcionado correctamente, como era de esperar. El código lo he entendido todo menos lo siguiente:
'-- Vamos a determinar en que posición pondremos cada etiqueta --
Dim pos As Integer pos = 0
If IsNull(Me.[n_fabricacion]) Then pos_n_fabricacion = 0 Else pos = pos + 1 pos_n_fabricacion = pos End If
|
No entiendo el "pos +1 " la posicion que asigna...
Adjunto imagen del resultado.
Gracias.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: fcoval
Fecha de publicación: 30/Abril/2021 a las 08:47
Me alegro que lo hayas aplicado... veamos si soy capaz de explicarte la duda.
Partimos del siguiente supuesto:
Que tienes 7 cuadros de texto modelo n_fabricacion año_fabricacion voltaje potencia volt_salida frecuencia
y que si todos tuvieran valor, el orden de su posicion seria 0,1,2,3,4,5 y 6.
Y ademas, el campo "modelo" siempre va a tener información y por tanto, la posición incial de dicho cuadro de texto siempre sera la definida como 0 y será siempre visible para este campo únicamente. Pero para el resto de campos, el 0 significará que no tienen valor y que deben de ocultarse.
Por tanto tengo que tener algo que me indique la posicion de cada campo y que salvo el 0 (que usaremos para ocultar campos que no tengan valor), deben de ser valores que no se pueden repetir para no tener dos cuadros de texto en la misma posicion.
Por esta razón, el primer If es para tratar el siguiente campo llamado "n_fabricacion"
If IsNull(Me.[n_fabricacion]) Then pos_n_fabricacion = 0 Else pos = pos + 1 pos_n_fabricacion = pos End If
|
No entiendo el "pos +1 " la posicion que asigna...
|
Analizamos cada campo y: - si no tiene valor, digo que su pos_xxxxxxx será 0 para posteriormente ocultarlo. - si tiene valor, digo que la posición de ese campo debe de ser la siguiente a la ya ocupada, y para el primer If, sera 1 (pos = pos + 1, partimos de pos = 0) y le asigno dicho valor a la posicion de dicho campo con pos_xxxxxxx = pos
Analizo el siguiente campo y lo mismo: - si no tiene valor, digo que su pos_xxxxxxx será 0 para posteriormente ocultarlo. - si tiene valor, digo que la posición de este campo será la siguiente, y en este caso ya sera 2 (pos = pos + 1, porque "pos" ya era 1) y le asigno dicho valor a la posicion de dicho campo con pos_xxxxxxx = pos
Tengo que tener una variable (que yo he llamado "pos") y que su valor desde 1 al 6 no se me puede repetir.
No sé si me he sabido explicar.
Un detalle mas, el codigo que yo te puse era con etiquetas independientes de los cuadros de texto porque no sé si las tenias asociadas o no (es muy facil asociarlas) en caso de tenerlas asociadas, como bien comento Xavi y Mihura, con solo aplicar visibilidad True o False al cuadro de texto le vas a trasladar el mismo estado a su etiqueta asociada.
Xavi, coincido con Mihura en lo que te comenta sobre "Me!miTextBox.Controls(0).Name", tampoco lo conocia. muchas gracias.
|
Publicado por: xavi
Fecha de publicación: 30/Abril/2021 a las 08:51
|
A ver, que yo tampoco lo sabia "de toda la vida". De hecho, hace poco menos de un año que lo puse http://www.llodax.com/smf/index.php?topic=184.0" rel="nofollow - aqui explicando de dónde lo había sacado.
Me alegro que sea útil.
Un saludo
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: a.alf
Fecha de publicación: 30/Abril/2021 a las 23:42
|
Gracias, te has explicado perfectamente. Dejo el código así y no emplearé los dos informes mas. Gracias a todos por ayudarme una vez mas. Por mi se puede cerrar el hilo.
Gracias.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
|