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)
-   -   problema al refrescar tabla en firebird (https://www.clubdelphi.com/foros/showthread.php?t=81815)

anubis 20-12-2012 15:50:02

problema al refrescar tabla en firebird
 
Hola de nuevo,

Tal y como me habíais contestado en otro post a la hora de insertar, modificar.... un registro en una aplicación y que se pudiera ver reflejado en otro pc con event, si funciona si se dispara un mensaje de que se ha insertado un regisro, pero lo que no funciona es el refresh, ni abriendo ni cerrando la tabla, sigo teniendo que cerrar la aplicacion en el otro pc y volverla a abrir para ver reflejado el nuevo registro.

No se si se me olvida algo para que se actualicen los datos pero creo que ya probe todo, incluso poner la tabla como edit y luego post y applyupdates.

Alguna sugerencia?

saludos y gracias

ecfisa 20-12-2012 16:00:28

Hola anubis.

Luego de la acción, ¿ Realizas Commit o CommitRetaining sobre la tabla en cuestión ?

Saludos.

MartinS 20-12-2012 16:08:48

Hola: Parto del supuesto después del commit tal como te pregunta ecfisa y supongo que has creado un trigger para firebird para tal caso, por ejemplo:

Código SQL [-]
CREATE TRIGGER POST_NEW_REG FOR CLIENTES
ACTIVE AFTER INSERT
POSITION 0
AS
BEGIN
 
  POST_EVENT 'new_reg';
END


Obviamente el trigger anterior se dispara al momento de ingresar uno nuevo y logicamente despues del commit.

Luego con la utilizacion de un IbEvents haces:

Cuando se crea el formulario:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  IBEvents1.Events.Clear;
  IBEvents1.Events.Add('new_reg');
  IBEvents1.RegisterEvents;
  //....
end;

y en el event alert:

Código Delphi [-]
procedure TDM.IBEvents1EventAlert(Sender: TObject; EventName: string;
  EventCount: Integer; var CancelAlerts: Boolean);
begin
  if EventName = 'new_reg' then
  Begin
  // ShowMessage('Nuevo registro');
  SClientes.DataSet.Refresh;
  End;  
end;

donde preguntamos si viene el evento new_reg hacemos el refresco del datasource que enlaza la grilla

Se enuncia que firebird usa otro puerto adicional al 3050 para el procesamiento de eventos y lo asigna arbitrariamente. Estos es cierto y en su caso se configura editando el Firebird.conf en RemoteAuxPort a 6020 por ejemplo, habilita ese puerto en el firewall y listo.-

Saludos

anubis 20-12-2012 18:35:46

Gracias por contestar,

Si, eso ya lo hice, si me salta el event cuando inserto un registro, pero el refresh no hace nada.

ecfisa 20-12-2012 19:08:17

Hola anubis.

No hay dudas que el evento se dispara y es recibido correctamente... ¿ En que componente no ves reflejado los cambios ?

Saludos.

anubis 20-12-2012 20:24:51

Si, gracias.

En este caso en un dbgrid relacionado con el query.
en el pc1 doy de alta el registro, le aplico post y resfresh, y lo veo en el dbgrid.
en el pc2 cuando he dado de alta en el pc1 el registro, salta el evento le aplico refresh y no se actualiza en el dbgrid del pc2, tengo que cerrar la aplicacion en el pc1 y volverla a abrir para que aparezca el cambio.

ecfisa 20-12-2012 20:38:51

Cita:

Empezado por anubis (Mensaje 452239)
en el pc1 doy de alta el registro, le aplico post y resfresh, y lo veo en el dbgrid

Sólo me guío por lo que comentas en esta línea ya que no he visto el código, pero el Refresh se tendría que realizar en la captura del evento. Por ejemplo luego de mostrar el mensaje de aviso.

Saludos.

anubis 20-12-2012 20:57:30

Si, tienes razon, pero es lo que hago, tanto cuando lo inserto en el pc1, como cuando salta el evento en el pc2, poner un zquery.refresh.

De todas formas, entiendo que el evento y lo que viene despues son independientes, por lo que el zquery.refresh ya lo he querido usar en otras partes de la aplicacion con los mismos resultados, el problema ya no es en si el evento, que si funciona, sino el zquery.refresh, que debiera de funcionar en cualquier parte de la aplicacion que lo coloque y se active, aunque sea tan solo asignado a un boton.

esto lo digo porque ya estuve haciendo pruebas de diferentes formas y no hay nada

ecfisa 20-12-2012 21:12:26

Hola.
Cita:

De todas formas, entiendo que el evento y lo que viene despues son independientes
Si totalmente. Es que pensé que el refresh lo deseabas como consecuencia de la captura del evento.

Lo que comentas es un comportamiento extraño, con los componentes IBX siempre me ha funcionado correctamente.
Tal vez haya que ajustar algún detalle en los componentes Zeos, pero lamento no poder ayudarte con ellos por no conocerlos.

Saludos. :)

