Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al Actualizar Decimales (https://www.clubdelphi.com/foros/showthread.php?t=96898)

pruz 15-10-2024 21:35:33

Error al Actualizar Decimales
 
1 Archivos Adjunto(s)
Hola amigos:

Su pesadilla otra vez :)

Tengo el siguiente problema, estoy trabajando con Mysql 5.1 y Delphi Tokio.

Tengo un valor con decimales, pero solo cuando actualizo me da el siguiente error (ver imagen)

Código Delphi [-]
      Valor := SacaMiles(edt_uf.Text);
      ModuloDatos.QTablas.SQL.Clear;
      ModuloDatos.QTablas.SQL.Add(' Update remaux ');
      ModuloDatos.QTablas.SQL.Add(' set valor  = ''' + FloatToStr(Valor) + '''');
      ModuloDatos.QTablas.SQL.Add(' Where Raiz =  ''' + copy(edt_cuf.Text,1,1) + '''');
      ModuloDatos.QTablas.SQL.Add(' and Codigo = ''' + Trim(copy(edt_cuf.Text,3,3)) + '''');
      ModuloDatos.QTablas.Execute;

Ya revise el campo en la tablas Mysql y es de Double(15,4)


Estoy usando la siguiente funcion para validar el punto o coma, como separador de miles o decimales.


Código Delphi [-]
Function SacaMiles( cValor : String ): Extended ;
var
  cRetorno, smiles, sdecimal : String ;
  n        : word ;
begin
  smiles   := SysUtils.FormatSettings.ThousandSeparator ;
  sdecimal := SysUtils.FormatSettings.DecimalSeparator ;

  cRetorno := '';
  For n := 1 To Length( cValor ) do begin
     If (cValor[ n ] <> '.')  then
               cRetorno :=  cRetorno + cValor[ n ] ;
  end;
  If cRetorno = '' then cRetorno := '0' ;
  Result := StrToFloat( cRetorno ) ;

end ;

aledieb 15-10-2024 23:08:09

Hola, proba con:

Código Delphi [-]
      Valor := SacaMiles(edt_uf.Text);
      ModuloDatos.QTablas.SQL.Clear;
      ModuloDatos.QTablas.SQL.Add(' Update remaux ');
      ModuloDatos.QTablas.SQL.Add(' set valor  = :valor');
      ModuloDatos.QTablas.SQL.Add(' Where Raiz =  ''' + copy(edt_cuf.Text,1,1) + '''');
      ModuloDatos.QTablas.SQL.Add(' and Codigo = ''' + Trim(copy(edt_cuf.Text,3,3)) + '''');
      ModuloDatos.QTablas.parambyname('valor').value:=valor;
      ModuloDatos.QTablas.Execute;

Editado, entendí mal y estas grabando un valor como texto. No convendría modificar la tabla y grabar un valor numérico?

navbuoy 16-10-2024 03:55:49

si utilizas FloatToStr() lo conviertes a cadena de texto, quizas deberias usar la funcion FormatFloat()

La función FormatFloat en Delphi se utiliza para dar formato a un número de punto flotante (float) de acuerdo con una cadena de formato especificada.

Sintaxis:
Código:

function FormatFloat(const Format: string; Value: Extended): string;
Format: Especifica cómo debe formatearse el número, utilizando ciertos caracteres especiales.
Value: Es el número que deseas formatear.

Ejemplo:

Código:

var
  formattedValue: string;
  number: Double;
begin
  number := 12345.6789;
  formattedValue := FormatFloat('#,##0.00', number);
  ShowMessage(formattedValue);  // Resultado: "12,345.68"
end;

Caracteres comunes para el formato:
0: Se usa para forzar la aparición de ceros en posiciones vacías.
#: Representa un dígito opcional. No se muestra si no hay dígito en esa posición.
.: Se utiliza como separador decimal.
,: Se utiliza como separador de miles.

navbuoy 16-10-2024 06:17:54

Formato simple:

Código:

FormatFloat('0.00', 123.456);  // "123.46"
Separador de Miles:

Código:

FormatFloat('#,##0.00', 12345.678);  // "12,345.68"
Formato con signos positivos - negativos

Código:

FormatFloat('+0.00;-0.00', -123.45);  // "-123.45"
La función es muy útil para presentar valores numéricos con un formato específico, como cuando deseas mostrar cantidades con separadores de miles, números decimales fijos, o en un estilo contable.

Casimiro Notevi 16-10-2024 12:35:25

Es mejor y más seguro usar parámetros, tal y como ha explicado aledieb

Y de todas formas, a simple vista me parece que esto está mal:
Código Delphi [-]
ModuloDatos.QTablas.SQL.Add(' set valor  = ''' + FloatToStr(Valor) + '''');
Porque al hacer floatostr ya te devuelve el valor entre comillas (un string), y tú estás añadiendo más comillas.

pruz 16-10-2024 14:54:00

Lo primero que voy hacer es aplicar la sugerencia de Casimiro y si no resulta ire escalando en las soluciones propuestas

gracias

cloayza 16-10-2024 16:11:18

Estimado pruz, me tome la libertad de sugerir lo siguiente...

Código Delphi [-]
var
  Value:String;
  SValue:String;
  Valor:Single; //Double?..
begin
      SValue:=edt_uf.Text;

      {Reemplaza Separador de Miles, por ''}
      SValue:=SValue.Replace(FormatSettings.ThousandSeparator, EmptyStr);

      {Convierte Strint a Single}
      Valor :=0;
      if not SValue.IsEmpty then
         Valor :=SValue.ToSingle;

      ModuloDatos.QTablas.SQL.Clear;
      ModuloDatos.QTablas.SQL.Add(' Update remaux ');
      ModuloDatos.QTablas.SQL.Add('   set valor  = :Valor');
      ModuloDatos.QTablas.SQL.Add(' Where Raiz = :Raiz ');
      ModuloDatos.QTablas.SQL.Add('   and Codigo = :Codigo');

      ModuloDatos.QTablas.ParamByName('valor').value := valor; //[Valor | SValue.ToSingle]
      ModuloDatos.QTablas.ParamByName('raiz').value  := copy(edt_cuf.Text,1,1)
      ModuloDatos.QTablas.ParamByName('codigo').value:= Trim(copy(edt_cuf.Text,3,3))

      ModuloDatos.QTablas.Execute;
end;
Como indican los colegas, es una muy buena alternativa el utilizar parámetros para asignar los datos a actualizar en la sentencias SQL. Simplifica y clarifica el código...

Saludos cordiales

navbuoy 16-10-2024 16:14:31

lo primero que hay que tener en cuenta es que ha dicho en el primer post que su base de datos tiene un valor numerico con decimales asi que pasarlo a string aparte de ser una tonteria no servira para almacenarlo en un float numerico en la BD (y digo tonteria porque si el campo de la BD es numerico con decimales que sentido tiene pasarlo a string? quiero decir si el objetivo parece ser almacenarlo en la BD, no mostrarlo en un ShowMessage o cosas parecidas) y tambien para que tantas lineas de codigo si con FormatFloat de 1 sola linea ya lo puedes ajustar a lo que necesitas? (me refiero al primer post donde utiliza una funcion para los miles)

y si cloayza, asi como lo muestras yo tambien lo utilizo para construir las sentencias SQL de los queries, funciona muy bien el ParamByName y lo simplifica a la hora de construir la sentencia con datos dinamicos que puedan variar

pruz 17-10-2024 17:43:43

Hola a todos:

Listo, solucionado aplique la solucion "cloayza", solo la parte del UPDATE.
funciona perfecto

muchas gracias


La franja horaria es GMT +2. Ahora son las 18:21:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi