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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2007
Avatar de fedelphi
fedelphi fedelphi is offline
Miembro
 
Registrado: abr 2006
Ubicación: Santa Fe
Posts: 122
Poder: 19
fedelphi Va por buen camino
Cita:
Empezado por Lepe

PD: Para entender como funcionan, deberías leer los pdf acerca de las transacciones de Interbase, que son aplicables a Firebird.
Lepe me podrias decir donde se encuentran estos pdf?
__________________
De lo que hay no falta nada!!!
Responder Con Cita
  #2  
Antiguo 05-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
www.ibphoenix.com apartado de Documentacion. Eso si, vienen en inglés.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 05-05-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Yo he descarga este artículo

Ha decir verdad, ya no me acuerdo como llegué a él... Si vi el enlace en un post o si fue buscando en google...

Tal vez te pueda interesar esta busqueda realizado en google.

Saludos,
PD: A también me está costando un poquito entender esto de las transacciones.

__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 19-05-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Me uno al tema

Estoy tratando de hacer que se ejecute el evento, pero no me funciona.

Uso D7, FB 2.0.1 y MDO.

En la base de datos defino el procedimiento:

Código SQL [-]
CREATE PROCEDURE ACTUALIZARCITAS 
as
begin
  post_event 'ACT_CITAS';
  suspend;
end^
GRANT EXECUTE ON PROCEDURE ACTUALIZARCITAS TO SYSDBA;

// ¿ que hace la ultima línea ?

Que lanzo despues con varios triggers:

Código SQL [-]
CREATE TRIGGER CI_CITAS_EVENT_NUEVA FOR CI_CITAS
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
EXECUTE PROCEDURE ACTUALIZARCITAS;
end

en delphi pongo un componente: MDOEvents con la base de datos asignada

Código Delphi [-]
procedure TfCitas.MDOEvents1EventAlert(Sender: TObject; EventName: String;
  EventCount: Integer; var CancelAlerts: Boolean);
begin
If EventName = 'ACT_CITAS' then
   MostrarCitas;  // = refresh
end;

Pero cuando incorporo una nueva cita (INSERT) desde otro módulo de la aplicación (otro exe) no ocurre el evento.

Lo único "raro" es que en mi datamodule defino 2 transacciones Una "Read commited" (read_committed, rec_version, nowait) para los SELECT y otra Read-Write table stability (write, consistency) para insert, update y delete.

¿me falta algo?

Edito:

inclui esto y tampoco funciona:

Código Delphi [-]
procedure TfCitas.FormActivate(Sender: TObject);
begin
If Not MDOEvents1.Registered Then
   MDOEvents1.Registered := true;
end;
__________________
Sitrico

Última edición por sitrico fecha: 19-05-2007 a las 08:26:40.
Responder Con Cita
  #5  
Antiguo 19-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
No necesitas el procedimiento almacenado. Con el disparador sobra:
Código SQL [-]
CREATE TRIGGER CI_CITAS_EVENT_NUEVA FOR CI_CITAS
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
 post_event 'ACT_CITAS'
end

En el mdoRegisterEvent, necesitas añadir el evento que quieres esperar, dado que, en la base de datos puedes lanzar muchos eventos, pero una ventana de tu programa solo quiere enterarse de uno de ellos:
Código Delphi [-]
// solo hace falta registrarlo 1 vez, por ejemplo, al crear el form

const CitaModificada = 'ACT_CITAS';


procedure TfCitas.FormCreate(Sender: TObject);
begin
with mdoevents1 do
begin
  Add(CitaModificada);

If Not MDOEvents1.Registered Then
   MDOEvents1.Registered := true;
end;

Como sabrás, el evento lanzado por el SGBBDD lo recogerá todas las aplicaciones delphi que esten accediendo a esa Base de datos, pero solo le llegará el mensaje a la ventana que tenga registrado dicho mensaje.

Como has visto, he definido una constante CitaModificada, es muy fácil equivocarse al escribir el string, y con una sola letra que varíe, delphi no recibirá dicho evento, y empezarás a creer que Firebird no funciona bien o le echas la culpa a MDO. Usando constantes, te aseguras de no cometer errores mecanográficos. Por el bien de tu salud mental, te lo recomiendo encarecidamente .

El evento mdoEventAlert1.OnEvent lo tienes bien definido, por ello no comento nada más.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 19-05-2007 a las 09:06:02.
Responder Con Cita
  #6  
Antiguo 19-05-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Gracias Lepe, con ese cambio ya se disparan los eventos

Ahora me genera unos errores:
System error 5 acceso denegado (creo que asociados al nowait de la transacción).

Si lo quito me aparece lock conflic on mo wait transaction
__________________
Sitrico
Responder Con Cita
  #7  
Antiguo 20-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Ya ese tema es totalmente distinto, y puede ser precisamente derivado de los mensajes.

Abres un dataset, que de alguna forma depende de las citas (foreign key, por ejemplo), después abres otro dataset que hace un update a la tabla citas, se dispara el mensaje, se recibe el EventAlert que cierra y abre el dataset de citas.... pero el primer dataset, que se abrió antes no se ha cerrado, puesto que dependía de las citas, tendrás esos conflictos.

Bueno, sé que lo he explicado fatal, pero vamos, la solución consiste en cerrar todos los datasets en el mismo orden en que se abrieron, incluso si se recibe un EventAlert.

Tampoco puedo asegurar al 100 % lo dicho, pero creo que hay "cierta lógica" en el comentario, ya que una transacción más antigua (la del primer dataset) no ha sido confirmada ni rechazada, mientras una más nueva (la tabla citas) si lo ha hecho.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 20-05-2007 a las 10:49:11.
Responder Con Cita
  #8  
Antiguo 20-05-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
El problema está aqui:

Código Delphi [-]
   With l do
      Begin
      SQL.Clear;
      SQL.Add('SELECT  IDCITA, p.Cedula, P.IDPACIENTE, P.nombre, p.apellido, p.TLFCEL, p.SEXO, p.FCHNACIMIENTO,');
      SQL.Add('        FCHCITA, HORA, DURACION, IDAREA, IDESPECIALISTA,');
      SQL.Add('        STATUSCITA, OBSERVACIONES');
      SQL.Add('FROM    CI_CITAS C, dg_pacientes P');
      SQL.Add('Where p.idpaciente = c.idpaciente And FCHCITA = :FCHCITA AND IdAREA = :IDAREA');
      ParamByName('FCHCITA').AsDateTime := tp.Fecha;
      ParamByName('IDAREA').AsInteger := IdArea;
      Open; // aqui comienza el problema
      tp.MostrarCitasDelDia(l);  // While not eof do....
      Close;
      End;

Este es el ciclo crítico del Refresh (MostrarCitas) no se por que extraña razón al usar el debugger en la línea del Open; al presionar f8 o f7 en lugar de saltar a la siguiente línea (tp.MostrarCitasDelDia(c); ) salta otra vez al open; y de ahí en adelante sigue un comportamiento erratico.

Como se puede ver mis consultas están cerradas hasta tanto no se necesiten, (de hecho el código SQL lo coloque para el ejemplo pero se carga una sola vez en OnCreate);

Busqué eventos asociados a la DB, transaccion o query que pudieran cambiar la secuencia lógica pero NADA. ¿ Alguna idea ?

Nota: En otras ocaciones mi delphi ha tenido esos comportamiento erraticos pero generalmente se asociaban a eventos "inoportunos".

¿Hay alguna manera de forzar una sección de código para evitar que su ejecución sea interrumpida, algo como "DisableEvents"?

Por ahora no me quedo otra opción que "apagar" los eventos y usar una alarma (60seg) para refrescar automáticamente la información
__________________
Sitrico

Última edición por sitrico fecha: 20-05-2007 a las 22:49:29.
Responder Con Cita
Respuesta



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
refresco de datos en red valdorre Conexión con bases de datos 8 05-05-2007 02:16:07
Refresco datos FireBird Io Conexión con bases de datos 2 06-08-2005 18:44:59
Refresco de Datos en Interbase PINO72 Firebird e Interbase 6 14-02-2005 18:21:30
Refresco de Datos con ADO Ivr Conexión con bases de datos 1 15-10-2004 14:11:07
Refresco de datos con ADO fjcg02 Conexión con bases de datos 2 23-01-2004 14:03:24


La franja horaria es GMT +2. Ahora son las 22:43:15.


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