Ayuda con consulta SQL con rango de fechas

649 views
Skip to first unread message

José Luis

unread,
Oct 14, 2013, 1:49:10 PM10/14/13
to publice...@googlegroups.com
Hola amigos,

A ver si me podéis ayudar con esta consulta, pues no soy capaz de obtener el resultado que busco

Tengo este cursor

ccodpro cnompro dfecini dfecfin
802001 PROVEEDOR 1 01/01/2013 10/01/2013
802003 PROVEEDOR 2 01/07/2013 10/07/2013
802004 PROVEEDOR 3 01/02/2013 30/06/2013
802005 PROVEEDOR 4 01/03/2013 10/03/2013

Necesito obtener los registros que tengan periodo inicial y final en el mismo rango de fechas que otro proveedor

Es decir, la consulta debería dar como resultado:




ccodpro cnompro dfecini dfecfin
802004 PROVEEDOR 3 01/02/2013 30/06/2013
802005 PROVEEDOR 4 01/03/2013 10/03/2013

Gracias de antemano.


José Luis

Fernando D. Bozzo

unread,
Oct 14, 2013, 2:05:09 PM10/14/13
to publice...@googlegroups.com
Hola José Luis:

Olvidaste poner cuáles son los datos a comparar del proveedor, ¿a qué rango de fechas te referís? Porque solo se ven los registros que querés filtrar, pero no pusiste nada sobre cuál es el criterio del filtrado.


Saludos.-

Víctor Hugo Espínola Domínguez

unread,
Oct 14, 2013, 2:13:57 PM10/14/13
to publicesvfoxpro
Hola Fernando

Yo interpreto que quiere los proveedores que tengan igual periodo o que uno de ellos esté comprendido en otro(s). Trabajando sobre el cursor con  Scan, Set Near On y Seek lo veo más fácil que con un Selec Sql.

Saludos,
Víctor.
Lambaré - Paraguay.

José Luis

unread,
Oct 14, 2013, 2:24:43 PM10/14/13
to publice...@googlegroups.com
Hola Fernando,

Es justo lo que indica Victor.
Digamos que no pueden existir proveedores que tengan periodos comprendidos en otros.
Deseo evaluar la consulta y obtener aquellos registros que chocan en este aspecto.

Jorge L. Florez C.

unread,
Oct 14, 2013, 2:42:05 PM10/14/13
to publice...@googlegroups.com
Pero en tu ejemplo tomas al proveedor 4, porque no tomas al proveedor 1 ó 2, por eso te preguntan el criterio de filtrado, lo que dices es muy generico

Saludos
Jorge Florez

Víctor Hugo Espínola Domínguez

unread,
Oct 14, 2013, 3:00:04 PM10/14/13
to publicesvfoxpro
Hola José Luís

Prueba este código:

Select * From crsProveedores prv1 ;
Inner Join ( Select cCodPro, dFecIni, dFecFin From crsProveedores ) prv2 ;
ON prv1.dFecIni Between prv2.dFecIni And prv2.dFecFin ;
And prv1.dFecFin Between prv2.dFecIni And prv2.dFecFin ;
And prv1.cCodPro <> prv2.cCodPro

Saludos,
Víctor.
Lambaré - Paraguay.


Fernando D. Bozzo

unread,
Oct 14, 2013, 3:08:08 PM10/14/13
to publice...@googlegroups.com
Hola José Luis:

Según veo la solución al problema tiene 2 partes:

1) La más sencilla es controlar eso cuando se dan de alta o modifican los proveedores o sus fechas de vigencia, ya que buscarías a ese proveedor entre los demás, por ejemplo así (m.dfecini y m.dfecfin son los datos del proveedor a comparar):

