Group By Format([DATE]) VBA - SQL

Résolu
bastien0675 Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 12 août 2010 - 24 mars 2010 à 19:26
bastien0675 Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 12 août 2010 - 26 mars 2010 à 14:26
Bonjour,

je suis en train de bosser sur un formulaire Access qui vient taper dans une BD.
J'ai deux zoneListe représentant des Portefeuilles et des marchés, et deux zone de texte avec les dates. Tout ca me permet de "filtrer" les infos que je veux et de les afficher dans un sous formulaire.

Mon Problème, dans le sous formulaire j'ai un champs [Date Opération], qui contient des dates journalières.

Je souhaiterais, via un Groupe d'option, regrouper ces dates par jour, ou semaine, ou mois, ou années. (au choix, donc 4 options)

En SQL j'utilise Format([Date Opération];"mmm-yy") pour regrouper par mois.

Comment est-ce que je dois retranscrire ca en VBA?

Merci par avance!

Voici une partie de mon code:

'On retourne les valeurs filtrées
strSQL = "SELECT Portefeuille, Marché, [Ss - Jacent], [SommedeNb Opé], [SommedeNombre de lot], [Date Opération]" _
& "FROM [Recap Deals] WHERE (Portefeuille Like '" & vZoneListe1 & "*' and Marché like '" & vZoneListe2 & "*')"

'Sur Date Début
If TxtDateDébut <> "" Then
strSQLDateDébut = " AND ([Date Opération]>=" & DateAuFormatUS(Me.TxtDateDébut) & ")"
End If

'Sur Date Fin
If TxtDateFin <> "" Then
If TxtDateFin >= TxtDateDébut Then
If strSQLDateDébut <> "" Then
strSQLDateFin = " AND ([Date Opération]<=" & DateAuFormatUS(Me.TxtDateFin) & ")"
Else
strSQLDateFin = " WHERE ([Date Opération]<=" & DateAuFormatUS(Me.TxtDateFin) & ")"
End If
Else
MsgBox ("La Date de fin ne peut pas être inférieur à la date de début")
Me.TxtDateFin.Value = Me.TxtDateDébut.Value
End If
End If


'Sur Groupe d'Option Time Periode
If Me.ChoixTimePeriod = 1 Then
strSQLTimePeriod = " "

ElseIf Me.ChoixTimePeriod = 2 Then
strSQLTimePeriod = "GROUP BY "

ElseIf Me.ChoixTimePeriod = 3 Then
strSQLTimePeriod = "GROUP BY format([Date Opération],'mmm-yy')"

ElseIf Me.ChoixTimePeriod = 4 Then
strSQLTimePeriod = "GROUP BY format([Date Opération],'yyyy')"
End If

strSQL = strSQL & strSQLTimePeriod & strSQLDateDébut & strSQLDateFin

Me.SF_Recap.Form.RecordSource = strSQL


Merci par avance pour votre aide!

Bastien
A voir également:

5 réponses

bastien0675 Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 12 août 2010
25 mars 2010 à 13:36
Bonjour,

Merci pour toutes ses informations détaillées et commentaires!

Je vais me repencher sur mon code et améliorer tout ca!

Bonne journée!

Bastien
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 mars 2010 à 10:25
Salut
Revoici ton code, collé avec la colloration syntaxique = plus facile à relire grace à l'indentation
+ mes commentaires

'On retourne les valeurs filtrées 
strSQL = "SELECT Portefeuille, Marché, [Ss - Jacent], [SommedeNb Opé], " & _
         "       [SommedeNombre de lot], [Date Opération]" & _ 
         "  FROM [Recap Deals] " & _
         " WHERE (Portefeuille Like '" & vZoneListe1 & "%' " & _
         "   And [Marché] like '" & vZoneListe2 & "%')" 
'### Avec l'opérateur Like sous SQL, il faut utiliser % et pas *
'### Le champ Marché comportant un caractère spécifique à la langue, je te conseille
'    vivement de l'encadrer avec des [ et ]

'### Les strSQLDateDébut et strSQLDateFin étant associés au GROUP BY, il serait plus
'    logique de les placer après les lignes traitant le GROUP BY
'    (plus facile à comprendre quand, comme nous, on reprend le décryptage du code

'Sur Groupe d'Option Time Periode 
'### Voir aussi Select Case à la place de If-Else
'### jour, ou semaine, ou mois, ou années : Ces formats sont expliqués dans l'aide
If Me.ChoixTimePeriod = 1 Then '### Jour                     ---------------------
    '### Jour est un peu court : Est-ce que tu veux affiché les données
    '    des 23 de chaque mois :
    strSQLTimePeriod = " GROUP BY format([Date Opération],'jj')" 
    '    des Lundis de chaque mois :
    strSQLTimePeriod = " GROUP BY format([Date Opération],'e')" 
    '    ou bien simplement classer les résultats par Jour, Mois et Année ?
    strSQLTimePeriod = " GROUP BY format([Date Opération],'dd-mm-yyyy')" 

ElseIf Me.ChoixTimePeriod = 2 Then '### Semaine
    '### Pourquoi avoir abrégé l'année sur 2 digits ? risqué
    strSQLTimePeriod = " GROUP BY format([Date Opération],'ee-yyyy')" 
    '### Manque espace devant le G de GROUP

ElseIf Me.ChoixTimePeriod = 3 Then '### Mois
    '### Pourquoi avoir abrégé l'année sur 2 digits ? risqué
    '### 'mmm' donne le mois sous forme de lettres en abrégé : janvier et juin se suivront
    '    Normal ?
    '    Sinon, utilise le format numérique des mois : 'mm-yyyy'
    strSQLTimePeriod = " GROUP BY format([Date Opération],'mmm-yyyy')" 
    '### Manque espace devant le G de GROUP

ElseIf Me.ChoixTimePeriod = 4 Then '### Année
    strSQLTimePeriod = " GROUP BY format([Date Opération],'yyyy')" 
    '### Manque espace devant le G de GROUP
End If 

'### Je ne suis pas certain qu'on puisse faire du AND ou du WHERE dans un GROUP BY (à vérifier)
'    Si c'est Ok, revoir le WHERE qui n'existe que dans le traitement de date de fin
'    alors qu'il devrait aussi y en avoir un dans le traitement de date de début
'### Ne pas confondre GROUP BY et ORDER BY ou encore le WHERE du SELECT
'Sur Date Début 
If TxtDateDébut <> "" Then 
    strSQLDateDébut = " AND ([Date Opération] >= " & DateAuFormatUS(Me.TxtDateDébut) & ")" 
End If 

'Sur Date Fin 
If TxtDateFin <> "" Then 
    If TxtDateFin >= TxtDateDébut Then 
        If strSQLDateDébut <> "" Then 
            strSQLDateFin = " AND ([Date Opération]<=" & DateAuFormatUS(Me.TxtDateFin) & ")" 
        Else 
            strSQLDateFin = " WHERE ([Date Opération]<=" & DateAuFormatUS(Me.TxtDateFin) & ")" 
        End If 
    Else 
        '### inférieurE
        MsgBox ("La Date de fin ne peut pas être inférieure à la date de début") 
        Me.TxtDateFin.Value = Me.TxtDateDébut.Value 
    End If 
End If 

strSQL = strSQL & strSQLTimePeriod & strSQLDateDébut & strSQLDateFin 

Me.SF_Recap.Form.RecordSource = strSQL 


Tu as du boulot !
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
bastien0675 Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 12 août 2010
25 mars 2010 à 14:44
ReBonjour!

J'ai fait les modifications suggérées.

- J'ai changé le If..Else en Select Case
- Pour le regroupement par jour je souhaite regrouper tous les champs du 1, du 2 du 3 etc... jusqu'à la fin du mois, pour chaque mois
- Pour le regroupement de l'année sur 2 digit, il n'y avait pas vraiment de raison particuliaire.
- Concernant l'utilisation de AND and WHERE dans GROUP BY, je sais que en SQL on mettra GROUP BY [Expression1], [Expression2]... j'ai essayé de remplacer les AND et WHERE par " , ([Date Opération...) mais ça ne change rien.
-Juste pour info, DateAuFormatUS est une fonction que j'ai dans un module

- En faisant les changements suggérés, j'ai l'erreur suivante:
"Vous avez essayé d'exécuter une requête ne comprenant pas l'expression spécifiée 'Portefeuille' comme une partie de la fonction d'agrégat"

