![]() |
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 |
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. |
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. |
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 |
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. |
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 |
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. |
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 |
Ya no me da error, el error estaba en que creaba antes el Form Inici que el Modulo de datos y claro...
Incorrecto
Correcto
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 |
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 |
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. |
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.
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 |
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. |
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