Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Sql clause
Message
From
24/12/2005 10:05:41
 
General information
Forum:
Visual FoxPro
Category:
Databases,Tables, Views, Indexing and SQL syntax
Title:
Environment versions
Visual FoxPro:
VFP 9
OS:
Windows XP SP2
Database:
Visual FoxPro
Miscellaneous
Thread ID:
01080241
Message ID:
01080706
Views:
14
Essaye d'analyser et de comprendre le code.
Essaye aussi sans having ( iId is null ) et regarde le resultat: Null = pas trouve, <> null = trouve

Remplace le LEFT JOIN par JOIN tout court et regarde la difference

Joyeux Noel.


>Gregory,
>
>Tonc code semble fonctionner avec les premières dates "tordues" que j'ai essayées...
>
>Je fais un test réél demain et poserai ma deuxième question..( doublons )
>
>Un tout grand merci ...!
>
>joyeux réveillon..
>
>bernhart
>
>
>
>>Berhart,
>>
>>Est-ce que ceci est un pas dans la bonne direction ?
>>
>>CREATE CURSOR Etats (dDebut D, dFin D , iresidentid i , iid i )
>>
>>	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 )
>>	INSERT INTO Etats VALUES ({^2006/01/10}, {^2007/05/25} , 1756 , 4 )
>>	INSERT INTO Etats VALUES ({^2006/05/30}, {^2007/06/25} , 1756 , 5 )
>>	INSERT INTO Etats VALUES ({^2001/01/08}, {^2003/03/30} , 2 , 6 )
>>
>>	
>>	&& (1) Min and Max Dates/Resident
>>	&& You may have this table
>>	&& It gives beginning and ending date per Resident
>>	select	iresidentid, ;
>>			Min(dDebut)	as	MinDate, ;
>>			Max(dFin)	as	MaxDate ;
>>		From Etats ;
>>		into Cursor Accord ;
>>		group by 1
>>	
>>	&& (2) create date cursor
>>	local i, DateFromTo[2]
>>	
>>	select	min(MinDate), ;
>>			max(Maxdate) ;
>>		from Accord ;
>>		into array DateFromTo
>>	
>>	Create Cursor Dates ( dDate D)
>>	
>>	for i = 0 to DateFromTo[2] - DateFromTo[1]
>>		insert into Dates values ( DateFromTo[1] + m.i )
>>	endfor
>>	
>>  && (3)
>>  select	Accord.iresidentid, ;
>>  			dDate, ;
>>  			iid ;
>>  		from Accord ;
>>  				join Dates on dDate between MinDate and MaxDate ;
>>  				left join Etats on ;
>>  							( Accord.iresidentid = Etats.iresidentid ) ;
>>  						and	( dDate between dDebut and dFin ) ;
>>  		into cursor tmp ;
>>  		order by 1, 2 ;
>>  		having ( iId is null ) && if you leave this out, iId will be the corresponding entry in Etats
>>
>>
>>>>Ok, donc si j'ai bien compris, tu as quelque part un table Accord par resident (Resident I, ddebut D, dFin D)
>>>>
>>>>Est-ce le cas ?
>>>
>>>Absolument
>>>
>>>
>>>
>>>>_________________
>>>>>Gregory,
>>>>>
>>>>>cela va être plus simple à expliquer ...:)
>>>>>
>>>>>On a des accords de dépendances chez les mutuelles.
>>>>>Etats.dbf
>>>>>ddebut dfin iresident
>>>>>
>>>>>99 Fois sur 100 ces accords sont successifs et donc doivent se suivrent.
>>>>>Avant de facturer aux mutuelles on doit vérifier 2 choses.
>>>>>
>>>>>1) Pas de "trous" entre les accords ( erreurs d'encodage )
>>>>>
>>>>>2) Pas deux accords identiques.....( cette qustion viendra demain ...:) )
>>>>>
>>>>>
>>>>>1) Pas de trou
>>>>>
>>>>>INSERT INTO Etats VALUES ({^2005/01/08}, {^2005/03/30} , 1753 , 1 )
>>>>>INSERT INTO Etats VALUES ({^2005/04/10}, {^2005/06/25} , 1753 , 2 )
>>>>>
>>>>>dans ce cas ci pour le residentid = 1753 on a les dates situées entre le 31/03/2005 et le 09/04/2005.....
>>>>>
>>>>>Est ce plus claire ?
>>>>>
>>>>>( je ne suis pas un modèle de pédagogie...:) )
>>>>>
>>>>>
>>>>>bernhart
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>Alors, explique-moi ce que tu veux - car la, je n'ai pas tres bien compris
>>>>>>
>>>>>>(1) les dates entre 08/01/2005 et 25/06/2005 pour tous les residents
>>>>>>= select min(date), max(date)
>>>>>>= min(date)/max(date) = minumum/maximum entree
>>>>>>
>>>>>>ou
>>>>>>
>>>>>>(2) les dates entre min/max date par resident en Etats
>>>>>>= select resident, min(date), max(date) group by 1
>>>>>>
>>>>>>Quelles dates veux-tu pour le resident 2 ?
>>>>>>_____________________________
>>>>>>>Gregory,
>>>>>>>
>>>>>>>sorry for my poor english but my parents wanted that I study Hollands in place of English ...:)
>>>>>>>
>>>>>>>Please try this code , and see the ( bad ) result For iresidentid = 2
>>>>>>>
>>>>>>>Please help me , c'est noel et je dois m'occupper des enfants ....:)
>>>>>>>
>>>>>>>bernhart
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>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 )
>>>>>>>  INSERT INTO Etats VALUES ({^2006/01/10}, {^2007/05/25} , 1756 , 4 )
>>>>>>>  INSERT INTO Etats VALUES ({^2006/05/30}, {^2007/06/25} , 1756 , 5 )
>>>>>>> INSERT INTO Etats VALUES ({^2001/01/08}, {^2003/03/30} , 2 , 6 )
>>>>>>>
>>>>>>>  && (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 )
>>>>>>>
>>>>>>>
>>>>>>> SET
Gregory
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform