** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Ocultar campos vacíos y recolocar el resto
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoOcultar campos vacíos y recolocar el resto

 Responder Responder Página  <12
Autor
Mensaje
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1536
Enlace directo a este mensaje Enviado: 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.
Arriba
fcoval Ver desplegable
Asiduo
Asiduo


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 225
Enlace directo a este mensaje Enviado: 29/Abril/2021 a las 07:57
Publicado originalmente por a.alf 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í :

Cita
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.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 29/Abril/2021 a las 11:27
¿Recordar? ... mira yo esa no me la sabía ... Wink

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.

Access Aplicaciones
Tecsys.es
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 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:

Cita

'-- 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á.
Arriba
fcoval Ver desplegable
Asiduo
Asiduo


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 225
Enlace directo a este mensaje Enviado: 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"

Cita
Cita
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.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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 aqui explicando de dónde lo había sacado.

Me alegro que sea útil.

Un saludo



Xavi, un minyó de Terrassa

Mi web
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 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á.
Arriba
 Responder Responder Página  <12
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable