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

Access Discussion :

Calcul de somme à partir de sous-formulaires


Sujet :

Access

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Calcul de somme à partir de sous-formulaires
    Bonjour,

    J'ai un formulaire dans lequel se trouve 7 sous-formulaires, eux-mêmes basés sur des requêtes.
    Dans chaque sous-formulaire il y a un champ contenant une valeur numérique en fonction de la requête sur lequel il est basé.
    Dans mon formulaire il y a un champ, que je met à jour à l'aide d'un bouton qui calcul (entre autre) la somme de chaque champ contenu dans mes sous-formulaires.
    Jusque là tout fonctionne parfaitement.

    Les ennuis arrivent lorsqu'un de mes sous-formulaire ne s'affiche pas (par absence de donnée dans ma requête), mon bouton de mise à jour me donne alors un message d'erreur (erreur automation)...
    Ce que je souhaiterais, c'est que lorsqu'un de mes sous-formulaire ne contient pas de donnée (et donc ne s'affiche pas), je récupère une valeur zéro dans mon calcul, correspondant à ce sous-formulaire.
    J'ai beau essayer diverses formules (iif, nz, isnull...), je n'y arrive pas...

    Quelqu'un aurait-il une idée ??

    Je vous en remercie par avance.
    Cordialement,

    Noëllie

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    J'ai été confronté au même problème avec un formulaire et 5 sous-formulaires liés au formulaire par le même champ.

    Je me suis construit une petite fonction qui vérifie si mon sous-formulaire a des données en allant faire une interrogation directement sur les tables sources des sous-formulaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Compter le nombre d'enregistrement dans un sous-formulaire
    Function EnrEtat(TblSF As String, ValId As Integer) As Boolean
    'TblSF : le nom de la table source du formulaire ou Etat
    'ValId : le champ liant le formulaire aux sous-formulaires
    Set tb = CurrentDb.OpenRecordset(TblSF, dbOpenDynaset)
    With tb
        'Faire attention que le champ de liaison se trouve en premier sur toutes les tables ou requêtes des sous-formulaires
        .FindFirst "[" & .Fields(0).Name & "]=" & ValId
        If .NoMatch Then EnrEtat = False Else EnrEtat = True
    End With
    tb.Close
    Set tb = Nothing
    End Function
    La source du champ résultat correspondant du formulaire est (mettant 0 s'il n'y a pas d'enregistrement correspondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =VraiFaux(EnrEtat("TableduSouform";[ChamdLiaison]);NomSousForm.Formulaire!Total;0)
    Et on fait la somme de tous ces contrôles.

    Peut-être que quelqu'un peut te proposer de plus simple comme solution.

    @+
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour Mandresy,

    Je viens juste de consulter votre réponse, et je vous en remercie !
    Je regarde ça et vous tiens au courant du résultat.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je suis désolée, je ne suis pas une experte sur Access, et encore moins en VBA...

    Cette fonction tu la met dans ton formulaire ou dans chaque sous-formulaire ?
    S'il faut la mettre sur le formulaire, est-ce que je peux l'intégrer à mon bouton de mise à jour ? C'est ce que je viens d'essayer mais lorsque je compile le code ça me met : "End Sub attendu", alors que le End Sub est bien présent...

    Autre question, mes sous-formulaires sont chacun basés sur des requêtes différentes (enregistrées) ; est-ce que je peux mettre le nom de la requête à la place de "TblSF" ?

    Merci d'avance pour ton aide !

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Ci-joint une petite base qui explicite le fonctionnement.

    Tables : Cotations (IdCotation, Divers,...) - Hébergement (IdCotation_FK,Montant,Divers,...) - Animation (IdCotation_FK,Montant, Divers ....) Cotations liée aux 2 tables en relation 1 - n par IdCotation.

    - 1 formulaire Cotation avec 2 sous-formulaires SFHebergement et SFAnimation en relations Pères/Fils.
    - Dans chaque sous-formulaire nous avons un champ Total qui fait le calcul du montant pour la cotation.

    Résultat cherché : 1 champ qui fait la somme des 2 totaux.

    Possibilité 1 :
    On met en source d'un champ : = SFHebergement!Formulaire.Total + SFAnimation!Formulaire.Total.
    Problème (ton cas actuel), Si un des sous-formulaire n'a pas d'enregistrement, Access met n'importe quoi. Soit Vide, soit #Erreur#, soit...

    Possibilité 2 (J'ai détaillé dans la base mais tu peux regrouper en une seule fois).
    - Créer 2 champs dans le formulaire qui vont utiliser la fonction que j'ai donnée pour vérifier si les sous-formulaires ont des enregistrements correspondants à l'Idchoisi (ici le numéro de cotation) en interrogeant directement la table ou requête source.
    - Utiliser ces résultats pour conditionner calcul de la somme avec un Vraifaux en source du champ final :
    Ex : Si EnrHeb est le champ pour les sous-formulaire Hébergement et EnrAnim pour l'Animation, on aurait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    = VraiFaux(EnrHeb;SFHebergement!Formulaire.Total;0) + VraiFaux(EnrAnim;SFAnimation!Formulaire.Total;0)
    C'est compréhensible je pense. Cette fonction est facilement utilisable du moment qu'on a une table ou requête enregistrée comme source du sous-formulaire et qu'on a la valeur de l'identifiant.

    Et transposable sur autant de sous-formulaires.

    Bonne continuation.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Effectivement je comprend mieux, par contre je suis vraiment nul... je ne trouve pas la base en pièce jointe !

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    , c'est moi .
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Pas de souci, merci !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bon, j'ai bien compris le principe, même si je ne comprend pas toutes les formules de la fonction...

    Par contre est-ce que ça pose un problème si mon identifiant n'est pas un entier mais du texte ?
    J'ai modifié "integer" par "string" pour la propriété de ValId dans la fonction, mais j'ai un message d'erreur dont je n'arrive pas à trouver l'origine : "le moteur de la base de données ne reconnait pas "MON ID" en tant que nom de champ ou expression correcte".
    Lorsque je fais le débogage, c'est la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .FindFirst "[" & .Fields(0).Name & "]=" & ValId
    qui est surlignée...

    J'ai pourtant vérifié que mon identifiant se trouve bien comme premier champ dans la requête et dans la table, et dans mon contrôle j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =EnrEtat("R_pourcent_lmi_derivation_TRO";[tro_id])

  10. #10
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Si ton ValId est du texte, il faut mettre entre apostrophes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .FindFirst "[" & .Fields(0).Name & "]='" & ValId & "'"
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Effectivement, ça fonctionne beaucoup mieux !!
    Merci encore pour ton aide !

    Encore quelques petites modifs pour l'adapter à ma base, mais c'est en très bonne voie !!
    Je finaliserai ça demain.

    Bonne soirée !

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Je viens de finaliser l'outil dans ma base, tout fonctionne parfaitement, c'est super !!
    Un grand merci à Mandresy pour ton aide, je n'aurais jamais trouvé ça toute seule !

    Bonne journée !

    No

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable suivi evaluation
    Inscrit en
    Octobre 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Responsable suivi evaluation
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Somme dans un formulaire de plusieurs champs de sous formulaires
    Bonjour à tous,
    J'espère que tout le monde va bien.
    je viens vers vous pour solliciter une aide.
    Mon message fait suite à cette discussion car le problème est presque le même. J'ai suivi les exemples mais je n'y arrive pas.
    Je veux faire la somme dans un formulaire de 7 champs contenus dans 7 sous formulaires.
    Dès que 1 des champs est vide, je n'ai plus de résultat dans le champs du formulaire.
    Merci à toi de me venir en aide!!!
    Excellente journée !

  14. #14
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    bonjour,
    il y a une solution plus simple pour contourner le problème de sous-formulaire vide: il faut utiliser IsError avec un VraiFaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =VraiFaux(IsError([NomSousformulaire].[Formulaire]![NomduChamp]);0;[NomSousformulaire].[Formulaire]![NomduChamp])
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

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

Discussions similaires

  1. calcul de somme dans un sous formulaire
    Par david29170 dans le forum IHM
    Réponses: 4
    Dernier message: 30/05/2011, 14h26
  2. Réponses: 2
    Dernier message: 19/06/2007, 08h44
  3. cacul d'une somme dans un sous formulaire
    Par T'chab dans le forum IHM
    Réponses: 5
    Dernier message: 22/01/2007, 14h17
  4. somme et cumuls sous-formulaire
    Par Pigwi dans le forum Access
    Réponses: 2
    Dernier message: 18/09/2006, 17h35
  5. Somme d'un sous formulaire avec une table comme source
    Par yoyosoleil dans le forum Access
    Réponses: 4
    Dernier message: 22/06/2006, 11h00

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