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)
-   -   Ampliar una tabla (https://www.clubdelphi.com/foros/showthread.php?t=66042)

jafera 29-01-2010 12:25:28

Ampliar una tabla
 
Buenos días de nuevo.

A ver si alguien me echa un cable, pues tengo una tabla funcionando en un programa y necesito ampliarla con un campo nuevo. Hasta aquí todo correcto alter, add etc y a correr.
El problema se me presenta cuando mando el ejecutable nuevo actualizado con los campos en el modulo de datos, pero la tabla del receptor no tiene estos campos.
Como puedo hacer para comprobar si los campos existen en la tabla?
En caso afirmativo no ejecuta la consulta de creacion de campos y en caso negativo si la ejecuta.

He pensado en hacer este proceso en el oncreate del form principal, no se si es lo correcto.

Gracias

Josep

guillotmarc 29-01-2010 12:59:30

Hola

Puedes utilizar las tablas de sistema, que te informarán de las tablas que tiene la base de datos.

De esta forma sabrás si tienes todas las tablas y campos que debería.

http://www.firebirdfaq.org/faq174/

Para obtener una lista de todas las tablas :

select rdb$relation_name
from rdb$relations
where rdb$view_blr is null
and (rdb$system_flag is null or rdb$system_flag = 0);

Para obtener una lista de todas las tablas, junto a sus campos :

select f.rdb$relation_name, f.rdb$field_name
from rdb$relation_fields f
join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
and r.rdb$view_blr is null
and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
order by 1, f.rdb$field_position;

Hacer esta comprobación en el OnCreate, antes de empezar a cargar más datos, te debería funcionar perfectamente.

Salutacions.

Neftali [Germán.Estévez] 29-01-2010 13:25:49

Si esta situación se va a dar más veces, yo te recomiendo que guardes en la Base de Datos (en alguna tabla tuya de configuración) la versión de la Base de Datos (campo tuyo).

De forma que puedes automatizar eso para diferentes versiones.

A medida que vas añadiendo campos a las tablas y creas una nueva versión de tu programa, también modificas la versión de la Base de Datos. Cuando mandas un ejecutable nuevo al cliente, compruebas la versión que tiene él, la que vas a instalar tú y lanzas los cambios correspondientes.

jafera 01-02-2010 09:58:34

Buenos dias a todos.

He creado una consulta con los parametros que me indica guillotmarc para buscar las tablas que tengo en mi base de datos y recibo un mensaje de "Database not assigned" caundo hago consulta.close, consulta.open.

Alguna idea?

Gracias

Josep

guillotmarc 01-02-2010 11:26:36

Hola Josep.

El mensaje ya te debería haber dado una pista, parece ser que tu consulta no la has enlazado a la base de datos. Tienes que añadir un objecto Database o Connection (depende de los componentes que uses) apuntando a tu base de datos.

Salut.

jafera 01-02-2010 11:51:12

Tengo un componente IBQuery enlazado con la base de datos y un Data Source con este IBQuery.

No se si es el componente idoneo, si ejecuto la consulta en IBConsole me devuelve una tabla con los datos correctos.

Josep

guillotmarc 01-02-2010 12:22:36

Si utilizas IBX, te faltan el IBDatabase y el IBTransaction (o bien los tienes, pero no están enlazados entre ellos con las propiedades Database y Transaction del Query).

Salutacions.

jafera 01-02-2010 12:27:52

El IBDatabase y el IBTransaction están en el Modulo de Datos

En la consulta pongo la ruta de acceso al database.

Estoy encallado.

Josep

jafera 01-02-2010 15:41:35

Ya no me da error, el error estaba en que creaba antes el Form Inici que el Modulo de datos y claro...

Incorrecto
Código Delphi [-]
 
Application.CreateForm(TF_Inici, F_Inici);
Application.CreateForm(TF_ModulDades, F_ModulDades);

Correcto
Código Delphi [-]
 
Application.CreateForm(TF_ModulDades, F_ModulDades);
Application.CreateForm(TF_Inici, F_Inici);

Ahora que ya no falla es cuando debo comprobar si la tabla o campos existen y si no existen los cree y si existen no haga nada.

El titulo de la columna, me sirve para esta comprobación?

Josep

jafera 01-02-2010 16:41:59

Quisiera conservar en un Dataset las tablas y en otro las tablas y los campos pero no lo consigo.

Con el código enviado por guillotmarc en IBConsole funciona pero en Delphi , cuando quiero crear los campos en la tabla me dice que error Token unknow, line 2 char 1 from.

Josep

guillotmarc 01-02-2010 20:46:11

Hola Josep.

¿ Como creas los campos ?, ¿ con un ALTER TABLE ?. Piensa que no puedes poner más de una sentencia SQL en un Query.

Así que si tienes que añadir dos campos, no puedes hacerlo de una tacada, sino que primero añades uno, y después el otro.

En todo caso, si te sigue fallando, dínos la sentencia SQL que tienes cuando te da ese error.

Salutacions.

jafera 01-02-2010 22:19:41

Hola de nuevo, coloco el siguiente código en una sql y al hacer sql.close, sql.open me da el error del token unknow.

Código SQL [-]
 
select rdb$relation_name
from rdb$relations
where rdb$view_blr is null
and (rdb$system_flag is null or rdb$system_flag = 0);

Si este código lo coloco en el IBConsole me saca una tabla con los campos.
Me gustaría poder guardar estos campos en una tabla para poder utilizarlos posteriormente para tener la descripcion de las tablas con nombre tabla, descripcion, para comprobaciones, etc.

Josep

guillotmarc 01-02-2010 23:05:58

Lo siento, mi experiencia con IBX es muy limitada, a ver si alguien que haya trabajado con estos componentes te puede ayudar.

NOTA: En componentes parecidos, en lugar de hacer un Open, había que hacer un Excecute, ExecSQL, ExecQuery, o algo por el estilo.

Salutacions.

jafera 01-02-2010 23:26:54

Ok Marc, seguire investigando, muchas gracias por tu tiempo

Josep


La franja horaria es GMT +2. Ahora son las 23:53:55.

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