Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
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 22/09/2011, 10h03   #1
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : août 2011
Messages : 53
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 53
Points : 13
Points : 13
Par défaut Calcul de Moyenne

Après plusieurs recherches infructueuses, je me tourne vers le forum:

Je cherche à faire une moyenne sur l'année qui prendrait en compte seulement les mois remplis. Je m'explique: Si seulement janvier février et mars sont remplis on fait une moyenne seulement sur ces trois mois, Si toute l'année est remplie, on divise par les douze mois de l'année...

Ca ne marche pas avec la fonction Moyenne ().

Merci pour votre aide!
borisp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 13h35   #2
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 086
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 086
Points : 11 622
Points : 11 622
Bonjour,

Via une requete il faut écarter les valeurs vides.

Code :
1
2
3
4
SELECT Avg(Table1.Note) AS MoyenneDeChamp1
FROM Table1
WHERE (((Table1.Note) Is Not Null));
;
Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 14h52   #3
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : août 2011
Messages : 53
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 53
Points : 13
Points : 13
Merci de ton aide, pour le premier mois cela a l'art de fonctionner mais quand j'essaye de rajouter les mois suivants j'ai le message d'erreur "Vous avez essayé d'exécuter une requête ne comprenant pas l'expression "fevrier" comme une partie de la fonction d'agrégat" ... En fait je veux une moyenne de plusieurs champs de ma table par (ou pour un) enregistrement.

Merci encore
borisp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 17h10   #4
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 086
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 086
Points : 11 622
Points : 11 622
Peux-tu poster la structure de la table et ta requete ? Parceque je suis un peu dans le flou.
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 09h24   #5
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : août 2011
Messages : 53
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 53
Points : 13
Points : 13
Merci pour ton aide!

Ma table coûts comporte un champ pour chaque mois de l'année appelé [jan1], [fev1], [mar1], etc...
Ma requête comporte un champ total_taux ou je souhaite calculer la moyenne de l'année, la difficulté vient du fait que certains mois ne sont pas forcément remplis (c'est pour des formations qui peuvent un mois seulement).

Si seulement trois mois sont saisis, je veux la moyenne pour ces trois mois. Si les 12 sont saisis, la moyenne sur ces 12, etc...

J'espère avoir été plus clair, merci beaucoup pour l'aide!
borisp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 11h55   #6
Membre régulier
 
Inscription : février 2010
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 100
Points : 92
Points : 92
Si je comprends bien, tu as une table avec une "colonne" pour chaque mois ?
Donc 12 colonnes pour un an ? Jan1, fev1, mar1,... jan2, fev2, mar2,... etc ?
Beub' est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 12h15   #7
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : août 2011
Messages : 53
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 53
Points : 13
Points : 13
Oui c'est ca, je n'ai pas pu faire autrement car j'ai besoin de remonter chaque mois dans un formulaire de modification ...
borisp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 13h04   #8
Membre régulier
 
Inscription : février 2010
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 100
Points : 92
Points : 92
... c'est pas très très propre tout ça...

Tu ne pourrais pas faire, par exemple, une table avec 13 champs (Année, janvier, février, mars,..., novembre, décembre) ? L'année te permettrait d'avoir un ID unique.

Ou encore (le mieux ?) : une table de deux champs seulement (MoisAnnee, ChiffreMois). Du coup, tu n'insères plus que les enregistrements où tu as qqc (si c'est NULL, pas d'enregistrements !).
Au final, ça donnerait qqc comme :
Janvier2010 | 1000
Mars2010 | 1500
Juillet2010 | 750
Janvier2011 | 2500
...

Dans les deux cas, la construction de ta requête serait clairement beaucoup plus facile... et le formulaire de modification serait opérationnel sans problème.

Dans le deuxième cas seulement, la requête donnée par loufab fonctionnerait (à une clause WHERE près).

