1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 12 Support de cours rédigé par Bernard COFFIN Université Paris 10 – Nanterre 2007/2008
2 Système d’information 1.Une mémoire 2.Une capacité de traitements
3 C’est la base de données proprement dite Ensemble cohérent de données élémentaires Cohérence assurée par les liens entre les données les liens sont porteurs de sens (dépendent du sens) les données enregistrées dans une même table sont liées (donc sont complémentaires) les données enregistrées dans des tables unies par un lien logique sont également liées (mais le lien est de 1 à n et non plus de 1 à 1) La mémoire
4 Permettent de mettre à jour et consulter la mémoire Les traitements aussi doivent être cohérents Qu’ils s’appellent directement ou non, ils sont complémentaires Les résultats d’un traitement donné (et leur sens) dépendent des traitements antérieurs La cohérence des traitements est assurée par le partage de la mémoire Les traitements
5 Pour les traitements n’ayant pas de lien (appel de l’un par l’autre, directement ou non) utilisation de la mémoire permanente : relations stables les tables Pour les traitements liés, on peut aussi utiliser une mémoire temporaire (elle n’existe que pour la durée de ces traitements) - relations construites à l’aide de requêtes sélections (pourvu que l’objet lié soit ouvert) - contrôles d’un formulaire ouvert accessibles depuis un autre formulaire - arguments - variables communes L’utilisation des tables a été abordée dans les cours précédents ; nous n’y ajoutons rien ici
6 Utilisation d’un champ ou d’un contrôle d’un autre formulaire Elle est toujours possible pourvu que le formulaire soit ouvert Il suffit de nommer correctement le champ ou le contrôle (et la propriété concernée) Rappel de la syntaxe forms!nom_du_formulaire!nom_du_champ forms!nom_du_formulaire!nom_du_contrôle.propriété Indique qu’on s’adresse à la classe des formulaires Attention ! Le point d’exclamation peut parfois être remplacé par un point, mais d’autre fois cela peut engendrer des confusions. Il est donc fortement conseillé de s’en tenir à cette syntaxe… Champ de la relation source du formulaire
7 Peut-on indifféremment utiliser un champ ou le contrôle qui lui est lié ? La réponse est NON ! Lors de l’ouverture du formulaire, la valeur du champ est attribuée à la propriété « valeur » du contrôle qui lui est lié (par la propriété Source Contrôle) La modification de la propriété valeur du contrôle entraîne la modification de la valeur du champ, mais… Cette modification n’est effective que lors de la mise à jour de l’enregistrement actif. Il est donc possible que les deux valeurs (champ et contrôle lié) ne soient pas identiques à un moment donné Comment savoir ? En réfléchissant avant d’écrire n’importe quoi !
8 L’échange d’informations directement (par champ ou contrôle) est-elle toujours possible ? La seule condition est que les deux formulaires concernés soient ouverts Mais elle peut se révéler insuffisante si plusieurs formulaires peuvent être concernés Exemple : on veut construire un formulaire qui permette d’ajouter de nouveaux enregistrements dans une table et l’utiliser dans des contextes différents Il faut savoir quel est le formulaire d’où on vient pour faire les mises à jour nécessaires au bon endroit L’utilisation d’un argument (lors de l’ouverture du formulaire par la méthode OpenForm) ou d’une variable commune permet d’adapter le traitement au contexte (c’est-à-dire en l’appelant d’autres formulaires)
9 tabCommande CP : N° Commande CE : Réf Client Date commande tabLigne_commande CP :CE : Réf Commande CE : Réf adresse livraison CE : Réf Produit Qté_commandée tabClient CP : N° client Nom client Prénom client Adresse client tabProduit CP : N° produit Nom produit Description PU HT tabAdresse CP : N° adresse CE : Client concerné Adresse livraison
10 Considérons l’enregistrement d’une nouvelle adresse de livraison On peut envisager trois contextes différents pour effectuer ce traitement 1.Création d’un nouveau client et de ses premières adresses 2.Ajout d’une adresse à un client déjà enregistré (sans prise de commande) 3.Ajout d’une nouvelle adresse lors de la saisie d’une commande On peut faire des formulaires complètement différents pour ces trois traitements On peut aussi préférer réutiliser le même formulaire de base (insertion d’une adresse dans la table) dans les trois contextes (l’exemple porte sur un formulaire simplissime – une seule zone de texte – mais c’est le principe de son utilisation dans des contextes différents qui est important) C’est une garantie de cohérence
11 Le formulaire de saisie d’une adresse [N° adresse] est déclaré NuméroAuto, c’est ACCESS qui lui donne sa valeur [Adresse livraison] est le champ source de la zone de texte [Cient_concerné] est la clef externe qui permet de relier une adresse à un client ; on utilisera différentes façons de la gérer en fonction du contexte d’utilisation du formulaire Le bouton de commande btFermer sert à fermer le formulaire si besoin est
12 1.Création d’un nouveau client et de ses premières adresses Utilisation d’un formulaire et d’un sous-formulaire La clef externe est gérée automatiquement par le couple champ père / champ fils Le bouton btFermer du sous-formulaire est sans objet, on le rend invisible au moment de l’ouverture du formulaire principal Private Sub Form_Load() sfAdresse_livraison!btFermer.Visible = False End Sub
13
14
15 2.Ajout d’une adresse à un client déjà enregistré (sans prise de commande) Utilisation de deux formulaires : le premier (lié à tabClient) appelle le second (Saisie_adresse décrit plus haut) grâce à un bouton de commande La clef externe est gérée par programmation. Sa valeur est transmise du premier formulaire au second par l’intermédiaire d’un argument de la méthode OpenForm
16 Source du formulaire : Select * From tabClient;Section En-tête (fonctionne comme les sections des états) Description d’un enregistrement Le formulaire est ouvert en mode « formulaires continus » ; on ne voit qu’un bouton « Rechercher » parce qu’il est dans l’en-tête, mais on voit un bouton « Ajouter… » pour chaque enregistrement affiché. btAjout_adresse Un click fait de l’enregistrement correspondant l’enregistrement courant ztSaisie et btRechercher pour trouver un enregistrement à partir d’une partie du nom
17 Programmation événementielle de la recherche d’enregistrement (rappel du cours N°9) Private Sub btRecherche_Click() ztNom_client.SetFocus DoCmd.FindRecord ztSaisie, acAnywhere, False, _ acSearchAll,, acCurrent, False End Sub Private Sub ztSaisie_Change() DoCmd.GoToRecord,, acFirst End Sub On recherche dans un seul champ, le nom du client, il faut donc qu’il soit actif Si l’enregistrement trouvé n’est pas satisfaisant, on peut continuer sur les enregistrements suivants En cas de modification de la zone de texte, on reprend le recherche à partir du premier enregistrement
18 Programmation événementielle de l’appel du formulaire Saisie_adresse Deux nouveaux arguments de la méthode OpenForm Private Sub btAjout_adresse_Click() DoCmd.OpenForm "Saisie_adresse",,, _ "Client_concerné=forms!Ajout_adresse_livraison![N° client]" _,,, Forms!Ajout_adresse_livraison![N° client] End Sub Quatrième argument : clause Where (Cf. même argument pour l’ouverture d’état) Il met à jour la propriété filtre du formulaire et exécute ce filtre Septième argument : passage d’une valeur au formulaire appelé Cette valeur se retrouve dans la propriété OpenArgs de Saisie_adresse
19 Programmation événementielle du formulaire Saisie_adresse Utilisation de la propriété OpenArgs pour la gestion de la clef externe Private Sub Form_BeforeInsert(Cancel As Integer) If IsNull(Me.OpenArgs) Then Exit Sub Client_concerné = Me.OpenArgs End Sub Quand le formulaire est utilisé comme sous-formulaire, la propriété n’est pas renseignée La clef externe est maintenant renseignée, l’enregistrement peut être ajouté à la table Private Sub Form_Load() If IsNull(Me.OpenArgs) Then btFermer.Visible = False Else btFermer.Visible = True DoCmd.GoToRecord,, acNewRec End If End Sub Gestion du bouton de fermeture et du premier enregistrement actif selon le mode d’ouverture Private Sub btFermer_Click() DoCmd.Close End Sub
20 On a cliqué sur cette occurrence de l’image du bouton, l’adresse sera ajouté au client Lenouveau
21 3.Ajout d’une nouvelle adresse lors de la saisie d’une commande Le principe est le même pour l’ajout d’un nouveau client La structure du formulaire de saisie de commande a déjà été étudiée (cours N° 9 – avec une donnée supplémentaire, le taux de remise permanente) Nous rajoutons deux boutons de commande pour appeler les formulaires de saisie d’un client (pas développé, ne pose pas de problème nouveau) et de saisie d’adresse
22 Le bouton d’appel de saisie d’adresse est dans la section en-tête du sous- formulaire de saisie des lignes de commande) Visible une seule fois (et non pas plusieurs comme dans le formulaire des diapos 16 à 20) il agit de la même façon Communication du N° client (pour la gestion du lien logique adresse / client) par l’intermédiaire de l’argument OpenArgs Au retour du formulaire saisie_adresse, recalculer le contenu de la zone de liste déroulante choix_adresse Comment gérer automatiquement un lien logique (ligne commande / adresse) avec la dernière adresse active ? OpenArgs ne fonctionne pas dans l’autre sens Utilisation d’une variable commune (Numéro_adresse_créée) mise à jour dans un formulaire et utilisée dans l’autre Le bouton d’appel du formulaire de saisie d’adresse
23 Private Sub btAdresse_Click() DoCmd.OpenForm "Saisie_adresse",,, _ "Client_concerné = forms!saisie_commande!Choix_client.Value", _,, Forms!saisie_commande!Choix_client.Value End Sub Programmation du bouton d’appel du formulaire de saisie d’une adresse Même principe que dans l’exemple précédent, seul le nom du fichier change Déclaration de la variable Numéro_adresse_créée
24 Gestion de la variable Numéro_adresse_créée dans le formulaire de saisie des adresses Private Sub Form_Load() Numéro_adresse_créée = 0 If IsNull(Me.OpenArgs) Then btFermer.Visible = False Else btFermer.Visible = True DoCmd.GoToRecord,, acNewRec End If End Sub Initialisation pour ne pas créer de lien erroné en cas de fermeture du formulaire sans création d’enregistrement Private Sub Form_AfterInsert() Numéro_adresse_créée = [N° adresse] End Sub Mise à jour du contenu de la variable
25 Private Sub btAdresse_LostFocus() If Numéro_adresse_créée = 0 Then Exit Sub Choix_adresse.Requery Choix_adresse.SetFocus Choix_adresse.Value = Numéro_adresse_créée End Sub Gestion de la variable Numéro_adresse_créée dans le formulaire de saisie d’une ligne de commande Il n’y a pas eu d’adresse créée FIN DU COURS