Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Un IBQuery que falla cuando se ejecuta por segunda vez (https://www.clubdelphi.com/foros/showthread.php?t=85438)

gorsan 17-03-2014 22:01:12

Un IBQuery que falla cuando se ejecuta por segunda vez
 
Hola a todos.
En un módulo de datos tengo un IBQuery en blanco, recién implantado desde la VCL lo único que he cambiado es el nombre.
El uso que le doy a este componente es la creación de una tabla IBX en tiempo de ejecución:
Código Delphi [-]
 with DMPrincipal.IBQuery2 do
   begin
    Close;
    Database:= DMPrincipal.IBDB;
    Transaction:= DMPrincipal.IBTPermanente;
    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 = :PTABLE2');
    ParamByName('PTABLE2').AsString:= TableName2;
    Open;
    if IsEmpty then
      with DMPrincipal.IBQuery2 do
       begin
        Close;
        Database:= DMPrincipal.IBDB;
        Transaction:= DMPrincipal.IBTPermanente;
        SQL.Clear;
        SQL.Add('CREATE TABLE '+ TableName2 + '(');
        SQL.Add('PRECIO_HORA_OFICIAL FLOAT DEFAULT '+IntToStr(0)+',');
        SQL.Add('FACTOR_CORRECTOR FLOAT DEFAULT '+IntToStr(0)+',');
        SQL.Add('ANUALIDAD_EN_CURSO SMALLINT NOT NULL,');
        SQL.Add('MES_EN_CURSO VARCHAR(10) NOT NULL,');
        SQL.Add('PRIMARY KEY(MES_EN_CURSO, ANUALIDAD_EN_CURSO)');
        SQL.Add(')');
        ExecSQL;
       end
    else
      raise Exception.Create('Existe una tabla con ese nombre');
  end;
end;
La primera vez que se ejecuta funciona como debe, es decir, genera la tabla, pero si inmediatamente después genero una segunda entonces el sistema da una excepción inesperada y peta en el primer open "token desconocido SELECT"
Alguna idea? intuyo que el componente no queda liberado para volver a cargar. ¿Si es eso como lo libero?

ecfisa 17-03-2014 22:25:03

Hola gorsan.

Tenes que usar el método Clear para limpiar el contenido previo de la lista.
Código Delphi [-]
   with DMPrincipal.IBQuery2 do
   begin
    Close;
    Database:= DMPrincipal.IBDB;
    Transaction:= DMPrincipal.IBTPermanente;
    SQL.Clear; 
    ...

Saludos :)

gorsan 17-03-2014 22:58:38

Gracias ecfisa. Vaya una estupidez pero no lo veía.

ecfisa 17-03-2014 23:05:01

No te preocupes, nos pasa a todos.
(Ví que era un olvido ya que mas abajo lo estabas usando)

Saludos :)


La franja horaria es GMT +2. Ahora son las 20:28:20.

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