PDA

Ver la Versión Completa : alter table / modify -> Problemas en tablas dbase


Jose_Pérez
12-11-2003, 16:05:55
Hola de nuevo:

Estoy intentando cambiar la estructura de una tabla dbase...


alter table "tabla.dbf" modify campo nuevoformato


...pero SQL no me reconoce la palabra modify. He probado con change, en lugar de modify, pero tampoco funciona.

¿Alguien sabe como se hace?.

Saludos.

roman
12-11-2003, 18:01:07
No creo que esto sea posible en dbase. Me parece que tendrás que crear una nueva columna, pasar los datos de la anterior a la nueva y finalmente eliminar la anterior.

// Saludos

Jose_Pérez
13-11-2003, 09:14:18
Eso me estaba temiendo.

Gracias.

roman
13-11-2003, 16:21:24
Otra opción sería utilizar la API del BDE en lugar de SQL. Busca en la ayuda del BDE acerca de la función DbiDoRestructure. En la sección de ejemplos viene uno para cambiar un campo en una tabla paradox o dbase.

// Saludos

Jose_Pérez
14-11-2003, 09:35:08
Ya lo socioné del otro modo. De todos modos es bueno saberlo.

Gracias.

roman
14-11-2003, 16:29:33
Jose_Pérez comentó:
Ya lo socioné del otro modo. De todos modos es bueno saberlo.

¿Y no podrías cooperar con el Club y contarnos cómo fue que lo solucionaste?

// Saludos

Jose_Pérez
17-11-2003, 09:24:34
Hola Roman:

Me refería a que lo solucionés tal como tú me sugerías en la primera respuesta.


procedure TfrmPrincipal.ModificarCampo(Tabla, NombreCampo: String; TipoCampo: TFieldType;
Longitud: Integer);
var
Consulta: String;
Begin

// Añade un campo temporal con la nueva estructura.
Consulta:='alter table "'+Tabla+'" add CampoTemp';

Case TipoCampo Of
ftBoolean: Consulta:=Consulta+' boolean';
ftDate: Consulta:=Consulta+' date';
ftString: Consulta:=Consulta+' char('+IntToStr(Longitud)+')';
ftInteger: Consulta:=Consulta+' integer';
ftFloat: Consulta:=Consulta+' numeric';
End;

With Datamodulo.qryConsultas Do
Begin
Close;
SQL.Clear;
SQL.Add(Consulta);
ExecSQL;
End;

// Actualiza el campo temporal con la información del campo a modificar.
Consulta:='update "'+Tabla+'" set CampoTemp='+NombreCampo;

With Datamodulo.qryConsultas Do
Begin
SQL.Clear;
SQL.Add(Consulta);
ExecSQL;
End;

// Elimina el campo a Modificar
Consulta:='alter table "'+Tabla+'" drop '+NombreCampo;

With Datamodulo.qryConsultas Do
Begin
SQL.Clear;
SQL.Add(Consulta);
ExecSQL;
End;

// Vuelve a crear el campo modificado con la nueva estructura.
Consulta:='alter table "'+Tabla+'" add '+NombreCampo;

Case TipoCampo Of
ftBoolean: Consulta:=Consulta+' boolean';
ftDate: Consulta:=Consulta+' date';
ftString: Consulta:=Consulta+' char('+IntToStr(Longitud)+')';
ftInteger: Consulta:=Consulta+' integer';
ftFloat: Consulta:=Consulta+' numeric';
End;

With Datamodulo.qryConsultas Do
Begin
Close;
SQL.Clear;
SQL.Add(Consulta);
ExecSQL;
End;

// Actualiza el campo a modificar con la información del campo temporal.
Consulta:='update "'+Tabla+'" set '+NombreCampo+'=CampoTemp';

With Datamodulo.qryConsultas Do
Begin
SQL.Clear;
SQL.Add(Consulta);
ExecSQL;
End;

// Elimina el campo temporal.
Consulta:='alter table "'+Tabla+'" drop CampoTemp';

With Datamodulo.qryConsultas Do
Begin
SQL.Clear;
SQL.Add(Consulta);
ExecSQL;
End;

End;


Un abrazo.