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 06-02-2013
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
Question Problema raro con Firebird

Hola a todos:
Trabajo con D5, firebird 2.1 y componentes FibPlus.
El problema raro es el siguiente y sólo ocurre cuando trato de conectar con una BD Firebird remota: (En local funciona perfectamente)
la ruta de conexion que utilizo es: xxx.xxx.xxx.xxx:C:\Directorio\BaseDeDatos.FDB siendo xxx.xxx.xxx.xxx la ip pública de internet.
El programa es un mantenimiento de clientes que tiene un componente EventAlerter de Fibplus para que cuando haya algún cambio en los datos del cliente actualice automáticamente el DBGrid de presentación. En la Base de datos es un trigger que está así:
Código Delphi [-]
SET TERM ^ ;

CREATE TRIGGER ACTUALIZA_CLIENTES FOR CLIENTES
ACTIVE AFTER INSERT OR UPDATE OR DELETE
POSITION 0
AS
BEGIN
 POST_EVENT 'ACTUALIZA_CLIENTES';
END^

SET TERM ; ^

y en el programa, en el OnShow tengo:

Código Delphi [-]
Eventos1.Events.Add('ACTUALIZA_CLIENTES');
Eventos1.RegisterEvents;

en el OnClose tengo:
Código Delphi [-]
Eventos1.UnregisterEvents;

y en el OnEventAlerter del componente tengo:
Código Delphi [-]
        if EventName='ACTUALIZA_CLIENTES' then
          begin
              Clientes.Refresh;
          end;

Pues bien, si pongo un "exit" al principio de el OnShow y no registra los eventos, el programa funciona perfectamente, sin embargo, si el programa entra por ahí y los registra, se queda colgado en el CLOSE cuando hace la siguiente consulta de clientes:

Código Delphi [-]
SQL := 'Select * from Clientes ORDER BY NOMBRE ASCENDING';

Clientes.CLose;
if pFIBTransaction1.InTransaction then pFIBTransaction1.CommitRetaining;
pFIBTransaction1.StartTransaction;
CLIENTES.SelectSQL.Clear;
CLIENTES.SelectSQL.Add(SQL);
CLIENTES.QSelect.ExecQuery;
pFIBtransaction1.CommitRetaining;
Clientes.Open;

Repito, sólo cuando registra los eventos.

¿Alguien puede ayudarme?
Gracias.
Responder Con Cita
  #2  
Antiguo 06-02-2013
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
Ese tema se ha tratado en diversas ocasiones, el problema es que los "eventos" se transmiten por otros puertos que no es el 3050.
Haz una búsqueda por post_event a ver si lo encuentras.
Responder Con Cita
  #3  
Antiguo 06-02-2013
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
Gracias Casimiro, me pongo a ello como un loco.
Responder Con Cita
  #4  
Antiguo 06-02-2013
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
También puede ser que estés registrando más de una vez el evento.
El OnShow se ejecuta cada vez que se muestra el formulario (si minimizas y vuelves a maximizarlo o si haces un Form.Hide; Form.Show.
Quizás debas poner el registro de eventos en OnActivate.

También puede ser que se esté ejecutando el evento al mismo tiempo que haces un Close y el evento trate de hacer un Refresh.
Para probar puedes crear una variable global a la unidad

Código Delphi [-]
var
   TenerEnCuentaEventos : Boolean;

OnCreate
begin
   TenerEnCuentaEventos := True;
end;

OnEvent
begin
   if ((TenerEnCuentaEventos) and (EventName='ACTUALIZA_CLIENTES')) then
   begin
      Clientes.Refresh;
   end;
end;

Consulta
begin
   SQL := 'Select * from Clientes ORDER BY NOMBRE ASCENDING';

   // "desactivo" eventos
   TenerEnCuentaEventos := False;
   try
      Clientes.CLose;
      if pFIBTransaction1.InTransaction then pFIBTransaction1.CommitRetaining;
      pFIBTransaction1.StartTransaction;
      CLIENTES.SelectSQL.Clear;
      CLIENTES.SelectSQL.Add(SQL);
      CLIENTES.QSelect.ExecQuery;
      pFIBtransaction1.CommitRetaining;
      Clientes.Open;
   finally
      // "activo" nuevamente los eventos
      TenerEnCuentaEventos := True;
   end;
end;
Responder Con Cita
  #5  
Antiguo 06-02-2013
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
Por fin solucionado:

En el equipo donde está la BAse de Datos:

Con el Firebird.Config: Establecer el "Remote Auxc Port" por ejemplo 3051
En el Router: Abrir el puerto 3051 y direccionarlo a la IP local del Servidor donde esta la base de datos 192.168.X.XXX
Firewall: permitir/abrir el puerto 3051

Los programas no hay que tocarlos de como registran e interceptan el evento en los anteriores post.

Con esto ya se puede acceder remotamente

Gracias
Responder Con Cita
  #6  
Antiguo 06-02-2013
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
Diuisola
Tal como he comentado, el problema de la conexión (fisica) está resuelto, pero con tu aporte creo que ya está perfecto. Tendré en cuenta tus recomendaciones.
Gracias
Responder Con Cita
  #7  
Antiguo 06-02-2013
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En el OnShow y Activate se puede hacer un lío, creo lo mejor es en el OnCreate del Form, (así lo tengo yo).

En el OnClose ( o quizás en el OnCloseQuery si preguntas al usuario), antes de nada, quita el registro de eventos, así no interfiere con el resto de código.

Te aconsejo no juegues mucho con el RegisterEvents y el UnRegisterEvents porque pueden hacer pupa (lanzar excepciones), por eso, actívalos una vez y quítalo una vez nada más.

Además recuerda que solo puedes registrar 15 eventos por cada EventAlert.

Edito: Yo, no suelo hacer eso con los eventos... imagina que uno está editando un registro y le viene un mensaje de refresco... adios edición. Sí puedes poner un botón de refresco, o bien un mensaje de que hay nuevos registros desde la red. Si no usas controles DBaware, entonces sí puedes hacerlo perfectamente.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
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
error raro en firebird leo_037 Firebird e Interbase 10 03-02-2008 20:22:23
Caso raro Firebird consume muchos recursos AGAG4 Firebird e Interbase 4 23-02-2007 02:10:19
Error Firebird sin Explicacion , Demasiado Raro hot1974 Firebird e Interbase 10 05-10-2006 16:44:35
Comportamiento raro de Firebird en Starting With AGAG4 Firebird e Interbase 6 07-06-2006 17:10:56
URGENTE: Error raro en Firebird burasu Firebird e Interbase 3 14-07-2004 14:19:25


La franja horaria es GMT +2. Ahora son las 19:48:27.


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