Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ayuda con un query (https://www.clubdelphi.com/foros/showthread.php?t=9428)

tgsistemas 22-04-2004 23:33:19

Ayuda con un query
 
Saludos a tod@s :

Pido ayuda al foro con un query que me está liando y no tengo claro como hacerlo, es con SQL 7 y D5.
Tengo una tabla de contratos y necesito una consulta que me facilite los contratos de un cliente en un plazo de tiempo determinado, la tabla es la siguiente :

Código:

CdgoClnte      FecAlta              FecBaja        Activo
------------------------------------------------------------
801013          08/09/2003        18/04/2004      Falso
801013          19/04/2003        (nulo)          Verdadero

Utilizo el siguiente query :

Código:

SELECT * FROM CNTRTOS
WHERE (CDGOCLNTE = :CDGOCLNTETEMP OR
(FECBAJA BETWEEN :FECHAD AND :FECHAH
AND CDGOCLNTE = :CDGOCLNTETEMP))

Si solicito los datos de todo el mes de Abril funciona correctamente, pero si solicito los datos del 1 al 15 de Abril muestra los dos contratos cuando solo debería mostrar el primero.

Alguien podría ayudarme por favor esta tonteria se me está atravesando :confused:

Gracias y saludos.

roman 22-04-2004 23:42:34

Bueno, pero la primera condición

CDGOCLNTE = :CDGOCLNTETEMP

simepre se cumplirá para el cliente dado independientemente del rango de la fecha ¿no? De manera que es lógico que siempre te traiga todos los registros del cliente escogido.

// Saludos

roman 22-04-2004 23:48:35

De hecho la condición que menciono sale sobrando ¿no? Basta la segunda condición que ya es el AND del código de cliente y el rango de fecha.

// Saludos

tgsistemas 22-04-2004 23:56:19

Me he expresado mal, perdona Roman.
Lo que necesito es encontrar todos los contratos de un cliente en un plazo de tiempo determinado, es decir, los contratos que tienen "fecbaja <> null" y el resto siempre y cuando sean del mismo cliente.
Se trata de una aplicacion para controlar las horas previstas e invertidas en determinados contratos con clientes. Se puede dar el caso de un contrato que finalice a mitad de mes y al dia siguiente empiece otro tipo de contrato con diferentes características.
Gracias por la ayuda.

roman 23-04-2004 00:09:57

Creo que sigo sin entender. Independientemente de SQL, la frase

"todos los contratos de un cliente en un plazo de tiempo determinado, es decir, los contratos que tienen "fecbaja <> null" y el resto siempre y cuando sean del mismo cliente" pues indica todos los contratos del cliente.

// Saludos

tgsistemas 23-04-2004 00:17:52

Estoy muy espeso, perdona roman.
Los clientes tienen contratos con características determinadas (horas contratadas, tarifa por hora, penalizaciones, etc...). Se trata de que el usuario seleccione el cliente y las fechas y el query le devuelva los contratos que no han finalizado aun y los que se han cerrado en ese periodo de tiempo (pero no deben aparecer los que finalizaron anteriormente) para así poder calcular las horas previstas y las realizadas contabilizando los días habiles en las fechas seleccionadas.
Es parecido a control de nóminas con los contratos de los trabajadores, puede haber una reduccion o ampliación de horas a partir de una determinada fecha.
No se si me he explicado bien, a estas horas ya estoy un poco dormido.
Gracias roman.

roman 23-04-2004 00:22:31

Cita:

Empezado por tgsistemas
Se trata de que el usuario seleccione el cliente y las fechas y el query le devuelva los contratos que no han finalizado aun y los que se han cerrado en ese periodo de tiempo (pero no deben aparecer los que finalizaron anteriormente)

Entonces creo que sería así:

Código:

select * from CNTRTOS
where
  (CDGOCLNTE = :CDGOCLNTETEMP) and
  (
    (FECBAJA is null) or
    (FECBAJA between :FECHAD and :FECHAH)
  )

// Saludos

tgsistemas 23-04-2004 00:37:39

Cita:

Empezado por roman
Entonces creo que sería así:

Código:

select * from CNTRTOS
where
  (CDGOCLNTE = :CDGOCLNTETEMP) and
  (
    (FECBAJA is null) or
    (FECBAJA between :FECHAD and :FECHAH)
  )

// Saludos

Gracias roman por la ayuda, pero no funciona bien, lo he probado y solo muestra un contrato. :(
Sucede exactamente lo contrario que me pasaba a mi en el primer mensaje (cuando debería mostrar dos contratos solo encuentra uno).
Gracias por la ayuda.

jachguate 23-04-2004 08:09:41

Cita:

Empezado por tgsistemas
y el query le devuelva los contratos (jach: de un solo cliente) que no han finalizado aun y los que se han cerrado en ese periodo de tiempo

Pues lo propuesto por román, cumple con esta especificación...

quizas otra vez no te explicaste bien... o no has explicado el campo que hay que tomar en cuenta... pero si es fecbaja, ya esta bien.

Hasta luego.

;)

tgsistemas 23-04-2004 20:32:32

Gracias jachguate !!!

Despues de leer tu mensaje (y dormir un poco ;) ) me he dado cuenta de una cosa muy importante... necesitaba utilizar tambien el campo FecAlta.

Cita:

Empezado por jachguate
Pues lo propuesto por román, cumple con esta especificación...

quizas otra vez no te explicaste bien... o no has explicado el campo que hay que tomar en cuenta... pero si es fecbaja, ya esta bien.

Hasta luego.

;)

Ahora lo estoy probando con el siguiente query y parece que funciona correctamente :D :D

Código:

select * from CNTRTOS
where
  (CDGOCLNTE = :CDGOCLNTETEMP) and
  (
    (FECBAJA is null and FECALTA <= :FECHAH) or
    (FECBAJA between :FECHAD and :FECHAH or
    FECBAJA >= :FECHAH)
  )

Como digo lo estoy probando y parece que funciona pero seguiré haciendo pruebas para estar completamente seguro.

Gracias tambien a Roman por su ayuda.

Saludos.


La franja horaria es GMT +2. Ahora son las 08:11:14.

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