Lazarus

Other Languages => Spanish => Topic started by: esdonis on May 28, 2018, 08:37:00 pm

Title: Insertar registro númerico con más de 4 decimales
Post by: esdonis 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
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: Edson 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.
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: esdonis 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
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: esdonis 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
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: esdonis 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
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: Edson 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.
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: GAN on May 29, 2018, 10:38:02 pm
A ver si esto te sirve: http://mc-computing.com/Databases/Delphi/QueryParameters.html (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.
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: esdonis 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
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: GAN 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 (http://wiki.freepascal.org/SqlDBHowto/es#.C2.BFC.C3.B3mo_ejecutar_consultas_directas_o_crear_una_tabla.3F)
Title: Re: Insertar registro númerico con más de 4 decimales
Post by: esdonis 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)';