LOCAL i,; D_debut,; d_fin D_debut = {^2005/01/01} d_fin = {^2005/07/01} - 1 CREATE CURSOR dDate ( dDate D ) FOR i = 1 TO 180 INSERT INTO dDate VALUES( {^2005/01/01} - 1 + m.i ) ENDFOR CREATE CURSOR Etats (dDebut D, dFin D , iresidentid i , iid i ) *-- je veux touver toutes les dates comprises entre le {^2005/01/08} *-- et le {^2005/06/25} pour le resident 1753 INSERT INTO Etats VALUES ({^2005/01/08}, {^2005/03/30} , 1753 , 1 ) INSERT INTO Etats VALUES ({^2005/04/10}, {^2005/06/25} , 1753 , 2 ) INSERT INTO Etats VALUES ({^2005/01/10}, {^2005/06/25} , 1754 , 3 ) SELECT MIN(dDebut) AS MinDate, ; MAX(dFin) AS Maxdate ,; iresidentid; FROM Etats ; GROUP BY 3; INTO CURSOR MinMax *!* && (1) *!* SELECT dDate ; *!* FROM dDate JOIN ( SELECT MIN( dDebut ) MinDate , MAX( dFin ) Maxdate FROM Etats ) MinMax; *!* ON NOT dDate BETWEEN MinDate AND Maxdate INTO CURSOR temp SELECT Mm.iresidentid, ; D.dDate ; FROM MinMax Mm ; JOIN dDate D; ON ( D.dDate BETWEEN MinMax.MinDate AND MinMax.Maxdate ) ; INNER JOIN Etats E ; ON ; ( ( Mm.iresidentid = Etats.iresidentid ) ; AND ; ( D.dDate NOT BETWEEN E.dDebut AND E.dFin ) ); INTO CURSOR tmp ; HAVING ( d.dDebut IS NULL )
> LOCAL i,; > D_debut,; > d_fin > > D_debut = {^2005/01/01} > d_fin = {^2005/07/01} - 1 > > > CREATE CURSOR dDate ( dDate D ) > > FOR i = 1 TO 180 > > INSERT INTO dDate VALUES( {^2005/01/01} - 1 + m.i ) > > ENDFOR > > > > CREATE CURSOR Etats (dDebut D, dFin D , iresidentid i , iid i ) > > > *-- je veux touver toutes les dates NON comprises entre le {^2005/01/08} > *-- et le {^2005/06/25} pour chaque resident. > > > INSERT INTO Etats VALUES ({^2005/01/08}, {^2005/03/30} , 1753 , 1 ) > INSERT INTO Etats VALUES ({^2005/04/10}, {^2005/06/25} , 1753 , 2 ) > > INSERT INTO Etats VALUES ({^2005/01/10}, {^2005/06/25} , 1754 , 2 ) > > > && (1) > && min and max dates: entre le {^2005/01/08} et le {^2005/06/25} pour chaque resident > SELECT MIN(dDebut) AS MinDate, ; > MAX(dFin) AS Maxdate ; > FROM Etats ; > INTO CURSOR MinMax > > && (2) > select distinct iresidentid ; > from Etats ; > into Cursor Resident ; > > && (3) > select Resident.iresidentid, ; > dDate, ; > dDebut ; > from Resident ; > join dDate ; > on ( dDate between MinMax.MinDate and MinMax.MaxDate ) ; > left join Etats on ; > ( (Resident.iresidentid = Etats.iresidentid) ; > and ; > ( dDate between dDebut and dFin ) ; > ) ; > into cursor tmp ; > having ( dDebut is null ) >