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 22-04-2004
Avatar de tgsistemas
tgsistemas tgsistemas is offline
Miembro
 
Registrado: dic 2003
Ubicación: Barcelona
Posts: 149
Poder: 21
tgsistemas Va por buen camino
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

Gracias y saludos.
__________________
Toni | blog
Responder Con Cita
  #2  
Antiguo 22-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 22-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 22-04-2004
Avatar de tgsistemas
tgsistemas tgsistemas is offline
Miembro
 
Registrado: dic 2003
Ubicación: Barcelona
Posts: 149
Poder: 21
tgsistemas Va por buen camino
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.
__________________
Toni | blog
Responder Con Cita
  #5  
Antiguo 23-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #6  
Antiguo 23-04-2004
Avatar de tgsistemas
tgsistemas tgsistemas is offline
Miembro
 
Registrado: dic 2003
Ubicación: Barcelona
Posts: 149
Poder: 21
tgsistemas Va por buen camino
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.
__________________
Toni | blog
Responder Con Cita
  #7  
Antiguo 23-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 23-04-2004
Avatar de tgsistemas
tgsistemas tgsistemas is offline
Miembro
 
Registrado: dic 2003
Ubicación: Barcelona
Posts: 149
Poder: 21
tgsistemas Va por buen camino
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.
__________________
Toni | blog
Responder Con Cita
  #9  
Antiguo 23-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 23-04-2004
Avatar de tgsistemas
tgsistemas tgsistemas is offline
Miembro
 
Registrado: dic 2003
Ubicación: Barcelona
Posts: 149
Poder: 21
tgsistemas Va por buen camino
Thumbs up

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

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.
__________________
Toni | blog
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 21:01:20.


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