Classe M.E.L.A. (C.R.U.D.) avec Microsoft ACCESS

Création d'une classe M.E.L.A. : Création et mise en oeuvre d'une classe de Modification, Effacement, Lecture, Ajout.

Date de publication : 27/09/2011. Date de mise à jour : 03/10/2011.

Par Fabrice Constans (Ma page personnelle) (Blog)
 

Certaines opérations sont redondantes dans une IHM. La gestion des fiches en est une. Au travers de ce tutoriel, nous allons créer et mettre en oeuvre une classe qui prendra en compte un système de navigation et de manipulation des fiches.

Commentez cet article : 4 commentaires

Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us MySpace Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Windows Live Favorites      



0. Introduction
0-A. Mise en garde
I. Analyse du besoin
I-A. Modification
I-B. Effacement
I-C. Lecture
I-D. Ajout
II. Formulaire et boutons
II-A. Le formulaire
III. La classe
III-A. Créer la classe
III-B. Déclaration
III-C. Propriété Form
III-D. La fonction d'instanciation
IV. Référencer la bibliothèque
V. Le formulaire
VI. Les méthodes de la classe
VI-A. Verrouiller les contrôles
VI-A-1. Créer
VI-A-2. Modifier
VI-A-3. Enregistrer
VI-A-4. Annuler
VI-A-5. Supprimer
VII. La navigation
VII-A. Vers la fiche précédente
VII-B. Vers la fiche suivante
VII-C. Fermeture du formulaire
VIII. Piloter un autre formulaire
IX. Conclusion
X. Liens utiles


0. Introduction

M.E.L.A., ou C.R.U.D. en anglais, est l'acronyme de Modification, Effacement, Lecture, Ajout (Create, Read, Update, Delete). Il s'agit des actions de création, suppression, modification et enregistrement des données d'un formulaire. Toutes les applications qui gèrent de l'information sont équipées d'un système M.E.L.A.

La plupart des applications ACCESS possèdent un M.E.L.A. par formulaire. Qu'il ait été dupliqué ou créé pour chacun d'eux, il représente, en phase de conception, une charge importante.

Dans ce tutoriel, nous allons créer un M.E.L.A. unique et générique qui s'adaptera à tous les formulaires d'une application via une simple déclaration.


0-A. Mise en garde

Ce tutoriel nécessite une bonne connaissance de VBA et du fonctionnement des formulaires en général.


I. Analyse du besoin

Le besoin est décrit en partie par l'acronyme.


I-A. Modification

Dans les formulaires ACCESS, on retrouve souvent des contrôles déverrouillés. C'est la méthode basique qui ne nécessite pas de programmation mais qui pose de réels problèmes lors de fausses manipulations. Cette méthode étant insuffisante pour une application professionnelle, nous utiliserons un système de verrouillage / déverrouillage des contrôles avec la propriété Enabled ou Locked.


I-B. Effacement

L'effacement d'un enregistrement se fait par la méthode Delete de l'objet Recordset.


I-C. Lecture

La lecture ne comprend que le déplacement entre enregistrements.

Deux boutons permettent de le faire : le bouton précédent et le bouton suivant. Bien qu'il existe les méthodes MovePrevious et MoveNext dans l'objet Recordset, il est conseillé de passer par la commande GotoRecord habituelle.

En effet, les méthodes Move ne sont pas opérationnelles lorsque le curseur est positionné sur le NewRecord.

idea Vous pouvez également créer des boutons pour aller à la première et la dernière fiche.

I-D. Ajout

Pour ajouter une fiche, il faut se placer sur le nouvel enregistrement avec la méthode AddNew.


II. Formulaire et boutons

Maintenant que nous avons déterminé les grandes fonctionnalités nécessaires pour bâtir notre M.E.L.A., nous allons réaliser un formulaire type dans une base annexe.

Ouvrons une nouvelle base et ajoutons une table et un formulaire basé sur celle-ci.


II-A. Le formulaire

La propriété du formulaire Avec Module doit être réglée sur Oui.

Nous allons positionner les nouveaux boutons dans son en-tête.

Les boutons :

Nom Libellé
btnPrecedent &Précédent
btnSuivant Sui&vant
btnCreer &Créer
btnEnregistrer &Enregistrer
btnModifer &Modifier
btnSupprimer &Supprimer
btnAnnuler &Annuler

Le nom des boutons doit absolument être respecté.

Voici le résultat.

image
Le bouton Enregistrer est positionné au-dessus du bouton Modifier.


III. La classe

Pour réaliser notre M.E.L.A. générique, nous allons créer une classe. La classe a plusieurs avantages ; son installation est rapide sur les formulaires, et les évolutions touchent l'ensemble de l'application sans autre modification qu'elle-même.

L'interaction entre une classe et un objet doté d'événements comporte des règles précises qu'il vaut mieux bien connaitre avant de se lancer.

Pour que la classe gère les événements d'un objet il faut :

  • qu'il dispose d'événements ;
  • que les événements utilisés soient activés en réglant leur propriété sur [Event Procedure] ou [Procédure événementielle] ;
  • que la variable qui le représente soit déclarée avec la clause WithEvents.
Les propriétés événementielles qui seront utilisées peuvent être réglées directement dans la classe comme nous le verrons plus tard.

La procédure événementielle de l'objet n'a pas forcément besoin d'exister explicitement ; cependant si elle est présente, son code sera exécuté avant celui de la classe.

Par exemple, si du code existe sur l'événement Sur Clic à la fois dans l'objet et dans la classe, c'est toujours celui de l'objet qui sera exécuté en premier.


III-A. Créer la classe

Créons un nouveau fichier nommé MELA.accdb.

Pour créer un module de classe, il faut aller dans le ruban Créer, Autre, Macro, Module de classe. L'éditeur VBE s'ouvre.

Les propriétés du module de classe sont réglées ainsi :

image
PublicNotCreatable permet d'utiliser cette classe à l'extérieur de sa base moyennant un petit artifice.

Une classe publique placée en bibliothèque est visible dans toutes les bases depuis laquelle elle est référencée. Cependant son instanciation est impossible.

Schématiquement, cela veut dire que la classe se trouvant dans une base bibliothèque dûment référencée est visible de la base principale mais ne peut être instanciée. En effet, le périmètre d'action de l'instruction de déclaration New est limité à la base dans laquelle elle est exécutée.

Une base A voit une classe de la base B référencée comme bibliothèque mais est incapable de l'utiliser.

Un artifice consiste à appeler une fonction de la bibliothèque qui se chargera de déclarer la classe et d'en renvoyer l'instance.


III-B. Déclaration

Les variables d'objets de la classe sont déclarées privées et déclencheuses d'événements (WithEvents).

image
La variable vDefaultControlName permet de stocker le nom d'un contrôle. Elle sera utilisée ultérieurement pour positionner le focus sur un contrôle lors de certaines actions.


III-C. Propriété Form

La première propriété à créer initialise le formulaire et les boutons du M.E.L.A.

Cette propriété publique sera appelée depuis chaque formulaire bénéficiant du M.E.L.A.

image
L'objet formulaire est stocké dans la variable objet oForm tandis qu'un premier For Each parcourt la section d'en-tête de formulaire (acHeader) pour déclarer chaque bouton de commande (CommandButton). Pour chaque bouton de commande, la propriété événementielle OnClick est activée.

Chaque bouton de commande possède sa propre variable.

Le deuxième For Each parcourt la section de détail (acDetail) à la recherche du contrôle dont l'index de tabulation (TabIndex) est égal à 0. Ce contrôle capturé recevra le focus au moment du passage en saisie.

image
La propriété événementielle OnCurrent du formulaire est également activée.

Chaque fois qu'on doit ajouter un bouton de commande ou autre dans le M.E.L.A., on le fait depuis cette procédure.

Le Get sur la propriété Form permet d'accéder à l'objet formulaire. Nous pourrions nous passer de cette propriété et y accéder en utilisant l'objet oForm.

image
warning Le nom des procédures événementielles de l'objet Form est toujours formé avec le nom de la variable (oForm), jamais avec le Get (Form).

Public Sub Form_Current()
Ceci ne fonctionne pas dans la classe.

Alors que :

Public Sub oForm_Current()
Cette syntaxe fonctionne dans la classe.

Il ne faut pas oublier de déclarer le « Getter » et « Setter » de la propriété DefaultControlName.

image
Ces deux procédures ont pour but d'écrire et de lire la propriété DefaultControlName. Elle est volontairement déclarée publique pour pouvoir la définir depuis l'extérieur. En effet, il est possible de vouloir définir un autre contrôle à activer.


III-D. La fonction d'instanciation

Comme précisé dans un des chapitres précédents, les classes d'une bibliothèque ne peuvent être utilisées directement. Il faut créer une fonction.

Ouvrons un nouveau module normal pour y ajouter cette fonction.

image
La base bibliothèque peut être enregistrée.


IV. Référencer la bibliothèque

Repassons sur l'application pour référencer la bibliothèque.

Dans le menu Outils/Références, il faut cliquer sur Parcourir., choisir Tous les fichiers (*.*) dans la liste déroulante Fichiers de type, puis aller chercher le fichier MELA.accdb dans son répertoire.

Nous validons notre choix avec le bouton Ouvrir.

image
La bibliothèque apparait maintenant dans la liste.


V. Le formulaire

Pour que le formulaire utilise la classe cBoutonNav, nous devons instancier cette dernière.

Ouvrons le formulaire en mode création et activons l'événement Sur Ouverture.

Dans l'en-tête du module, il faut déclarer la variable de classe.

image
Il ne reste qu'à instancier la classe au chargement du formulaire.

image
La propriété Form de la classe est renseignée avec l'objet formulaire (Me).

Toute variable de type objet doit être libérée ; nous ajoutons cette libération dans l'événement Sur Fermeture du formulaire.

image
À la fermeture du formulaire, la classe sera libérée de la mémoire.


VI. Les méthodes de la classe

À présent, rédigeons les méthodes et propriétés de la classe.

warning La modification d'une bibliothèque ne peut se faire au travers de la base qui la référence. Bien que son code soit visible, la bibliothèque est, à ce moment, en lecture seule. Pour modifier une bibliothèque, il faut fermer les bases qui la référencent et la rouvrir.

VI-A. Verrouiller les contrôles

Le verrouillage/ déverrouillage des contrôles se fait grâce à une méthode privée de notre classe. Lors de l'appel, une valeur booléenne peut être passée.

  • True verrouille les contrôles.
  • False déverrouille.
  • Lorsque rien n'est passé, il y a inversion du verrouillage des contrôles.
La visibilité des boutons Enregistrer et Modifier est inversée. Le focus est passé soit au contrôle par défaut (DefaultControlName), soit au bouton Modifier afin d'éviter les erreurs liées à la désactivation d'un contrôle actif.

image
Seuls les contrôles de la section Détail sont désactivés.

Le grisage provoqué par la propriété Enabled peut poser des problèmes de lecture avec certaines résolutions d'écran. On utilisera Locked à la place, qui a l'avantage et l'inconvénient de laisser les boutons de commande actifs.

Si vous souhaitez utiliser la propriété Enabled, la variante est disponible dans le code.

Pour que cette fonctionnalité soit opérationnelle, on y fait appel lors d'événements bien précis, comme lors du changement d'enregistrement qui déclenche l'événement Sur Activation.

image
Ici le choix de l'activation ou non des contrôles est conditionné par la valeur renvoyée par la propriété NewRecord du formulaire. Ceci permet d'être immédiatement en situation de saisie si l'ouverture du formulaire est réglée sur Ajout de données.

image
On continue le verrouillage/déverrouillage tout au long des actions qui le nécessitent.


VI-A-1. Créer

Pour la procédure Créer, nous commençons par effectuer un test de la propriété Dirty qui détermine si l'enregistrement est modifié. Dans ce cas, on déclenche la procédure d'enregistrement.

On se positionne systématiquement sur le nouvel enregistrement. Enfin on déverrouille les contrôles.

image
Là encore, vous pouvez remplacer la méthode Addnew par la commande classique.

image

warning Dirty passe à True lorsqu'un contrôle lié est modifié, aussi bien par l'utilisateur que par code. Il sera donc incompatible avec les formulaires préremplis à moins d'utiliser la propriété Valeur par défaut pour faire le préremplissage.

VI-A-2. Modifier

Le bouton Modifier ne fait que déverrouiller les contrôles.

image

VI-A-3. Enregistrer

Pour l'enregistrement, la propriété Dirty est utilisée pour déterminer l'état de l'enregistrement. La méthode du même nom permet de faire la sauvegarde. Dans tous les cas, les contrôles sont verrouillés.

image

Dirty a la particularité d'être à la fois une propriété et une méthode. Vous pouvez consulter l'aide Microsoft ACCESS pour en savoir plus.

idea Vous pouvez employer la commande classique à la place de Dirty = False.
image

VI-A-4. Annuler

Pour l'annulation, nous testons toujours si l'enregistrement est modifié, puis nous utilisons la méthode Undo de l'objet Form.

image
idea Vous pouvez utiliser la commande classique d'annulation à la place de la méthode Undo.
image


VI-A-5. Supprimer

La suppression utilise la méthode Delete du Recordset. La confirmation de suppression est requise par l'utilisateur, puis si l'enregistrement est nouveau, la modification est annulée, sinon l'enregistrement est supprimé.

image

VII. La navigation


VII-A. Vers la fiche précédente

En tout premier lieu, il faut vérifier que l'enregistrement courant n'est pas en cours de modification. Si c'est le cas, un message demande à l'utilisateur s'il souhaite l'annulation.

Ensuite, la position dans la table est vérifiée. Si le curseur n'est pas au début, il y a déplacement sur l'enregistrement précédent. Sinon un message d'avertissement est émis.

image

VII-B. Vers la fiche suivante

Pour le déplacement vers la fiche suivante, c'est le même déroulement que précédemment à la différence que l'on teste si le curseur n'est pas à la fin.

image

VII-C. Fermeture du formulaire

La fermeture ne se résume pas à un simple Close du formulaire, il faut veiller à bien libérer toutes les variables de la classe.

image
Dans la classe, il existe une méthode privée qui est toujours exécutée à la fin. Il s'agit de Class_Terminate qui peut servir à libérer toutes les variables objets.

image
La classe est libérée lors de l'événement OnClose du formulaire.


VIII. Piloter un autre formulaire

Rien de plus simple que d'implémenter la classe dans un autre formulaire.

Copier le code du formulaire fourni avec la bibliothèque.

image

Ensuite copier les boutons.

image
Exécutez ! Ça fonctionne !


IX. Conclusion

L'avantage d'une classe M.E.L.A. c'est son extrême portabilité, sa rapidité de déploiement ainsi que sa maintenance aisée.

Imaginez !

Le fonctionnement de l'annulation ne vous plait pas. Vous n'avez qu'à modifier la classe et l'ensemble de votre application bénéficie instantanément de ce changement.

Vous souhaitez ajouter une fonctionnalité dans certains formulaires ? Qu'à cela ne tienne, modifiez la classe et rajoutez le ou les boutons dans les formulaires concernés. Seuls ceux-ci seront impactés.

Une classe n'est pas très complexe à mettre en oeuvre. Cependant il faut de la rigueur et être familiarisé avec le concept objet. Notez que lorsque vous manipulez du code dans un formulaire ou un état, vous manipulez un module de classe de formulaire ou d'état.

La bibliothèque M.E.L.A. est disponible en téléchargement ; si vous avez une version de Microsoft ACCESS 97 vous pouvez télécharger le code au format texte ici. http://loufab.developpez.com/tutoriels/access/classe-mela/MELA.zip


X. Liens utiles

Pour en savoir plus sur les modules de classes dans ACCESS, je vous conseille quelques lectures.




               Version PDF (Miroir)   Version hors-ligne (Miroir)

Valid XHTML 1.0 TransitionalValid CSS!

Copyright © 2011 Fabrice Constans. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC. Cette page est déposée.

 
 
 
 
Partenaires

Hébergement Web