Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access
Access Forum d'entraide sur Microsoft Access. Avant de poster -> La F.A.Q Access
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/01/2012, 20h10   #1
Invité de passage
 
Homme Messaoud Rouabha
Étudiant
Inscription : janvier 2012
Messages : 18
Détails du profil
Informations personnelles :
Nom : Homme Messaoud Rouabha
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2012
Messages : 18
Points : 3
Points : 3
Par défaut La somme entre 2 années successives avec jours et mois fixes

salut a tous
j'ai une table tblcommandes qui contient 2 champs:

1- DateCommande de type date.
2- Montant de type numerique.

Si par exemple la date la plus ancienne entreé dans le champ DateCommande ( Min([DateCommande])) est: 3/2/2008;comment faire ( dans une requete ou dans un etat ) pour avoir afficher (separement):

- La somme des montants dont la date DateCommande est comprise entre 3/2/2008 et 3/2/2009.
- La somme des montants dont la date DateCommande est comprise entre 3/2/2009 et 3/2/2010.
- La somme des montants dont la date DateCommande est comprise entre 3/2/2010 et 3/2/2011.
- La somme des montants dont la date DateCommande est comprise entre 3/2/2011 et la date en cours ( Date() ).
mouhamadrouabha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 22h45   #2
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonsoir,

voici la démarche :

la date minimum :
Code :
dmin("DateCommande","tblCommandes")
le 1er anniversaire :
Code :
dateserial(Year(dmin("DateCommande","tblCommandes"))+1,Month(dmin("DateCommande","tblCommandes")),Day(dmin("DateCommande","tblCommandes")))
2e anniversaire ;

Code :
dateserial(Year(dmin("DateCommande","tblCommandes"))+2,Month(dmin("DateCommande","tblCommandes")),Day(dmin("DateCommande","tblCommandes")))
….

Dans une requête, cela devient (N.B. francisée et virgule => point-virgule) :

Code :
1
2
SELECT Sum(IIf([DateCommande]>=DMin("DateCommande","tblCommandes") And [DateCommande]<DateSerial(Year(DMin("DateCommande","tblCommandes"))+1,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))),[Montant],0)) AS Année1, Sum(IIf([DateCommande]>=DateSerial(Year(DMin("DateCommande","tblCommandes"))+1,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))) And [DateCommande]<DateSerial(Year(DMin("DateCommande","tblCommandes"))+2,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))),[Montant],0)) AS Année2, Sum(IIf([DateCommande]>=DateSerial(Year(DMin("DateCommande","tblCommandes"))+2,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))) And [DateCommande]<DateSerial(Year(DMin("DateCommande","tblCommandes"))+3,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))),[Montant],0)) AS Année3, Sum(IIf([DateCommande]>=DateSerial(Year(DMin("DateCommande","tblCommandes"))+3,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))) And [DateCommande]<DateSerial(Year(DMin("DateCommande","tblCommandes"))+4,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))),[Montant],0)) AS Année4
FROM tblCommandes;
Si tu veux te documenter sur le traitement des dates et heures, vois ceci :

Les Fonctions Date/Heure
http://mhubiche.developpez.com/vba/f...ions/datetime/
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/01/2012, 07h36   #3
Invité de passage
 
Homme Messaoud Rouabha
Étudiant
Inscription : janvier 2012
Messages : 18
Détails du profil
Informations personnelles :
Nom : Homme Messaoud Rouabha
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2012
Messages : 18
Points : 3
Points : 3
Merci Claud.

Votre solution est valable si le nombre d'anniversaire est connu; alors que dans notre cas ce nombre (n) est variable et peut prendre n'importe quelle valeur (entier) selon Min(DateCommande) et la date du système Date().

Donc ce que on veut faire est de laisser Access détermine ce nombre entier d'anniversaires n et d'afficher la somme de chaque anniversaire à part.
mouhamadrouabha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 07h44   #4
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Dans une fonction personnalisée alors, pas dans une requête.

Explique comment tu voudrais voir le résultat affiché.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 11h40   #5
Invité régulier
 
Homme Joao DA ROCHA
Inscription : octobre 2005
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Joao DA ROCHA
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 29
Points : 5
Points : 5
Bonjour,