Je pense que l'erreur provient d'une mauvaise écriture du code au niveau des caractères spéciaux tels que " ou ' ou même une erreur d'espace...mais je ne vois pas où!


    'On retourne les valeurs filtrées
    strSQL = "SELECT [Portefeuille], [Marché], [Ss - Jacent], [SommedeNb Opé], [SommedeNombre de lot], [Date Opération]" _
    & "FROM [Recap Deals]" _
    & " WHERE ([Portefeuille] Like '" & vZoneListe1 & "%' " _
    & " And [Marché] like '" & vZoneListe2 & "%')"
   
   
'Sur le Groupe d'option Time Period
Select Case Me.ChoixTimePeriod
   
Case Is = 1 'regroupement par jour / Date
strSQLTimePeriod = " GROUP BY format([Date Opération],'jj')"

Case Is = 2 'regroupement par semaine
strSQLTimePeriod = " GROUP BY format([Date Opération],'ee-yyyy')"

Case Is = 3 'regroupement par mois
strSQLTimePeriod = " GROUP BY format([Date Opération],'mm-yyyy')"

Case Else 'regroupement par année
strSQLTimePeriod = " GROUP BY format([Date Opération],'yyyy')"

End Select


'Sur Date Début
If TxtDateDébut <> "" Then
    strSQLDateDébut = " AND ([Date Opération]>=" & DateAuFormatUS(Me.TxtDateDébut) & ")"
    Else
    strSQLDateDébut = " WHERE ([Date Opération]>=" & DateAuFormatUS(Me.TxtDateDébut) & ")"
End If


'Sur Date Fin
If TxtDateFin <> "" Then
    If TxtDateFin >= TxtDateDébut Then
        If strSQLDateDébut <> "" Then
            strSQLDateFin = " AND ([Date Opération]<=" & DateAuFormatUS(Me.TxtDateFin) & ")"
        Else
            strSQLDateFin = " WHERE ([Date Opération]<=" & DateAuFormatUS(Me.TxtDateFin) & ")"
        End If
    Else
    MsgBox ("La Date de fin ne peut pas être inférieure à la date de début")
    Me.TxtDateFin.Value = Me.TxtDateDébut.Value
    End If
End If

'Rassemblement des variables pour constituer le SQL
strSQL = strSQL & strSQLTimePeriod & strSQLDateDébut & strSQLDateFin
    
Me.SF_Recap.Form.RecordSource = strSQL

0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
26 mars 2010 à 00:18
Avant de trouver la réponse, il faut les éléments de la question :
A quoi ressemble ta requète avant de la soumettre ?

Es-tu sûr qu'on ait le droit de faire un
Group By Filtre Where QuelqueChose
Ca me parait louche

Dans ta requète, tu mets un And ou un Where derrière un Group By : à mon avis, ce n'est pas possible/autorisé.
Si tu veux voir les enregistrements filtrés par ces conditions, c'est après le Where de la clause Select qu'il faut le mettre, pas après le Group By

Colle nous la requète strSQL avant soumission.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bastien0675 Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 12 août 2010
26 mars 2010 à 14:26
En effet le AND et Where apres le Group By poseraient problème.

J'ai fait une requête qui représentant ma recherche:

Voici le SQL:

SELECT Portefeuille, Marché, [Ss - jacent], Sum([Nb Opé]) AS Trades, Sum([Nombre de lot]) AS Lots, [Date Opération]
FROM SourceData
GROUP BY [Portefeuille], [Marché], [Ss - jacent], [Date Opération]
HAVING (((Portefeuille)="IXOEUX") AND ((Marché)="EUREX"))
ORDER BY [Date Opération];


Je constate que le SQL utilise HAVING pour rechercher les Portefeuille et Marché (ce qui correspond à mes vZoneList1 et vZonelist2. J'ai donc enlevé le GROUP BY et remplacé par AND , j'ai plus d'erreur mais aucun regroupement sur la date n'est fait.

J'ai ajouté une Etiquette à mon Formulaire afin de voir à quoi ressemble mon strSQL afin de comparer, et j'obtiens:


strSQL = "SELECT [Portefeuille], [Marché], [Ss - Jacent], [SommedeNb Opé], [SommedeNombre de lot], [Date Opération] FROM [Recap Deals] WHERE ([Portefeuille] Like 'IXOEUX*' And [Marché] like 'EUREX*' ) AND format([Date Opération],'mm-yyyy') AND ([Date Opération]>=#1/1/2010# AND ([Date Opération]<=#1/15/2010#)



Merci!
0
Rejoignez-nous