Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-06-2007
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Actualizacion BD

Hola tengo otro problema.....

Fijense que estoy trabajando con los compomentes de IB, y estoy manejando una base de datos hecha en FireBird, tengo varios clientes que estan haciendo actualzaciones a la base de datos.....pero sucede que esas actualizaciones no las puede ver otro usuario, es decir si un cliente distinto al que hace la actulizacion quiere ver lo que actualizo, no se presenta dicha informacion, se tiene que salir del sistema y volver a entrar para ver las actualizaciones....

Alguien sabe como puedo resolver este problema....que las actualizaciones puedan ser consultadas por otro usuario, sin necesidad de salir y volver a entrar al sistema ?....

Gracias !!!
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #2  
Antiguo 16-06-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Una opción sería que tengas un botón de actualización o refresco. de esa manera el usuario no tendría necesidad de salir del sistema.

No te consejo un enfoque de refrescado automático, pues imagina que tienes 20, 30 o 100 usuarios concurrentes en la base de datos. se vería horrible un grid moviendose cada n segundos para actualizar el contenido de la tabla.

Un mejor enfoque sería que los usuarios seleccionaran un conjunto de opciones y presionaran un botón para ver los registros que con concordaran con las opciones de filtrado.

Mi muy particular y humilde punto de vista.

Suerte
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 26-06-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 17
gabrielkc Va por buen camino
Saludos

mmmm refrescado manual ???????????? por supuesto que no es igual o peor a que pollees tu bd cada x tiempo.

En firebird existe una maravilla que se llama eventos, creas un trigger y generas un evento que es detectado por tu aplicacion.

en el trigger del digamos After Insert pones como unica instruccion necesaria : POST EVENT 'NOMBRE_EVENTO'

y en tu aplicacion en delphi pones un IBEvents y registras el evento 'NOMBRE_EVENTO' en la lista de eventos que detectará dicho componente. Te mencionaría las ventajas de este esquema al de un boton de refrescado, pero creo que saltan a la vista.

En evento OnEventAlert del IBEvents detecta cuando se genera alguno de los eventos para los cuales se registró y en ese momento refrescarias tu pantalla.


Por cierto doy por echo que si estás usando transacciones correctamente, es decir si haces commit despues de insertar algún regisro y si inicias una nueva transaccion en cada select, sino.......... tienes que hacerlo

Última edición por gabrielkc fecha: 26-06-2007 a las 17:47:43.
Responder Con Cita
  #4  
Antiguo 26-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
El tema de Eventos (post_event) hay que manejarlo con cuidado, y más en entornos multiusuarios.

Si se tiene muchos usuarios realizando inserciones continuamente, el uso de Eventos puede ser peor que un Timer , imagina solo a 4 personas realizando inserciones a tuti pleni, el 5º usuario recibirá 4 u 8 mensajes en ... ¿menos de 1 minuto?

mRoman el hecho es que tendrás que usar un Commit cuando se guarden los cambios y acto seguido cerrar y abrir el dataset. De esta forma siempre tendrás los registros actualizados.

Si ahora tienen que salir del programa para ver los cambios, es porque abres los componentes IBX (TIBTables, TIbDataset, etc) al principio del programa y no los cierras hasta salir (o que uses CommitRetaining... hay muchas causas). Tendrás que implementar una filosofía distinta de actuación, y para ello, tendrás que estudiar el tema de Transacciones y concurrencia.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 30-06-2007
maro maro is offline
Miembro
 
Registrado: sep 2003
Ubicación: Sevilla
Posts: 104
Poder: 21
maro Va por buen camino
Hola,

Creo que el problema está en el aislamiento de transacciones.
Podrías revisar tu componente tIBTransaction, y configurar la propiedad Params, prueba con esto:

read_committed
rec_version
nowait


Un Saludo.
__________________
Maro. OutSourcing de programación con Delphi.
Responder Con Cita
  #6  
