FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
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; |
#3
|
|||
|
|||
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... |
#4
|
|||
|
|||
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
|
#5
|
|||
|
|||
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 |
#6
|
|||
|
|||
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 Mira de poner el código que utilizas a ver que puede estar pasando |
#7
|
|||
|
|||
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. |
#8
|
|||
|
|||
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?
|
#9
|
|||
|
|||
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. |
#10
|
|||
|
|||
la URL directa es http://www.clubdelphi.com/users/cadetill/utilsib.php
y está en la sección de Firebird - Units - UtilsIB |
#11
|
|||
|
|||
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 |
#12
|
|||
|
|||
Cita:
|
|
|
|