Décompter un nombre de cases cochées

Je souhaite permettre à l’utilisateur de sélectionner des enregistrements un par un, à l’aide de cases à cocher. Comment décompter le nombre de cases à cocher en temps réel ?

Mise en place

On dispose dans cet exemple d’une table Acteurs (tbl Acteurs), et on souhaite permettre la sélection de ces acteurs.

  • La table contient un champ nommé Sélectionné, de type Oui/Non (accessoirement, la valeur par défaut de ce champ est Non).
  • La table elle-même donne lieu à une requête qui trie les acteurs par ordre alphabétique.
  • Enfin, un formulaire est basé sur la requête.

Calculer le nombre de cases à cocher

Un champ Oui/Non équivaut graphiquement à une case à cocher (Cochée = Oui, Non cochée = Non). Access gère cette valeur sous forme numérique, ce qui donne : Oui = -1, Non = 0. En calculant la somme du champ, on obtient donc le nombre (négatif) de cases cochées. D’où cette procédure :

  1. Ouvrez votre formulaire en mode Création.
  2. Ajoutez une zone de texte sur ce formulaire (icône ).
  3. Dans cette zone de texte, tapez la formule suivante :

Notes
  • Notez le signe « – » devant la somme, pour inverser le total.
  • Si vous devez compter le nombre de cases non cochées, remplacez la formule par =Compte(*) + Somme([Sélectionné])
    Compte(*) donne le nombre total de lignes, nombre auquel vous ajoutez la somme (négative) des cases cochées. La différence est bien le nombre de cases non cochées !

Un problème à régler

Sur le principe, tout est en place. Maintenant, si vous passez en mode Formulaire et que vous cochez les cases, vous noterez qu’il y a toujours un décalage de 1 par rapport au total attendu. En d’autres termes, votre total affiche 4 quand 5 cases sont réellement cochées.

La raison est que, au moment où vous cochez la case, vous passez en mode d’édition des données (voyez l’icône de stylo à gauche des enregistrements). L’enregistrement est en cours de mise à jour, mais n’est pas encore validé ; ses nouvelles valeurs ne sont donc pas encore stockées dans la table… et le calcul ne se met pas à jour.

La solution consiste à forcer la mise à jour de l’enregistrement à chaque fois qu’une case est cochée (ou décochée) :

  1. Ouvrez votre formulaire en mode Création.
  2. Faites apparaître les propriétés de votre case à cocher, onglet Evénements.
  3. Réglez l’événement Après MAJ (Après Mise A Jour) sur « Procédure événementielle« .
  4. Cliquez sur les points de suspension à droite de l’événement (vous accédez au code Visual Basic de l’événement).
  5. Ajouter la ligne Me.Dirty = False, de façon à ce que votre événement ressemble à :

La valeur booléenne Dirty indique si un enregistrement est en cours de modification. Le fait de donner la valeur False à cette propriété suffit pour forcer l’enregistrement des données dans la table. Vous pouvez maintenant re-tester le formulaire : le calcul des cases cochées fonctionne !

Que faire ensuite avec les enregistrements ?

Cet article concerne uniquement le traitement des cases à cocher. Maintenant que les lignes ont été sélectionnées par l’utilisateur, rappelez-vous que le champ Sélectionné, dans la table, vaut Oui (ou -1) pour les acteurs sélectionnés, et Non (ou 0) pour les autres. Pour exploiter ces infos, vous pouvez par exemple construire une requête qui filtrera sur le champ Sélectionné, et pourquoi pas un état utilisant cette requête…

Info

La méthode de sélection décrite ici a le mérite d’être parlante et rapide à mettre en œuvre. Mais elle comporte aussi des inconvénients :

  1. Il faut modifier la structure de la table en ajoutant le champ Sélectionné.
  2. Ce champ Sélectionné n’a pas de rapport direct avec les données de la table, il ajoute une fonctionnalité de traitement, ce qui est moyennement cohérent.
  3. En réseau, seule une personne peut utiliser les cases à cocher à un instant t, sinon on a des effets de collision (non gérés ici).

Dans un prochain article, on verra donc comment améliorer le principe et résoudre tous ces problèmes !

Vous aimerez aussi...

2 réponses

  1. Humphry dit :

    Ce blog est vraiment sympa, j’aime la lecture après. 08))

  2. JJ dit :

    Merci.
    J’avais essayé d’autres solutions qui n’étaient pas réellement satisfaisantes.
    Réellement merci beaucoup au ‘Grenier Access’ et au responsable de ce blog.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *