Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-06-2004
Mashabak Mashabak is offline
Registrado
 
Registrado: jun 2004
Posts: 8
Poder: 0
Mashabak Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 18-06-2004
Avatar de cbrrr
cbrrr cbrrr is offline
Miembro
 
Registrado: jun 2004
Posts: 57
Poder: 20
cbrrr Va por buen camino
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
__________________
Si no tienes algo que decir más importante que el silencio, cállate
Responder Con Cita
  #3  
Antiguo 18-06-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 18-06-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
¿No prefieres tener una sola tabla con un campo que identifique el año contable?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 18-06-2004
Mashabak Mashabak is offline
Registrado
 
Registrado: jun 2004
Posts: 8
Poder: 0
Mashabak Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 18-06-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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'
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 18-06-2004
Mashabak Mashabak is offline
Registrado
 
Registrado: jun 2004
Posts: 8
Poder: 0
Mashabak Va por buen camino
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 ).

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.
Responder Con Cita
  #8  
Antiguo 18-06-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 18-06-2004 a las 20:40:54. Razón: Corrección de las Etiquetas
Responder Con Cita
  #9  
Antiguo 18-06-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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
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;
Responder Con Cita
  #10  
Antiguo 18-06-2004
Mashabak Mashabak is offline
Registrado
 
Registrado: jun 2004
Posts: 8
Poder: 0
Mashabak Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 23:06:45.


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