Et dans ton cas, je ne vois même pas comment faire à moins de récupérer tous les champs et ensuite faire du tri avec du code VBA...
Tu connais le VBA ?
Beub' est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 14h11   #9
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : août 2011
Messages : 53
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 53
Points : 13
Points : 13
Il y a surement plus simple que ce que j'ai fait mais c'est plus compliqué que ce que j'ai expliqué. Ce n'est pas par année mais par type de coût, il y en a 10. Donc avec mes connaissances en access (appris sur le tas depuis 1 mois ...) le plus simple m'a paru de faire [jan1], [fev1],..., [jan2], [fev2],... Tout marche bien sauf les calculs!
Et pareil le VBA je connais que depuis 1 mois donc je suis très vite limité...
borisp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 14h38   #10
Membre régulier
 
Inscription : février 2010
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 100
Points : 92
Points : 92
Fait très rapidement (copie-colle, ça devrait marcher) :

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
33
34
35
 
Public CNN_Application  As ADODB.Connection
Public CNN_SqlServer As ADODB.Connection
 
Private Sub Form_Load()
    Dim strSQL As String
    Dim rst As Recordset
 
    Dim Compteur As Integer, i As Integer
 
    Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset, fld As ADODB.Field
    Dim strSQL As String
 
    Set CNN_Application = Nothing
    Set CNN_Application = New ADODB.Connection
    Set CNN_Application = Application.CurrentProject.Connection
    Set rst = New Recordset
 
    'requête sql
    strSQL = "SELECT * FROM Table1"
    rst.Open strSQL, CNN_Application, adOpenForwardOnly, adLockReadOnly
 
    'Le cas suivant ne traite qu'une table à 12 colonnes (une année, donc pas de jan2, fev2,...) : il faudra l'adapter pour plusieurs années
    For i = 1 To 12
 
        If IsNull(rst.Fields(i)) = False Then
            Somme = Somme + rst.Fields(i)
            Compteur = Compteur + 1
        End If
 
    Next
 
    MsgBox "Moyenne = " & Somme / Compteur
 
End Sub
ça devrait tourner correctement.
Pour avoir la moyenne sur jan2 => dec2, il faut simplement créer un déphasage sur la boucle : i doit aller de 13 à 24 au lieu de 1 à 12. Idem pour jan3 => dec3, i devra aller de 25 à 37.

Cordialement,
Beub'
Beub' est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/09/2011, 14h45   #11
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 086
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 086
Points : 11 622
Points : 11 622
C'est justement le problème c'est super facile à gérer comme une feuille Excel... sauf qu'on est dans un base de données et pas dans un tableur. Du coup la facilité que tu as eu à la "conception" de ton modèle de données tu es en train de la payer au prix fort. Les calculs qui auraient été très facile deviennent rédibitoire à faire.

Il va te falloir monter une belle UAG pour résoudre ça.

Voici une UAG typique :

Code :
1
2
SELECT nz([Janv],0)+nz([Fev],0)+nz([Mars],0)+nz([Avril],0)+nz([Mai],0)+nz([Juin],0)+nz([Juil],0)+nz([Aout],0)+nz([Sept],0)+nz([Oct],0)+nz([Nov],0)+nz([Dec],0) AS SommeTotale, IIf(IsNull([Janv]),0,1)+IIf(IsNull([Fev]),0,1)+IIf(IsNull([Mars]),0,1)+IIf(IsNull([Avril]),0,1)+IIf(IsNull([Mai]),0,1)+IIf(IsNull([Juin]),0,1)+IIf(IsNull([Juil]),0,1)+IIf(IsNull([Aout]),0,1)+IIf(IsNull([Sept]),0,1)+IIf(IsNull([Oct]),0,1)+IIf(IsNull([Nov]),0,1)+IIf(IsNull([Dec]),0,1) AS Nombre, [SommeTotale]/[Nombre] AS Moyenne
FROM Table1;
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/09/2011, 15h03   #12
Candidat au titre de Membre du Club
 
Homme Boris
Étudiant
Inscription : août 2011
Messages : 53
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 53
Points : 13
Points : 13
Merci pour tout je vais essayer tout ca et je reviens vers vous, c'est cool de m'aider!
borisp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h35.


 
 
 
 
Partenaires

Hébergement Web