** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Consulta sobre Form_Timer
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoConsulta sobre Form_Timer

 Responder Responder
Autor
Mensaje
emijas Ver desplegable
Asiduo
Asiduo


Unido: 03/Junio/2004
Localización: España
Estado: Sin conexión
Puntos: 399
Enlace directo a este mensaje Tema: Consulta sobre Form_Timer
    Enviado: 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
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

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

Mi web
Arriba
emijas Ver desplegable
Asiduo
Asiduo


Unido: 03/Junio/2004
Localización: España
Estado: Sin conexión
Puntos: 399
Enlace directo a este mensaje Enviado: 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
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 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
Un Saludo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

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

Mi web
Arriba
emijas Ver desplegable
Asiduo
Asiduo


Unido: 03/Junio/2004
Localización: España
Estado: Sin conexión
Puntos: 399
Enlace directo a este mensaje Enviado: 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
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

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

Mi web
Arriba
emijas Ver desplegable
Asiduo
Asiduo


Unido: 03/Junio/2004
Localización: España
Estado: Sin conexión
Puntos: 399
Enlace directo a este mensaje Enviado: 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
Arriba
emijas Ver desplegable
Asiduo
Asiduo


Unido: 03/Junio/2004
Localización: España
Estado: Sin conexión
Puntos: 399
Enlace directo a este mensaje Enviado: 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, 
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable