Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-07-2006
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Angry Problemas con Operador Or

Hola a todos:

Tengo la siguiente consulta SQL:

Código SQL [-]
SELECT NOM.*, SEG.COD_ESTADO_SEG FROM 
PRF_NOMBRAMIENTO NOM,
PRF_SEGUIMIENTO SEG
WHERE NOM.ANO_ACADEMICO = SEG.ANO_ACADEMICO
  AND NOM.COD_ESCUELA = SEG.COD_ESCUELA
  AND NOM.COD_NOMBRA = SEG.COD_NOMBRA
  AND (SEG.COD_ESTADO_SEG = 1
        OR SEG.COD_ESTADO_SEG BETWEEN 1 AND 2)
  AND SEG.ESTADO = 'VIGENTE'

pero siempre me toma los valores del OR

Si a la primera instrucción le paso un valor inexistente solo en ese momento debería saltar al operador OR.
Espero que se entienda, Mil Gracias
__________________
No todo es como parece ser...

Última edición por lucasarts_18 fecha: 20-07-2006 a las 23:21:01.
Responder Con Cita
  #2  
Antiguo 20-07-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Cita:
Si a la primera instrucción le paso un valor inexistente
Cual 1ra instruccion. Solo veo una sola sentencia

Cita:
Espero que se entienda, Mil Gracias
Eeesteee, NOP
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 20-07-2006
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Amigo VtDeleon, tengo entendido que el operador OR se evalua de todas maneras si la primera expresión es verdadera.

Lo que yo necesito es algo así.

1 = Documento Ingresado
2 = Docuemnto Enviado
y Ademas debe tener la opción de traer ambos o sea uno y dos

Entonces:

Código SQL [-]
AND (SEG.COD_ESTADO_SEG = 1 Aquí puede ser un valor inexistente, por ejemplo ya le envio un -1
  OR SEG.COD_ESTADO_SEG BETWEEN 1 AND 2)

Por lo tanto -1 yo sé que no existe tal registro lo que debería
recuperar todos los documentos que tengan 1 y 2.
El problema se produce cuando la primera expresión evalua a verdadera me recupera registro que tenga coincidencia con el numero 2, esto no debería pasar ya que está en el OR, pero insisto creo que el OR también se produce si la primera expresión es verdadera.
__________________
No todo es como parece ser...
Responder Con Cita
  #4  
Antiguo 20-07-2006
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por lucasarts_18
Amigo VtDeleon, tengo entendido que el operador OR se evalua de todas maneras si la primera expresión es verdadera.
Desconozco si el ANSI SQL define si las evaluaciones son por circuito corto o largo. Pero si no me equivoco (no quiero asegurarlo), motores como Oracle realiza las evaluaciones derecha a izquierda (de abajo hacia arriba).

Cita:
Empezado por lucasarts_18
El problema se produce cuando la primera expresión evalua a verdadera me recupera registro que tenga coincidencia con el numero 2, esto no debería pasar ya que está en el OR, pero insisto creo que el OR también se produce si la primera expresión es verdadera.
El OR es verdadero cuando cualquiera de las dos expresiones son verdaderas... ¿Cómo llegas a saber que esta haciendo las dos evaluaciones?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 21-07-2006
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por delphi.com.ar
Desconozco si el ANSI SQL define si las evaluaciones son por circuito corto o largo. Pero si no me equivoco (no quiero asegurarlo), motores como Oracle realiza las evaluaciones derecha a izquierda (de abajo hacia arriba).
Uso Oracle y probaré invertiendo la situación

Cita:
Empezado por delphi.com.ar
El OR es verdadero cuando cualquiera de las dos expresiones son verdaderas...
Esto es cierto, ví la tabla de Boolena en un manual de Oracle.

Cita:
Empezado por delphi.com.ar
¿Cómo llegas a saber que esta haciendo las dos evaluaciones?
Porque si la primera expresión es verdadera me trae registros de documentos que tienen asignado un seguimiento 2 (es decir enviado), por lo tanto ahí yo sé que trae registro después del or
__________________
No todo es como parece ser...
Responder Con Cita
  #6  
Antiguo 21-07-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Creo saber por que te sale asi.

(Soy un CHUTO explicando pero ahi vamos...)
Segun mi interpretacion estas diciendo que traiga cada registro que cumpla "EG.COD_ESTADO_SEG = 1", si ese registro no cumpel con esa condicion pues con esta ==> SEG.COD_ESTADO_SEG between 1 and 2"

Si evaluas registro por registro veras qeu va a traer tando 1 como 2.
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #7  
Antiguo 21-07-2006
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por lucasarts_18
Uso Oracle y probaré invertiendo la situación
No te entiendo.. en un OR de este tipo, si inviertes la situación no ganas nada. Si fuera en Delphi y hubieras compilado ese fragmento de código con Short Circuit como es por defecto, y ambos “comparandos” son funciones, podría decirte que si es importante el orden, para evitar ejecutar el código de una de ellas. Pero en este caso no se que es lo que te afecta que se compare una u otra.

Cita:
Empezado por lucasarts_18
Porque si la primera expresión es verdadera me trae registros de documentos que tienen asignado un seguimiento 2 (es decir enviado), por lo tanto ahí yo sé que trae registro después del or
No era a eso lo que me refería.... cómo sabes que ejecutó las dos??.. Obviamente si tienes el valor, una de las dos es cierta y en algo tan excluyente como esto, es fácil saber cuál de las dos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 22-07-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Yo enteindo que Si ejecutamos la consulta y no obtenemos por lo menos un registro qeu cumpla con la condicion "SEG.COD_ESTADO_SEG = 1", pues evalue "SEG.COD_ESTADO_SEG between 1 and 2 " (aunque no entiendo por que between 1 and 2 si 1 ha sido evaluado anteriormente)

Es asi lucarsart?
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!

Última edición por vtdeleon fecha: 22-07-2006 a las 00:54:11.
Responder Con Cita
  #9  
Antiguo 22-07-2006
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
He encontrado la solución

Hola Amigos:

Aquí logre sacar los resultados deseados:




Código SQL [-]
SELECT NOM.*, SEG.COD_ESTADO_SEG FROM PRF_NOMBRAMIENTO 
NOM,PRF_SEGUIMIENTO SEG
WHERE NOM.ANO_ACADEMICO = SEG.ANO_ACADEMICO  
AND NOM.COD_ESCUELA = SEG.COD_ESCUELA  
AND NOM.COD_NOMBRA = SEG.COD_NOMBRA  
AND ((SEG.COD_ESTADO_SEG = I_OPCION)        
  OR (I_OPCION = - 1 AND SEG.COD_ESTADO_SEG BETWEEN 1 AND 2)) 
AND SEG.ESTADO = 'VIGENTE'

I_OPCION = PARAMETRO

Con esto mi reporte está funcionando a la perfección, gracias a todos los que intentaron orientarme

Hasta luego -
__________________
No todo es como parece ser...
Responder Con Cita
  #10  
Antiguo 22-07-2006
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por vtdeleon
Yo enteindo que Si ejecutamos la consulta y no obtenemos por lo menos un registro qeu cumpla con la condicion "SEG.COD_ESTADO_SEG = 1", pues evalue "SEG.COD_ESTADO_SEG between 1 and 2 " (aunque no entiendo por que between 1 and 2 si 1 ha sido evaluado anteriormente)

Es asi lucarsart?
No tan así, puse el SQL de la solución, basicamente si yo mando un valor 1 me devuelva todas las coincidencias y si mando un valor 2 me devuelva esas coincidencias y, para terminar si mando un -1 me mande los registros que coincidan con los valores 1 y 2, espero que se entienda

Hasta Luego -
__________________
No todo es como parece ser...
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
Operador LIKE en access maurogambo Tablas planas 5 06-09-2006 14:20:42
Que pasa con el operador @? Turboleta Varios 3 12-01-2006 20:50:35
Operador IS Aztaroth C++ Builder 8 04-08-2004 14:44:27
Operador *= febito SQL 1 09-06-2004 21:26:43
Operador @ Tanix PHP 2 27-10-2003 10:07:14


La franja horaria es GMT +2. Ahora son las 09:19:50.


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