Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-10-2003
rmnart rmnart is offline
Miembro
 
Registrado: jun 2003
Posts: 17
Poder: 0
rmnart Va por buen camino
Post 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
Responder Con Cita
  #2  
Antiguo 03-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 03-10-2003
rmnart rmnart is offline
Miembro
 
Registrado: jun 2003
Posts: 17
Poder: 0
rmnart Va por buen camino
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...
Responder Con Cita
  #4  
Antiguo 03-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 04-10-2003
rmnart rmnart is offline
Miembro
 
Registrado: jun 2003
Posts: 17
Poder: 0
rmnart Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 06-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 06-10-2003
rmnart rmnart is offline
Miembro
 
Registrado: jun 2003
Posts: 17
Poder: 0
rmnart Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 07-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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?
Responder Con Cita
  #9  
Antiguo 07-10-2003
rmnart rmnart is offline
Miembro
 
Registrado: jun 2003
Posts: 17
Poder: 0
rmnart Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 08-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
la URL directa es http://www.clubdelphi.com/users/cadetill/utilsib.php

y está en la sección de Firebird - Units - UtilsIB
Responder Con Cita
  #11  
Antiguo 04-11-2003
rmnart rmnart is offline
Miembro
 
Registrado: jun 2003
Posts: 17
Poder: 0
rmnart Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 04-11-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:30:27.


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