Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Bases de datos > Firebird e Interbase
Register FAQ Members List Calendar Guía de estilo Today's Posts

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 11/03/2014
gorsan gorsan is offline
Miembro
 
Join Date: Jun 2003
Location: 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.
Reply With Quote
  #2  
Old 12/03/2014
ecfisa's Avatar
ecfisa ecfisa is offline
Moderador
 
Join Date: Dec 2005
Location: 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 ....
Reply With Quote
  #3  
Old 12/03/2014
gorsan gorsan is offline
Miembro
 
Join Date: Jun 2003
Location: 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
Reply With Quote
  #4  
Old 12/03/2014
ecfisa's Avatar
ecfisa ecfisa is offline
Moderador
 
Join Date: Dec 2005
Location: 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 ....
Reply With Quote
  #5  
Old 12/03/2014
Casimiro Notevi's Avatar
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Join Date: Sep 2004
Location: En algún lugar.
Posts: 32,040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Quote:
Originally Posted by ecfisa View Post
...
Escelente
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Crear tabla en tiempo de ejecucion en un directorio X Tauro78 Tablas planas 2 24/03/2010 00:37
Tabla en tiempo de ejecucion noshy SQL 1 24/07/2006 00:39
crear una tabla en tiempo de ejecucion. chileno MySQL 1 06/07/2005 03:13
Crear Tabla en Tiempo de ejecucion alcides Varios 4 01/07/2005 20:23
Crear un DSN en tiempo de ejecucion neyvan Conexión con bases de datos 7 21/05/2004 17:41


All times are GMT +2. The time now is 09:17.


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