Imprimir página | Cerrar ventana

Consulta sobre Form_Timer

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=84965
Fecha de impresión: 28/Marzo/2024 a las 19:43


Tema: Consulta sobre Form_Timer
Publicado por: emijas
Asunto: Consulta sobre Form_Timer
Fecha de publicación: 24/Enero/2020 a las 12:03
Buenos Dias

Tengo varios eventos que se ejecutan a horas distintas, tengo la leve impresión de que la forma como lo tengo diseñado está constantemente verificando que se cumpla la condición de hora.

por ejemplo

If (Hour(Time) = 14 And Minute(Time) = 25) Then 

y otro

If (Hour(Time) = 19 And Minute(Time) = 30) Then 


Y desde el formulario en las propiedades  tengo el intervalo en 50000.

Hay alguna manera mas eficiente que esta para ejecutar las acciones dentro del IF?

Saludos y gracias de antemano



Respuestas:
Publicado por: xavi
Fecha de publicación: 27/Enero/2020 a las 12:54
Hola, 

Se supone que ese código está en el evento "Al cronómetro". Y, por el valor que indicas de la propiedad intervalo, se ejecutara cada 50 segundos. Eso significa que cada vez que se cumpla el intervalo se evaluará la hora y minuto del momento.

¿Se puede ser más eficiente? Pues depende...

Se puede evaluar de otra forma (en programación siempre hay más de 1 camino):
If Format(Time, "hh:nn") = "14:25" Then ....

¿Obligatoriamente a las 14:25 y a las 19:30? Si la respuesta es "no" puedes ampliar el intervalo y trabajar con tiempos iniciales y finales --> si HoraActual > "14:25" y HoraActual < 14:30 ... lanzas proceso

Otra opción es dejar eso en manos del programador de tareas de windows.

En lugar de tener una aplicación con 2 procesos, tienes 2 miniaplicaciones con un proceso cada una que se lanza en el Autoexec. Añades 2 tareas al programador de tareas de Windows y listo.

Un saludo


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: emijas
Fecha de publicación: 27/Enero/2020 a las 14:34
Hola Xavi

Gracias por la respuesta.

Si o si se tienen que lanzar los procesos a las horas indicadas. Son procesos internos de la aplicación de Access que envían a mi email reportes de lo ocurrido en horario de mañana y tarde respectivamente.

Lo que me refiero como mas eficiente es que no tenga que chequear cada 50 segundos si se cumplen las condiciones, sino otra forma de encarar el lanzamiento de los procesos.

Saludos


Publicado por: mounir
Fecha de publicación: 27/Enero/2020 a las 15:52
Hola!

Precisamente tengo guardado un ejemplo desarrollado por el maestro "Xavi" que se llama timer (lo descargué hace tiempo desde su página web creo) para lanzar un email en un tiempo determinado cronometrando el tiempo cada segundo. Pienso que lo puedes adaptar a tu necesidad restando la hora actual de la hora que quieras lanzar un aviso.
Te dejo el ejemplo:-
https://onedrive.live.com/?cid=70302728F05A12E3&id=70302728F05A12E3%21802&parId=70302728F05A12E3%21136&o=OneUp" rel="nofollow - https://onedrive.live.com/?cid=70302728F05A12E3&id=70302728F05A12E3%21802&parId=70302728F05A12E3%21136&o=OneUp

-------------
Un Saludo.


Publicado por: xavi
Fecha de publicación: 27/Enero/2020 a las 17:27
¡Pues menudo ejemplo si se lanza cada segundo! ¡Que derroche de recursos!

Si el momento es muy relevante (como parece) o lo haces como lo tienes ahora, o lo haces con programador de tareas. Desde mi punto de vista, no hay otra.


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: emijas
Fecha de publicación: 27/Enero/2020 a las 17:38
Gracias por ambas respuestas

Una última pregunta para Xavi. Veo que utilizas DateAdd("s", -Me.TimerInterval ,

¿Ves factible usar Dateadd en vez de con segundos "s" con horas "h" de manera tal que no haya tanto uso/derroche de recursos?

Saludos


Publicado por: xavi
Fecha de publicación: 27/Enero/2020 a las 19:03
La utilización de "s" es una aberración en términos de consumo...

Se me ocurre otra técnica: cambiar el intervalo de cronometro en función de cuando se está ejecutando. No tiene ningún sentido lanzar el evento cada 50 segundos cuando quedan horas para la siguiente ejecución "interesante".

Sería algo como esto en el intervalo al cronómetro:

    Dim dtmEventoMañana         As Date:    dtmEventoMañana = TimeSerial(14, 25, 0)
    Dim dtmEventoTarde          As Date:    dtmEventoTarde = TimeSerial(19, 30, 0)
    
    Dim intProximoEvento        As Integer  ' 1 para mañana, 2 para tarde
    Dim intTiempoEspera         As Integer  ' Los minutos que faltan hasta la próxima ejecución
    Dim intNuevoTiempo          As Integer  ' Minutos para el nuevo cronometro
    
    ' Miramos si ahora es el momento de la mañana
    If Format(Time, "hh:nn") = Format(dtmEventoMañana, "hh:nn") Then
        ' AQUI la función para el evento de la mañana
        ' Establecemos el cronómetro a 1 hora y salimos
        Me.TimerInterval = 1 * 60 * 1000
        Exit Function
    End If
    
    ' Miramos si ahora es el momento de la tarde
    If Format(Time, "hh:nn") = Format(dtmEventoTarde, "hh:nn") Then
        ' AQUI la función para el evento de la tarde
        ' Establecemos el cronómetro a 1 hora y salimos
        Me.TimerInterval = 1 * 60 * 1000
        Exit Function
    End If
    
    ' En este punto no se ha ejecutado ninguno de los 2 eventos: estamos "entre-eventos"
    ' Calculamos cuál es el próximo evento
    ' Comprobamos cuantos minutos faltan hasta el próximo "lanzamiento"
    If CDbl(Time) < CDbl(dtmEventoMañana) Then
        intProximoEvento = 1
    Else
        intProximoEvento = 2
    End If
    
    ' Comprobamos cuantos minutos faltan hasta el próximo "lanzamiento"
    intTiempoEspera = DateDiff("n", CDbl(Time), CDbl(Choose(intProximoEvento, dtmEventoMañana, dtmEventoTarde)))
    Select Case intTiempoEspera
        Case Is < 5
            ' Menos de 5 minutos: cambiamos a 1 minuto
            intNuevoTiempo = 1
        Case Is < 60
            ' Menos de 1 hora: cambiamos a 5 minutos
            intNuevoTiempo = 5
        Case Else
            ' Mas de 1 hora: cambiamos a 1 hora
            intNuevoTiempo = 60
    End Select
    
    Me.TimerInterval = intNuevoTiempo * 60 * 1000

Escrito al vuelo. Los experimentos, con gaseosa.

Un saludo



-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: emijas
Fecha de publicación: 27/Enero/2020 a las 21:40
Gracias Xavi por tomarte el tiempo y la molestia de escribir un codigo especial para responder a mi pregunta.

Voy a adaptarlo a mi aplicacion.

Un Saludo


Publicado por: emijas
Fecha de publicación: 21/Febrero/2020 a las 12:19
Buenas Tardes

he usado el codigo subido por Xavi "escrito al vuelo" y salvo un pequeño retoque funciona perfectamente.

Pueden cerrar el hilo, 



Imprimir página | Cerrar ventana