Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-11-2011
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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!
Responder Con Cita
  #2  
Antiguo 21-11-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Prueba :

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

Saludos
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #3  
Antiguo 21-11-2011
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
Gracias guillotmarc, pero siguen apreciando solo 4 cifras después del punto. Alguna otra idea...
Responder Con Cita
  #4  
Antiguo 21-11-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

El problema probablemente sea la representación que muestra tu programa Delphi, estará redondeando en el momento de mostrar.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 21-11-2011
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
Hola, gracias por tu interés. la consulta la estoy realizando directamente en firebird utilizando la herramienta EMS Intebase Manager.
Responder Con Cita
  #6  
Antiguo 21-11-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
De que tipo de dato son los campos PRECIO y COSTO?
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #7  
Antiguo 21-11-2011
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
son decimal(18,4).
Responder Con Cita
  #8  
Antiguo 21-11-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 21-11-2011 a las 22:46:37.
Responder Con Cita
  #9  
Antiguo 21-11-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #10  
Antiguo 21-11-2011
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
Question

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!
Responder Con Cita
  #11  
Antiguo 21-11-2011
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Prueba con lo que te dijo Chris (double precision)
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #12  
Antiguo 21-11-2011
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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?
Responder Con Cita
  #13  
Antiguo 23-11-2011
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
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.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #14  
Antiguo 23-11-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Cita:
Empezado por rastafarey Ver Mensaje
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 ?.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #15  
Antiguo 23-11-2011
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
Lo probare, muchas gracias a todos
Responder Con Cita
  #16  
Antiguo 26-11-2011
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
resp

Por que lo prove es que lo digo
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #17  
Antiguo 26-11-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Decimales eduardo360 Varios 1 19-02-2008 02:29:28
Decimales en una consulta (TQUERY ) a paradox Wonni Conexión con bases de datos 6 14-11-2006 21:22:33
Decimales Luis Alberto Varios 1 19-05-2006 16:40:25
decimales jfontane Varios 2 24-06-2003 05:35:19
Decimales alexisns Conexión con bases de datos 2 22-06-2003 21:45:40


La franja horaria es GMT +2. Ahora son las 03:51:51.


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
Copyright 1996-2007 Club Delphi