Ver Mensaje Individual
  #8  
Antiguo 17-02-2017
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Reputación: 21
gorsan Va por buen camino
Hola de nuevo!!
He creado una nueva aplicación para que nada interfiera en la ejecución. En un formulario he puesto:

1 IBDatabase1
1 IBTransaction1 conectada a la anterior pero con la propiedad Active:=False.
1 IBDataSet1 conectada a la IBDatabase1 pero con la propiedad Active:=False y la tabla EMPLEADOS encapsulada.
1 IBQuery1 tambien conectada a IBDatabase1
1 BitBttn que ejecuta el siguiente código:

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  TableName1: string;
begin
  TableName1:='9999999999';
  with IBQuery1 do
    begin
      Close;
      DataBase:=IBDatabase1;
      Transaction:=IBTransaction1;
      SQL.Clear;
      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:=TableName1;
      Open;
      if IsEmpty then
        begin
          Close;
          DataBase:=IBDatabase1;
          Transaction:=IBTransaction1;
          SQL.Clear;
          SQL.Add('CREATE TABLE '+'"'+TableName1+'"' +'(');
          SQL.Add('VNIP VARCHAR(10) NOT NULL,');
          SQL.Add('VNUM VARCHAR(20) NOT NULL,');
          SQL.Add('APELLIDO1 VARCHAR(50) NOT NULL,');
          SQL.Add('APELLIDO2 VARCHAR(50),');
          SQL.Add('VNOMBRE VARCHAR(30) NOT NULL,');
          SQL.Add('VINCULACION VARCHAR(50) NOT NULL,');
          SQL.Add('OBSERVACIONES BLOB SUB_TYPE TEXT SEGMENT SIZE 80,');
          SQL.Add('PRIMARY KEY(VNIP)');
          SQL.Add(')');
          ExecSQL;
        end
      else
        raise Exception.Create('Existe una tabla con ese nombre');
    end;
  IBTransaction1.Commit;
  IBTransaction1.StartTransaction;
    with IBQuery1 do
      begin
        Close;
        DataBase:=IBDatabase1;
        Transaction:=IBTransaction1;
        SQL.Clear;
        SQL.Add('ALTER TABLE '+'"'+TableName1+'"'+ ' ADD CONSTRAINT '+'"'+'FK_'+TableName1+'"'+' FOREIGN KEY (VNIP) REFERENCES EMPLEADOS (NIP) ON DELETE CASCADE');
        ExecSQL;
      end;
  IBTransaction1.Commit;
  IBTransaction1.StartTransaction;
end;

Bueno pues la tabla se genera sin problema pero al ejecutar el segundo commit vuelve a dar el mismo mensaje de error de que la tabla EMPLEADOS esta en uso.
Por otro lado:

Código SQL [-]
CREATE TABLE "9999999999"
(
  "VNIP"  VARCHAR(10) NOT NULL,
  "VNUM"  VARCHAR(20) NOT NULL,
  "APELLIDO1"  VARCHAR(50) NOT NULL,
  "APELLIDO2"  VARCHAR(50),
  "NOMBRE"  VARCHAR(30) NOT NULL,
  "VINCULACION"  VARCHAR(50) NOT NULL,
  "OBSERVACIONES"  BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
  CONSTRAINT "PK_9999999999" PRIMARY KEY ("VNIP"),
  CONSTRAINT "FK_9999999999" FOREIGN KEY ("VNIP") REFERENCES INTERNOS ("NIP") ON DELETE CASCADE
);

Funciona sin problema desde el entorno isql de IBConsole.

¿Como lo ven?
Responder Con Cita