Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-03-2014
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 21
gorsan Va por buen camino
Crear una tabla en tiempo de ejecucion

Hola.
¿Es posible crear una tabla IB en tiempo de ejecución? ¿Como?
He estado mirando por el foro antes de escribir y he visto algo sobre tablas temporales, etc. Pero yo lo que quiero es crear tablas persistentes pero en tiempo de ejecución del programa. El usuario proporciona el nombre de la tabla, por ejemplo, en un TEdit, y yo me ocupo de crear la tabla con unos campos predeterminados que seran siempre los mismos, si la tabla no existe. No se bien si hacerlo desde el lado del servidor, es decir, desde la BD mediante un store procedure que recoja el nombre como un parámetro de entrada; o hacerlo desde el lado cliente (Delphi 7) encapsulando desde un TIBDataSet por ejemplo.
¿Cómo puedo realizar esto?
Muchas gracias.
Responder Con Cita
  #2  
Antiguo 12-03-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola gorsan.

Te pongo un ejemplo desde el cliente usando TIBQuery y otro desde el servidor usando un stored procedure.

Cliente:
Código Delphi [-]
procedure TDataModule1.CreateTable(const TableName: string);
begin
 with TIBQuery.Create(nil) do
  try
    Close;
    Database:= IBDatabase1;
    Transaction:= IBTransaction1;
    SQL.Add('SELECT RDB$RELATION_NAME FROM RDB$RELATIONS');
    SQL.Add('WHERE RDB$VIEW_BLR IS NULL');
    SQL.Add('AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0)');
    SQL.Add('AND RDB$RELATION_NAME = :PTABLE');
    ParamByName('PTABLE').AsString:= TableName;
    Open;
    if IsEmpty then
      with TIBQuery.Create(nil) do
      try
        Close;
        Database:= IBDatabase1;
        Transaction:= IBTransaction1;
        SQL.Add('CREATE TABLE '+ TableName + '(');
        SQL.Add('ID INTEGER, NOMBRE VARCHAR(30),');
        SQL.Add('etc, etc');
        SQL.Add(')');
        ExecSQL;
      finally
        Free;
      end
    else
      raise Exception.Create('Existe una tabla con ese nombre');
  finally
    Free;
    IBTransaction1.Commit;
  end;
end;

Servidor:
Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_CREATE_TABLE (
    TABLENAME VARCHAR(100))
AS
DECLARE VARIABLE RESULT SMALLINT;
DECLARE VARIABLE SQL VARCHAR(300);
BEGIN
  SELECT COUNT(*)
  FROM RDB$RELATIONS
  WHERE RDB$VIEW_BLR IS NULL
  AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0)
  AND RDB$RELATION_NAME = TRIM(:TABLENAME) INTO RESULT;

  IF (RESULT = 0) THEN
  BEGIN
    SQL= 'CREATE TABLE' || ' ' || TRIM(TABLENAME) || '('
         || 'ID INTEGER, NOMBRE VARCHAR(30),'
         || 'etc, etc);';
    EXECUTE STATEMENT SQL;
  END
  SUSPEND;
END^

SET TERM ; ^

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 12-03-2014
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 21
gorsan Va por buen camino
Muchas gracia ecfisa por tu contestación.
He probado ambas soluciones pero no me funcionan ninguna de las dos.
Por parte del ISQL se queja en la palabra OR y no compila.
Desde D7 se queja en el punto free del segundo finally y si lo elimino se queja en la sentencia del commit ambas con el mismo error de Class EAccessViolation. Lee de la dirección xxxxxxxxxxxxx.
El caso es que ambas rutinas tienen muy buena pinta pero me sucede eso.
Saludos
Responder Con Cita
  #4  
Antiguo 12-03-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola gorsan.

No sé que te puede estar sucediendo...Tal vez estes usando una versión menor de Firebird que la mía. Pero probé ambos códigos antes de publicarlos, nuevamente ahora y funcionan correctamente.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 12-03-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ecfisa Ver Mensaje
...
Escelente
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear tabla en tiempo de ejecucion en un directorio X Tauro78 Tablas planas 2 24-03-2010 00:37:34
Tabla en tiempo de ejecucion noshy SQL 1 24-07-2006 00:39:31
crear una tabla en tiempo de ejecucion. chileno MySQL 1 06-07-2005 03:13:55
Crear Tabla en Tiempo de ejecucion alcides Varios 4 01-07-2005 20:23:52
Crear un DSN en tiempo de ejecucion neyvan Conexión con bases de datos 7 21-05-2004 17:41:45


La franja horaria es GMT +2. Ahora son las 02:39:11.


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