Problème d'un contrôle calculé à partir de sous-formulaires [Résolu/Fermé]

Signaler
Messages postés
5
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
26 novembre 2012
-
Messages postés
5
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
26 novembre 2012
-
Bonjour,

Dans Access 2010, je rencontre un soucis avec une formule de calcul d'un contrôle qui doit contenir la somme de 2 valeurs issues chacune de 2 sous-formulaires différents. Ce contrôle est assez grand pour afficher le résultat, mais il affiche constamment "#Taille".

Je pense avoir compris d'où vient le problème, mais je ne sais pas comment le résoudre. Je remercie toute âme charitable de bien vouloir m'apporter son aide.

* Description des calculs :
Mon contrôle [TOTAL] qui contient la formule en erreur est sur le formulaire principal (FMP).

Ce formulaire contient 2 sous-formulaires destinés à saisir les charges (en j/h) des projets (projet par projet) :

- Le 1er sous-formulaire (SFM1) permet de saisir les charges de 2012 à 2014 par Direction Métier. Il est sous format liste tabulée et contient un contrôle [TOTAL1] en en-tête. Ce contrôle est obtenu par sommation des contrôles correspondant aux charges totales 2012, 2013 et 2014 toutes Directions Métiers confondues.
C'est-à-dire :
[TotCharges2012] = Somme([TableCharges12-14].[Charges2012])
[TotCharges2013] = Somme([TableCharges12-14].[Charges2013])
[TotCharges2014] = Somme([TableCharges12-14].[Charges2014])
[TOTAL1] = Nz([TotCharges2012])+Nz([TotCharges2013])+Nz([TotCharges2014])
Remarque : pour chaque projet, il y a toujours au moins un enregistrement dans la table TableCharges12-14

- Le 2ème sous-formulaire (SFM2) est identique au premier et permet de saisir les charges de 2015 à 2017 par Direction Métier. Il contient un contrôle [TOTAL2] en en-tête. Ce contrôle est obtenu par sommation des contrôles correspondant aux charges totales 2015, 2016 et 2017 toutes Directions Métiers confondues.
C'est-à-dire :
[TotCharges2015] = Somme([TableCharges15-17].[Charges2015])
[TotCharges2016] = Somme([TableCharges15-17].[Charges2016])
[TotCharges2017] = Somme([TableCharges15-17].[Charges2017])
[TOTAL2] = Nz([TotCharges2015])+Nz([TotCharges2016])+Nz([TotCharges2017])
Remarque : pour certains projets, la table TableCharges15-17 peut être vide

Le contrôle [TOTAL] du formulaire principal contient la formule suivante :
Nz([SFM1].[Formulaire]![TOTAL1])+Nz([SFM2].[Formulaire]![TOTAL2])

*Constat :
Cette formule fonctionne parfaitement lorsque le formulaire principal et ses sous-formulaires sont ouverts en modification, mais dès lors que les formulaires sont vérouillés en lecture seule, "#Taille" s'affiche dans le contrôle [TOTAL] lorsque il n'y a rien de saisi dans la table 2015-2017 pour les projets concernés.

J'ai remarqué en effet qu'en mode modification, même si la table TableCharges15-17 est vide, il y a toujours une ligne qui apparait dans le sous-formulaire SFM2, ce qui permet de calculer [TOTAL2] à 0, et donc [TOTAL] n'affiche pas d'erreur. Mais en mode Lecture Seule, il n'y aucune ligne qui s'affiche dans le sous-formulaire SFM2, et donc [TOTAL2] affiche blanc, ce qui crée une erreur sur [TOTAL].

J'ai fait quelques tests pour connaitre la valeur de [TOTAL2] à ce moment là :
1/ VraiFaux([SFM2].[Formulaire]![TOTAL2] est null ;1;2] => affiche 2, ce qui veut dire que la valeur n'est pas null
2/ VraiFaux([SFM2].[Formulaire]![TOTAL2] > 0 ;10;20] => Erreur, ce qui pourrait vouloir dire que la valeur n'est pas numérique ?

Quelqu'un a-t-il une idée pour corriger ma formule ?

A noter aussi que je ne connais pas le VBA et que je n'utilise que le générateur d'expression, mais s'il faut programmer quelque chose en VBA, je suis à l'écoute de la solution.

5 réponses

Messages postés
2955
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
31 août 2019
198
bonjour
essaies de mettre ton champ calculé dans ta table en mode creation , taille du champ en reel double
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
5
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
26 novembre 2012

Bonjour castours, merci pour ton aide.

J'avais Entier long dans les champs de ma table, que j'ai remplacé par Réel double, mais ça ne fonctionne toujours pas.

Au-secours.
Messages postés
2955
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
31 août 2019
198
Bonjour
Je n'ai pas la version 2010.
Si tu peux, mets ta base sur le site avec cjoint.fr
Messages postés
5
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
26 novembre 2012

Bonjour,

La base contient des données confidentielles de ma société que je ne peux mettre en ligne. Mais j'essaierai de créer une autre base pour reproduire ce cas.

Je pense pouvoir joindre cette base en milieu de semaine prochaine (je n'ai pas la version 2010 chez moi, et mon début de semaine au bureau est un peu chargé pour travailler sur cette base).
Messages postés
2955
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
31 août 2019
198
Je possede access 2007 et 2003
Si tu refais ta base sur le meme principe, il se peut que le phenomene ne se reproduise pas.
Messages postés
5
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
26 novembre 2012

OK Castours,

alors je créerai une base avec mon Access 2003 à domicile.
Messages postés
5
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
26 novembre 2012

Finalement, avec l'aide d'un collègue, on a trouvé une solution.
Le contrôle [TOTAL2] est considéré en erreur par Access lorsque le sous-formulaire en mode "Lecture seule" ne ramène aucune ligne (table vide).

Pour éviter que la formule tombe en erreur, il faut donc tester l'erreur en amont avec la fonction IsError et la modifier ainsi : Si le contrôle est en erreur, considérer qu'il vaut 0, sinon prendre sa valeur avec Nz.

On a alors [TOTAL] =
IIF(IsError([SFM1].[Formulaire]![TOTAL1]);0;Nz([SFM1].[Formulaire]![TOTAL1])) + IIF(IsError([SFM2].[Formulaire]![TOTAL2]);0;Nz([SFM2].[Formulaire]![TOTAL2]))