DIMENSION laCount(1)
laCount(1) = 0
SELECT COUNT(*) FROM PROVEEDORES ;
   WHERE m.dfecIni BETWEEN dfecini and dfecfin ;
   OR m.dfecfin BETWEEN dfecini and dfecfin ;
   OR dfecini <= m.dfecini AND dfecfin >= m.dfecfin ;
   INTO ARRAY laCount

IF laCount(1) > 0

   *-- Hay uno o más períodos coincidentes
ENDIF


2) La más compleja es si querés validar la integridad de toda la BDD, ya que implicaría comparar cada registro con todos los demás, o sea aplicar lo anterior pero registro a registro.


Saludos.-

Geovanny Quiros Castillo

unread,
Oct 14, 2013, 3:11:02 PM10/14/13
to publice...@googlegroups.com
Hola,
prueba con esto:
 
Select    a.*
from      TablaProveedores a
where    a.ccodpro in (select ccodpro from TablaProveedores where dfechaini>=a.dfechaini and dfechafin<=a.dfechafin)
 
Saludos

Fernando D. Bozzo

unread,
Oct 14, 2013, 3:15:59 PM10/14/13
to publice...@googlegroups.com
Me faltó aclararte la lógica que usé para esto. Supongamos los siguientes períodos, donde el primero es el que se quiere buscar:

----------#########-----------  => Período a buscar
---------------#########------  => Caso 1: Fecha dfecini dentro del rango m.dfecini , m.fecfin
-----#########----------------  => Caso 2: Fecha dfecfin dentro del rango m.dfecini , m.fecfin
------------#####-------------  => Caso 3: Fecha dfecini y dfecfin dentro del rango m.dfecini , m.fecfin
-------##############---------  => Caso 4: Fecha dfecini y dfecfin dentro del rango m.dfecini , m.fecfin
-####--------------------####-  => Caso 5 y 6) Fechas fuera de rango

El SQL que puse busca estos rangos.

Saludos.-

Víctor Hugo Espínola Domínguez

unread,
Oct 14, 2013, 3:59:50 PM10/14/13
to publicesvfoxpro
Hola Geovanny

Esa consulta te traerá todos los registros.

Saludos,
Víctor.
Lambaré - Paraguay.



2013/10/14 Geovanny Quiros Castillo <geovann...@gmail.com>

Geovanny Quiros Castillo

unread,
Oct 14, 2013, 4:16:59 PM10/14/13
to publice...@googlegroups.com
Umm puede ser que si, la vi muy fácil en un principio Triste y la escribí al vuelo!
wlEmoticon-sadsmile[1].png

Geovanny Quiros Castillo

unread,
Oct 14, 2013, 4:33:57 PM10/14/13
to publice...@googlegroups.com
Analizando mas a fondo la situación me parece que el requerimiento en si está un poco extraño, ya que un mismo proveedor se puede repetir tantas veces como coincida con las fechas de otros proveedores
 
 
Sent: Monday, October 14, 2013 1:59 PM

J. Enrique Ramos Menchaca

unread,
Oct 14, 2013, 6:56:33 PM10/14/13
to publice...@googlegroups.com
A mi se me ocurra que realices lo siguiente: 
1) Un select con el rango de fechas deseado tal como ya te lo han explicado.
2) Un select con los proveedores obtenidos y llenar con el resultado un listbox.
3) Hacer un select al primero de los selects con los proveedores seleccionados.

No encuentro otra forma de verlo y solucionar tu duda.

José Luis

unread,
Oct 15, 2013, 4:52:50 AM10/15/13
to publice...@googlegroups.com
Hola Victor,

El código me funcionó perfectamente para lo que quería hacer.

En realidad no son proveedores sinó tarifas de proveedor.
No tengo control sobre lo que ingresa el usuario ya que se trata de un programa comercial
Simplemente he realizado un módulo que conecta con la base de datos y extrae una serie de informes y demás

Gracias a todos por vuestras respuestas
Es impresionante la ayuda que ofrecéis a la comunidad VFP
Reply all
Reply to author
Forward
0 new messages