PDA

Ver la Versión Completa : Problema Con Sentencia en Delphi


Castelo1986
04-03-2017, 02:53:32
Saludos amigos, soy nuevo en esto de la programación, espero puedan ayudarme. tengo un problema con esta sentencia, el campo que necesito actualizar es tipo float y lo voy a actualizar con un valor que coloque en una caja de texto. al ejecutar el programa me da error. que puede ser adjunto codigo.


procedure TT_UT.ButtonUtClick(Sender: TObject);
begin
T_UT.DBISAMQueryUT.SQL.Clear;
T_UT.DBISAMQueryUT.SQL.Add('UPDATE');
T_UT.DBISAMQueryUT.SQL.Add('STipoRetencionDetalle SET FRETD_MAYORQUE =:ValorUt');
T_UT.DBISAMQueryUT.SQL.Add('WHERE FRETD_PERSONA = 0');
T_UT.DBISAMQueryUT.Params.CreateParam(ftString,'ValorUt');
T_UT.DBISAMQueryUT.ParamByName('ValorUt').AsString := T_UT.EditUt.Text;
T_UT.DBISAMQueryUT.ExecSQL;

AgustinOrtu
04-03-2017, 04:34:59
Bienvenido a Club Delphi

Recuerda pegarle una leida a la guia de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)

Tambien recuerda utilizar tags para publicar codigo fuente

http://www.clubdelphi.com/images/UtilizarTAGs.png

Con respecto a tu consulta, cual es el error (tipo de excepcion y mensaje) y en que linea?

Que componentes de acceso a datos estas usando? A que base de datos te conectas?

Como esta definido el campo que queres actualizar/insertar?

roman
04-03-2017, 16:12:59
Tal como indica AgustinOrtu, debes dar más detalles de tu problema. En principio, si el campo FRETD_MAYORQUE es un float entonces quizá el motor de b.d no acepta que le des el valor como cadena de texto.

LineComment Saludos

Castelo1986
05-03-2017, 02:09:16
este es el error que me da.
First chance exception at $7530B760. Exception class EDBISAMEngineError with message 'DBISAM Engine Error # 11949 SQL parsing error - Expected NULL, SmallInt, Word, AutoInc, Integer, LargeInt, Currency, Float, or BCD expression but instead found ? in UPDATE SQL statement at line 2, column 43'.


el campo que requiero actualizar esta tipo float.


es una base datos dbisam. disculpen no haberlo puesto antes.

AgustinOrtu
05-03-2017, 03:49:42
Muy sencillo, no te esta reconociendo el parametro.


No use nunca dbisam (ni tampoco se que componentes estas usando). Pero por lo que es idiomatico, no es necesario que se utilicen los metodos para crear parametros en ninguna suite de componentes ya que esto lo hacen automaticamente al detectar los caracteres especiales para parametros (como los dos puntos o en algunos casos el signo de interrogacion)

Prueba a eliminar la linea

T_UT.DBISAMQueryUT.Params.CreateParam(ftString,'ValorUt');

La otra opcion, que no solo podria provocar el error, sino que tambien me parece mas adecuado, si estas trabajando con un campo float, porque mejor no pasarle valores float? Le estas pasando un string y el error reza: "Expected NULL, SmallInt, Word, AutoInc, Integer, LargeInt, Currency, Float, or BCD expression but instead found ?" y es cierto ya que le pasaste un string

adebonis
06-03-2017, 11:31:47
Hola.

Debes hacer caso a la opinión de AgustinOrtu.

Saludos.

Castelo1986
08-03-2017, 03:18:18
Gracias por responder, AgustinOrtu, Hice lo que me dijistes y aun me resulta el mismo error, el parámetro se esta creando porq necesito que el valor que yo ponga en una caja de texto me actualice ese campo en la base de datos

AgustinOrtu
08-03-2017, 03:27:12
El parametro lo crea internamente el componente, no hace falta que vos mismo lo crees

Si no es eso entonces deberias verificar como esta definido el campo en la base de datos.

Como estas asignando el valor en el parametro?

Castelo1986
08-03-2017, 03:43:27
el campo esta debinido como float.

si no es necesario crear el paramatro como actualizo ese campo desde una caja de texto? no lo domino

AgustinOrtu
08-03-2017, 03:50:00
procedure TT_UT.ButtonUtClick(Sender: TObject);
begin
T_UT.DBISAMQueryUT.SQL.Clear;
T_UT.DBISAMQueryUT.SQL.Add('UPDATE');
T_UT.DBISAMQueryUT.SQL.Add('STipoRetencionDetalle SET FRETD_MAYORQUE =:ValorUt');
T_UT.DBISAMQueryUT.SQL.Add('WHERE FRETD_PERSONA = 0');
// T_UT.DBISAMQueryUT.Params.CreateParam(ftString,'ValorUt'); // esta linea no va
T_UT.DBISAMQueryUT.ParamByName('ValorUt').AsFloat := 1.23; // en un principio ve por lo mas simple,
// deberia funcionar a la primera con esto. Si funciona ya luego quitas esta linea tambien
T_UT.DBISAMQueryUT.ParamByName('ValorUt').AsFloat := FloatToStr(T_UT.EditUt.Text); // y dejas esta
T_UT.DBISAMQueryUT.ExecSQL;
end;

Ten cuidado con la conversion: FloatToStr (http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.FloatToStr) convierte usando la configuracion regional del equipo. Existen formas de utilizar formatos definidos por el programador.

Esto se puede hacer usando la version sobrecargada que acepta un parametro de tipo TFormatSettings (http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TFormatSettings); o bien utilizando una funcion llamada FloatToStrF (http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.FloatToStrF)

Castelo1986
08-03-2017, 04:08:36
Muchas gracias Hermano si Funciono, Lo unico que cambie fue StrToFloat(T_UT.EditUt.Text) y asi si funciono. agradecido