je partirais sur une requête, avec un champs calculé et la fonction datediff (voir l'aide) qui te renverra combien d'années se sont écoulées entre deux dates.

Ensuite, cette requête, je l'injecte dans une 2nde requête croisée dynamique, où en ligne, je met ce champ calculé, et en valeurs, je met la somme des montants.

En espérant que ce soit une piste ...

TALERE
talere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 12h04   #6
Invité de passage
 
Homme Messaoud Rouabha
Étudiant
Inscription : janvier 2012
Messages : 18
Détails du profil
Informations personnelles :
Nom : Homme Messaoud Rouabha
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2012
Messages : 18
Points : 3
Points : 3
je veut que le resultat soit afficher comme suit ( si on prend l'exemple precedent ):

Periode La somme
2009 1000
2010 5000
2011 43000
2012 8700

On prend l'année la plus grande de chaque periode
Fichiers attachés
Type de fichier : doc Exemple.doc (23,5 Ko, 2 affichages)
mouhamadrouabha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 14h27   #7
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Je poursuis sur ma première idée : voici une sub pour construire la requête que je t’ai d’abord proposée.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Sub Rouabha(NomTable As String)
Dim dDebut As Date
Dim dDepart As Date
Dim dFin As Date
Dim sDebut As String
Dim sfin As String
Dim i As Integer, NbreAns As Integer
Dim sSql As String
Dim q As QueryDef
'Date de départ
dDepart = dMin("DateCommande", "tblCommandes")
'Nombre d'années complètes
NbreAns = DateDiff("yyyy", dDepart, Date)
'Construction du sql de la requête
sSql = "SELECT "
For i = 1 To NbreAns + 1
   dDebut = DateSerial(Year(dDepart) + i - 1, Month(dDepart), Day(dDepart))
   dFin = DateSerial(Year(dDepart) + i, Month(dDepart), Day(dDepart))
   'Mise en forme string
   sDebut = "#" & Format(dDebut, "mm/dd/yy") & "#"
   sfin = "#" & Format(dFin, "mm/dd/yy") & "#"
   'construction de la clause select
   sSql = sSql & "Sum(IIf([DateCommande]>=" & sDebut & " and [DateCommande]<" & sfin & " ,[Montant],0)) AS Année" & i & ","
Next i
'Supprimer la dernière virgule et ajouter la clause From
sSql = Left(sSql, Len(sSql) - 1) & " FROM " & NomTable & ";"
'Affecter le sql à une requête
Set q = CurrentDb.QueryDefs("tst")
q.SQL = sSql
'Ouvir la requête
DoCmd.OpenQuery ("tst")
End Sub
Pour voir son fonctionnement
- tu dois avoir une requête « tst » enregistrée (peu importe son sql) ;
- dans la fenêtre d’exécution (<Ctrl + G>), tu saisis :

Code :
call Rouabha("tblCommandes")
<Enter>

La requête « tst » est construite sur mesure : elle tient compte du nombre d’anniversaires.
La requête tst affiche le résultat en ligne, pas tout à fait comme tu le prévoyais.
Mais si la démarche te plait, on peut voir comment améliorer l'affichage.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/01/2012, 18h25   #8
Invité de passage
 
Homme Messaoud Rouabha
Étudiant
Inscription : janvier 2012
Messages : 18
Détails du profil
Informations personnelles :
Nom : Homme Messaoud Rouabha
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2012
Messages : 18
Points : 3
Points : 3
Merci Claude, ça marche bien; mais j'ai besoin de quelques améliorations:

1- Au lieu d'afficher dans la requête tst :Année1,Année2,Année3,...,Année(n) je veut avoir :Année2009, Année2010, Année2011 (si la première période est entre 2008 et 2009 on doit avoir Année2009 ... c.à.d on prend l'année la plus grande de chaque période).

2- Comment obliger la requête tst à afficher la somme des montants sous format standard avec décimales 0 c.à.d au lieu d'avoir par exemple 23000,00 on doit avoir 23 000.

3- Comment peut on avoir afficher les années ( Année2009, ... ) dans une colonne de la requête tst (nommé par exemple Année) et non pas dans une ligne comme c'est le cas, et aussi la somme des montants dans une autre colonne (nommé par exemple Total).

Et merci encore une fois pour vos explications.
mouhamadrouabha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 18h59   #9
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Désolé, à part pour le 1- (en bricolant le titre de la colonne dans le code), j'ignore comment faire pour le 2 et le 3.

Il me semble que fabriquer un état (au départ de la requête) serait plus raisonnable.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 19h13   #10
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 447
Points : 4 447
Bonsoir à tous,

Je viens d’avoir un début d’ébauche de brouillon d’idée quelque peu différente de celle de Claude.

Je vous la soumets donc

L’idée consiste à ajouter un champ calculé [Année] :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
idCommande	DateCommande	Montant	      annee
1	      03/02/2008	1 200,00 €	2009
2	      05/02/2008	2 000,00 €	2009
3	      15/03/2008	1 500,00 €	2009
4	      05/02/2009	10 000,00 €	2010
5	      08/02/2009	12 000,00 €	2010
6	      28/06/2009	8 000,00 €	2010
7	      02/01/2010	1 000,00 €	2010
8	      08/02/2010	100 000,00 €	2011
9	      10/04/2010	120 000,00 €	2011
10	      08/01/2011	120 000,00 €	2011
11	      07/02/2011	10,00 €	        2012
12	      08/03/2011	12,00 €	        2012
Il ne restera plus qu’à faire un SUM(Montant) en faisant un groupement par [Année] pour résoudre le problème.

Pour le champ calculé [Année], j’ai ça pour le moment :
Code sql :
1
2
3
4
5
6
7
SELECT tblcommande.idcommande, 
       tblcommande.datecommande, 
       tblcommande.montant, 
       INT (Datediff("y", Dmin("DateCommande", "TblCommande"), datecommande) / 
            366) + 1 
       + Year(Dmin("DateCommande", "TblCommande")) AS annee 
FROM   tblcommande;

… mais mon calcul avec INT(…/366)… est certainement approximatif, il reste donc à l’améliorer ...
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 31/01/2012, 19h44   #11
Invité de passage
 
Homme Messaoud Rouabha
Étudiant
Inscription : janvier 2012
Messages : 18
Détails du profil
Informations personnelles :
Nom : Homme Messaoud Rouabha
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2012
Messages : 18
Points : 3
Points : 3
Merci Claude pour votre aide et votre, tu ma guider presque a la fin.

Merci Fabien s'est ce que je voudrai avoir exactement ... ça marche très bien.

Bonne nuit à tous au revoir.
mouhamadrouabha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 13h09   #12
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 255
Points : 5 255
Bonjour,

Concernant l'amélioration sur le champ année, on peut essayer :

Code :
Annee: VraiFaux(SérieDate(Année([DateCommande]);Mois(MinDom("DateCommande";"tblCommandes"));Jour(MinDom("DateCommande";"tblCommandes")))<=[DateCommande];Année([DateCommande])+1;Année([DateCommande]))
Ou:

Code :
Annee: -(SérieDate(Année([DateCommande]);Mois(MinDom("DateCommande";"tblCommandes"));Jour(MinDom("DateCommande";"tblCommandes")))<=[DateCommande])+Année([DateCommande])
A vérifier...
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/02/2012, 09h14   #13
Invité de passage
 
Homme Messaoud Rouabha
Étudiant
Inscription : janvier 2012
Messages : 18
Détails du profil
Informations personnelles :
Nom : Homme Messaoud Rouabha
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2012
Messages : 18
Points : 3
Points : 3
Merci Denis je vais essayer et je te donne le résultats.

Mais j'ais besoin d'aide encore une fois:

En ce qui concerne la solution du FABIEN, comment peut on éliminer ou exclure les dates qui n'ont pas encore une année complète c.à.d si la date système Date() est < 3/2/2012 ( dans l'exemple de Fabien ) nous devons éliminer les dates 07/02/2011 et 08/03/2011 ( c.à.d les commandes 11 et 12 ).
mouhamadrouabha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 19h24   #14
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 447
Points : 4 447
bonsoir,

