PDA

Ver la Versión Completa : ejecutar codigo de delphi cada 24 horas


richy08
04-06-2010, 23:03:55
buenos dias compañeros tengo una duda y no encuentro como atacarla, estamos por terminar una aplicacion que controla la funcionalidad de un hotel, en diho sistema existe un proceso que es llamado night audit, el cual una persona a la media noche tiene que ira presionar un boton para que cargue las noches y consumos de itinerario que halla tenido el huesped durante el dia, tambien corre procesos que hacen interfax con un pbx, y un punto de restaurant llamado aldelo, pero ahora nos pide el cliente que dicho proceso se ejecute automaticamente, inicialmente los dodigos los mande a procedimientos almacenados los cuales puedo controlar la hora en que quiero que se ejecuten pero las interfaces pbx, aldelo extraigo datos de otras bases de datos por lo cual un procedimiento almacenado no me sirve, he estado viendo el timer de delphi pero ese componente no me resuelve el problema o al menos no he encontrado la forma de utilizarlo, la pregunta es existe la posibilidad de especificarle a delphi que corra dicho codigo diario a las 12 de la noche gracias por cualquier comentario.

Casimiro Notevi
04-06-2010, 23:12:04
Puedes hacerlo de varias formas, con timers o sin ellos, por ejemplo con decodetime, échale un vistazo a esa función.

richy08
04-06-2010, 23:16:07
gracias casimiro voy a buscar info sobre este comando

Casimiro Notevi
04-06-2010, 23:30:48
Mira este (http://www.clubdelphi.com/foros/showpost.php?p=342572&postcount=2) hilo.

richy08
04-06-2010, 23:46:11
gracias casimiro ya tengo un timer en mi aplicacion que me muestra la hora y fecha en el sistema pero este timer lo tengo que se este actualizando cada segundo ahora lo que pretendo hacer es que este leyendo una tabla de mi base de datos no resultaria esto muy costoso para la aplicacion? anexo el codigo

procedure TFrm_Menu.RelojTimer(Sender: TObject);
var d,m,a:Word;
mes,dia:String;
begin
Decodedate(now,a,m,d);
case m of
1 :mes:='January' ;
2 :mes:='February' ;
3 :mes:='March' ;
4 :mes:='April' ;
5 :mes:='May' ;
6 :mes:='June' ;
7 :mes:='July' ;
8 :mes:='August' ;
9 :mes:='September' ;
10 :mes:='October' ;
11 :mes:='November' ;
12 :mes:='December' ;
end;

case DayOfWeek(now) of
1 :dia:='Sunday' ;
2 :dia:='Monday' ;
3 :dia:='Tuesday' ;
4 :dia:='Wednesday' ;
5 :dia:='Thursday' ;
6 :dia:='Friday' ;
7 :dia:='Saturday' ;
end;
stb_panel.Panels[0].Text:=Application.Hint;
stb_panel.Panels[1].Text:='Date: '+dia+', '+IntToStr(d)+' of '+mes+' of '+IntToStr(a);
stb_panel.Panels[2].Text:='Time: '+TimeToStr(Time);
//pretendo hacer algo asi
Qry_ultimacorrida.close;
qry_ultimacorrida.open;
MyDate := EncodeDate(a,m,d);
if Qry_ultimacorrida.fieldbyname('fecha').asdatetime>=muydate then
begin
//desencadena proceso
end;
end;

Casimiro Notevi
05-06-2010, 00:21:08
Pero si sólo quieres que se ejecute a una hora determinada, entonces te sobra bastante de ese código, quedaría algo así como:


private
var
bProcesado : boolean; <- poner a false en el oncreate o en onshow

...
...
...

procedure TFrm_Menu.RelojTimer(Sender: TObject);
var
ho,mi,se,mm : Word;
bProcesado : boolean;
begin
bProcesado := false;
Decodetime(now, ho,mi,se,mm);
if (ho=0) and (mi=0) and (se=0) and (not bProcesado) then
HacerLoqueTengasQueHacer();
end;


procedure HacerLoQueTengasQueHacer();
begin
loquesea;
otracosa;
//
bProcesado := true;
end;





La variable bProcesado sirve por si tarda más de un segundo en HacerLoQueTengasQueHacer que no lo vuelva a ejecutar.

richy08
05-06-2010, 00:47:10
pues en realidad no el codigo que puse lo hice para darle presentacion a la aplicacion indicando el tiempo y la fecha en la que estamos, muchas gracias por tu ayuda me diste una luz para poder programarlo mil gracias por tu tiempo

Casimiro Notevi
05-06-2010, 00:59:06
Para eso puedes simplificarlo con los parámetros de FormatDateTime, ejemplos:

stb_panel.Panels[1].Text:= FormatDateTime('dd-mm-yyyy hh:nn',Now);

stb_panel.Panels[1].Text:= FormatDateTime('ddd. dd/mm/yyyy hh:nn',Now);

richy08
05-06-2010, 01:05:43
si tiens mucha razon no lo habia pensado asi

richy08
05-06-2010, 20:38:40
Pero si sólo quieres que se ejecute a una hora determinada, entonces te sobra bastante de ese código, quedaría algo así como:

Código Delphi [-] (http://www.clubdelphi.com/foros/#)private var bProcesado : boolean; <- poner a false en el oncreate o en onshow ... ... ... procedure TFrm_Menu.RelojTimer(Sender: TObject); var ho,mi,se,mm : Word; bProcesado : boolean; begin bProcesado := false; Decodetime(now, ho,mi,se,mm); if (ho=0) and (mi=0) and (se=0) and (not bProcesado) then HacerLoqueTengasQueHacer(); end; procedure HacerLoQueTengasQueHacer(); begin loquesea; otracosa; // bProcesado := true; end;


La variable bProcesado sirve por si tarda más de un segundo en HacerLoQueTengasQueHacer que no lo vuelva a ejecutar.

me quede pensando en la parte del codigo donde usas la variable bProcesado, la idea es que la aplicacion se este ejecutando siempre asi es que no volveria a ejecutarse hasta que se cerrara y se abriera el programa :confused: pero vi algo que sifnifica esto
(ho=0) and (mi=0) and (se=0) = 12:00 de la mañana si es asi esto
indica (ho=59) and (mi=59) and (se=59) esto seria las
12 de la noche??

gracias :D

arturom
05-06-2010, 20:46:08
Hola,
ho=0 son las 0 horas,
mi=0 es el minuto 0,
se=0 es el segundo 0,
00:00:00 son las 12 de la noche.
Como no existe la hora 59, pero si los 59 minutos y 59 segundos, si usas, por ejemplo, las 23:59:59 es justo un segundo antes de la media noche.
Las doce del medio día serán entonces las 12:00:00

Saludos

richy08
05-06-2010, 20:52:54
Hola,
no existe la hora 59, pero si los 59 minutos y 59 segundos, si usas, por ejemplo, las 23:59:59 es justo un segundo antes de la media noche.

Saludos
tienes razon jejej:p bueno ya es fin de semana creo que con esto ya puedo segui adelante gracios a los dos buen fin de semana:D

Ñuño Martínez
07-06-2010, 10:33:21
Sé que llego tarde pero, ¿no sería mejor dejar que sea el sistema operativo quien se encargue? Programas un "cron" (o lo que sea que tenga Windows, que no lo recuerdo) y a correr...

richy08
07-06-2010, 16:38:22
ñuño martines pues si tiens razon seria una buea opcion:D