Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-07-2012
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
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!!!
Responder Con Cita
  #2  
Antiguo 23-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por n03l Ver Mensaje
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
Responder Con Cita
  #3  
Antiguo 24-07-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #4  
Antiguo 24-07-2012
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
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...
Responder Con Cita
  #5  
Antiguo 24-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Olvídate de todo eso que has puesto



Y ahora... explica claramente lo que necesitas conseguir.
Responder Con Cita
  #6  
Antiguo 24-07-2012
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
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...
Responder Con Cita
  #7  
Antiguo 24-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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 , 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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear un DataModule para Firebird claudiorene Firebird e Interbase 1 13-07-2007 19:01:09
Ayuda para crear usuario en firebird antony_prg JAVA 8 14-07-2006 22:29:43
crear usuarios para Firebird chikitolina Firebird e Interbase 1 03-05-2005 19:20:46
Error en sql cuando cambie de version IVAND Firebird e Interbase 4 03-05-2005 02:44:34
Duda con un tigger Gregory Mazon Firebird e Interbase 2 19-08-2003 17:31:21


La franja horaria es GMT +2. Ahora son las 23:38:34.


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
Copyright 1996-2007 Club Delphi