ACCESS VBA Actualizar un txt de un formulario ejecutando el Timer

Por código voy leyendo las piezas que se van fabricando y el resultado lo voy colocando en el campo correspondiente de la tabla. Los resultados de esta tabla los muestro en un subformulario continuo y sus txt recogen la información (origen de control) de la tabla que voy actualizando cada 30''. No logro actualizar los valores de los txt si no presiono F5 o utilizo el método requery o recalc, pero si uso estos métodos la pantalla parpadea y la propiedad Painting no evita este parpadeo. He probado con actualizar únicamente los txt afectados y tb escribir directamente en los txt, pero si no le doy a F5 no refresca el subform.

Adjunto una imagen del sub form, los txt que tengo que actualizar son Pz_Fabr y Pz_xFabr

1 Respuesta

Respuesta
2

Hola Icue González, no consigo quitar el parpadeo de pantalla. Lo he utilizado  de dos formas con el método requery y otra con el estado del objeto visible (False / True) y no logro quitarlo el parpadeo.

Application.Echo False

'Form_PlanSemSub.Pz_Fabricadas.Requery

Form_PlanSemSub.Pz_Fabricadas.visible = False
Form_PlanSemSub.Pz_Fabricadas.visible = True

DoEvents

Application.Echo True

No te puedo responder a la pregunta, ya que, no sé porqué, a mi no me sucede. Mira, si tengo el formulario Compras con el subformulario DetalleCompra, basados ambos en las tablas del mismo nombre y le añado(para el ejemplo) un botón donde le voy a decir que inserte en la tabla DetalleCompra unos valores puestos al tuntun y que el subformulario reconsulte su origen.

En el evento al hacer clic del botón le pongo

Private Sub Comando22_Click()
DoCmd.RunSQL "insert into detallecompra(idcompra,precio,antes)values(idcompra,25,77)"
Me!DetalleCompra.Form.Requery
End Sub

Cuando lo pulso

Y te puedo garantizar que ni pestañea ni nada.

El código lo tengo dentro del Timer del form y cada vez que se ejecuta el Time se ejecuta el codigo que actualiza la tabla y después Recalc para que los datos actualizados se vean en el form. Pero ahí es cuando parpadea y no hay forma de quitarlo. 

En un foro he leído que lo han quitado de esta forma pero no logro interpretarlo:

You can use Application.Echo False to turn off screen updating while the Recalc runs. Though I'm a bit surprised that a simple sum would cause dramatic flickering.

Create a function like this in the form module:

Private Function MyRecalc()
    Application.Echo False
    Me.Recalc
    Application.Echo True
End Function

and change the control's AfterUpdate to

=MyRecalc()


Hola   Icue González! He encontrado el origen del problema. El parpadeo viene originado por los labels que tienen condicional. Al usar Requery, Recal o Refresh hace que los condicionales se vuelva a repintar (aunque sean pocos condicionales), el formulario que uso esta usando varios formatos condicionales en las labels. Conoces alguna forma de evitar que los formatos condicional queden congelados pero que los valores si se pinten.

Saludos

¿Las etiquetas con condicional? No lo entiendo, tanto donde pone Pz_Fabr y Pz_XFabr son etiquetas y no tienen porqué cambiar.

Por ejemplo, en el formulario le tengo puesto que cada 10 segundos inserte en la tabla Composicion, los valores que hay en la tabla Productos, y te dejo los botones de navegación en el subformulario Composición para que veas como aumentan los registros y no parpadea absolutamente nada.

A los 10 segundos

Y el código que tengo en el evento Al cronómetro es

Private Sub Form_Timer()
DoCmd.RunSQL "insert into composicion(codproducto,antes) select codproducto,existencias from productos"
DoCmd.RunSQL "update composicion set idfabricacion=" & Me.IdFabricacion & ", cantidad=25 where idfabricacion is null"
Me!Composicion.Form.Requery
End Sub

Por eso me resulta extraño todo

El color de las labels se lo doy con un formato condicional. Al invocar el método requery o recal los labels con un color dado por un formato condicional genera un parpadeo de pantalla, en mi casi todos los objetos del subformulario están pintados de esta forma. Se podría desactivar el formato condicional y volverlo a conectar después de actualizar los valores de las etiquetas 

Es imposible, las etiquetas no tienen formato condicional. Mira la imagen

Por otro lado, aunque veas varios registros, en los formularios continuos o en vista hoja de datos sólo tiene existencia real el registro activo. Los demás son imágenes virtuales. Por tanto, si lo que emplearas es algo como

If.... then

codproducto_etiqueta.caption

o

codproducto_etiqueta.backcolor=..

Esa condición sólo se cumpliría en el registros activo, lo que sucediera en los demás no se cumpliría, por tanto el color sería el del primer registro.

Si en el formulario, en el cuadro de texto CodProducto, le pongo como formato condicional

Y en Antes le pongo

Cuando abro el formulario y pasan 10 segundos

Y, a mi por lo menos, no "parpadea absolutamente nada, y cuando pasan otros 10 segundos

Exactamente igual. Lo que pasa es que mi ordenador es un portátil y como la pantalla es pequeña no puedo "estirar" totalmente es subformulario, pero le pone los colores que correspondan a cada uno.

Muchas gracias Icue González es un trabajo excelente,   

He creado un formulario continuo de prueba muy sencillo con algunas etiquetas y les he añadido un formato condicional. He pulsado  F9 o F5 para simular un Recal o Requery y el resultado es el mismo. He obtenido esta explicación del funcionamiento del que tienen al pintar el formato condicional:

El formato condicional se aplica (normalmente) en los subformularios continuos, por ser una de las pocas formas de crear la ilusión de que los registros están 'vivos' (activos) cuando solo existe uno.
Eliminar ese parpadeo es difícil por lo que supone (redibujar dos veces lo mismo, una para refrescar sin colorines y acto seguido aplicar la nueva 'mano de pintura') …. lo ideal es cambiar la estética y evitar los formularios continuos (simple ilusión óptica).

Para evitar que el formato condicional vuelva a pintar las etiquetas, voy ha probar de eliminar el formato condicional de todas las etiquetas e intentar pintar cada etiqueta según la condición que le indique al cargar el formulario. Formule otra pregunta que se llama :

(VBA ACCESS Como actualizar los labels de un form sin usar Requery, Recal o Refresh)

En esta pregunta le he indicado que he realizado un procedimiento que según el valor que contiene la etiqueta y la condición que cumpla le de un color de fondo u otro. Pero no se como añadirlo al cargar el formulario (recordsource) para que actúe en cada línea que va ejecutando el formulario continuo. Esto mismo lo he preguntado en la otra pregunta que tengo abierta

Gracias

Parece lógico que te lo explique quien te respondió a la pregunta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas