PDA

Ver la Versión Completa : crear un tigger para que se dispare cuando cambie la fecha en firebird


n03l
23-07-2012, 21:00:32
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)


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

//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
Lo que pretendo hacer ... es manejar en todos los clientes la fecha que me entrega firebird

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) (http://es.wikipedia.org/wiki/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.


//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:
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
- 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.

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.

-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:

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:
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:

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:
procedure TForm1.bt2Click(Sender: TObject);
begin
ShowMessage( FormatDateTime('dd.mm.yyyy hh:nn:ss', getFechaServidor) );
end;


Espero que te sirva.