IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Récuperer un total dans une requête pour faire un calcul dans un champ [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Récuperer un total dans une requête pour faire un calcul dans un champ
    Bonjour,

    Après plusieurs heures de tripatouillage je viens vous voir car je n'arrive décidément pas à résoudre ma problématique.
    Je vous expose donc mon sujet tout en sachant qu'il y a peut être une autre façon de faire mais que je n'arrive pas à appréhender :

    J'ai construit une base qui a pour vocation de gérer des statistiques d'accident avec une table principale qui gère les enregistrements sur une base mensuelle.

    Pour ce faire, ma table de collecte des données comporte les champs principaux suivants :

    Champs d'identification :
    - Mois concerné (mm-aaaa), format date
    - La filiale concernée (nom texte)

    Champs de données (je vous le fais en version courte pour l'exemple) :
    - Nombre d'heure travaillé (numérique)
    - Nombre d'accident (numérique)

    Ce que j'arrive à faire sans soucis concerne les stats mensuelles, filtrés par filiale. Pour l'exemple, mon calcul de base est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TF1 mois : ([nb accident] * 1000000) / [nb heure travaillé]
    La où je capote complétement c'est lorsque je veux avoir les stats annuels (sur une année donnée ou 12 mois glissants).

    Dans une requête, j'arrive à :
    1/ trier les enregistrement en fonction de mes critères de recherche (soit 12 mois glissants, soit à partir d'un intervalle de date spécifié dans 2 champs de formulaire)

    2/ faire un total, sur ce tri, de chaque colonne [working hour] et [nb accident], par la fonction "total des colonnes"

    Là où je bloque :
    3/ récupérer ces valeurs de totaux pour leur appliquer la formule TF1 (année).
    Je pensait créer un champ calculé dans un formulaire, mais pour cela j'ai besoin de pouvoir faire référence à ces totaux !!!

    Si vous savez comment faire ou si vous avez une meilleure idée, je suis plus que preneur.

    Merci,

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 059
    Points : 24 662
    Points
    24 662
    Par défaut
    Bonjour,

    Pour récupérer des valeurs, et éventuellement y appliquer une nouvelle formule, tu peux utiliser les fonctions de domaines. Notamment Dlookup.

    Il y a un excellent tuto sur ces fonctions.

    Cordialement,

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Je te remercie pour cette info.
    Du coup j'ai essayé de m'y coller, dans un 1er temps avec DSum car je ne vois pas comment extraire mon total avec DLookup.

    J'essais donc de remplacer ma requête de filtrage, par les critères associés à Dsum... et ça y'en a pas marcher vraiment.

    Je m'explique, lorsque j'utilise cette fonction dans un champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]");"Pas de Données")
    ==> J'ai bien un retour qui me fait une somme de toutes les valeurs présentes dans la table.

    Maintenant quand j'ajoute un ou plusieurs critère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]"; "[Reporting_date]" Entre #01/01/2010# Et #31/12/2010#);"Pas de données")
    ==> Je n'ai plus de retour d'enregistrement, mais "Pas de données" affiché, alors que je suis certain d'avoir des valeurs avec ce filtre puisque c'est l'objet de ma requête.

    Quid ???

    Subsidiairement, l'idée finale est de remplacer les critères par des variables présentes dans des champs du formulaire, je suppose qu'au lieu d'écrire en dure la date par exemple, je fais une référence comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Entre [Formulaires]![F_Subsidiary_Stats]![Start_Date] Et [Formulaires]![F_Subsidiary_Stats]![End_Date]


    Merci pour les conseils.

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 059
    Points : 24 662
    Points
    24 662
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]"; "[Reporting_date] Entre #01/01/2010# Et #31/12/2010#");"Pas de données")
    Un guillemet mal placé. Il s'agit d'une seule et même expression.

    et donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]"; "[Reporting_date] Entre [Formulaires]![F_Subsidiary_Stats]![Start_Date] Et [Formulaires]![F_Subsidiary_Stats]![End_Date]");"Pas de données")
    Cordialement,

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci pour cette réponse, j'avance

    En revanche, si cette correction d'erreur m'a permis de renvoyer des valeurs corrects à partir de champs texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]";"Subsidiary_Name=[Formulaires]![F_Subsidiary_Stats]![Subsidiary_Filter]");"Pas de données")


    Ça ne passe pas pour les dates. J'ai beau changer les formats de date dans la base et/ou la requête (FR / US), taper directement en clair la date dans les critères, rien n'y fait, j'ai systématiquement un renvois Une idée ??

    Lorsque je tente de faire la somme de tous les enregistrements "working_hours", sans critère, à partir de ma requête qui filtre les données suivant "subsidiaries" et "dates", je me colle également une erreur ?!! Mais je ne vois pas le bug dans ma table source

    Merci

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 059
    Points : 24 662
    Points
    24 662
    Par défaut
    As-tu essayer de remplacer les # par des ".

    Date Uk uniquement avec VBA, sinon c'est le format utilisé par le système qui prime.

    Une autre méthode est l'utilisation du double.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cdbl([monchamp]) entre cdbl([date1]) et cdbl([date2])
    Avec ça tu t’affranchis de tous ces problèmes de format. Il faut savoir que le format Date est un format d'affichage, le stockage se fait au format double. La partie entière exprime la date et les décimales les heures/minutes/secondes...

    Cordialement,

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    J'ai essayé et ça ne donne pas de meilleur résultat. En revanche j'ai pu constater la chose suivante :

    Lorsque je n'ai qu'un critère simple (une date précise ou un nom précis), ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]";"[Reporting_date]=#01/01/2010#");"Pas de données")
    Dès que j'ajoute un 2ème critère (une date + un nom ou entre 2 dates), j'ai un code Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]";"[Reporting_date]=#01/01/2010# Et [Subsidiary_Name]='AAA-TEST'");"Pas de données")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]";"[Reporting_date] Entre #01/01/2010# Et #31/12/2010#");"Pas de données")


    C'est d'autant plus étrange que lorsque j'applique cette technique, dans sa version la plus simple, qui fonctionne sur la table, à ma requête, j'ai également un code Erreur.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(SomDom("[Working_hours]";"[R_Subsidiary_Stats_Annuel]");"Pas de Données")
    Code de la requête en SQL pour une meilleure lisibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Reporting_Indicateurs.Subsidiary_Name, T_Reporting_Indicateurs.Reporting_date, Sum(T_Reporting_Indicateurs.Working_hours) AS SommeDeWorking_hours, Sum(T_Reporting_Indicateurs.Nb_Lost_time_accident) AS SommeDeNb_Lost_time_accident, Sum(T_Reporting_Indicateurs.Nb_No_Lost_time_accident) AS SommeDeNb_No_Lost_time_accident, Sum(T_Reporting_Indicateurs.Nb_Nursing_care) AS SommeDeNb_Nursing_care, Sum(T_Reporting_Indicateurs.Nb_Lost_time_days) AS SommeDeNb_Lost_time_days, T_Reporting_Indicateurs.TF1
    FROM T_Reporting_Indicateurs
    GROUP BY T_Reporting_Indicateurs.Subsidiary_Name, T_Reporting_Indicateurs.Reporting_date, T_Reporting_Indicateurs.TF1
    HAVING (((T_Reporting_Indicateurs.Subsidiary_Name)=[Formulaires]![F_Subsidiary_Stats]![Subsidiary_Filter]) AND ((T_Reporting_Indicateurs.Reporting_date) Between [Formulaires]![F_Subsidiary_Stats]![Start_Date] And [Formulaires]![F_Subsidiary_Stats]![End_Date]));

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 059
    Points : 24 662
    Points
    24 662
    Par défaut
    Quel message d'erreur ?

    Il se peut que l'une des valeurs soit un null.

    Dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nz(SomDom("nz([Working_hours];0)";"[T_Reporting_Indicateurs]";"[Reporting_date]=#01/01/2010#");"Pas de données")
    Mais dans ce cas le premier nz() n'a plus d’utilité.

    Sinon il faut vérifier les valeurs qui remontent avec la double condition. Comme tu le fait avec ta requête.

    A noter que le where (ou having) de ta requête peut être copier dans le somdom.

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SomDom("nz([Working_hours];0)";"[T_Reporting_Indicateurs]";"T_Reporting_Indicateurs.Subsidiary_Name=[Formulaires]![F_Subsidiary_Stats]![Subsidiary_Filter] AND T_Reporting_Indicateurs.Reporting_date Between [Formulaires]![F_Subsidiary_Stats]![Start_Date] And [Formulaires]![F_Subsidiary_Stats]![End_Date]")
    Cordialement,

  9. #9
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    J'avais un retour de la cellule de type (et il y avait bien des données).
    Ta dernière proposition de code me renvois un :
    En faisant un mixte de tout ça, avec codage en anglais et majuscule, j'arrive à un champs qui fonctionne sur le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nz(SomDom("[Working_hours]";"[T_Reporting_Indicateurs]";"T_Reporting_Indicateurs.Reporting_date BETWEEN [Formulaires]![F_Subsidiary_Stats]![Start_Date] AND [Formulaires]![F_Subsidiary_Stats]![End_Date] AND T_Reporting_Indicateurs.Subsidiary_Name=[Formulaires]![F_Subsidiary_Stats]![Subsidiary_Filter]");"Pas de données")
    Merci BEAUCOUP !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2014, 08h41
  2. Réponses: 2
    Dernier message: 04/06/2009, 14h49
  3. XI - Extraire une somme dans une periode pour faire une addition
    Par campia dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 06/12/2007, 16h41
  4. requête pour trouver un mot dans une phrase
    Par FRIGAUX dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 25/11/2006, 22h18
  5. [Sécurité] Sécurité portable pour les données utilisées dans une requête
    Par berceker united dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/07/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo