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)
-   -   Consulta con mas de 4 decimales (https://www.clubdelphi.com/foros/showthread.php?t=76714)

subzero 21-11-2011 18:29:02

Consulta con mas de 4 decimales
 
Hola.

Tengo una consulta en Firebird 2.5 en la cual me trae el costo (12987.0000) el precio (15516.8676), al momento de dividirlos me retorna el valor de 1.1948 cuando necesito que me muestre 1.194829 la consulta la estoy realizando así:

Código SQL [-]
  SELECT precio / costo FROM producto;

Que puedo hacer, ya intente con un CAST( AS DECIMAL(4,6)), generando error -842. Gracias!

guillotmarc 21-11-2011 19:17:24

Prueba :

select cast(precio as numeric(15,6)) / costo from producto

Saludos

subzero 21-11-2011 21:29:39

Gracias guillotmarc, pero siguen apreciando solo 4 cifras después del punto. Alguna otra idea...

guillotmarc 21-11-2011 21:44:54

Hola.

El problema probablemente sea la representación que muestra tu programa Delphi, estará redondeando en el momento de mostrar.

subzero 21-11-2011 21:50:26

Hola, gracias por tu interés. la consulta la estoy realizando directamente en firebird utilizando la herramienta EMS Intebase Manager.

Chris 21-11-2011 22:11:45

De que tipo de dato son los campos PRECIO y COSTO?

subzero 21-11-2011 22:18:22

son decimal(18,4).

guillotmarc 21-11-2011 22:40:58

Hola.

Quizás sea la visualización del EMS Interbase Manager quien te redondea el resultado.

Prueba esto, para confirmarlo : select cast(cast(precio as numeric(15,6)) / costo as varchar(50)) from producto

Si el problema no está en un redondeo en los componentes de presentación en pantalla, entonces prueba de cambiar el tipo a todos los operandos (en principio solo debería ser necesario hacerlo en el primero) :

select cast(precio as numeric(15,6)) / cast(costo as numeric(15,6)) from producto

NOTA: Aunque lo acabo de probar en una base de datos Firebird 2.0, y a mi me funciona correctamente solo cambiando el tipo en el primer operando, tal y como te recomendé en el mensaje anterior. Así que aunque el EMS Interbase Manager te muestre solo 4 caracteres, en tu aplicación deberías poder mostrar correctamente los 6 caracteres que en realidad devuelve la consulta.

Saludos.

Chris 21-11-2011 22:55:40

Creo que es ahí el detalle. Los campos no son de DOUBLE PRECISION. Necesitas convertir a DOUBLE PRECISION los campos COSTO y PRECIO al momento de hacer la consulta: Por ejemplo;
Código SQL [-]
select cast(a.precio as double precision) / cast(a.costo as double precision) from ...

Puedes leer más al respecto en http://www.firebirdfaq.org/faq79/

Saludos,
Chris

subzero 21-11-2011 23:21:47

Bueno aun nada, tratare de ser mas especifico.

Código SQL [-]
SELECT
       (cast(costo as NUMERIC(15,6)) + cast((cast(costo as NUMERIC(15,6)) * (pcj_venta1/100)) as numeric(15,6))) / cast(costo as NUMERIC(15,6))
FROM productos
WHERE id = 147

La primera parte del select hace referencia al precio : (cast(costo as NUMERIC(15,6)) + cast((cast(costo as NUMERIC(15,6)) * (pcj_venta1/100)) as numeric(15,6)))

La segunda al costo : cast(costo as NUMERIC(15,6)).

El porcentaje de venta pcj_venta1 no es mas que una variable de tipo decimal(4,4).

El resultado luego de realizar la consulta donde el costo es 12987 y precio es 15516.8876 es el siguiente... 1.1284.

Ahora el por que. requiero hacer esto... bueno sucede que el cliente el margen de utilidad esta dado por ((precio/costo)-1))*100 donde reemplazando me dará una utilidad de 12.8449, pues bien, ahora el cliente compro no a 12987 sino a 11000 pero se requiere que el precio de venta se mantenga por lo tanto calculo el precio actual y lo divido entre el nuevo costo para actualizar el margen de utilidad en la tabla.

Espero quizás me entiendan el porque de la necesidad de los decimales ya que con solo los cuatro del resultado 1.1284 al restarle 1 y multiplicarlo por 100 me da 12.84 donde el precio se vera afectado... como enrredado cierto! :D

RONPABLO 21-11-2011 23:32:12

Prueba con lo que te dijo Chris (double precision)

subzero 21-11-2011 23:54:08

Efectivamente... gracias a todos. Ya funciono la cuestión estaba en hacerle cast a pcj_venta1 era lo único y listo.. claro esta utilice el double precisión. Por ultimo habrá mucha diferencia en utilizar double precision y decimal o numeric?

rastafarey 23-11-2011 03:17:04

Resp
 
No creo que deba hacer ningun cast. Pero eso es el resultado de la division. El manejador es tan inteligente que expande la cantidad de decimales tanto numerador como denominador. Osea 8 decinames.

El resultado de la division es 11948. No entendo como quieres que te de mas decimales si eso es lo que da lo he probado con varias calculadoras y no me da diferente.

guillotmarc 23-11-2011 10:10:46

Cita:

Empezado por rastafarey (Mensaje 419154)
No creo que deba hacer ningun cast. Pero eso es el resultado de la division. El manejador es tan inteligente que expande la cantidad de decimales tanto numerador como denominador. Osea 8 decinames.

No, no lo hace. Redondea el resultado a la misma cantidad de decimales que el tipo original de los operandos a dividir.

Pruébalo.

NOTA : ¿ Que crees que haría el motor de Firebird si el resultado de una operación es un número irracional ?, ¿ devolvernos un nº infinito de decimales ?.

subzero 23-11-2011 15:07:40

Lo probare, muchas gracias a todos

rastafarey 26-11-2011 04:29:12

resp
 
Por que lo prove es que lo digo

guillotmarc 26-11-2011 14:40:09

Si, tienes razón, disculpa.

Lo acabo de probar, y en efecto, Firebird ya devuelve siempre un valor correcto con 8 decimales. El valor que devolvía Firebird en la pregunta original ya era el valor correcto de verdad, y no el valor que equivocadamente estaba esperando el usuario.

Todas las respuestas que se han dado han sido correctas en todo momento, pero innecesarias. Como bien dices, en esta ocasión no hay ninguna necesidad de forzar los tipos de datos.


La franja horaria es GMT +2. Ahora son las 04:01:19.

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