Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   crear un tigger para que se dispare cuando cambie la fecha en firebird (https://www.clubdelphi.com/foros/showthread.php?t=79623)

n03l 23-07-2012 21:00:32

crear un tigger para que se dispare cuando cambie la fecha en firebird
 
Buenas , queria saver si me pueden decir si es posible crear un tigger para que se dispare cuando cambie la fecha del servidor firebird

tengo el siguiente codigo (Claro no funciona pero es mas o menos lo que pretendo hacer)

Código Delphi [-]
create trigger fechas for RDB$DATABASE active after CURRENT_DATE FROM RDB$DATABASE update
begin
post_event 'Fecha_a_actualizado';
end

tengo un programilla que se ejecuta en red y Lo que pretendo hacer con este disparador es manejar en todos los clientes la fecha que me entrega firebird



claro tambien puedo hacer lo siguiente
Código Delphi [-]
//crear un Qry con el siguiente codigo
QServerTime.SQL.ADD:='SELECT CURRENT_TIME AS HORA, CURRENT_DATE AS FECHA FROM RDB$DATABASE'

//y en un timer poner lo siguiente 

QServerTime.Open;
Label1.Caption := QServerTime.FieldByName('FECHA').AsString;
Label2.Caption := QServerTime.FieldByName('HORA').AsString;
QServerTime.Close;

pero no me parece factible estar consultando la fecha constantemente!!!!

saludos y gracias por su ayuda!!!

Casimiro Notevi 23-07-2012 22:15:26

Cita:

Empezado por n03l (Mensaje 437983)
Lo que pretendo hacer ... es manejar en todos los clientes la fecha que me entrega firebird

Código Delphi [-]
QServerTime.SQL.ADD:='SELECT CURRENT_TIME, CURRENT_DATE FROM RDB$DATABASE'

Así obtienes la fecha/hora del servidor, es eso lo que quieres, ¿no?, pues ya lo tienes, así de simple :)


Ten en cuenta que el trigger del que hablas estaría saltando siempre, continuamente, sin parar jamás, porque el tiempo no se detiene nunca :)

duilioisola 24-07-2012 12:29:17

Ten en cuenta que normalmente los ordendaores sincronizan su reloj mediante el servicio NTP (Network Time Protocol).
Esto hace que el reloj de tu ordenador y el de tu servidor sean iguales.
La excepción es cuando estás en diferentes zonas horarias, como cuando tienes un servidor en España y otro en Argentina.
La solución es fácil, solo debes tener en cuenta la diferencia horaria para tus cálculos.

Dicho esto, lo único que deberías tener es una "alarma" en tu aplicación y cuando sean las (00:00:00 + DiferenciaHoraria) lanzar el proceso que necesites.

n03l 24-07-2012 17:02:35

Ok gracias por contestar.
Les explico lo que pretendo hacer.

Código Delphi [-]
//crear un Qry con el siguiente codigo QServerTime.SQL.ADD:='SELECT CURRENT_TIME AS HORA, CURRENT_DATE AS FECHA FROM RDB$DATABASE'public
    tiempo:Ttime;
  fecha:Tdate;


procedure TForm1.FormCreate(Sender: TObject);
begin
{cuando abro la aplicacion consulto la fecha y hora que me entrega firebird}

QServerTime.Open;
fecha := StrToDate(QServerTime.FieldByName('FECHA').AsString);
tiempo := StrToTime(QServerTime.FieldByName('HORA').AsString);
QServerTime.Close;

end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
//(aqui manejo la hora);
tiempo:=tiempo+0.000012;
Label2.Caption:=TimeToStr(Tiempo);
end;


procedure TForm1.IBEvents1EventAlert(Sender: TObject; EventName: string;
  EventCount: Integer; var CancelAlerts: Boolean);
begin

if EventName='fecha_a_actualizado' then
begin
QServerTime.Open;
fecha := StrToDate(QServerTime.FieldByName('FECHA').AsString);
tiempo := StrToTime(QServerTime.FieldByName('HORA').AsString);
QServerTime.Close;
//con esto lo que pretendo hacer es que se dispare el evento solamente cuando e actualise la fecha del servidor firebird
end;

end;

En conclusion, el problema que tengo es que no se como crear el tigger, aunque casimiro_notevi me puso este codigo:
Código Delphi [-]
QServerTime.SQL.ADD:='SELECT CURRENT_TIME, CURRENT_DATE FROM RDB$DATABASE'

pero en verdad soy muy novato con los tigger y por mas que e intentado siempre me marca error

saludos y gracias...

Casimiro Notevi 24-07-2012 17:10:08

Olvídate de todo eso que has puesto :)



Y ahora... explica claramente lo que necesitas conseguir.

n03l 24-07-2012 17:24:15

lo que quiero esque todos clientes que se ejecuten en red manejen la misma fecha y hora del servidor firebird

teniendo en cuenta lo siguiente:
-Hay ocasiones en las que la fecha y hora del servidor firebird se ajusten de manera manual por una persona
-Hay clientes que podrian estar abiertos por varios dias.

saludos y gracias por contestar...

Casimiro Notevi 24-07-2012 18:21:51

Cita:

Empezado por n03l
- Hay ocasiones en las que la fecha y hora del servidor firebird se ajusten de manera manual por una persona

Bien, para empezar, NADIE debe cambiar la fecha del servidor :confused:, es más, un servidor no debe estar al alcance de ningún trabajador "normal" de la empresa.
En todo caso deja que el propio servidor se ajuste la hora automáticamente conectándose a un servidor horario, eso lo mantendrá siempre perfecto, tal y como ha indicado antes duilioisola.

Cita:

Empezado por n03l
lo que quiero esque todos clientes que se ejecuten en red manejen la misma fecha y hora del servidor firebird

Para eso solamente debes consultar la fecha y hora del servidor.

Cita:

Empezado por n03l
-Hay clientes que podrian estar abiertos por varios dias.

Como si están mil años, no importa, cada vez que hace falta saber la fecha y hora sólamente tienes que consultarla al servidor.


¿Cómo consultar la fecha y hora del servidor donde está instalado firebird?, pues es fácil, tienes diversas formas, esta es una de ellas.

Puedes tener funciones distintas para las fecha, hora y fechahora, ejemplo:

Código Delphi [-]
function getFechaServidor:TDateTime;
begin
  Result := SelectDBmain('CURRENT_DATE','RDB$DATABASE')
end;

function getHoraServidor:TDateTime;
begin
  Result := SelectDBmain('CURRENT_TIME','RDB$DATABASE')
end;

function getFechaHoraServidor:TDateTime;
begin
  Result := SelectDBmain('CURRENT_TIMESTAMP','RDB$DATABASE')
end;

Una función común para no repetir el mismo código en cada una de las funciones anteriores:
Código Delphi [-]
function SelectDBmain(cCampo,cTabla:string;cCondicion:string=''):Variant;
var
  Q : TQuery;
begin
  Q := TQuery.Create(nil);
  Q.Database := DMmain.DBmain;  // <-  tu componente de base de datos
  Q.Close;
  Q.SQL.Text:='select '+cCampo+' from '+cTabla
  Q.ExecQuery;
  Result:=Q.Fields[0].AsVariant;
  Q.Close;  
  FreeAndNil(Q);  
end;

Y para usarlo, por ejemplo, desde un botón, para presentar el dato en un tdatetime:

Código Delphi [-]
procedure TForm1.bt1Click(Sender: TObject);
begin
  if edFecha.Focused then  // <- componente de fecha, por ejemplo
    edFecha.Date := getFechaServidor;
end;

O simplemente para mostrar un mensaje:
Código Delphi [-]
procedure TForm1.bt2Click(Sender: TObject);
begin
  ShowMessage( FormatDateTime('dd.mm.yyyy hh:nn:ss', getFechaServidor) );  
end;

Espero que te sirva.


La franja horaria es GMT +2. Ahora son las 23:53:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi