Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-09-2005
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Resta equivocada...

Hola amigos foristas...

Bueno, la verdad esque estuvo un buen rato tratando de buscar un titulo descriptivo para esta pregunta pero me fue imposible encontrar alguno.

Mi situacion es la siguiente:

Estoy desarrolloando un aplicativo medianamente grande que esta dividido por modulos y en uno de ellos hay una opcion para hacer ajustes al inventario por articulos(ya sea por robo, porque se daño, caduco, aparecio, etc...), en esta opcion tu puedes escojer si deseas hacer una salida o entrada de dicho articulo.

El hecho es que uno de los usuarios esta tratando de hacer una salida, mas exactamente esta tratando de sacar del inventario lo unico que queda de cierto artiulo(pongamole el codigo 11000701) que son 0.01 gramos (cosa que ya verifique en el reporte de saldos de inventarios y haciendo el respectivo query); en dicha opcion de ajuste hay una validacion para que no permite sacar mas de lo que hay(cosa que es perfectamente necesaria); el señor usuario digita 0.01 pero el sistema muestra la excepcion que controla que no se saque mas de lo que hay.

Lo primero que se me vino a la cabeza fue "Quiza en la validacion dice if CantidadenBD <= CantidadDigitada then raise exception.create("No es posible"), haciendo que el 0.01 entre en dicho rango de error", asi que inmediatamente fui a verificar dicho pensamiento el cual resulto incorrecto pues decia
Código Delphi [-]
 if CantidadenBD < CantidadDigitada then begin...end;
,
De manera pues que estaba bien...

Luego dije "Caramba quiza el query a traido mal el resultado redondeandolo o que se yo", asi que comence a depurar y Ohhh sorpresa¡¡¡¡¡¡ lo hacia bien, asi que tengo un algoritmo asi:

Código Delphi [-]
 if CantidadenBD < CantidadDigitada then begin...end;

Donde CantidadenBD es igual a : 0.01
y
Donde CantidadDigitada es igual a : 0.01

Entonces, ¿Porque entra en esa condicion cuando no la cumple?, he hecho una prueba poniendo una variable llamada Resta y restandole
CantidadenBD - CantidadDigitada y el resultado es -7.35689749e16, asi que repise manualmente todo el movimiento de las cantidades de dicho articulo en la BD y me sucede lo mismo, cambie el tipo de CantidadDigitada como Double, Extended, Real y tampoco, tambien intente Al llamar el query que me trae CantidadenBD como AsFloat, AsCurrency, y ninguna me funciono y por eso no entiendo que es lo que sucede... si tengo un algoritmo que me dice:

Código Delphi [-]
 if 0.01 < 0.01 then begin...end;

Esta es mi triste situacion , muchas gracias compañeros por su atencion prestada cualquier opinion seria muy valiosa.

P.D.
Motor = FireBird 1.5.
Lenguaje = Delphi 5.
Sistema operativo, donde se a probado = Windows 2000 y en Windows XP.
Procesadores en los que se a probado = Intel y AMD.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #2  
Antiguo 23-09-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Has mirado qué datos hay guardados exactamente en la fdb?

Te aconsejo que lo mires con herramientas como isql (la encontrarás en el directorio bin de firebird).
Código:
 c:\> isql
 SQL> connect "mibasedatos.fdb" user "sysdba" password "masterkey";
 SQL> select codigo, precio, stock from tbTabla where codigo=3333;   (el que busques)
Te saldrá por pantalla el registro con TODOS los decimales tal y como está almacenado en la base de datos, ahí podrás ver si realmente tiene 0.01 o cualquier otra cosa.

El verlo con ibexpert, marathon, etc. tiene el inconveniente de que te trunca los decimales por la máscara que tienen configurado en el programa.

Ya nos contarás.
Responder Con Cita
  #3  
Antiguo 23-09-2005
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Muy bien amigo muchas gracias por tu atencion prestada, pero lamentablemente ese no es el problema pues aunque tenia dudas de que fuese esto debido a que como ya mencione habia repizado todas las cantidades. hice lo que mencionaste y sencillamente me muestra todos con 2 decimales y la suma me da 0.01.

Muchisimas gracias

P.D. Aun sigo sin solucionarlo
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #4  
Antiguo 24-09-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jhonny
... me muestra todos con 2 decimales...
Qué raro, de qué tipo son los campos en la base de datos?, lo digo porque en mi caso, aunque sean valores con 2 decimales, me muestra siempre los mismos rellenos de ceros, ejemplo:
Código:
 6.51600000000000
 5.05500000000000
 0.22555485454554
 225.650000022210
 2.23000000000000
Por eso te comento que puede que los campos en la base de datos no sean del tipo correcto... en fin, por echar un vistazo no pierdas nada.
Responder Con Cita
  #5  
Antiguo 24-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
Cita:
he hecho una prueba poniendo una variable llamada Resta y restandole
CantidadenBD - CantidadDigitada y el resultado es -7.35689749e16
Por lo que comentas aqui creo que tu problema esta respondiendo correctamente, dado CantidadenBD < CantidadDigitada.

Como te dice Casimito tu problema esta en los decimales, lo que pasa es vos estas viendo los datos redondeados.

aunque dudo mucho que tu resultado sea -7.35689749e16, no será -7.35689749e-16 o 7.35689749e16?
__________________
[Crandel]
Responder Con Cita
  #6  
Antiguo 26-09-2005
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Bueno, mis compañeros, muchas gracias de nuevo por tu atencion.

Cita:
Empezado por Crandel
aunque dudo mucho que tu resultado sea -7.35689749e16, no será -7.35689749e-16 o 7.35689749e16?
Bueno, de hecho tienes toda la razon pido disculpas, la verdad esque cuando hice la primera pregunta no habia guardado dicho resultado y ademas no habia tomado en cuenta las precauciones pertinentes el resultado es exactamente -7.4072692424E-16.

Cita:
Empezado por Casimiro Notevi
Qué raro, de qué tipo son los campos en la base de datos?, lo digo porque en mi caso, aunque sean valores con 2 decimales, me muestra siempre los mismos rellenos de ceros
Bueno, lo que sucede esque en mi caso es un Numeric 15.2 (cosa que nunca me ha gustado), hare una prueba cambiando el tipo de campo para ver que sucede.

De nuevo muchas gracias,
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #7  
Antiguo 26-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
Cita:
Empezado por jhonny
el resultado es exactamente -7.4072692424E-16.
Es lo que suponia, tus dos datos vos los estas viendo iguales pero no lo son. Existe un error por la precisión con que se guardan los datos.

Cita:
Empezado por jhonny
Bueno, lo que sucede esque en mi caso es un Numeric 15.2 (cosa que nunca me ha gustado)
Esto parece ser más una forma en que te lo muestra, que de la forma en que se almacenan los datos, lo que te genera el error.

Posible solución: Redondear los datos. Proba algo asi:
Código:
Round(numero*100)/100
__________________
[Crandel]
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


La franja horaria es GMT +2. Ahora son las 11:30:39.


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