anubis 20-12-2012 22:36:24

no te preocupes.

Ya cree otra aplicacion pequeña con lo basico para probar y tampoco refresca los nuevos datos, si funciona el event.

Algo se me escapa.
Y si con los compentes zeos hay que modificar algo no se.

Casimiro Notevi 20-12-2012 22:49:27

Por decir algo.... ¿estás seguro que el dbgrid está asociado al datasource adecuado?

anubis 20-12-2012 23:03:33

gracias casimiro,

si, es correcto, porque solo estoy haciendo pruebas con un solo query, y en el programa de prueba solo he puesto el zconnection, un datasource un query el dbgrid, para ver si actualiza con los componentes minimos pero tampoco.

Dentro de la misma aplicacion si actualiza incluso sin refresh pero en la otra, una vez hecha la conexion con el zconnection de primera y teniendola abierta, como que ya no quiere recoger esos datos nuevos y el event si trabaja.

Tambien he probado como dice caral en otro post, en cerrar y abrir el query. pero nada, no funciona.
el problema es que no se trae los registros nuevos.

Casimiro Notevi 20-12-2012 23:43:14

Veamos, te lo han indicado 2 veces y creo que no has contestado: se supone que haces commit tras hacer post


Y después de contestar a lo anterior, pon el código que usas, explica un poco los componentes, propiedades, valores, etc.

anubis 21-12-2012 00:20:49

Si tienes razon, el commit es autocommit, de hecho cuando inserto un registro nuevo, queda la tabla actualizada, y eso lo veo abriendo el flamerobin y veo que el registro está ahi.

con la aplicacion nueva, no tengo codigo, le aplico nada mas el zquery1.refresh, tal y como indicais, enel momento que se dispara el evento.

Solo he puesto, un zconnection, un zquery, datasource, y un dbgrid.

Estoy usando componentes zeos 7, lazarus 1.1 y firebird 2.5.

Casimiro Notevi 21-12-2012 00:42:00

Cita:

Empezado por anubis (Mensaje 452267)
con la aplicacion nueva, no tengo codigo, le aplico nada mas el zquery1.refresh, tal y como indicais, enel momento que se dispara el evento.

¿Qué quieres decir con "la aplicación nueva"?, ¿que tienes una anterior que funciona y una nueva que no te funciona?

anubis 21-12-2012 02:04:11

Si, perdon.

Tengo una aplicación en el pc1 en el que meto los registros nuevos, y en el pc2, la aplicacion en la que debe verse esos registros nuevos sin cerrar el programa o desconectar y conectar a la base de datos.

La cuestion, para probar, hice otra aplicacion en el pc2 sencilla, con un zconnection, zquery, datasource y un dbgrid, y un boton en que tengo puesto, zquery1.refresh;

Uso el autocommit del zconnection.

anubis 21-12-2012 03:29:45

Perdon, ya encontre lo que me andaba fallando.

zconnection.transacisolationlevel lo tenia puesto en tinone, y lo he cambiado a tireadcommitted, con eso va perfecto y actualiza.


gracias a todos.

saludos.

Casimiro Notevi 21-12-2012 11:58:01

Se suponía que era algo de eso.

marcial 05-02-2013 20:23:18

Hola
Yo tuve un problema parecido con un programa que, además de los EventAlert tenia el componente ApplicationsEvents (que no se si será tu caso). Le quité el componente ApplicationEvents sustituyendo su código por otra cosa y solucioné el problema.

Casimiro Notevi 05-02-2013 20:27:08

Cita:

Empezado por marcial (Mensaje 454572)
.. sustituyendo su código por otra cosa ..

¿Por otra cosa? :eek:


La franja horaria es GMT +2. Ahora son las 07:20:14.

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