Antiguo 30-06-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 17
gabrielkc Va por buen camino
Cita:
Empezado por Lepe
mRoman el hecho es que tendrás que usar un Commit cuando se guarden los cambios y acto seguido cerrar y abrir el dataset. De esta forma siempre tendrás los registros actualizados.
Saludos
mmm cuestion de opiniones pero, si abres y cierras el dataset cada vez que guardas, segun yo ejecutas de nuevo la sentencia es decir vuelves a solicitar toda la información porque no estarías seguro de que fue lo que cambió, y cuando te envia el mensaje el servidor solo te envia el nombre del evento, con una creación adcuada de Eventos, al menos en mi sistema he podido lograr que solo actualice la información del registro que cambió o bien muestro solo en registro recien insertado, dependemos mucho de que tipo de sistema y que tipo de información maneje.

A mi los eventos me han funcionado perfectamente, de echo debo admitirlo tu comentario me hizo dudar porque estoy teniendo problemas con el servidor y luego de tu comentario quite mis amados eventos y el rendimiento del servidor no mejoró ni un poco.
Responder Con Cita
  #7  
Antiguo 01-07-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
gabrielkc, como bien dices, depende del sistema que se esté haciendo y lo más importante: cómo se usará.

Imagina un programa que almacena las reclamaciones teléfonicas de los usuarios de "Telefonica ADSL" . Si el directivo quiere monitorear en tiempo real las reclamaciones, la filosofía está clara, post_event en cada inserción. Si el directivo quiere ver una "foto fija" en un momento determinado, no se necesita implementar eventos. Son dos filosofías distintas de implementación.

Cita:
Empezado por gabrielkc
si abres y cierras el dataset cada vez que guardas, segun yo ejecutas de nuevo la sentencia es decir vuelves a solicitar toda la información
En mi caso, necesito saber el nuevo total (suma del campo "importe", calculado desde un SP) no me importa quien lo modificó.

Volviendo al hilo, la configuración que indica maro es la que uso actualmente, pero no se puede cambiar esos parámetros y esperar que todo funcione a la perfección, debes conocer qué hace cada uno de los parámetros para programar de una forma u otra.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 02-07-2007
jcapitan jcapitan is offline
Miembro
 
Registrado: jun 2006
Posts: 31
Poder: 0
jcapitan Va por buen camino
Cita:
Originalmente Escrito por gabrielkc
con una creación adcuada de Eventos, al menos en mi sistema he podido lograr que solo actualice la información del registro que cambió o bien muestro solo en registro recien insertado
Como puedo saber con eventos que registro se modifico, y poder enviar a los usuarios la llave?
Responder Con Cita
  #9  
Antiguo 02-07-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 17
gabrielkc Va por buen camino
Eventos

En en post_event puedes agregarle valores de campos:

POST_EVENT 'REGISTRO_MODIFICADO'||NEW.CAMPO;

tienes q tener muy en cuenta que dependes mucho de como tengas tu sistema, en mi caso es un sistema de producción, cuando se modifica la información de la producción relacionada con X máquina yo genero el mensaje:

POST_EVENT 'REGISTRO_MODIFICADO'||NEW.ID_MAQUINA;

Con lo cual solo actualizo la información de la producción actual en dicha máquina.

Hacerlo con el campo llave sería poco mmm como decir... funcional, si porque tendrías que registrar un evento para cada uno de los registros de tu BD, lo cual puedes hacer con un bucle desde delphi pero no se cuanto le pegues al desempeño del servidor.

¿Que campos tiene tu tabla?
Responder Con Cita
  #10  
Antiguo 22-07-2007
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Muchisisimas gracias por sus comentarios muchachos....los empezaré a aplicar...intentaré crear un trigger al cual lo asociare al sistema mediante el componente IBEvents....
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #11  
Antiguo 17-04-2010
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Cita:
Empezado por mRoman Ver Mensaje
Muchisisimas gracias por sus comentarios muchachos....los empezaré a aplicar...intentaré crear un trigger al cual lo asociare al sistema mediante el componente IBEvents....
Hola Amigos:

