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-10-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 22
Toni Va por buen camino
Problema con calculo en clausula where

Hola compañeros,

Tengo un problema con una consulta que tengo que hacer que me esta dando dolores de cabeza. Esta consulta tiene que funcionar en FB1.5 pues son aplicaciones que ya estan funcionando y por el momento no puedo migrar a FB2.5. (espero poder hacerlo mas adelante, pero la prioridad manda)

La consulta me esta dando problemas en la clausula WHERE, tengo una expresion que realiza unos calculos con varios campos y finalmente el resultado de este calculo lo comparo si es >1. Evidentemente para que solo me muestre los valores que el calculo supere a 1.

Esta consulta la estoy usando dentro de un procedimiento almacenado y las variables que utilizo son de tipo integer (V_VAR1, V_VAR2, V_VAR3) y los campos que utilizo para el calculo son de tipo NUMERIC(10,3) y uno de ellos es 'calculado' NUMERIC(15,3)
Código:
    select CAMPO1, CAMPO2
    from TABLA1 T1
    where ((T1.CAMPO3-(T1.CAMPO5*:V_VAR1))/(:V_VAR2 * :V_VAR3))>=1
El problema es que cuando ejecuto esta consulta me esta devolviendo registros que el calculo es <1. y no deberia. He intentado utilizar un cast to integer pero no me deja ponerlo en la expresion.

He probado con esta otra consulta para poder ver el resultado del calculo y estoy en lo cierto que el calculo es <1 (0.734)

Código:
    
select CAMPO1, CAMPO2,  ((T1.CAMPO3-(T1.CAMPO5*:V_VAR1))/(:V_VAR2 * :V_VAR3)) AS CALCULO
from TABLA1 T1
Tambien he probado a intentar utilizar la variable CALCULO de la clausula select en la clausula where pero me lanza un error que no reconoce la columna! Creo que no se puede en esta version de FB1.5.

El problema es que tengo que buscar alguna solucion pues no tengo que arrancar el sistema ya y no hay tiempo de migraciones en las que me voy ha encontrar con muchos otros problemas.

Si alguien tiene algo de luz se lo agradecere.

Saludos,
__________________
Saludos,

Bitman
Responder Con Cita
  #2  
Antiguo 21-10-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No lo se:
Código SQL [-]
    select CAMPO1, CAMPO2
    from T1
    where ((T1.CAMPO3 - (T1.CAMPO5 * :V_VAR1) / (:V_VAR2 * :V_VAR3) >= 1)) as Total
Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 21-10-2010
rfernandez rfernandez is offline
Miembro
 
Registrado: ago 2003
Posts: 64
Poder: 21
rfernandez Va por buen camino
Estoy especulando pero es posible que en lugar de preguntar en el where por

>=1

debas poner >=1.000

por probar que no quede.
Responder Con Cita
  #4  
Antiguo 21-10-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 22
Toni Va por buen camino
Si yo creo que el problema viene por los diferentes tipos de datos numericos en el calculo y despues en la comparacion pues hace algo raro.

Probare esto que me comentas y os digo algo. gracias
__________________
Saludos,

Bitman
Responder Con Cita
  #5  
Antiguo 21-10-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 22
Toni Va por buen camino
Si yo creo que el problema viene por los diferentes tipos de datos numericos en el calculo y despues en la comparacion pues hace algo raro.

Probare esto que me comentas y os digo algo. gracias
__________________
Saludos,

Bitman
Responder Con Cita
  #6  
Antiguo 22-10-2010
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Tu problema radica en el tipo de dato. ya que tienes dos multiplicaciones y una division lo que le dice al manejador que incremente la precion para poder alvergar el tipo datos. Este es un tema muy tratado en los foros.

Yo lo sulcionaria de la siguiente manera

Código SQL [-]
select CAMPO1, CAMPO2
from TABLA1 T1
where Cast(((T1.CAMPO3-(T1.CAMPO5*:V_VAR1))/(:V_VAR2 * :V_VAR3)) As Numeric(18, 4))>=1.0000

El numero de decimales depende de ti o de lso datos y mas si usas double o float si colocar Numeric(18, x) entonces el x deberias poner la cantidad de x en ceros al uno para asegurarte de las cosas simpre te van a funcionar por lo de la preciosion y toda la teoria que esto arrastra.

Espero haberme explicado y que te funcione la solucion.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #7  
Antiguo 28-10-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 22
Toni Va por buen camino
Hola a todos,

Pues has dado en el clavo rastafarey! es exactamente eso lo que me pasaba. ahora funciona perfectamente. Muchas gracias.

Saludos.
__________________
Saludos,

Bitman
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
SQL y clausula Count karlaoax SQL 14 17-09-2007 19:35:55
Clausula Like JoseAntonio SQL 5 27-05-2007 07:28:47
Clausula LIKE federiconqn21 SQL 3 28-12-2005 15:49:13
Usando la cláusula LIKE mlara Firebird e Interbase 1 10-06-2003 06:12:01
Clausula UNION TJose Firebird e Interbase 3 15-05-2003 20:59:56


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


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