Recent

Author Topic: Insertar registro númerico con más de 4 decimales  (Read 5406 times)

esdonis

  • Jr. Member
  • **
  • Posts: 61
Insertar registro númerico con más de 4 decimales
« on: May 28, 2018, 08:37:00 pm »
Estoy tratando de insertar un registro en una tabla de firebird con un campo númerico con 6 decimales pero siempre me trunca el número a 4 decimales.

Uso un TSQLQuery para en una consulta con parámetros de la siguiente forma:

  rsuvt.Close;
  rsuvt.SQL.Clear;
  rsuvt.SQL.Text := sqlstr;
  rsuvt.Params.ParamByName(LParam[0]).AsFloat:=StrToFloat(LValor[0]);
  try try
    trauvt.StartTransaction;
    rsuvt.ExecSQL;
    intfilas := rsuvt.RowsAffected;
    trauvt.Commit;
  except
    on e:exception do begin
      intfilas := 0;
      strerror := e.Message;
      trauvt.Rollback;
    end;
  end;
  finally
    trauvt.EndTransaction;
  end;

Al comprobar el parámetro LValor[0] si trae el valor con los 6 decimales, pero en la tabla solo se salvan 4 decimales

Edson

  • Hero Member
  • *****
  • Posts: 1301
Re: Insertar registro númerico con más de 4 decimales
« Reply #1 on: May 28, 2018, 09:05:28 pm »
¿Qué tipo de dato tiene la columna de Firebird? ¿No será que solo soporta 4 decimales?
Sería bueno que verifiques, primero, en que parte del proceso se pierden los decimales.
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Insertar registro númerico con más de 4 decimales
« Reply #2 on: May 28, 2018, 09:11:37 pm »
la tabla en firebird es decimal (16,6)
si inserto los datos directo a la tabla con flamerobin si los coge

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Insertar registro númerico con más de 4 decimales
« Reply #3 on: May 28, 2018, 09:31:55 pm »
Sin envargo si en la variable "sqlstr" le pongo directamente el valor por ejemplo de 1.012345 si me lo inserta correctamente, osea si pongo

sqlstr:='insert into tabla (cantidad) values (1.012345)

si me inserta bien el valor

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Insertar registro númerico con más de 4 decimales
« Reply #4 on: May 29, 2018, 03:54:31 pm »
Todo parece indicar que el error esta en los parametros, que al pasar el valor del parametro esta truncando el valor a 4 decimales.

He estado revizando el codigo de Lazarus, pero no he encontrado aun el procedimiento donde Lazarus transfiere el valor de los parametros al quey.

Alguien ha revizado esto?

Cualquier ayuda sera bien venida

Edson

  • Hero Member
  • *****
  • Posts: 1301
Re: Insertar registro númerico con más de 4 decimales
« Reply #5 on: May 29, 2018, 06:59:58 pm »
No trabajo mucho con Base de datos en Lazarus, pero en tu lugar verificaría las funciones que llevan valores al SQL. Tal vez en alguna parte se truncan los decimales, o usan el tipo Single de baja precisión.
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

GAN

  • Sr. Member
  • ****
  • Posts: 370
Re: Insertar registro númerico con más de 4 decimales
« Reply #6 on: May 29, 2018, 10:38:02 pm »
A ver si esto te sirve: http://mc-computing.com/Databases/Delphi/QueryParameters.html

Code: Pascal  [Select][+][-]
  1. procedure TxxDataSet.FloatPut(Field: string; A_Value: Double);
  2. begin
  3.   with Params.CreateParam(ftFloat, Field, ptInput) do
  4.     AsFloat := A_Value;
  5. end;

Saludos.
Lazarus 2.0.8 FPC 3.0.4 Linux Mint Mate 19.3
Zeos 7̶.̶2̶.̶6̶ 7.1.3a-stable - Sqlite 3.32.3 - LazReport

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Insertar registro númerico con más de 4 decimales
« Reply #7 on: May 30, 2018, 06:16:20 pm »
La verdad que no se como agregar ese procedimiento al TSQLQuery.

Yo al pasar el sql al query ya trae implicitos los parametros usados:

por ejemplo hago:

rsuvt.SQL.Clear;            
rsuvt.SQL.Text := 'insert into tabla (..., cantidad) values  (..., :fCan)';
rsuvt.Params.ParamByName('fCan').AsFloat:=1.012345;

Pero el sql es dinamico por lo que cambia el numero de parametros en dependencia de la consulta y los campos a actualizar

En este ejemplo me guarda el dato como 1.012300

GAN

  • Sr. Member
  • ****
  • Posts: 370
Re: Insertar registro númerico con más de 4 decimales
« Reply #8 on: May 30, 2018, 08:22:11 pm »
Parameters in TSQLQuery.SQL

In most situations, the SQL property of TSQLQuery will contain the select statement which in most situations doesn't need parameters. However, it can contain them. This allows a very easy and powerful way to filter your records.

Parameters have the following advantages:

 no need to format your data as SQL text, date etc arguments (i.e. no need to remember how to format a date for MySQL, which might differ from the Firebird implementation; no need to escape text data like O'Malley's "SQL Horror"

Esto dice la wiki de Free Pascal.

Por qué no intentas insertar la fila con TSQLTransaction.ExecuteDirect ? Ahí se manda todo texto y no deberías tener problemas. Te dejo el link en español de la wiki respecto de como hacer esto último: http://wiki.freepascal.org/SqlDBHowto/es#.C2.BFC.C3.B3mo_ejecutar_consultas_directas_o_crear_una_tabla.3F
Lazarus 2.0.8 FPC 3.0.4 Linux Mint Mate 19.3
Zeos 7̶.̶2̶.̶6̶ 7.1.3a-stable - Sqlite 3.32.3 - LazReport

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Insertar registro númerico con más de 4 decimales
« Reply #9 on: May 30, 2018, 09:24:00 pm »
Ese metodo lo conozco, y al utilizarlo me inserta bien los datos.

Pero lo que queria era solucionar el problema que tiene Lazarus con los parametros numericos cuando estos tienen mas de 4 decimales. Ya que esto es un problema que va a afectar a todos los que lo usen.

Por ahora de forma temporal estoy insertando el valor de forma directa:

Por ejemplo tengo que hacer lo que sigue:

scant:=AnsiReplaceStr(FormatFloat('#0.000000', ds.FieldByName('cantidad').AsFloat), ',', '.');
sexit:=AnsiReplaceStr(FormatFloat('#0.000000', ds.FieldByName('exist').AsFloat), ',', '.');

strsql := 'insert into vtractual (idac, ida, num, fecha, factura, importe, idp, codigo, desp, um, area, idcto, cantidad, pre1, pre2, saldo1, saldo2, exist, clave) ';
strsql := strsql + 'values (:iEnt, :iAlm, :iNum, :dFec, :sFac, :cImp, :iIdp, :sCod, :sDes, :sUm, :sArea, :iIdc, ' + scant + ', :cPcup, :cPcuc, :cVcup, :cVcuc, ' + sexit + ', :sCla)';

 

TinyPortal © 2005-2018