PDA

Ver la Versión Completa : Detectar si una tabla existe


Mashabak
18-06-2004, 13:58:25
Pues tengo una base de datos access a la que accedo mediante delphi.
La idea que tengo es crear una tabla para cada año contable, asi que necesito saber si la tabla (por ejemplo) facturas2004 existe y, si no existe, hace una copia de una tabla de facturas maestra para empezar a trabar con ella en el periodo 2004, y asi con el año 2005, 2006, etc.
Si alguien sabe como detectar si la tabla existe y, si no existe, crearla a partir de una copia de la maestra le estaria muy agradecido.
Por suspuesto, tambien se aceptan sugerencias de cualquier otra forma de hacerlo, pero teniendo en cuenta que la tabla facturas tiene un campo ID autonumerico que debe ponerse a 0 cada vez que empiece el año, para que las facturas sean del tipo 1-04, 2-04, 1-05, etc.

Un saludo.

cbrrr
18-06-2004, 14:32:21
Puedes hacerlo de dos maneras, o a lo borrico o de forma algo pulida

1.- Forma borrico: lanzas una query sobre esa tabla capturando errores

Q.SQL.Text := 'select * from mi tabla';
try
Q.Open;
except
// si no existe salta la excepción
end;

2.- A lo pulido
Creo que todo componente Database tiene el método GetTableName que te pone en un TStrings las tablas que tiene el sistema

Espero que te sirva

salvica
18-06-2004, 16:32:02
También puedes hacer los siguiente

with Query.SQL do begin
Add( 'CREATE TABLE IF NOT EXISTS facturas'+FormatDateTime('yyyy', Now)+'( ' );
Add( 'aqui insertas los campos que quieras' );
Add( 'y aqui insertas las claves que utilices' );
Add( '); ';
end;
Query.ExecSQL;


Con esto se creará la tabla "facturasXXXX" cuando no exista en la Base de Datos
Saludos

delphi.com.ar
18-06-2004, 17:30:18
¿No prefieres tener una sola tabla con un campo que identifique el año contable?

Mashabak
18-06-2004, 18:33:24
Pues no, prefiero tener cada año contable por separado.
Gracias las respuestas anteriores puedo detectar si la tabla existe o no y, si no existe crearla (muchas gracias a los dos por las respuestas), pero ahora me surge una duda, y es la manera de crear mediante la sentencia sql el campo Id de las facturas, que es un campo autonumerico que se incrementa automaticamente con cada nuevo registro, que creo que es lo unico que me falta. El resto de campos no son problema, pero nunca antes habia tratado con campos autonumericos en SQL, asi que no se si existe algun tipo de datos definido para estos casos.

Un saludo.

delphi.com.ar
18-06-2004, 18:41:20
Ok, no es una práctica que recomiende. Por otro lado, si se puede averiguar, por ejemplo el Jet tiene métodos para recuperar una colección con los objetos de la base de datos... ¿Cómo te conectas a la base de datos?

PD: Accediendo directamente al diccionario de datos, podrías hacer algo así:

SELECT *
FROM MSysObjects
WHERE Name = 'MiObjeto'

Mashabak
18-06-2004, 18:59:37
La conexion la hago mediante Tquery y ADOQuery en cada momento, todos ellos configurados para que accedan mediante un alias creado en el sistema que apunta a la base de datos.

Ademas, todo esto viene a raiz de que trabajo sobre una base de datos ya creada que tenia un colega y a la que estoy haciendo una pequeña interfaz, pero se empeña en que no quiere variar NINGUN campo de la base de datos, ni añadir, ni eliminar ni modificar, asi que por eso trabajo con una tabla para cada año contable en lugar de añadir un campo que sea dicho año (esto no se lo cuentes a nadie, que es secreto :D ).

En cuanto a lo que me comentas del diccionario de datos, no te entiendo bien (se nota que no soy precisamente una maquina de bases de datos en delphi xD). Si pudieses ser un poco mas explicito te lo agradeceria mucho.

Un saludo.

delphi.com.ar
18-06-2004, 19:12:27
La conexion la hago mediante Tquery y ADOQuery en cada momento, todos ellos configurados para que accedan mediante un alias creado en el sistema que apunta a la base de datos.
Tratandose de un TADOConnection, podrías hacer algo así:
function TableExists(AADOConnection: TADOConnection; ATableName: string): boolean;
var
AStrings: TStringList;
begin
AStrings := TStringList.Create;
try
AADOConnection.GetTableNames(AStrings);
Result := AStrings.IndexOf(ATableName) <> -1;
finally
AStrings.Free;
end;
end;

En cuanto a lo que me comentas del diccionario de datos, no te entiendo bien...
Simplemente esa consulta te retornará algún registro si existe algun objeto en la base de datos con ese nombre.

Saludos!

salvica
18-06-2004, 19:23:26
......., pero ahora me surge una duda, y es la manera de crear mediante la sentencia sql el campo Id de las facturas, que es un campo autonumerico que se incrementa automaticamente con cada nuevo registro,......... Volviendo al ejemplo anterior :D

with Query.SQL do begin
Add( 'CREATE TABLE IF NOT EXISTS facturas'+FormatDateTime('yyyy', Now)+'( ' );
Add( ' `id_registro` INT NOT NULL AUTO_INCREMENT, ' );
Add( ' ... resto de campos separador por comas ...' );
Add( ' PRIMARY KEY (`id_registro`)' );
Add( '); '); //----> final del añadir clausulas SQL
end;
Query.ExecSQL;

Mashabak
18-06-2004, 19:51:10
Pues la clausula AUTO_INCREMENT no me la acepta como sintaxis valida de SQL para Create Table (recordemos que trabajamos con una base de datos access) en el query.

Un saludo