Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   modificar o agregar campos a una tabla en ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=4130)

rmnart 03-10-2003 00:39:07

modificar o agregar campos a una tabla en ejecucion
 
Quisiera agregar campos a una tabla (interbase) ya creada en momento de ejecucion con componentes ibx... intente con un procedimiento almacenado pero me marca error en la clausula alter o alguna otra manera o si acaso voy por mal camino

CREATE PROCEDURE AGREGAR (
TIPO VARCHAR (10))
AS
BEGIN
ALTER TABLE UBICACION
ADD TIPO VARCHAR (10);
SUSPEND;
END

__cadetill 03-10-2003 01:37:41

yo suelo utilizar esta función para añadir campos a una tabla en ejecución. Se le pasa el nombre de la tabla, el nombre del campo, el tipo del campo y la posición (la función es mejorable, pero bueno, es una opción ;))

Código:

function CheckCampo(Tabla, Campo, Tipo : String; Posicion: Integer): Boolean;
var
  tCambios  : TIbTable;
  QryCambios : TIbQuery;
begin
  Result := False;
  tCambios := TIBTable.Create(Application);
  try
    tCambios.Database  := BDades.IBDatabase1;
    tCambios.TableName := Tabla;
    tCambios.Open;
    if tCambios.FindField( Campo ) = nil then
    begin
      tCambios.Close;
      QryCambios := TIbQuery.Create(Application);
      try
          QryCambios.Database := BDades.IBDatabase1;
          QryCambios.SQL.Add('ALTER TABLE '+ TABLA + ' Add "'+ CAMPO +'" ' + TIPO );
          try
            QryCambios.ExecSQL;
            BDades.IBTransaction1.CommitRetaining;
            if Posicion >= 0 then
            begin
              if NOT BDades.IBTransaction1.InTransaction then
                  BDades.IBTransaction1.StartTransaction;
              QryCambios.Close;
              QryCambios.SQL.Clear;
              QryCambios.SQL.Add('UPDATE RDB$RELATION_FIELDS SET RDB$FIELD_POSITION=' + IntTostr(POSICION) );
              QryCambios.SQL.Add('WHERE RDB$FIELD_NAME=' + '''' + CAMPO + '''' +
                                  ' AND RDB$RELATION_NAME= ' + '''' + TABLA + '''' );
              QryCambios.ExecSQL;
              BDades.IBTransaction1.CommitRetaining;
              fSplash.ProgressBar1.StepIt;
            end;
            Result := True;
          except
            on e: exception do
              MessageDlg( 'Imposible reestructurar Tabla ' + Tabla +
                    '. No es posible acceder a la tabla '+ BDades.IBDatabase1.Databasename +
                    #13 + e.Message, mtError, [mbOk], 0);
          end;
      finally
        QryCambios.Free;
      end;
    end
    else Result := True;
    if tCambios.Active then tCambios.Close;
  finally
      FreeAndNil(tCambios);
  end;
end;

Espero te sirva

rmnart 03-10-2003 19:08:35

Bueno cadetill, me parece que utilizas componentes ibtables, el que utilizo son ibdataset y he tratado de adaptar tu funcion pero no he podido, no se si conozcas alguna forma de hacerlos con ibdataset

De antemano gracias...

__cadetill 03-10-2003 19:32:24

pero.... para hacer la comprobación.... que más da que sea un IBTable??? total, es un objeto local de la función y sólo se utiliza para saber los campos que tiene la tabla :confused:

rmnart 04-10-2003 19:37:59

Hola Cadetill tenias razon, me funciona de maravilla al agregar un campo e intentado agregar mas de uno con un ciclo pero me el siguiente error pero no el programa si no al abrir el .gdb marca el sig. error

Arithmetic overflow or divizion by zero has ocurred
arithmetic exception, numeric overflow, or string truncation
cannot transliterate character between character sets

Nota: si agrego de un campo a la vez, si ejecuto el programa y agrego un campo lo cierro y agrego otro todo marcha bien, el problema es cuando trato de agregarlos con un ciclo.

Son campos de tipo Date

Tienes alguna idea de que pueda ser

__cadetill 06-10-2003 00:49:13

pues la verdad, no te sabria decir. Yo la utilizo para hacer verificaciones de campos en versiones nuevas de las aplicaciones haciendo algo así

Código:

if CheckCampo(....) and
  CheckCampo(....) and
  CheckCampo(....) then
// lo que sea, como arracar la app
else
// no arrancar la app

y me funciona b a las mil maravillas.

Mira de poner el código que utilizas a ver que puede estar pasando :confused:

rmnart 06-10-2003 20:12:58

Cadetill aqui te pongo lo q hago, mandando llamar a la funcion q me pusiste, si es una sola vez funciona muy bien, el problema es cuando es mas de un dato en la tabla exped. la funcion q pusiste esta casi igual no hice ningun cambio asi q por eso no la he puesto porq ya esta aqui...

procedure TForm1.AgregarClick(Sender: TObject);
var pos: integer;
begin
Exped.open;
pos:=12;
exped.first;
while not exped.eof do
begin
CheckCampo('UBICACION', Exped.fieldbyname('documento').asstring, 'DATE', i);
pos:=pos+1;
exped.next;
end;
end;

Bueno espero me puedes ayudar.

__cadetill 07-10-2003 03:32:22

bueno, he subido a mi web una demo del funcionamiento de esta función. La demo la he hecho con un bucle recorriendo una tabla (como tu). Miratelo y me cuentas, ok?

rmnart 07-10-2003 19:46:37

Bueno cadetill he estado buscando en tu web pero no he encontrado tu demo, no se si podrias ponerla aqui... o q me pusieras la liga..

Gracias por tu apoyo.

__cadetill 08-10-2003 01:06:49

la URL directa es http://www.clubdelphi.com/users/cadetill/utilsib.php

y está en la sección de Firebird - Units - UtilsIB

rmnart 04-11-2003 00:45:09

Bueno cadetiill se me habia pasado informarte que tu funcion estaba bien, que pude agregar varios campos en un ciclo como lo habia descrito antes..

El problema era que uno da los campos que queria agregar llevaba acento...


Gracias por tu ayuda

__cadetill 04-11-2003 09:27:55

Cita:

rmnart comentó:
El problema era que uno da los campos que queria agregar llevaba acento...
Pues mira, eso no lo habia probado nunca. Ya le hechare unos ojos a ver si puedo arreglarlo. De todas maneras, soy de la opinión de no poner acentos, ni minúsculas, ni carácteres raros en los nombres de tablas y campos


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

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