PDA

Ver la Versión Completa : Conocer lista de tablas de Base Datos (Firebird 2.0 y Componentes IBObjects)


mpedrero
14-02-2007, 17:06:28
Esta pregunta es parecida a la de más abajo, pero...

¿alguien sabe como obtener los nombres de las tablas de una base de datos Firebird 2.0 usando los componentes IBObjects 4.7 en delphi?.

Necesito saberlo, para que a la hora de crear una tabla saber si esta existe o no en la base de datos.

Saludo y gracias a todos...

fdelamo
14-02-2007, 17:47:16
No he utilizado los IBObjects, pero supongo que habrá un componente para hacer una query, ¿no?

Prueba como se dice Aquí (http://www.clubdelphi.com/foros/showthread.php?t=40282), o lo que también se puede hacer es intentar crear la tabla de todas formas con un try ... except y controlar el error que da si la tabla existe.

Un saludo

Lepe
14-02-2007, 19:12:15
En FB 1.5 esto furula:

const SALTOLINA = #13#10;

procedure CheckTablename(const TableName:string);
var Tablas:string;
begin
tablas := uppercase(GetTableNames);
if Pos(uppercase(TableName),tablas)= 0 then
raise Exception.Create(Format('La Tabla "%s" no existe en la BBDD.'+saltolinea+
'Tablas Correctas:'+SALTOLINEA+
'%s',[TableName,tablas]));
end;

function GetTableNames:string;
var Tablas:TStringList;
m :TMDOQuery;
begin
Tablas := TStringList.Create;
m := TMDOQuery.Create(nil);
try
m.Database:= dtm.DB;
m.Transaction:= dtm.Trans;
{----------------------------NOMBRES DE TABLAS Y VISTAS ----------------------}
m.SQL.Text:= 'SELECT RDB$RELATION_NAME FROM RDB$RELATIONS' + {do not localize}
' WHERE RDB$SYSTEM_FLAG = 0'; {do not localize}

m.Open;
lpsql.VerResultadoSql(m,tablas);
Result := Format('Tablas existentes en la BBDD:'+saltolinea+
'%s',[insertbreakline(tablas.CommaText,76)]);

finally
FreeAndNil(m);
end;
end;


VerResultadossql: toma todos los registros de la consulta "m", (cada registro es el nombre de una tabla o vista) y las añade al StringList "tablas".

InsertBreakLine hace lo propio, cada 76 caracteres, añade un salto de linea.

No incluyo esas funciones, ya que uso otras rutinas de terceros y se alargaría mucho el post.

Saludos

mpedrero
15-02-2007, 11:31:15
Antes de nada, gracias a todos por la ayuda, acabo de encontrar la solución a mis problemas, al menos usando sentencias SQL... para colaborar aqui vá la sentencia SQL, que espero sea la definitiva, para obtener únicamente las tablas de una base de datos:

SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$SYSTEM_FLAG = 0 AND
RDB$RELATION_NAME NOT IN (SELECT RDB$VIEW_NAME
FROM RDB$VIEW_RELATIONS);


Espero que os sirva... ;)

Ahora, espero impaciente, que alguien descubra como obtener las tablas sin usar sentencias SQL, usando IBObjects.
Gracias a todos por la ayuda... :)

fjcg02
15-02-2007, 23:42:45
He utilizado Delphi de mayordomo alguna vez. Si cuando meto un objeto TTable puedo seleccionar las tablas de la bbdd de una lista, seguro que existe una función ya creada que lo haga. Además la ha escrito un especialista, seguro.
A mi me funciona con Access, pero seguro que funciona con cualquier motor de bbdd ( cual no funciona con Delphi ? )


procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.Connected:= True;
ADOConnection1.GetTableNames(Memo1.lines,true);
end;

Suerte y un saludo

Lepe
16-02-2007, 10:55:59
Hombre, depende de los componentes que uses.

Cuando en el IDE eres capaz de elegir una tabla, eso corre por parte de los editores de propiedades de esos componentes. Pero está hecho para el IDE, no para usarlos en tu código.

Es cierto que Delphi tiene esa alegría, Todo lo que se propone en el IDE, también lo ofrecen por código para que lo uses como programador, pero no es algo obligatorio. Incluso cuando te ofrecen el código fuente de esos editores de propiedades, resulta algo engorroso extraer el código que hace esa opción que necesitas.

Por ejemplo, te habrás fijado que los componentes TIBDataset implementan un parser para crear las cadenas SQL de actualización, borrado, inserción, etc, ese parser no está inmediatamente disponible para usarlo en tus programas.

Saludos