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 06-12-2022
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
Smile bloqueo

Cuando abro el programa, los IbDatabase no están conectadas, las Transacciones y las Ibtables no están activas y como he dicho las abro cuando las necesito y las cierro cuando cierro el formulario que las abrió.

la cierro cuando cierro el formulario indica que si hay cambios en la tabla permanecen abiertas? la transaccion se compromete por cada cambio o solo cuando se cierra la forma ?

la transaccion, el commit , rollback es iniciada/ejecutada por el programa?

podria ampliar mas la informacion de como son las consultas ?
que tipo de componentes se conecta a la base de datos?
Responder Con Cita
  #2  
Antiguo 06-12-2022
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Los componentes que uso son TIbDatabase, TIbTransaction, TIbTable, TDatasurce, todos están incluidos en un TDatamodule, en dicho TDatamodule tengo dos TibDatabases y a cada uno su TIbTransaction y unas 20 TIbTables con sus 20 TDatasources enlazadas a su TibDatabase correspondiente.

IbTransaction está configurado en su Transation Editor de la siguiente manera:

Código:
                             Read_commited
                             Rec Version
                             Nowait

                             y tengo marcado en propiedades el Read Commited.
En un principio siempre TibDatabase no está conectado, TibTransaction y TibTAble no están activos.

Al abrir un formulario cualquiera de los muchos que tengo hago lo siguiente en OnShow:

Código:
                dat.datamodule1.IbDatabase1.Conected=true;
                dat.datamodule2.IbDAtabase2.Conected=true;
                dat.datamodule1.TibTransaction1.Active=true;
                dat.datamodule2.TibTransaction2.Active=true;

                dat.datamodule1.IbTable1.Active=true;
                ...
                dat.datamodule1.Ibtable4.Active=true;
Al cerrar el formulario en OnClose;

Código:
                 dat.datamodule1.TIbTransation1.Commit;
                 dat.datamodule1.TibTranssation2.commit;

                 dat.datamodule1.IbTable1.Active=false;
                ...
                dat.datamodule1.Ibtable4.Active=false;

                dat.datamodule1.IbDatabase1.Conected=false;
                dat.datamodule1.IbDatabase1.Conected=false;
                dat.datamodule1.TibTransaction1.Active=false;
                dat.datamodule1.TibTransaction2.Active=false;
Bien ahora en el manejo de grabar registro a registro con el Boton Grabar hago lo siguiente:

Código:
                       begin
                          try
                            dat.datamodule1.IbTable1.Append;
                            dat.datamodule1.IbTable1.Fields[0].AsString:=edit1.text;
                            ...
                            dat.datamodule.IbTable1.Fields[20].AsString:=Edit20.text;
                            dat.datamodule.IbTabl11.post;          
                         Except
                            dat.Datamodule.IbTransaction1.CommitRetaining;
Bien ahora trabajo con el programa en modo monopuesto y funciona bien, graba los 50 o 100 registros después cierro el programa y todo bien se cierra enseguida sin problemas.

Ahora bien, el programa lo tengo en el PC1, y también en el PC2, PC1 hace de servidor donde tengo los datos, el PC2 está con conectado al PC1 mediente el protocolo de conexión Ip, y tengo acceso a la base de datos del PC1 perfectamente.

Si trabajo sólo con el Pc1 todo funciona bien, grabo sin problemas,
Si trabajo sólo con el Pc2 todo funciona también bien, grabo, modifico sin problemas y me salgo del programa sin problemas, igual que con el Pc1.

Pero si abro el programa con los dos Pc's, a la vez puedo entrar bien, ver informes sin problemas, pero a la hora de modificar o dar de alta un registro o borrar se queda pillado y bloqueado sin posibilidad de avanzar, la idea es de poder modificar en ambos Pc's, que grabara y cerrara la aplicación sin bloquearse o quedar pillado.
Sería de gran ayuda ver en qué puedo fallar, Gracias
Responder Con Cita
  #3  
Antiguo 07-12-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Parece que solo haces Commit de la transacción si falla.

Deberías utilizar un bloque try..finally.
La diferencia es que el bloque FINALLY siempre se ejecuta (se ejecuta si el bloque TRY finaliza correctamente o falla).
El bloque EXCEPT solo se ejecuta si falla.

Si este es el caso, no estarás "cerrando" la transacción hasta que cierres el formulario, que a su vez hace commit y cierra tablas y base de datos.

Código:
begin
  try
    dat.datamodule1.IbTable1.Append;
    dat.datamodule1.IbTable1.Fields[0].AsString:=edit1.text;
    ...
    dat.datamodule.IbTable1.Fields[20].AsString:=Edit20.text;
    dat.datamodule.IbTabl11.Post;
  finally {Except}
    dat.Datamodule.IbTransaction1.CommitRetaining;
Responder Con Cita
  #4  
Antiguo 07-12-2022
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Perdón ha sido un error de sintaxis,

Utilizaba Finally en vez de Except.

Parece ser que está bien la extructura, tendrá que ser en algún otro detalle, tengo dos Ibdatabase y dos Transacciones y a cada una unas 20 tablas con 40 campos cada tabla, y todo está en un datamodule, aunque están todas cerradas, se supone que el programa se queda liberado puede cerrar fácilmente y no quedarse bloqueado cuando está abierto dos o más veces el programa, pero quizás internamente algo abre que no controlo y se queda pillado de alguna forma.

Gracias,
Responder Con Cita
  #5  
Antiguo 08-12-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por GINMARMENOR Ver Mensaje
Perdón ha sido un error de sintaxis,
Utilizaba Finally en vez de Except.
Pero no hagas eso, sólo copia tu código
Responder Con Cita
  #6  
Antiguo 08-12-2022
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Este sería el código

Los componentes que uso son TIbDatabase, TIbTransaction, TIbTable, TDatasurce, todos están incluidos en un TDatamodule, en dicho TDatamodule tengo dos TibDatabases y a cada uno su TIbTransaction y unas 20 TIbTables con sus 20 TDatasources enlazadas a su TibDatabase correspondiente.

IbTransaction está configurado en su Transation Editor de la siguiente manera:

Código:
                             Read_commited
                             Rec Version
                             Nowait
y tengo marcado en propiedades el Read Commited.
En un principio siempre TibDatabase no está conectado, TibTransaction y TibTAble no están activos.

Al abrir un formulario cualquiera de los muchos que tengo hago lo siguiente en OnShow:

Código:
                dat.datamodule1.IbDatabase1.Conected=true;
                dat.datamodule2.IbDAtabase2.Conected=true;
                dat.datamodule1.TibTransaction1.Active=true;
                dat.datamodule2.TibTransaction2.Active=true;

                dat.datamodule1.IbTable1.Active=true;
                ...
                dat.datamodule1.Ibtable4.Active=true;
Al cerrar el formulario en OnClose;

Código:
                 dat.datamodule1.TIbTransation1.Commit;
                 dat.datamodule1.TibTranssation2.commit;

                 dat.datamodule1.IbTable1.Active=false;
                ...
                dat.datamodule1.Ibtable4.Active=false;

                dat.datamodule1.IbDatabase1.Conected=false;
                dat.datamodule1.IbDatabase1.Conected=false;
                dat.datamodule1.TibTransaction1.Active=false;
                dat.datamodule1.TibTransaction2.Active=false;

Bien ahora en el manejo de grabar registro a registro con el Boton Grabar hago lo siguiente:

Código:
                       begin
                          try
                            dat.datamodule1.IbTable1.Append;

                            dat.datamodule1.IbTable1.Fields[0].AsString:=edit1.text;
                            ...
                            dat.datamodule.IbTable1.Fields[20].AsString:=Edit20.text;

                            dat.datamodule.IbTable1.post;          
                         Finally
                            dat.Datamodule.IbTransaction1.CommitRetaining;
Bien ahora trabajo con el programa en modo monopuesto y funciona bien, graba los 50 o 100 registros después cierro el programa y todo bien se cierra enseguida sin problemas.

Ahora bien, el programa lo tengo en el PC1, y también en el PC2, PC1 hace de servidor donde tengo los datos, el PC2 está con conectado al PC1 mediente el protocolo de conexión Ip, y tengo acceso a la base de datos del PC1 perfectamente.

Si trabajo sólo con el Pc1 todo funciona bien, grabo sin problemas,
Si trabajo sólo con el Pc2 todo funciona también bien, grabo, modifico sin problemas y me salgo del programa sin problemas, igual que con el Pc1.

Pero si abro el programa con los dos Pc's, a la vez puedo entrar bien, ver informes sin problemas, pero a la hora de modificar o dar de alta un registro o borrar se queda pillado y bloqueado sin posibilidad de avanzar, la idea es de poder modificar en ambos Pc's, que grabara y cerrara la aplicación sin bloquearse o quedar pillado.
Sería de gran ayuda ver en qué puedo fallar, Gracias
Responder Con Cita
  #7  
Antiguo 12-12-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Para descartar el tema de transacciones haz la siguiente prueba:
  1. PC1 Enciende aplicacion/ conecta
  2. PC2 Enciende aplicacion/ conecta
  3. PC1 inserta/modifica un registro
  4. PC2 inserta/modifica un registro.
    En este punto el PC2 debería estar bloqueado, esperando a quela transaccion sea liberada.
  5. PC1 desconecta (cierra la aplicación)
  6. PC2 debería responder en este momento y permitirte seguir insertando/editando registros.
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
redimensionar varias veces un array Manuel Varios 13 14-07-2014 04:49:40
Mi busca si lo hace varias veces Paulao Varios 0 05-07-2011 17:15:43
llamar varias veces un formulario Lizette Varios 3 05-11-2008 16:28:10
Imprimir un registro varias veces Vlady Impresión 1 29-08-2008 08:04:14
Imprimir algo varias veces. aoiTo Impresión 0 20-07-2004 19:12:49


La franja horaria es GMT +2. Ahora son las 06:26:02.


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