Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Tabla en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=71564)

campiki 28-12-2010 10:39:12

Tabla en tiempo de ejecución
 
De antemano gracias por al menos leer mi problema.

Uso Delphi 7, con Firebird (creo versión 1.5).

En tiempo de ejecución creo una tabla llamada L20101228A, una vez creada no puedo acceder a ella.

En el Datamodule tengo.

1- Tibdatabase
2- IbTransaction
3- TibTable
4- Tdatasource.

Las únicas formas que he conseguido acceder a ella son:

1- Haciendo close del tibdatabase y volviendo abrir, con el problema que me vuelve a pedir el password y no es una opción lógica ni agil.
2- Saliendo del programa y volviendo a entrar (gran solución informática por excelencia.

Agradecería algo de luz.

He probado.

IBTransaction2.Commit;
IBTransaction2.StartTransaction;

Pero da error de metada la table L20101228A no exist.

Gracias por su ayuda.

Neftali [Germán.Estévez] 28-12-2010 12:35:08

Está claro que la lógica dice que no deberías tener que reabrir la conexión de la Base de Datos. Lo lógico sería:

BeginTransaction
CrearTabla
CommitTransaction

Desde ese momento deberías verla. Si no es así o si al cerrar la conexión sí existe puede ser que no tengas bien configurada la transacción.

campiki 28-12-2010 12:47:56

Cita:

Empezado por Neftali (Mensaje 385966)
BeginTransaction
CrearTabla
CommitTransaction

Estos comandos u opciones no existen para Ibtransaction ni ibdatabase.

Ibtransaction lo tengo configurado de la siguiente manera.

Active True
AutostopAction saNone
Default Action TaCommit
Default database IBDatabase2
idletimer 0
Name IBTransaction2
Params (vacío)
Tag 0

La base de datos está abierta pues en ella tengo otras tablas que necesito para trabajar.

Si uso...
IBTransaction2.StartTransaction;
me dice que ya está abierta.

También he probado hacer lo siguiente...

if dm.IBTransaction2.InTransaction then
begin
dm.IBTransaction2.Commit;
dm.IBTransaction2.StartTransaction;
end;

Pero no sé donde falla.

Gracias de nuevo.

Neftali [Germán.Estévez] 28-12-2010 13:19:07

Cita:

Empezado por campiki (Mensaje 385968)
Estos comandos u opciones no existen para Ibtransaction ni ibdatabase

Lo se. Era una forma genérica de colocar las operaciones que debes hacer. Ese es el orden correcto. Debes asegurarte de que no se estén haciendo de forma implícita.
Si las haces manualmente debes hacerlas en ese orden.

Debes (1) Iniciar la transacción, (2) Crear la tabla y (3) finalmente aceptar la transacción y acabarla con CommitTransaction (o la orden que sea).

Pueden variar los nombres, pero el orden de las operaciones debe ser ese.

campiki 28-12-2010 13:58:14

Cita:

Empezado por Neftali (Mensaje 385974)

Debes (1) Iniciar la transacción, (2) Crear la tabla y (3) finalmente aceptar la transacción y acabarla con CommitTransaction (o la orden que sea).

Pueden variar los nombres, pero el orden de las operaciones debe ser ese.

Probaré y pegaré el código pero diría que la prueba ya está hecha y que no funciona.

Gracias.

Neftali [Germán.Estévez] 28-12-2010 14:04:24

Cita:

Empezado por campiki (Mensaje 385981)
Probaré y pegaré el código pero diría que la prueba ya está hecha y que no funciona.

Que no, que no es código que puedas pegar. Son "operaciones" que debes hacer. Si lo pegas directamente falla. Te lo pongo de otra manera:

(1) Iniciar_la_transacción
(2) Crear_la_tabla
(3) Realizar_Commit_de_la_transaccion

Debe ser que hoy no e explico bien...

campiki 28-12-2010 14:33:21

Cita:

Empezado por Neftali (Mensaje 385984)
Que no, que no es código que puedas pegar. Son "operaciones" que debes hacer. Si lo pegas directamente falla. Te lo pongo de otra manera:

(1) Iniciar_la_transacción
(2) Crear_la_tabla
(3) Realizar_Commit_de_la_transaccion

Debe ser que hoy no e explico bien...

Lo que digo es que pegaré el código que yo haga para ver que puede ser lo que falla..

Venga gracias.

campiki 29-12-2010 13:49:16

Bueno... creo que lo solucioné... Antes de explicar cómo quiero agradecer la ayuda recibida.

La base de datos que uso tiene tablas fijas y otras que las tengo que crear en tiempo de ejecución.

1- En el datamodule, activo el database

ibdatabase2.Params.Values['Password'] := '*****';
ibdatabase2.Connected := true;
ibtransaction2.StartTransaction;

2- En el Form.

Después de crear la tabla, ejecuto un..
dm.IBTransaction2.Commit;
Esto hace que todas las tablas del Database queden sin acceso.

3- Restablezco el acceso en el momento necesario.

if dm.IBTransaction2.InTransaction then
begin
dm.IBTransaction2.Commit;
dm.IBTransaction2.StartTransaction;
end;

Si no lo condiciono al hacer el estart, me da error diciendo que la base de datos ya está activa.

A partir de aquí ya todo funciona correctamente.

Gracias por las ideas recibidas.

Campiki


La franja horaria es GMT +2. Ahora son las 10:34:36.

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