j'ai essayé avec une fonction VBA à copier/coller dans un module.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
Public Function DateMaxi() As Date
'
Dim Datemini As Date
Datemini = DMin("DateCommande", "tblCommande")
'
If Date < DateSerial(Year(Date), Month(Datemini), Day(Datemini)) Then
        DateMaxi = DateSerial(Year(Date) - 1, Month(Datemini), Day(Datemini))
    Else
        DateMaxi = DateSerial(Year(Date), Month(Datemini), Day(Datemini))
    End If
'
End Function
puis dans la requête, ajouter le critère:
Code sql :
...WHERE [DateCommande]<DateMaxi();

à voir...
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 07h39   #15
Invité de passage
 
Homme Messaoud Rouabha
Étudiant
Inscription : janvier 2012
Messages : 18
Détails du profil
Informations personnelles :
Nom : Homme Messaoud Rouabha
Localisation : Algérie

Informations professionnelles :
Activité : Étudiant
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2012
Messages : 18
Points : 3
Points : 3
Merci Claude ça fonctionne.



Merci Fabien pour vos solutions simples et efficaces, ça fonctionne très bien.

J'ais besoin de vos aides sur le le problème du lien:
http://www.developpez.net/forums/d11...ayer-commande/
Et merci d'avance.
mouhamadrouabha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 09h27   #16
Invité régulier
 
Femme
Inscription : février 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : février 2012
Messages : 6
Points : 8
Points : 8
Citation:
Envoyé par mouhamadrouabha Voir le message
Merci Claude pour votre aide et votre, tu ma guider presque a la fin.

Merci Fabien s'est ce que je voudrai avoir exactement ... ça marche très bien.

Bonne nuit à tous au revoir.
Je vous souhaite de beaux rêves
glenngac est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h03.


 
 
 
 
Partenaires

Hébergement Web