Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   falla en división (https://www.clubdelphi.com/foros/showthread.php?t=39896)

mamaro 01-02-2007 17:10:47

falla en división
 
Hola, utilizo Firebird 1.5 y tengo un problema, cuando ejecuto la consulta:

Select
...,
entrada_det.cantidad,
(entrada_det.total/entrada_det.cantidad) as precio,
entrada_det.total,
...
from
entrada_det inner ...


me da un resultado erróneo:
...=...
cantidad = 100
precio = 0,004 (!! :confused: !!)
total = 41.682

...
lo hice con un procedimiento almacenado (calculando el precio posteriormente) y funciona perfecto
... si alguien me puede tirar una pista de que puede estar pasando se los agradesco.

ContraVeneno 01-02-2007 17:18:32

¿como que tipo de dato estan definidos tus campos?

mamaro 01-02-2007 17:42:44

tipos de datos
 
cantidad es de tipo Numeric(10,3)
y total numeric(10,2)

mamaro 01-02-2007 17:44:03

aclaración
 
me olvidé aclarar que mi firebird es una version 1.5 Classic sobre Red Hat 9.

Casimiro Notevi 01-02-2007 20:49:49

Serán otros los valores, seguro que no es fallo de la división.

Ivanzinho 02-02-2007 10:40:25

Eso me pasó a mi y lo comenté aqui. Esto lo soluciono aplicando una función al valor, normalmente unas UDF´s creadas por mi que son una para redondear un valor a un numero de decimales, ambos pasados como parametro, y otra para truncar valores. No se si es una forma muy ortodoxa, pero fué la única solución que encontre y por ahora me funciona perfectamente.

lbuelvas 05-02-2007 04:21:58

Hola foro,

pues me puse en la tarea de reconstruir el caso

Código SQL [-]
CREATE TABLE XXX (
    ID        INTEGER NOT NULL,
    CANTIDAD  NUMERIC(10,2) NOT NULL,
    TOTAL     NUMERIC(10,3) NOT NULL
);

ALTER TABLE XXX ADD CONSTRAINT PK_XXX PRIMARY KEY (ID);

INSERT INTO XXX (ID, CANTIDAD, TOTAL) VALUES (1, 100, 41.682);

y corri la consulta

Código SQL [-]
Select
cantidad,
(total/cantidad) as precio,
total
from xxx

y el resultado fue:

CANTIDAD PRECIO TOTAL
100 0.41682 41.682

Casimiro Notevi debe tener razon, otros son tus datos o el valor almacenado en cantidad es diferente.

Otra cosa que observe, es que una division tiene en la parte decimal del resultado la suma de los numeros de posiciones decimales de los operandos.

En tu caso deberian aparecer en la parte decimal 5 digitos.

mamaro 05-02-2007 15:16:51

voy a buscar
 
Voy a tratar de repetir la falla y se las envío, actualmente no la tengo a mano porque sustituí el código por uno que andubiera y listo.

aaaa.... antes de alterar el código probé en otro equipo (Windows con motor Firebird SS 2.0), y la falla no se dió (con la misma base).

Gracias de nuevo por e interés que han demostrado, les envío los datos a la brevedad. :)

Ivanzinho 05-02-2007 16:30:23

¿Habeis probado ejecutando la consulta con el execute statement? En mi caso solo daba problemas en las consulta dinamicas que se ejecutaban con la intrucción anterior.

mamaro 07-02-2007 15:05:16

solucion
 
Después que me dió ese error (y me dí cuenta dónde estaba fallando) mudé la consulta a un procedimiento almacenado y quedó solucionado.
Pero atención, no hice el cálculo dentro de la consulta ..

Select ....
(total/cantidad) as precio,
...

sino que lo hice ..

For Select
total,
cantidad,
(sin el precio)
...
into ... :LTOTAL, :LCANTIDAD
do
begin
LPRECIO=:LTOTAL/:LCANTIDAD;
suspend;
end


... por supuesto que LPRECIO está dentro de los parámetros que se retornan.

Bueno saludos a todos.:)

Casimiro Notevi 07-02-2007 15:27:48

Cita:

Empezado por mamaro
Después que me dió ese error (y me dí cuenta dónde estaba fallando) mudé la consulta a un procedimiento almacenado y quedó solucionado.
Pero atención, no hice el cálculo dentro de la consulta ..

Select ....
(total/cantidad) as precio,
...

sino que lo hice ..

For Select
total,
cantidad,
(sin el precio)
...
into ... :LTOTAL, :LCANTIDAD
do
begin
LPRECIO=:LTOTAL/:LCANTIDAD;
suspend;
end


... por supuesto que LPRECIO está dentro de los parámetros que se retornan.

Bueno saludos a todos.:)

Tampoco tiene que fallar, seguramente es que has puesto tipos integer.

rastafarey 12-02-2007 17:48:44

Resp
 
tengan cuidado cuando trbajan con numeric que se vana a encontar con unos resultados que los van a volver completamente loco. En este foro hay una refencia hacia un link de como se comporta firebird con los numericos traten de leerlas antes de trabajar con es tipo de datos.

Esto lo he dicho varias veces en el foro.


La franja horaria es GMT +2. Ahora son las 23:24:22.

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