OVH Cloud OVH Cloud

Casse tête SQL!

7 réponses
Avatar
Thom
Bonjour,
J'ai une table contenant des événements(EVENT), ayant une date de début(DB)
et une date de fin(DF).
Jaimerais en une requête obtenir la liste des mois sur lesquels se déroule
un événement.

Exemple:
EVENT: Mes prochaines vacances
DB : 23/12/06
DF : 04/02/07

Résultat de la requête souhaité:
Décenbre, Janvier, Février

Merci d'avance,

Thom

7 réponses

Avatar
Eric
Bonjour,

Pas sur de répondre correctement mais ...
En regard de l'évènement, tu veux afficher la suite de mois sur lequel
il se déroule dans un champ calculé ?
Si c'est le cas, la fonction suivante à copier dans un module doit
pouvoir répondre à ton problème, sous réserve d'avoir une version
d'Access >= à Access2k à cause de la fonction MonthName().

Function fnSuiteMois(dateDeb, dateFin, _
Optional sep As String = " - ") As String
If IsNull(dateDeb) Or IsNull(dateFin) Then
Exit Function
Else
Dim i As Byte, nb As Byte, chaine as String
nb = DateDiff("m", dateDeb, dateFin)
For i = 0 To nb
If chaine = "" Then
chaine = chaine & MonthName(Month(dateDeb))
Else
chaine = chaine & sep & _
MonthName(Month(DateAdd("m", i, dateDeb)))
End If
Next i
fnSuiteMois = chaine
End If
End Function

Fonction que tu pourras appeler dans une requête par :
1er champ:Event
2e champ:Evènement sur : fnSuiteMois([db];[df];Car(13) & Car(10)), pour
une présentation en liste dans le champ(augmenter la hauteur de ligne)
ou
Evènement sur : fnSuiteMois([db];[df];" - ") présentation en ligne


Bonjour,
J'ai une table contenant des événements(EVENT), ayant une date de début(DB)
et une date de fin(DF).
Jaimerais en une requête obtenir la liste des mois sur lesquels se déroule
un événement.

Exemple:
EVENT: Mes prochaines vacances
DB : 23/12/06
DF : 04/02/07

Résultat de la requête souhaité:
Décenbre, Janvier, Février

Merci d'avance,

Thom




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Argyronet
Bonjour,

J'ai une solution en VBA car je n'ai pas assez de temps pour creuser en SQL...
Voici ce que je te propose:
Dans le QBE tu tapes :
SELECT TBLEvents.Event, MonthPeriod([DB],[DF]) AS Mois
FROM TBLEvents;
où MonthPeriod est la fonction suivante:
Function MonthPeriod(ByVal DB As Date, ByVal DF As Date) As String
Dim dtmTempDate As Date
Dim astrMonthPeriod() As String
Dim intMonth As Integer
Dim intNBMonths As Integer
Dim blnAlreadyDim As Boolean
Dim strPeriod As String
Dim I As Integer

On Error Resume Next

If IsDate(DB) And IsDate(DF) Then
intMonth = Month(DB)
intNBMonths = 0
dtmTempDate = DB
If (Month(DB) = Month(DF) And Year(DB) = Year(DF)) Or DB = DF Then
strPeriod = StrConv(Format(dtmTempDate, "mmmm"), vbProperCase)
ElseIf (Month(DB) = Month(DF) And Year(DB) < Year(DF)) Or DB > DF Then
strPeriod = "Période invalide !!!"
Else
While dtmTempDate < DF
If Month(dtmTempDate) = intMonth Then
ReDim Preserve astrMonthPeriod(0 To intNBMonths)
astrMonthPeriod(intNBMonths) = StrConv(Format(dtmTempDate,
"mmmm"), vbProperCase)
Else
intNBMonths = intNBMonths + 1
intMonth = Month(dtmTempDate)
ReDim Preserve astrMonthPeriod(0 To intNBMonths)
astrMonthPeriod(intNBMonths) = StrConv(Format(dtmTempDate,
"mmmm"), vbProperCase)
End If
dtmTempDate = dtmTempDate + 1
Wend
For I = LBound(astrMonthPeriod) To UBound(astrMonthPeriod)
strPeriod = strPeriod & astrMonthPeriod(I) & IIf(I =
UBound(astrMonthPeriod), "", " - ")
Next
End If
End If
MonthPeriod = strPeriod
End Function

Bon évidemment, tu peux peaufiner pour d'autres cas ou d'autres résultats
mais le principe est là...
Ca donne par ex pour 24/10/2006 à 24/02/2007
Vacances : Octobre - Novembre - Décembre - Janvier - Février

--
Argy { MVP }
http://argyronet.developpez.com/

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient.
Si vous n´obtenez pas la réponse voulue, communiquez différemment



Bonjour,

Pas sur de répondre correctement mais ...
En regard de l'évènement, tu veux afficher la suite de mois sur lequel
il se déroule dans un champ calculé ?
Si c'est le cas, la fonction suivante à copier dans un module doit
pouvoir répondre à ton problème, sous réserve d'avoir une version
d'Access >= à Access2k à cause de la fonction MonthName().

