Club Delphi  
    Paypal   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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-02-2009
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 22
rruffino Va por buen camino
Smile Problemas con Datos

Hola gente.
Les comento el problema que estoy teniendo. Tengo una base de datos (interbase 6.5) la cual es accedida por dos aplicaciones distintas. El tema es que hasta desde ambas aplicaciones necesito ver la informacion que se va produciendo por el uso de cada aplicacion, pero para verla tengo que cerrar la aplicacion y volverla a ejecutar. Mas alla de eso hice dos aplicaciones separadas, una que inserta y otra que consulta. La que inserta mete informacion perfecto, pero al mismo tiempo quiero consultar desde el otro programa y no veo la informacion que genera el inserta. Para verla tengo que cerrar el consulta y volverlo a abrir para ver la info.
En cada aplicacion tengo un IBDatabase, IBTransaction, IBDataset.
Calculo que estoy teniendo algo raro con las transacciones pero no encuentro solucion. Desde ya gracias...
Saludos, Román.-
Responder Con Cita
  #2  
Antiguo 24-02-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Muestra el código en donde insertas.

Se supone que debes hacer un Commit después de cada insersión.

Por ejemplo, así:
Código Delphi [-]
begin
   // Si no está abierta la transacción, la abro
   if (not IBTransaction.InTransaction) then
      IBTransaction.StarTransaction;

   // Inserto un dato
   with IBDataset do
   begin
      Insert;
      // relleno campos
      Params.ByName['NOMBRE_CAMPO'].AsString := 'abc';
      Post;
   end;

   // Hago Commit de la transaccion para que todos puedan ver lo insertado
   IBTransaction.Commit;
end;
Responder Con Cita
  #3  
Antiguo 24-02-2009
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 22
rruffino Va por buen camino
ASi lo estoy haciendo

Gracias por contestar, te comento que estoy haciendo exactamente eso. Para que me funcione en la otra aplicacion sin necesidad de cerrarla es haciendo un commit de la aplicacion de consulta. Es decir, con la aplicacion insertar meto registros y hago el commit. Desde la aplicacion de consulta, para poder ver los datos tengo que hacer un commit de la transaccion de esta ultima aplicacion. Raro, no entiendo.
Gracias nuevamente.
Responder Con Cita
  #4  
Antiguo 24-02-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Si no nos muestras tu código, difícil será que te podamos ayudar.

Dicho esto, te comento algo sobre las transacciones:

Si tienes 2 aplicaciones, llamadas INSERTAR y LEER, ambas deben tener un componente de acceso a la base de datos (IBDataBase) y una transaccion (IBTransaction).
Cada uno manejará su Base de Datos y su transacción. Uno no puede intervenir en las transacciones del otro.

La aplicación INSERTAR debe hacer lo siguiente:
- Transaction.StartTransaction
- Insert
- Transaction.Commit

La aplicación LEER debe hacer lo siguiente:
- Transaction.StartTransaction
- Open
- Transaction.Commit

Hasta que INSERTAR no hace un Commit, LEER no verá nada nuevo.

Si LEER no empieza una transacción nueva antes de leer, no verá nada de lo que haya hecho INSERTAR, por más que INSERTAR haya hecho Commits.

Podrías poner un botón de refresco en la aplicación LEER que haga un Commit de la transacción y vuelva a abrir el DataSet.

Última edición por duilioisola fecha: 24-02-2009 a las 21:06:08.
Responder Con Cita
  #5  
Antiguo 24-02-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
La transacción al final de cuentas es un número.
Imagina el siguiente caso:

LEER abre la transaccion 1 y hace Open. No ve nada, pues no hay nada.

INSERTAR abre la transaccion 2 inserta y hace commit.
INSERTAR abre la transaccion 3 inserta y hace commit.

LEER hace Close y Open. No ve nada, pues siguen en la transacción 1.

LEER hace Close, Commit y abre una nueva transacción. Luego Open. Ahora su transacción es la 4 y verá todo lo insertado hasta este número de transaccion.

INSERTAR abre la transacción 5 inserta y hace commit.
INSERTAR abre la transacción 6 inserta y hace commit.

LEER hace Close y Open (sin hacer commit). Su transacción sigue siendo la 4, por lo que solo ve lo insertado en las transacciones 2 y 3.
Responder Con Cita
  #6  
Antiguo 25-02-2009
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 22
rruffino Va por buen camino
Vamos entendiendo

Muy bien amigo, espectacular explicacion, ya lo he probado y es como tu dices. Nuevamente gracias.
Bien, para ir hilando un poco mas fino, por defecto la transaccion siempre esta activa, y si no me equivoco, cada vez que hago un commit se cierra esa y se tira una nueva. Hay forma de que yo active la transacción solo cuando la necesito??? En realidad puedo hacerlo por codigo, pero cada vez que desactivo la transaccion se me cierran los datasets y cuando la activo tengo que abrir todos los datasetes nuevamente. Como el sistema tiene alrededor de 30 datasets me entra la duda si es eficiente desactivar la transaccion y al activarla volver a abrir los datasets aunque por ahi lo veo como mas controlable porque se cuando la inicio y cuando la acabo.
Esta es my ultima duda con este tema (espero, je) y de mas esta reiterarte mi agradecimiento.
Saludos, Román.-
Responder Con Cita
  #7  
Antiguo 25-02-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Algo que debes tener en cuenta es si los 30 DataSets tienen que estar abiertos al mismo tiempo.
Por ejemplo. Si tienes 10 DataSets para un Formulario de Clientes y 10 DataSets para otro de Pedidos y otros 10 para un formulario de Facturas, podrías abrir la transacción y los DataSets de lo que estés mostrando y cerrar el resto.

Con ese mismo ejemplo, yo tendría tres formularios con su correspondiente DataModule y dentro de el una transacción por cada uno.

- DMPrincipal
--- Database
--- OnCreate: Database.Open;
--- OnClose: Database.Close;
- FMPrincipal

- DMCliente
--- TLocal
--- DataSet, Database = DMPrincipal.Database, Transaction=TLocal
--- OnCreate: Transaction.StarTransaction; DataSet.Open;
--- OnClose: DataSet.Close; Transaction.Commit;
- FMCliente

- DMPedido
--- TLocal
--- DataSet, Database = DMPrincipal.Database, Transaction=TLocal
--- OnCreate: Transaction.StarTransaction; DataSet.Open;
--- OnClose: DataSet.Close; Transaction.Commit;
- FMPedido

- DMFactura
--- TLocal
--- DataSet, Database = DMPrincipal.Database, Transaction=TLocal
- FMFactura

De esta manera, puedes tener 3 transacciones abiertas e ir haciendo Commit y volviendo a abrir solo la que necesitas.

Si todos son necesarios en un mismo momento, puedes hacer un procedimiento que guarde la posición en la que están los Datasets, haga Commit y vuelva a abrir y posicionarlos.

Una tercera opción (y que depende de los datos que tengas) es poner los datos más estáticos (los que no cambian a lo largo del programa) con una transacción y los que si cambian a menudo en otra. De esta manera solo refrescas los que cambian.
Dato que no cambia : Tipo de cliente: MA-Mayorista, MI-Minorista, GS-Grandes superficies
Dato que cambia: Pedido, Detalle de Pedido, etc.
Responder Con Cita
  #8  
Antiguo 02-03-2009
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 22
rruffino Va por buen camino
Gracias...

Hola amigo, gracias por responder nuevamente. He seguido tus consejos y me esta andando bien, de todos modos no lo he probado con procesos complicados. Pero hasta ahora me viene funcionando al pelo.
Gracias nuevamente.
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
Problemas con datos paradox salvanano Conexión con bases de datos 3 02-08-2007 19:31:48
Problemas con Base de Datos i_gauss C++ Builder 2 16-01-2006 11:02:50
Problemas al agregar datos romansiux Conexión con bases de datos 2 15-04-2005 03:30:16
Problemas con MDI y Bases de datos NeWsP Varios 10 14-10-2003 22:17:48
Problemas con ficheros de datos Ane Varios 9 15-07-2003 15:27:27


La franja horaria es GMT +2. Ahora son las 20:34:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi