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?