He decidido consultar nuevamente este hilo para dar la solucion que la verdad de todas las que me comentaron, pues desafortunadamente no se pudieron aplicar, por la filosofia de desarrollo que actualmente tiene el sistema.

Sé q este hilo es de hace 3 años aproximadamente, la solucion al problema de radicaba en que el componente de TRANSACCIONES desde que habria mi aplicacion estaba ACTIVA. Buscando aqui y alla temas nada q ver con este hilo, me encontre otro hilo, (no me acuerdo si aqui), donde mencionaban la propiedad StartTransaction la cual permite iniciar una transaccion y con el commit, grabar dicha transaccion, chequen el siguiente codigo.

Código Delphi [-]
procedure TfrmPrecios.pnlClavesExit(Sender: TObject);
begin
  inherited;
  if not(cbxProducto.KeyValue='') then
  begin
      ModDatos.trsFluida.Active:=False;
      ModDatos.trsFluida.StartTransaction;
      dsPrecios.Close;
      dsPrecios.ParamByName('CVE_PROD').AsString:=cbxProducto.KeyValue;
      dsPrecios.ParamByName('CVE_CONTRATO').AsInteger:=cbxContrato.KeyValue;
      dsPrecios.Open;
      if dsPrecios.IsEmpty then
      begin
            btnGrabar.Enabled:=True;
            btnEliminar.Enabled:=False;
            btnCancelar.Enabled:=True;
            dsPrecios.Append;
            dsPrecios.FieldByName('CVE_PRODUCTO').AsString:=cbxProducto.KeyValue;
            dsPrecios.FieldByName('CLAVE_CONTRATO').AsInteger:=cbxContrato.KeyValue;
      end Else begin
            mskPorcentaje.Text:=dsPrecios.fieldbyname('PORCENTAJE_GANANCIA').AsString;
            btnGrabar.Enabled:=True;
            btnEliminar.Enabled:=True;
            btnCancelar.Enabled:=True;
            dsPrecios.Edit;
      end;
  end Else
  begin
      Application.MessageBox('Digita una clave de producto valida','Error',mb_ok+mb_iconerror);
      cbxProducto.SetFocus;
  end;
end;


Lo que esta en ROJO fue lo que agregue para evitar el problema de salirme del sistema para que el otro usuario pudiera ver las actualizaciones que se habian hecho. Simplemente desactivo el componente IBTransaction y le indico que inicio con una nueva transaccion con "StartTransaction" y esto me resolvio el problema, ya que realice pruebas en RED de la aplicacion y funcionó, hizo lo que queria.

Con otro procedimiento talvez dando click en un botón, solo lo deje como estaba....IBTrs.Commit y listro. StartTransaction como que por "default" activa el componente, ya que si hacia esto: "ModDatos.trsFluida.Active:=True" e inmediatamente despues esto otro: "ModDatos.trsFluida.StartTransaction", marcaba un error de que la transaccion ya estaba activa....asi que la puese en False y listo.

Anteriormente las lineas de código que puse de color ROJO, no las tenia....

Espero que esto ayude a otras personas que tienen el mismo problema...que yo tenia.

Saludos y se esperan comentarios al respecto.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Última edición por mRoman fecha: 17-04-2010 a las 20:44:34.
Responder Con Cita
  #12  
Antiguo 18-04-2010
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Problema solucionado

Cita:
Empezado por mRoman Ver Mensaje
Muchisisimas gracias por sus comentarios muchachos....los empezaré a aplicar...intentaré crear un trigger al cual lo asociare al sistema mediante el componente IBEvents....
Ya encontre la solucion a esto, se los deje en el post anterior a este hilo.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
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


La franja horaria es GMT +2. Ahora son las 18:26: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