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

Mashabak 18-06-2004 13:58:25

Detectar si una tabla existe
 
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
Código Delphi [-]
 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
Código:

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í:
Código SQL [-]
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

Cita:

Empezado por Mashabak
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í:
Código Delphi [-]
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;

Cita:

Empezado por Mashabak
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

Cita:

Empezado por Mashabak
......., 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
Código:

  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


La franja horaria es GMT +2. Ahora son las 09:17:50.

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