Function fnSuiteMois(dateDeb, dateFin, _
Optional sep As String = " - ") As String
If IsNull(dateDeb) Or IsNull(dateFin) Then
Exit Function
Else
Dim i As Byte, nb As Byte, chaine as String
nb = DateDiff("m", dateDeb, dateFin)
For i = 0 To nb
If chaine = "" Then
chaine = chaine & MonthName(Month(dateDeb))
Else
chaine = chaine & sep & _
MonthName(Month(DateAdd("m", i, dateDeb)))
End If
Next i
fnSuiteMois = chaine
End If
End Function

Fonction que tu pourras appeler dans une requête par :
1er champ:Event
2e champ:Evènement sur : fnSuiteMois([db];[df];Car(13) & Car(10)), pour
une présentation en liste dans le champ(augmenter la hauteur de ligne)
ou
Evènement sur : fnSuiteMois([db];[df];" - ") présentation en ligne


Bonjour,
J'ai une table contenant des événements(EVENT), ayant une date de début(DB)
et une date de fin(DF).
Jaimerais en une requête obtenir la liste des mois sur lesquels se déroule
un événement.

Exemple:
EVENT: Mes prochaines vacances
DB : 23/12/06
DF : 04/02/07

Résultat de la requête souhaité:
Décenbre, Janvier, Février

Merci d'avance,

Thom




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Bonjour

Résultat 100% SQL :

SELECT Event, Format([db],"mmmm") & ";" & IIf(DateAdd("m",1,[db])<[df],Format(DateAdd("m",1,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",2,[db])<[df],Format(DateAdd("m",2,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",3,[db])<[df],Format(DateAdd("m",3,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",4,[db])<[df],Format(DateAdd("m",4,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",5,[db])<[df],Format(DateAdd("m",5,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",6,[db])<[df],Format(DateAdd("m",6,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",7,[db])<[df],Format(DateAdd("m",7,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",8,[db])<[df],Format(DateAdd("m",8,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",9,[db])<[df],Format(DateAdd("m",9,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",10,[db])<[df],Format(DateAdd("m",10,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",11,[db])<[df],Format(DateAdd("m",11,[db]),"mmmm") & ";","") &
IIf(DateAdd("m",12,[db])<[df],Format(DateAdd("m",12,[db]),"mmmm") & ";","") & Format([df],"mmmm") & ";" AS Expr1
FROM TaTable;

--
Arnaud
---------------------------------------------
infos, conseils et liens : http://www.mpfa.info
---------------------------------------------


"Thom" a écrit dans le message de news:
Bonjour,
J'ai une table contenant des événements(EVENT), ayant une date de début(DB) et une date de fin(DF).
Jaimerais en une requête obtenir la liste des mois sur lesquels se déroule un événement.

Exemple:
EVENT: Mes prochaines vacances
DB : 23/12/06
DF : 04/02/07

Résultat de la requête souhaité:
Décenbre, Janvier, Février

Merci d'avance,

Thom



Avatar
Eric
Bonsoir,

Bonjour

Résultat 100% SQL :
...




Avec du dateadd() !!! bon, je sais que je suis de mauvaise foi, je file
... {soupir} ;-)
--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Thom
Merci pour vos réponses, je dois avouer que je préfère la réponse d'Anor car
c'est la seule qui est 100% SQL.

Eric, pourquoi n'aime tu pas la solution du dateadd?



"Thom" a écrit dans le message de news:

Bonjour,
J'ai une table contenant des événements(EVENT), ayant une date de
début(DB) et une date de fin(DF).
Jaimerais en une requête obtenir la liste des mois sur lesquels se déroule
un événement.

Exemple:
EVENT: Mes prochaines vacances
DB : 23/12/06
DF : 04/02/07

Résultat de la requête souhaité:
Décenbre, Janvier, Février

Merci d'avance,

Thom



Avatar
Bonjour

Il taquinait sur le fait que la formule faisait appel à 2 fonctions intégrées à access : iif et dateadd
donc ce n'était pas tout à fait du 100%

Mais j'avais bien saisi l'ironie du message
;-)

a+
--
Arnaud
---------------------------------------------
infos, conseils et liens : http://www.mpfa.info
---------------------------------------------

"Thom" a écrit dans le message de news: eXlb$
Merci pour vos réponses, je dois avouer que je préfère la réponse d'Anor car c'est la seule qui est 100% SQL.

Eric, pourquoi n'aime tu pas la solution du dateadd?



"Thom" a écrit dans le message de news:
Bonjour,
J'ai une table contenant des événements(EVENT), ayant une date de début(DB) et une date de fin(DF).
Jaimerais en une requête obtenir la liste des mois sur lesquels se déroule un événement.

Exemple:
EVENT: Mes prochaines vacances
DB : 23/12/06
DF : 04/02/07

Résultat de la requête souhaité:
Décenbre, Janvier, Février

Merci d'avance,

Thom







Avatar
Eric
Bonjour,

Non, je n'ai rien contre la fonction DateAdd() puisque je l'utilise moi
aussi dans la fonction en VBA.

Mais comme te le dit Arnaud, je le taquinais sur sa réponse 100% SQL,
erreur de ma part car en relisant son post, il parlait de *Résultat*
100% SQL, tu noteras le distingo ;-) et là, ma remarque tombait à l'eau.


...

Eric, pourquoi n'aime tu pas la solution du dateadd?



"Thom" a écrit dans le message de news:




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr