Vous êtes sur la page 1sur 39

BTS Services informatiques aux organisations – 1re année

EXPLOITATION D’UN SCHÉMA DE DONNÉES


COURS

BTS SIO – 1re année – Spécialité SLAM

José Gil – Élisabeth Martins Da Silva

EXPLOITATION
D’UN SCHÉMA DE DONNÉES

TRAVAUX PRATIQUES
Retrouvez la liste de nos formations sur www.cned.fr
Pour plus d’informations, appelez le 05 49 49 94 94
Du lundi au vendredi, 8 h 30-18 h.
Coût d’une communication ordinaire.

*82949TGPA0013*
Sommaire
Conseils généraux 3
TP 1 : Logiciel de gestion de DVD 5
TP 2 : Optimisation par les contraintes de la base « Tour de France » 25

CONNECTÉ À VOTRE AVENIR

Les cours du CNED sont strictement réservés à l’usage privé de leurs destinataires et ne sont pas destinés à une utilisation collective.
Les personnes qui s’en serviraient pour d’autres usages, qui en feraient une reproduction intégrale ou partielle, une traduction sans
le consentement du CNED, s’exposeraient à des poursuites judiciaires et aux sanctions pénales prévues par le Code de la propriété
intellectuelle. Les reproductions par reprographie de livres et de périodiques protégés contenues dans cet ouvrage sont effectuées
par le CNED avec l’autorisation du Centre français d’exploitation du droit de copie (20, rue des Grands Augustins, 75006 Paris).

© CNED 2013
Conseils généraux
Importance des TP
Dans le cadre du cours, vous avez eu l’occasion d’approfondir certaines notions (aussi
bien au niveau du SQL que du MCD) et de découvrir l’utilisation du logiciel de modé-
lisation WinDesign. Les TP représentent une mise en pratique qui va vous donner l'op-
portunité de manipuler concrètement ces notions. Au niveau de l’examen, il faut que
vous arriviez à montrer au jury que vous avez une certaine expérience. Ce sont les TP de
chaque module qui vont vous permettre d’acquérir cette expérience.

Organisation du fascicule
Ce fascicule contient 2 TP.
Le premier TP représente la création d’une petite application de gestion de DVD. Le
but est de vous faire utiliser le logiciel de modélisation WinDesin pour contrôler que les
connaissances abordées dans le cours sont acquises, puis vous faire exploiter une base de
données dans une application. La base de données sera au format PostgreSQL. Pour cette
première application réalisée spécifiquement dans l’option SLAM, vous allez travailler
avec VB6 que vous avez découvert dans le module 2944 « Base de la programmation ».
Si vous n’avez pas fait le TP sur VB6 dans le module 2944, vous devez le faire avant d’at-
taquer celui-ci car les connaissances abordées dans le module 2944 sur ce langage sont
considérées comme acquises. Le but ici n’est pas de vous faire découvrir un nouveau
langage ni d’aborder des fonctionnalités complexes, mais de vous montrer comment
gérer une application qui exploite une base de données. Le choix du langage a été fait
pour que vous puissiez vous concentrer sur l’aspect base de données. Dans le module
suivant (2950 « Programmation objet »), vous attaquerez un nouveau langage (Java) où
Conseils généraux
vous aborderez des notions de programmation nettement plus complexes. Vous pouvez
télécharger la correction de ce TP directement sur le site du Cned, au même endroit que Page 3
ce fascicule.
Le second TP représente le travail que vous pourriez avoir à faire sur une base de don-
nées existante. Le but est de vous faire appliquer les contraintes découvertes dans la
partie cours. Vous verrez les manipulations graphiques ainsi que les instructions SQL
correspondantes.
Le dessin du petit professeur vous signalera les étapes de tests à réaliser.

Logiciels nécessaires
Pour réaliser les TP, vous allez avoir besoin de plusieurs outils que vous avez norma-
lement déjà installés puisqu’ils ont été utilisés soit dans le cours correspondant à ce
module, soit dans des modules précédents. Voici tout de même quelques rappels pour
récupérer et installer ces outils.
WinDesign
Le logiciel est téléchargeable à l’adresse suivante :
http://www.win-design.com/fr/NEW_dl_WD.htm
C’est la version 10.04 qui a été utilisée dans ce module.
Si vous ne l’avez pas encore installé, référez-vous aux conseils généraux et à la séquence 2
du fascicule de cours.

8 2949 TP PA 00
PostgreSQL
SGBDR gratuit et téléchargeable sur le site officiel (http://www.postgresql.fr/accueil). Ce
cours a utilisé la version 9.1 mais vous pouvez a priori récupérer la version la plus récente.
Ce SGBDR est l’un des plus connus et des plus appréciés dans le monde gratuit : il est très
puissant et multiplateforme.
Vous l’avez normalement déjà installé.
Visual Basic 6
Vous avez déjà installé Visual Basic 6 dans le module 2944 « Base de la programmation ».
Si ce n’est pas le cas, référez-vous aux conseils généraux du fascicule de TP du module
2944.
Ce langage est récupérable grâce à l’abonnement étudiant msdnaa dont vous bénéficiez
par le Cned.
Bon courage à tous !

Conseils généraux

Page 4

8 2949 TP PA 00
TP 1
Logiciel de gestion de DVD
Cette séquence va vous permettre de mettre en pratique les connaissances acquises dans
les séquences 1, 2 et 3 du cours. Vous allez en particulier utiliser le logiciel WinDesign et
créer une application qui accède et manipule une base de données sous PostgreSQL. Le
Langage VB6 a été choisi pour ce TP pour 2 raisons : vous avez déjà abordé ce langage
dans le module 2944 « Base de la programmation » Et, surtout, il est très simple, le but,
ici, n’étant pas d’aborder des aspects complexes de la programmation mais plutôt d’in-
sister sur l’aspect accès aux données. Les codes sources de cette application sont téléchar-
geables sur le site, au même endroit que ce fascicule de TP.

X Capacités attendues en fin de TP


Savoir générer une base de données à partir d’un logiciel de modélisation. Avoir
compris comment exploiter une base de données à partir d’une application.

X Contenu
1. Création de la base de données ...................................................................... 6
2. Création de l’application ................................................................................ 10 TP 1
3. VB6 : complément de mémento .................................................................... 23
Logiciel
de gestion
de DVD

Page 5

8 2949 TP PA 00
Vous allez créer une petite application de gestion de DVD qui va exploiter une base de
données.
Voici les étapes que vous allez suivre pour créer cette application :
• création du schéma conceptuel de données sous WinDesign ;
• génération du schéma logique de données correspondant ;
• génération du script SQL ;
• création de la base de données sous PostgreSQL à partir du script ;
• création de l’application qui exploite cette base de données.

1. Création de la base de données


Attention, pour réaliser cette première partie, vous devez avoir fait et compris correcte-
ment la séquence 2 du fascicule de cours. Vous ne trouverez ici aucune indication mais
juste le travail demandé. Si vous n’y arrivez pas, refaites la séquence 2 du cours pour
apprendre à manipuler WinDesign.

Travail sous WinDesign


Création du MCD
L’application que vous allez créer dans ce TP va gérer des DVD classés par genre et avec,
TP 1 pour chaque film, la liste des acteurs concernés.
Logiciel Voici le schéma conceptuel de données :
de gestion 
de DVD

Page 6

Voici le détail des types de chaque attribut :


nom type précision longueur
numDvd compteur
titre alphanumérique variable 30
duree numérique entier 2
numActeur compteur
nom alphanumérique variable 30
numGenre compteur
libelle alphanumérique variable 30

8 2949 TP PA 00
À partir de ces indications, créez, sous WinDesign, le schéma correspondant et testez-le
avec l’outil de contrôle. Pensez à l’enregistrer sous le nom "gestionDvd", dans le dossier
de votre choix.
Génération du MLD
Générez le MLD correspondant, en choisissant le SGBDR PostgreSQL (sans oublier de
sélectionner l’utilisation par défaut des types de cette base de données).
Vous devriez obtenir le schéma suivant :

TP 1

Enregistrez ce MLD aussi sous le nom de "gestionDvd" (c’est en fait l’extension qui Logiciel
change). de gestion
de DVD
Génération du script SQL
Vous pouvez maintenant générer le script mais attention, gardez toutes les options Page 7
par défaut (ne décochez rien, contrairement à ce que vous aviez fait dans le cours, à la
séquence 2). Pensez tout de même à bien sélectionner le dossier qui va recevoir le fichier
de script.
Allez sur le disque et ouvrez le fichier SQL qui vient d’être créé. Il contient entre autres
tous les ordres de création des tables. Vous allez apporter une petite modification au
fichier en supprimant les lignes qui permettent de détruire et de créer la base de don-
nées (alors que vous allez créer la base de données vous-même sous PostgreSQL). Donc,
en début de fichier, supprimez les lignes qui commencent par :

drop database...
create database...

Enregistrez et fermez le fichier.


Le travail sous WinDesign est terminé. Fermez le logiciel. Inutile d’enregistrer l’espace
de travail.

Travail sous PostgreSQL


Il faut maintenant passer à la construction de la base de données sous PostgreSQL. Les
explications qui suivent sont assez détaillées, même si vous connaissez bien PostgreSQL.
C’est l’occasion de faire encore une révision de l’utilisation du logiciel.

8 2949 TP PA 00
Démarrage
Dans le menu Démarrer/Programmes/PostgreSQL, sélectionnez "lancer le service". Une
fois le service lancé, dans le même menu, sélectionnez "pgAdmin III" qui est l’interface
graphique de postgreSQL. Vous obtenez la fenêtre suivante :

TP 1

Logiciel
de gestion
de DVD

Page 8

Dans la partie gauche "Navigateur", sélectionnez "PostgreSQL Database Server".


Remarquez, dans les informations qui apparaissent à droite, que vous n’êtes pas connec-
té. Faites un clic droit sur "PostgreSQL Database Server" et sélectionnez "se connecter".
Normalement, un mot de passe est demandé (celui que vous avez donné lors de l’instal-
lation de PostgreSQL). Une fois la base connectée, la petite croix rouge n’apparaît plus.
Cliquez sur la double flèche rouge et verte de mise à jour : dans la fenêtre de droite, des
informations se sont ajoutées et "Connecté ?" est passé à oui.
Création de la base de données
Pour créer une base de données, commencez par "ouvrir" "PostgreSQL Database Server
en cliquant sur le "+" qui est à gauche du nom. Vous obtenez une liste contenant entre
autres "Bases de données". Cliquez sur le "+" à gauche de "Bases de données". Vous
devez avoir au moins par défaut la base de données "Postgres".
Pour créer une nouvelle base de données, faites un clic droit sur "Bases de données" et
sélectionnez "ajouter une base de données".

8 2949 TP PA 00
Une nouvelle fenêtre s’ouvre (comme celle-ci).

Donnez à votre base le nom GESTIONDVD, sélec-
tionnez dans "Propriétaire" le seul que vous devez
avoir (normalement "postgres") et prenez dans
Tablespace celui par défaut (pg_default). Cliquez
sur OK.
GESTIONDVD doit s’être ajouté en dessous de "Bases
de données".
Ouvrez GESTIONDVD en cliquant sur le "+" à gauche.
Vous obtenez des sous-parties dont "Schémas".
Dans une base de données, il est possible de créer
plusieurs "schémas" qui regroupent un ensemble de
tables. Dans notre exemple, un seul schéma suffira.
Pour le moment, laissez GESTIONDVD sélectionné :
on va exécuter sur cette base de données le script
qui a été précédemment créé.
Récupération du script
Pour exécuter du SQL sous pgAdmin, cliquez l’icone qui représente le SQL. Une nouvelle
fenêtre s’ouvre, qui permet d’exécuter des requêtes SQL. TP 1
Pour récupérer le script précédent, allez dans Fichier/ouvrir et allez chercher le fichier
Logiciel
gestionDvd.sql. Vous devriez obtenir dans la zone de visualisation l’ensemble du contenu de gestion
du fichier. Cliquez sur la flèche verte pour exécuter le script  . Normalement, excepté de DVD
des messages précisant certaines créations automatiques (de séquences pour les clés
SERIAL et d’index pour les clés primaires), vous devriez obtenir le message final indiquant Page 9
que la requête s’est exécutée avec succès. Ne vous inquiétez pas si vous avez en complé-
ment de message qu’elle ne renvoie aucun résultat : c’est normal (il n’y a pas de requête
SELECT qui retourne un résultat).
Si, au contraire, vous obtenez un message d’erreur, c’est que votre script n’est pas cor-
rect : corrigez-le et recommencez.
Contrôlons que tout s’est bien passé : cliquez sur la double flèche de réactualisation et,
dans le navigateur d’objets, ouvrez "Schémas" avec le "+" puis ouvrez "public" (qui est
le schéma par défaut) avec le "+". Vous remarquez que vous avez entre autres "Tables".
Ouvrez-le : vous devez obtenir les 4 tables de la base de données.
Création des premiers tuples
Normalement, le travail sous PostgreSQL est terminé car la gestion du contenu de la base
de données va se faire dans l’application. Cependant, pour que l’on puisse voir dès le
début du programme que certains points fonctionnent, avant même d’utiliser les ordres
d’ajouts et de modification, vous allez remplir un peu les tables sous PostgreSQL.
Sélectionnez la table acteur dans la partie "Tables" du navigateur.
Cliquez sur l’icône "afficher les données de l’objet sélectionné". Normalement, une
nouvelle fenêtre apparaît, qui permet de visualiser le contenu de la table  (vide,
pour le moment) mais aussi de saisir des informations. Saisissez 3 acteurs mais attention,
surtout ne saisissez pas d’informations dans la colonne numacteur (elle doit être auto-

8 2949 TP PA 00
matiquement gérée par PostgreSQL mais si vous saisissez des numéros, la numérotation
automatique ne marchera plus). Voici un exemple de ce que vous devez obtenir (mettez
les noms que vous voulez) :

Pour voir la numérotation automatique gérée par PostgreSQL, cliquez sur le bouton
rafraîchir (la double flèche rouge et verte). Vous allez voir apparaître des numéros dans
la première colonne. Vous pouvez maintenant fermer la fenêtre.
Avec la même logique, remplissez la table GENRE. Pour la table DVD, en la remplissant,
faites attention de mettre dans la colonne genre_numgenre un numéro de genre qui cor-
respond au genre du DVD. D’ailleurs, vous pouvez tester de mettre un numéro qui n’existe
TP 1 pas : vous allez obtenir une erreur car la contrainte d’intégrité créée avec la clé étrangère
n’est pas respectée. Enfin, pour la table ACTEUR_DVD, mettez dans les 2 champs des numé-
Logiciel ros qui correspondent respectivement à des acteurs et des DVD. Essayez de créer au moins
de gestion 2 acteurs pour un même DVD et 2 DVD pour un même acteur.
de DVD

Page 10
2. Création de l’application
Pour réaliser cette partie, pensez à vous référer au mémento VB6 qui se trouve à la fin
du fascicule de TP du module 2944 "Base de la programmation". À la fin de ce TP, vous
trouverez également un complément de mémento pour l’accès aux bases de données.
Pensez également à le regarder en cas de besoin.
Lancez VB6 et créez un projet en nommant la première fenêtre frmMenu et le projet
prjFilm (donnez ces noms aux fichiers en sauvant, mais aussi aux objets concernés dans
VB6). Ce projet va permettre de gérer la base de données de façon conviviale, à travers
des fenêtres et du code que vous allez créer.

Lien avec la base de données


Avant même de commencer à créer le contenu de la première fenêtre, il faut gérer le lien
avec la base de données. Voici les étapes à suivre (quel que soit le projet) :

8 2949 TP PA 00
Choisir le type de lien (middleware) avec le SGBDR
Il existe en effet différentes méthodes pour accéder aux bases de données. Généralement,
il faut installer un fichier qui est un driver de base de données (appelé aussi "mid-
dleware"), qui va servir d’interface entre le SGBDR et le langage, afin que les deux puis-
sent communiquer entre eux.
Installer et configurer le driver
Une fois votre choix fait (ici, il va vous être imposé), il faut installer et configurer ce
middleware. Allez dans le menu Démarrer/Programmes/PostgreSQL et sélectionnez
"constructeur de la pile applicative".
Dans la nouvelle fenêtre, dans la liste, sélectionnez PostgreSQL et cliquez sur suivant.
Un accès internet se fait pour récupérer la liste de tous les ajouts possibles à PostgreSQL.
Dans databasedriver, sélectionnez PgOleDB puis suivez les étapes d’installation.
Dans le langage, créer le lien en utilisant le bon middleware
Retournez dans votre projet VB6. Allez dans le menu Projet/Références. Dans la nouvelle
fenêtre, sélectionnez les 2 références suivantes :

Microsoft ActiveX Data Objects 2.8 library


Microsoft ActiveX Data Objects Recordset 2.8 library

Puis faites OK.


Dans le langage, écrire le code de la connexion TP 1
La connexion avec la base doit se faire pour tout le projet, et pas pour une seule fenêtre.
Lorsque vous avez ainsi besoin de faire des déclarations globales à tout le projet, ou Logiciel
de gestion
d'écrire du code qui influence tout le projet, il faut le mettre dans un module séparé des de DVD
fenêtres, un module de démarrage du projet.
Dans le menu Projet, choisissez "Ajouter un module". Dans la nouvelle fenêtre, sur Page 11
l’onglet "nouveau", Module est sélectionné. Faites "ouvrir". Une fenêtre vide s’ouvre :
enregistrez-la sous le nom mdlFilm (l’extension .bas est donnée automatiquement).
Remarquez que le module est inséré à droite, dans votre projet.
Il faut aussi indiquer à VB6 que le programme doit démarrer sur ce module : dans le
menu Projet, allez dans "propriétés de prjFilm". Dans la nouvelle fenêtre, dans "objet de
démarrage", sélectionnez "Sub Main". C’est donc à cet endroit que l’on peut préciser sur
quoi doit démarrer le projet (une fenêtre, ou le module de démarrage Main).
Repositionnez-vous dans le module mdlFilm. Écrivez la déclaration suivante :

Public dbFilm As ADODB.Connection

Normalement, après avoir écrit As et mis un espace, dans la liste des propositions,
vous avez dû trouver ADODB. Si ce n’est pas le cas, c’est qu’il y a un problème avec le
middleware, donc vous avez mal fait une étape précédente. Si vous avez bien ADODB,
placez-vous dessus et utilisez la touche TAB, puis placez le point : vous devez avoir à
nouveau une liste dans laquelle vous pouvez trouver Connection. Utilisez à nouveau la
touche TAB. Vous n’êtes pas obligé d’avoir recours à ces assistants à la saisie, cependant
ils sont bien pratiques pour éviter les fautes de frappe, pour contrôler que l’on prend les
bons outils et aussi lorsque l’on a oublié le nom de certains outils. Je vous conseille donc
d’utiliser ces facilités.

8 2949 TP PA 00
Cet objet (dbFilm) va permettre de faire la connexion directement avec votre base de
données créée sous PostgreSQL.
Une fois la connexion créée (on va écrire le code de la connexion plus loin), il faudra
manipuler des curseurs pour accéder, par des requêtes, au contenu des différentes tables.
C’est, bien évidemment, le but principal de cette application.
Déclarez les curseurs suivants (un recordset est un curseur) :

Public rsDvd As ADODB.Recordset


Public rsActeur As ADODB.Recordset
Public rsGenre As ADODB.Recordset
Public rsDernier As ADODB.Recordset
Public rsActeurFilm As ADODB.Recordset

Il est temps, maintenant, d’écrire le module principal de démarrage du projet, le "main".


Écrivez le code suivant à la suite des déclarations globales précédentes :

Sub main()
End Sub

Remarquez qu’après avoir écrit la première ligne et validé, la seconde ligne s’est auto-
matiquement écrite.
Dans ce main, vous allez "créer" l’objet dbFilm de la façon suivante :
TP 1 Set dbFilm = New ADODB.Connection

Logiciel
Vous avez certainement l’impression de ne rien faire de plus que la ligne de déclara-
de gestion
de DVD tion. En réalité, vous venez d’"instancier" l’objet, c’est-à-dire de réellement le créer en
mémoire, alors que, lors de la déclaration, vous n’avez fait que signaler qu’il y aura dans
Page 12 votre programme un objet de type ADODB.Connection.
Une fois l’objet créé, il faut l’utiliser pour faire le lien avec votre base de données. Ce lien
se fait par ce qu’on appelle une "chaîne de connexion", dans laquelle il faut préciser un
certain nombre de choses comme le nom du SGBDR, l’adresse ip du serveur qui contient
la base, le nom de la base de données, le nom de l’utilisateur de la base de données et
son mot de passe.
Voici donc la chaîne de connexion :

dbFilm.Open "PROVIDER=PostgreSQL;" & _


"DATA SOURCE=127.0.0.1;" & _
"LOCATION=GESTIONDVD;" & _
"USER ID=postgres;" & _
"PASSWORD=toto;"

Remplacez toutes les valeurs en couleur et surlignés, par les bonnes valeurs (si
vous avez suivi les étapes précédentes, vous n’avez que le user et password à changer en
mettant ceux que vous avez utilisés sous PostgreSQL). Remarquez au passage l’utilisation
du "_" en fin de ligne, qui permet tout simplement de dire à VB6 que le code de cette
ligne continue à la ligne suivante. Le signe & permet la concaténation de chaîne (et non
pas le +).
Une fois la connexion établie, les recordsets utilisant cette connexion permettront d’ac-
céder aux données. On s’en occupera directement dans les fenêtres du projet.

8 2949 TP PA 00
Après cette connexion, le programme doit ouvrir la première fenêtre de l’application,
c’est-à-dire frmMenu. Donc, en fin de Sub main, utilisez la méthode Show sur l’objet
frmMenu (vérifiez que vous avez bien renommé la fenêtre). En tapant frmMenu suivi
d’un point, si une liste apparaît contenant Show, c’est que vous l’avez bien renommé.

Testez l’application : si tout va bien, vous ne devriez pas avoir d’erreur et une fenêtre
vide devrait s’ouvrir.

Avant même de commencer à coder chaque formulaire, vous allez au moins les créer
pour les insérer dans votre projet : dans le menu Projet, choisissez "Ajouter une feuille".
Dans l’onglet "Nouveau", "Form" est sélectionné, cliquez sur Ouvrir. Une nouvelle feuille
s’est ouverte et s’est aussi insérée dans la liste de droite, dans le projet. Renommez cette
feuille en frmFilm et enregistrez-la. Changez aussi son titre (Caption) en Films.
Avec la même méthode, créez les formulaires frmGenre et frmActeur.

Formulaire du menu
Revenez sur frmMenu. Le premier formulaire va juste contenir des boutons pour per-
mettre d’accéder aux différentes fenêtres de l’application. Au passage, ce n’est pas du
tout une bonne méthode de présentation (abandonnée depuis au moins 20 ans :-) )
mais, pour démarrer, elle va nous faciliter la vie et montrer comment ouvrir et fermer TP 1
des fenêtres. Par la suite, vous verrez qu’il est préférable de regrouper les informations.
Logiciel
Donc, présentez cette fenêtre de la façon suivante (attention, surtout ne faites pas de
de gestion
copier/coller pour créer les boutons) : de DVD

Page 13

Renommez les objets en suivant les normes (cmdFilm pour le bouton Films…). Pensez à
le faire correctement dans tout votre projet.
Derrière le bouton "Films", mettez le code qui permet de cacher la fenêtre du menu
(avec la méthode hide sur frmMenu) et de faire apparaître la fenêtre des films (avec la
méthode Show sur frmFilm).
Avec la même logique, codez les autres boutons. Mettez End derrière le bouton Quitter.
Testez l’application. Normalement, vous ne devez pas avoir d’erreur au démarrage et,
en cliquant sur un bouton, la nouvelle fenêtre doit s’ouvrir : elle est vide mais contrôlez
que son titre est correct (il correspond au bouton utilisé). En revanche, ne voyant plus
le menu, vous ne pouvez pas tester les autres boutons, sauf en fermant et en relançant
l’application. Pour cela, fermer la fenêtre ne suffit pas : vous devez cliquer sur le carré
qui s’appelle "fin" et qui se trouve à droite de la flèche que vous avez utilisée pour lan-
cer l’application. Pour le moment, procédez ainsi pour tester tous les boutons.

Ce premier formulaire est terminé.

8 2949 TP PA 00
Formulaire des DVD
Passons au formulaire le plus important, et le plus copieux en code.
Dans ce formulaire, vous allez afficher les DVD, en permettant à l’utilisateur de navi-
guer entre les DVD. Pour chacun, vous allez afficher son titre, sa durée, son genre et ses
acteurs. Le formulaire doit aussi permettre de modifier les informations d’un DVD, de
supprimer ou d’ajouter un nouveau DVD, mais aussi d’ajouter de nouveaux genres ou
de nouveaux acteurs (afin de faciliter la saisie, plutôt que de devoir aller dans les formu-
laires Acteurs et Genres).
Commencez par construire l’interface suivante (nommez correctement tous les objets
graphiques en suivant la logique habituelle) :
Vous pouvez tout de suite coder le bouton Quitter, qui doit fermer (et non juste cacher)
le formulaire actuel (utiliser la procédure Unload avec, comme paramètre, la fenêtre à
fermer) et doit faire réapparaître (avec la méthode Show) le menu.

TP 1

Logiciel
de gestion
de DVD

Page 14

Testez pour voir si la fenêtre s’affiche correctement et si vous arrivez à retourner au


menu.

Chargement du formulaire
Créez le code qui va s’exécuter au chargement de la fenêtre (pour cela, il suffit de
double-cliquer sur une zone vide de la fenêtre, pour créer le Form_load).
Dans cette méthode événementielle, on veut remplir le combo des genres, le combo des
acteurs et remplir le curseur des films pour afficher le premier film. Travaillons étape par
étape.

8 2949 TP PA 00
Combo des genres
Comme on risque d’avoir plusieurs fois besoin de réinitialiser ce combo, on va mettre
le code dans un module non événementiel. Créez la procédure non événementielle
remplirGenre(). Dans cette procédure, commencez par vider le combo des genres. Vous
allez ensuite initialiser le recordset rsGenre avec une requête exécutée sur l’objet de
connexion à la base de données. Voici la syntaxe :

Set rsGenre = dbFilm.Execute("select * from genre")

Une fois le recordset ainsi initialisé, faites une boucle pour le parcourir et remplissez le
combo avec les libellés des genres. Après la boucle, fermez le recordset.
Revenez au module form_load et appelez votre procédure remplirGenre.

Testez pour vérifier que le combo est bien rempli des genres que vous avez insérés dans
la base de données.

Les combos, comme les listes, possèdent une propriété bien sympathique : un tableau
caché, qui fonctionne en parallèle du tableau des valeurs affichées. On peut mettre ce
que l’on veut dans ce tableau caché. C’est évidemment bien pratique pour y mémori-
ser les clés primaires des informations affichées (donc le numgenre). Dans la boucle de
chargement du combo des genres, juste après avoir ajouté le libellé dans le combo, vous TP 1

allez remplir ce tableau caché avec les numgenre. Aidez-vous du mémento et pensez à
Logiciel
utiliser la propriété NewIndex. de gestion
Combo des acteurs de DVD

En suivant exactement la même logique que pour le combo des genres, remplissez le Page 15
combo des acteurs.

Testez pour contrôler que le combo des acteurs se remplit correctement.

Gestion du recordset sur les DVD


Il faut s’occuper de récupérer toutes les informations sur les DVD. Cette opération devra
être réalisée plusieurs fois (à chaque ajout, suppression ou modification d’un DVD),
donc autant la mettre, elle aussi, dans un module séparé. Créez la procédure non événe-
mentielle initDvd qui reçoit en paramètre numDvd de type entier (ce numéro, lorsqu’il
contiendra autre chose que 0, permettra de se repositionner sur le DVD de ce numéro).
Dans ce module, commencez par initialiser le curseur rsDvd avec une requête récupérant
tous les DVD de la table DVD.
Puis faites un test sur la fin de curseur : si la fin est atteinte (si le curseur est vide, donc s’il
n’y a pas de DVD), on va juste vider dans la fenêtre le titre, la durée et la liste des acteurs :
ces 3 instructions seront peut-être à refaire plusieurs fois, alors mettez-les dans une procé-
dure que vous allez appeler miseABlanc() et appelez votre procédure à cet endroit.
Au niveau de la fenêtre, on désire que certains objets graphiques soient ou ne soient pas
accessibles, suivant le cas. Par exemple, au départ, il ne faut pas que l’on puisse modifier

8 2949 TP PA 00
le titre ou la durée : cela ne sera possible que si on clique sur le bouton modif. Pour cela,
créez une procédure nommée activation qui reçoit en paramètre état de type booléen.
Suivant les besoins, on appellera cette procédure en lui envoyant true ou false, pour faire
basculer l’état des différents objets (accessible ou non). Dans cette procédure, affectez le
paramètre etat à la propriété Enabled de tous les objets de la fenêtre, sauf les 3 objets
suivants, auxquels vous allez affecter le contraire de la propriété état (donc, not etat) :
titre, durée et le combo des genres. N’affectez rien au bouton Quitter, qui doit toujours
rester accessible.
De retour dans initDvd, à l’endroit où vous étiez, appelez la procédure activation en lui
envoyant False en paramètre.
Vous étiez dans un si (si la fin du curseur est atteinte), écrivez maintenant le sinon. En
effet, dans le cas où il y a des DVD, il faut s’en occuper. Commencez par vous position-
ner sur la bonne ligne du curseur (si le paramètre numDvd contient autre chose que
0) : Donc, faites un test sur numDvd car, s’il est différent de 0, faites une boucle sur le
curseur pour vous positionner sur le tuple dont le numdvd est égal au numDvd passé en
paramètre. A priori, si le numDvd est différent de 0, vous êtes sûr de le trouver. Après
cette boucle et ce test, appelez la procédure activation mais, cette fois, en envoyant true
dans le paramètre.
Il faut maintenant s’occuper d’afficher les informations du DVD sur lequel on est posi-
tionné. Encore une fois, comme cette manipulation risque de se répéter plusieurs fois,
faites une procédure nouvFilm sans paramètre.
TP 1 Dans cette procédure, commencez par déclarer une variable i de type entier. Comme
vous êtes positionné sur une ligne du curseur rsDvd, il suffit de remplir simplement les
Logiciel zones de texte du titre et de la durée avec les informations récupérées dans le curseur.
de gestion
de DVD Ensuite, faites une boucle sur le combo des genres pour trouver le genre dont le numéro
est égal au numgenre du curseur rsDvd (n’oubliez pas que les numéros de genre sont
Page 16 dans le tableau caché du combo). Une fois le genre trouvé, affectez l’indice de la ligne
dans la propriété ListIndex du combo des genres, pour que le bon genre s’affiche.
Il faut maintenant s’occuper des acteurs du film. Pour cela, initialiser le curseur rsAc-
teurFilm avec les noms et numéros des acteurs de ce film. La requête vous est donnée,
non pas parce que vous ne savez pas l’écrire (théoriquement, vous savez) mais parce
qu’elle utilise des concaténations et des retours à la ligne que vous auriez peut-être du
mal à trouver. Prenez donc bien le temps de comprendre comment cette requête est
construite. La concaténation en VB6 est soit & (qui se moque des types concaténés), soit
+ (qui est sensible aux types). Voici l’exemple avec + :

Set rsActeurFilm = dbFilm.Execute("Select nom, A.numacteur as numacteur " + _


"from acteur A, acteur_dvd D " + _
"where A.numacteur = D.acteur_numacteur and " + _
"D.dvd_numdvd = " + Str(rsDvd("numdvd")))

Une fois le curseur initialisé, videz la liste des acteurs du film et remplissez-la avec les
noms récupérés dans le curseur. Pensez en parallèle à remplir la liste cachée avec les
numacteur.
Après la boucle, pensez à fermer le curseur.
Il reste à appeler la procédure nouvFilm à l’endroit où vous étiez dans initDvd (en fin de
sinon).

8 2949 TP PA 00
Revenez dans le form_load : à la fin de la procédure, appelez initDvd en lui envoyant le
paramètre 0.

Testez pour voir si toutes les informations du premier DVD s’affichent (titre, durée,
genre, acteurs).

Les boutons de navigation


Bouton pour se positionner sur le dernier film
Dans la fonction événementielle correspondante, utilisez juste la méthode MoveLast sur
le curseur rsDvd, puis appelez votre fonction nouvFilm() qui va s’occuper de tout afficher
correctement.
Bouton pour se positionner sur le premier film
Suivez la même logique que le bouton précédent (mais en allant sur le premier avec la
méthode MoveFirst).
Bouton pour passer au film suivant
Utilisez la méthode MoveNext sur le curseur rsDvd pour passer au film suivant. Juste
après, contrôlez si vous êtes en fin de curseur avec la méthode EOF : dans ce cas, posi-
tionnez-vous sur le dernier (avec MoveLast). Ensuite, appelez nouvFilm().
Bouton pour revenir au film précédent
Suivez la même logique que le bouton précédent (mais en allant sur le film précédent
TP 1
avec la méthode MovePrevious).
Logiciel
de gestion
À ce stade, testez vos boutons pour voir si vous vous déplacez correctement et si les de DVD
affichages se font bien (titre, durée, genre et acteurs du film).
Page 17

Suppression d’un film


Pour supprimer un film (derrière le bouton correspondant), on va commencer par
demander une confirmation à l’utilisateur. Pour cela, vous allez utiliser la fonction VB6
MsgBox. Le but est d’afficher un message du genre "Voulez-vous vraiment supprimer ce
film ?" et d’afficher les 2 boutons "oui" et "non". Testez le résultat de l’appel de cette
fonction : si l’utilisateur a cliqué sur "oui", alors il faut exécuter la requête de suppres-
sion avec la méthode Exécute, directement sur l’objet de connexion dbFilm. Supprimez
le film dont le numéro est le numdvd actuel du curseur rsDvd (puisque le curseur est
positionné sur le DVD à supprimer).
Tentez d’exécuter le programme et de supprimer un film qui a des acteurs :
Normalement, vous devriez obtenir une erreur car PostgreSQL a mis des liens de type
contraintes entre les tables (les clés primaires/étrangères de l’association) et il n’appré-
cie pas que vous tentiez de supprimer un film alors que des acteurs sont liés à ce film.
D’ailleurs, le message d’erreur est très précis (en anglais) : violation de clé étrangère,
et il précise même la table.

Cela sous-entend donc que, avant de supprimer le DVD, il faut supprimer tous les liens
qui existent entre lui et les acteurs. Juste avant la requête de suppression du DVD, faites
une requête de suppression dans acteur_dvd pour supprimer toutes les lignes qui concer-
nent ce DVD.

8 2949 TP PA 00
Testez à nouveau. Cette fois, il n’y a plus d’erreur (sauf, bien sûr, si vous vous êtes
trompé dans la requête !). En revanche, le DVD est toujours là… et, même si vous
utilisez les boutons de navigation, il est toujours là… mais sans les acteurs ! Bizarre !
Allez voir dans PostgreSQL si le film a bien été effacé : c’est le cas ! Fermez l’applica-
tion et relancez-la. Le film n’y est plus ! Que s’est-il passé ?

En fait, la requête rattachée au curseur rsDvd n’ayant pas été mise à jour juste après la
suppression, le curseur contenait toujours les informations sur ce DVD, même s’il avait
été supprimé. Donc, il manque quelque chose dans le code. Après les 2 requêtes de sup-
pression, appelez votre procédure initDvd en lui envoyant le paramètre 0, pour qu’il se
repositionne en début de DVD et mette à jour le curseur.

Testez à nouveau. Supprimez un film qui contient des acteurs. Cette fois, vous êtes
repositionné sur le premier film du curseur et, si vous vous déplacez dans les films, le
film supprimé n’apparaît plus.

Ajout d’un film


Comment va fonctionner l’ajout ? Voyons le principe avant de commencer à coder.
L’utilisateur va cliquer sur le bouton "Ajout film" et, dans ce cas, il faut faire en sorte que
les zones soient vidées et accessibles. Le bouton doit changer de message pour devenir
"Enregistrer". Lorsque l’utilisateur cliquera sur "Enregistrer", le film sera créé dans la
TP 1 base et tout redeviendra comme avant.
Donc, derrière le bouton correspondant, commencez par tester si le message sur le bou-
Logiciel ton est bien "&Ajout film" (rappel : le signe & permet l’affichage d’un soulignement sous
de gestion
de DVD la lettre qui suit). Si c’est le cas, alors appelez la procédure activation en lui envoyant
False en paramètre (afin d’activer et désactiver les contrôles pour préparer l’ajout),
Page 18 appelez votre procédure miseABlanc pour vider les zones de saisie, placez le focus sur la
zone de texte pour saisir le titre, activez le bouton de l’ajout d’un film et modifiez son
message en mettant "&Enregistrer".
Dans le cas où le message du bouton n’était pas "&Ajout film" (donc, dans le sinon), cela
suppose qu’il faut ajouter le film. Pour cela, vous allez d’abord contrôler que les 2 zones
de texte ne sont pas vides, ainsi que la sélection du combo des genres. Si aucun des trois
n’est vide, alors exécutez la requête d’insertion sur l’objet de connexion. Attention, rap-
pelez-vous que, si un champ est de type chaine, sa valeur doit être entre guillemets ou
cotes.
Le but est de se rappeler du numdvd qui vient d’être créé car on va se repositionner
directement sur ce DVD lors de l’appel de la procédure de réinitialisation. Pour cela, vous
allez utiliser le curseur rsDernier et récupérer dans ce curseur le résultat de l’exécution
de la requête suivante :

"select last_value as ledernier from dvd_numdvd_seq"

Cette requête vous est donnée car vous ne pouviez pas la deviner ! Elle permet de récu-
pérer la valeur de la dernière clé numdvd insérée dans la table dvd. Cette requête est
spécifique à PostgreSQL. Sa syntaxe officielle est la suivante :

select last_value as NomVariable from NomTable_NomChamp_seq

Les noms en couleur et surlignés, sont à remplacer par les bons noms.

8 2949 TP PA 00
Chaque SGBDR a ses propres instructions pour récupérer ce genre d’information.
Avec le "as", on fabrique un champ temporaire "ledernier" dans lequel le numéro sera
récupéré.
Vous pouvez ainsi appeler votre procédure initDvd en lui envoyant en paramètre le
numéro récupéré dans ledernier (attention, ledernier est un champ du curseur rsDer-
nier). Pensez aussi à modifier à nouveau le message du bouton pour lui remettre
"&Ajout film".
Si un des 3 champs n’est pas vide (donc, dans le sinon), affichez un message d’erreur
signalant que l’ajout ne peut pas se faire, et utilisez le bouton vbOKOnly. Inutile, cette
fois, de récupérer dans une variable ou de tester la réponse de l’utilisateur car il n’a pas
le choix (un seul bouton). Alors, dans ce cas, VB6 accepte que vous appeliez la fonction
MsgBox comme si c’était une procédure.
Testez : normalement, quand vous cliquez sur l’ajout, tous les boutons se désactivent,
l’ajout devient "Enregistrer", les zones de texte se vident ainsi que la sélection du
combo. Saisissez un nouveau film, une durée et sélectionnez un genre. Cliquez sur
Enregistrer : vous êtes resté positionné sur le bon film. Essayez de vous déplacer et
revenez sur le film. Essayez aussi d’ajouter un autre film et de cliquer sur enregistrer
sans avoir rempli toutes les zones : vous devriez obtenir un message d’erreur.

Allez voir dans PostgreSQL si les ajouts se sont faits correctement.


Pour le moment, on ne s’occupe pas de l’ajout des acteurs : cette manipulation est un
peu plus complexe et sera abordée plus loin. TP 1
Si tout fonctionne correctement, vous pouvez passer à la suite.
Logiciel
Modification d’un film de gestion
Passons au bouton de modification d’un film. On va utiliser le même principe que pour de DVD
l’ajout, c’est-à-dire en modifiant le message sur le bouton de modification.
Page 19
Donc, commencez par tester le message sur le bouton. Si c’est "&Modif film", appelez
votre procédure activation en lui envoyant False en paramètre, rendez actif le bouton
et changez son message (en mettant "&Enregistrer"), puis placez le focus sur la zone de
texte du titre du film.
Dans le cas contraire, il faut modifier le film : exécutez une requête d’update pour
prendre en compte le nouveau titre, la nouvelle durée et le nouveau genre pour le film
actuellement sélectionné.
Après la modification, appelez votre procédure activation en lui envoyant True en para-
mètre, modifiez le message du bouton pour lui remettre "&Modif film" et appelez votre
procédure initDvd mais, cette fois, en lui envoyant en paramètre le numdvd du DVD qui
vient d’être modifié (donc du DVD actuel dans le rsDvd). Cela permettra de se reposition-
ner automatiquement sur ce DVD.
Testez en essayant de modifier un film : Normalement, les boutons doivent devenir
inactifs, sauf le bouton de modification qui change de message ("Enregistrer"). Vous
avez accès aux zones de saisie et de sélection du genre : modifiez le titre, la durée et
changez le genre, puis enregistrez. Les boutons sont redevenus comme avant, les zones
ne sont plus accessibles et les modifications ont été prises en compte. Essayez de vous
déplacer dans les films et revenez sur le film modifié : les modifications sont bien
enregistrées.

8 2949 TP PA 00
Suppression d’un acteur du film
Pour le moment, on ne s’est pas occupé d’ajouter ou de supprimer les acteurs d’un film.
Commençons par le plus simple : la suppression.
Pour supprimer (donc derrière le bouton suppression d’un acteur symbolisé par (-)), il
faut qu’il y ait un acteur sélectionné dans la liste. Commencez par faire cette vérification.
Si un acteur est sélectionné, alors exécutez une requête de suppression sur acteur_dvd
pour supprimer la ligne qui correspond au numéro de l’acteur sélectionné (à récupérer
dans la liste cachée des acteurs) et au numéro du DVD actif (à récupérer dans le curseur
rsDvd).
Afin de remettre à jour la liste des acteurs, appelez votre procédure nouvFilm.
Testez : choisissez un film qui possède des acteurs et, avant de sélectionner un acteur,
cliquez sur le bouton "-". Normalement, rien ne se passe. Sélectionnez un acteur et cli-
quez à nouveau sur "-". L’acteur devrait être supprimé de la liste. Pour bien contrôler,
changez de film et revenez sur le film concerné.

Ajout d’un acteur dans le film


Derrière le bouton de l’ajout d’un acteur (+), commencez par vérifier qu’un acteur est
bien sélectionné dans le combo. Si c’est le cas, vous devez faire une boucle pour véri-
fier que le nom sélectionné n’est pas déjà présent dans la liste des acteurs du film. S’il
y est, affichez un message d’erreur ; sinon, ajoutez (avec une requête d’insertion) dans
Acteur_dvd la ligne correspondant à l’acteur sélectionné et au DVD actif. Juste après
TP 1 l’ajout, pensez à appeler nouvFilm pour mettre à jour la liste des acteurs.

Logiciel
Testez : sélectionnez un acteur et tentez de l’ajouter à la liste des acteurs du film.
de gestion
de DVD
Vous devriez le voir apparaître directement. Changez de film et revenez sur le film
sélectionné pour contrôler que l’ajout est bien enregistré.
Page 20
Nouveau genre
Il sera possible par la suite de passer par le menu général et d'aller dans le formulaire
spécifique au genre pour ajouter/modifier/supprimer des genres. Mais, lorsque vous êtes
dans le formulaire des DVD, cela peut être bien pratique de pouvoir en direct ajouter un
genre. Et c’est aussi l’occasion de découvrir une nouvelle fonction de VB6.
Donc, dans la procédure derrière le bouton "nouveau genre", déclarez une variable
genre de type chaine et affectez-lui le résultat de l’appel de la fonction InputBox pour
demander à l’utilisateur de saisir un nouveau genre (voir la syntaxe dans le mémento).
Contrôlez ensuite, avec une boucle, que ce nom saisi n’est pas déjà présent dans le
combo des genres. S’il y est, affichez un message d’erreur ; sinon, exécutez une requête
d’insertion sur la table Genre, et réinitialisez le combo des genres en appelant votre
procédure remplirGenre.
Testez : essayer d’ajouter un genre et vérifiez qu’il s’est inséré dans le combo. Essayez
d’ajouter un genre qui existe déjà pour vérifier que vous obtenez bien un message
d’erreur. Remarquez qu’après un ajout, le film sur lequel vous êtes positionné perd son
genre actuel et n’a plus de genre.

Ce problème vient du fait que la réinitialisation du combo perd la position. Pour éviter
ce problème, appelez la procédure nouvFilm après l’appel de la procédure remplirGenre.

8 2949 TP PA 00
Nouvel Acteur
Avec le même principe que pour le genre, écrivez le code qui permet d’ajouter un acteur
au combo des acteurs.

Testez.

Petit contrôle sur la saisie de la durée


Il est toujours possible d’ajouter des tests pour éviter les saisies erronées. Par exemple, la
durée ne doit pas contenir autre chose que des chiffres.
Sur l’événement Change de la zone de texte de la durée, testez si la zone de texte
contient uniquement du numérique (utilisez la fonction VB6 IsNumeric présentée dans
le mémento). Dans le cas où le contenu ne serait pas numérique, videz-le (videz la zone
de texte).

Testez pour voir si la zone de la durée se vide dès que vous saisissez autre chose qu’un
chiffre, et avant même de valider.

Le formulaire principal est terminé. C’est le plus complexe. Vous avez ainsi acquis d’im-
portantes connaissances sur la manipulation d’une base de données à travers une appli-
cation.
TP 1
Formulaire des acteurs
Maintenant que la fenêtre principale est terminée, vous avez toutes les connaissances Logiciel
de gestion
pour construire les 2 autres. Pour celle des acteurs, le but est d’afficher tous les films
de DVD
concernés pour chaque acteur (dans quels films l’acteur a joué). Attention, dans cette
fenêtre, vous ne devez pas gérer l’affectation d’un film à un acteur : cela se fait unique- Page 21
ment dans la fenêtre de la gestion des DVD. Ici, vous devez juste gérer l’affichage des
films d’un acteur, et permettre d’ajouter/supprimer/modifier un acteur, et rien d’autre.
Codez complètement cette fenêtre.

Testez la fenêtre.

8 2949 TP PA 00
Formulaire des genres
En suivant exactement la même logique que pour le formulaire précédent, créez le for-
mulaire des genres.

Testez la fenêtre.

Optimisation du code
Vous avez sans doute remarqué qu’il y a beaucoup de codes identiques entre les diffé-
rentes fenêtres. De la même façon que vous avez créé des modules non événementiels
paramétrés dans vos fenêtres, il est possible de faire la même chose, pour toutes les
fenêtres. Pour cela, il faut placer les modules dans le module général qui se lance au
démarrage du projet, et qui contient déjà le main.
On va faire le test pour un des modules. Toutes les fenêtres font la même chose derrière
le bouton Quitter : la fenêtre active est fermée (avec unload) et la fenêtre du menu est
à nouveau montrée (avec Show).
Dans le module général, après le main, créez une procédure publique Quitter qui reçoit
en paramètre frm de type Form. Dans cette procédure, faites un unload sur le paramètre,
et appliquez la méthode Show sur le formulaire du menu.
Dans les 3 formulaires (les DVD, les genres et les acteurs), remplacez le code derrière le bou-
TP 1 ton quitter par l’appel de la procédure Quitter en envoyant à chaque fois le bon paramètre.

Logiciel
de gestion Testez.
de DVD

Cette procédure ne fait que remplacer 2 lignes par une, ce qui n’est pas une grande
Page 22
amélioration. Cependant, vous imaginez bien qu’il y a quantité d’autres procédures qu’il
est possible d’optimiser dans cette application.
Prenez le temps de bien analyser la correction officielle pour voir, entre autres, les opti-
misations apportées, mais aussi la présentation générale du code.

8 2949 TP PA 00
3. VB6 : complément de mémento
En fin de fascicule de TP du module 2944 "Base de la programmation", vous avez utilisé
un petit mémento qui donnait quelques indications sur le langage. Voici un complément,
sur l’accès aux bases de données, qui va vous servir pour ce TP.

Étapes d’accès à une base de données


Voici les instructions fondamentales :
‘défini une variable globale de type Base de données
Public db As ADODB.Connection
‘défini une variable globale de type enregistrement
Public rs As ADODB.Recordset

‘initialisation de db pointant sur une base de données


Set db = New ADODB.Connection
db.Open "PROVIDER=nomProvider;' & _
"DATA SOURCE=adresseIP;" & _
"LOCATION=nomBase;" & _
"USER ID=nomUser;" & _
"PASSWORD=motdepasse;"

‘initialisation de rs pointant sur une table TP 1


Set rs = db.Execute("select * from Eleve")
Logiciel
‘exemples de manipulations sur le curseur de gestion
de DVD
rs.MoveNext
rs.MoveFirst
Page 23
if rs.EOF then...
TxtNom.Text = rs.Fields("Nom")

Propriétés et méthodes (compléments)


Propriétés
Type objet Propriété Type Explication
Recordset EOF booléen vrai si accès après le dernier tuple
BOF booléen vrai si accès avant le premier tuple
Méthodes
Type objet Méthode Explication
Recordset MoveFirst() pour se positionner sur le premier enregistrement
MoveLast() pour se positionner sur le dernier enregistrement
MoveNext() pour se positionner sur l’enregistrement suivant
MovePrevious() pour se positionner sur l’enregistrement précédent
Close() pour fermer le recordset et libérer la mémoire
Fields(nom:chaine):chaine pour accéder au contenu d’un champ
Connection Execute(requete:chaine) exécute une requête SQL

8 2949 TP PA 00
TP 2
Optimisation par les contraintes
de la base « Tour de France »
Ce TP porte exclusivement sur la mise en place de contraintes afin de mettre en pratique
les concepts vus dans la séquence 4 du cours. Pour cela, nous allons reprendre la base de
données « Tour de France » telle qu’elle était à la fin du TP « Exploitation des données ».

X Capacités attendues en fin de TP


Savoir mettre en place des contraintes.

X Contenu
1. Analyse des besoins ....................................................................................... 26
2. Mise en place d’une contrainte d’unicité...................................................... 26
3. Mise en place d’une contrainte de validation simple .................................. 28
4. Mise en place de contraintes de validation complexes ............................... 29
TP 2
5. Création d’un domaine .................................................................................. 32
Optimisation
6. Gestion de l’intégrité référentielle ................................................................ 33 par les contraintes
7. Et Win Design dans tout ça ? ......................................................................... 37 de la base
"Tour de France"

Page 25

8 2949 TP PA 00
1. Analyse des besoins
Comme lors du TP "Exploitation des données", nous allons imaginer que vous continuez
d’assister un journaliste sportif qui prépare une émission sur le Tour de France. Lors d’une
entrevue avec lui, vous avez noté les règles métiers suivantes :
• sur chaque étape d’une épreuve, il ne peut y avoir qu’un seul coureur par classe-
ment (il ne peut pas y avoir, par exemple, plusieurs coureurs classés "n° 5") ;
• l’identifiant de pays est composé de 3 lettres majuscules ;
• l’identifiant de coureur international attribué par l’UCI est fabriqué de la manière
suivante :

F R A 1 9 7 9 0 6 2 2

Année de Mois de Jour de


Nationalité
naissance naissance naissance

• lorsqu’un coureur abandonne une étape, il n’a pas de classement sur cette étape, et
il n’a pas non plus de temps mémorisé ;
• il apparaît clairement que, dans le monde du cyclisme, beaucoup d’items sont iden-
tifiés avec un code de 3 lettres majuscules (nationalité, équipes, épreuves…) ;
TP 2 • l’identifiant d’épreuve peut être amené à être changé (il a été question de l’identi-
fiant du "Paris-Nice" qui pourrait passer de "PNC" à "PNI"). Il faut donc prévoir que
Optimisation les identifiants d’épreuve puissent évoluer sans avoir à faire de grosses opérations
par les contraintes
de la base
de maintenance.
"Tour de France"

Page 26
2. Mise en place d’une contrainte d’unicité
L’objectif, ici, est de faire en sorte que, sur chaque étape d’une épreuve, un classe-
ment ne puisse concerner qu’un seul coureur. Pour cela, nous allons mettre en place la
contrainte d’unicité "uni_classement" qui va concerner la table "resultatEtape" et, plus
précisément, les champs "idEtape", "idEpreuve" et "classement".
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la table "resultatEtape", puis choisissez
"Ajouter un objet X Ajouter une contrainte d’unicité" :

8 2949 TP PA 00
• La fenêtre "Ajouter une contrainte d’unicité…" s’ouvre. Complétez le champ
"Nom". Passez ensuite dans l’onglet "Colonnes". À l’aide du menu déroulant
"Colonne", ajoutez les colonnes concernées par la contrainte d’unicité.

 


TP 2

Optimisation
par les contraintes
de la base
"Tour de France"

Page 27

• La nouvelle contrainte apparaît dans la partie "Contraintes" :

• Dès lors, on ne peut plus saisir 2 coureurs d’une même étape dans une même
épreuve avec le même classement sans se heurter à une violation de contrainte
d’unicité :


8 2949 TP PA 00
Mise en place avec SQL
En SQL, la création de cette contrainte se fait avec l’instruction suivante :

ALTER TABLE resultatetape


ADD CONSTRAINT uni_classement
UNIQUE (idepreuve,idetape,classement) ;

3. Mise en place d’une contrainte de validation simple


L’objectif, ici, est de vérifier que les identifiants de pays que l’on saisit ne contiennent
que 3 lettres en majuscules. Nous allons, pour cela, utiliser un opérateur de comparaison
spécifique à PostgreSQL (nous avons vu dans la partie cours comment faire en respectant
la norme SQL).
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la partie "Contraintes" de la table "pays" et choi-
sissez "Ajouter un objet X Ajouter une contrainte de vérification" :

TP 2

Optimisation
par les contraintes
de la base
"Tour de France"

Page 28 • Nommez ensuite cette contrainte "chk_idPays" puis, dans l’onglet "Définition",
saisissez la vérification "idPays ~'[A-Z][A-Z][A-Z]'" puis validez avec "OK" :

 

Le caractère "~" (tilde) s’obtient avec la combinaison des touches "Atl Gr + é". Ce carac-
tère permet d’utiliser des expressions rationnelles lors de comparaisons sous PostgreSQL.
Cette vérification revient à faire la vérification suivante :

SUBSTRING(idPays FROM 1 FOR 1) BETWEEN 'A' AND 'Z'


AND SUBSTRING(idPays FROM 2 FOR 1) BETWEEN 'A' AND 'Z'
AND SUBSTRING(idPays FROM 3 FOR 1) BETWEEN 'A' AND 'Z'

8 2949 TP PA 00
Mise en place avec SQL
En SQL, la création de cette contrainte se fait avec l’instruction suivante :

ALTER TABLE pays


ADD CONSTRAINT chk_idPays
CHECK ( idPays ~ '[A-Z][A-Z][A-Z]' ) ;

Ou alors :

ALTER TABLE pays


ADD CONSTRAINT chk_idPays
CHECK (
SUBSTRING(idPays FROM 1 FOR 1)
BETWEEN 'A' AND 'Z'
AND SUBSTRING(idPays FROM 2 FOR 1)
BETWEEN 'A' AND 'Z'
AND SUBSTRING(idPays FROM 3 FOR 1)
BETWEEN 'A' AND 'Z'
) ;

TP 2
4. Mise en place de contraintes de validation complexes
Optimisation
Lors de l’analyse des besoins, nous avons découvert que le code UCI était créé en s’ap- par les contraintes
de la base
puyant sur la nationalité et la date de naissance d’un coureur. Nous allons donc mettre "Tour de France"
en place une contrainte de validation qui veillera à ce qu’il ne puisse pas y avoir d’erreur
sur les codes UCI, ni sur les dates de naissance des coureurs. Page 29
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la partie "Contraintes" de la table "coureur" et
choisissez "Ajouter un objet X Ajouter une contrainte de vérification" :

8 2949 TP PA 00
• Nommez ensuite cette contrainte "chk_codeUCI" puis dans l’onglet
"Définition" saisissez la vérification ci-dessous et validez avec "OK" :

Mise en place avec SQL


En SQL, la création de cette contrainte se fait avec l’instruction suivante :
ALTER TABLE coureur
ADD CONSTRAINT chk_codeUCI
CHECK
(
SUBSTRING(codeUCI FROM 1 FOR 3) = nationalite
AND CAST(SUBSTRING(codeUCI FROM 4 FOR 4) AS INT)
TP 2
= EXTRACT(YEAR FROM dateDeNaissance)
Optimisation AND CAST(SUBSTRING(codeUCI FROM 8 FOR 2) AS INT)
par les contraintes = EXTRACT(MONTH FROM dateDeNaissance)
de la base AND CAST(SUBSTRING(codeUCI FROM 10 FOR 2) AS INT)
"Tour de France"
= EXTRACT(DAY FROM dateDeNaissance)
) ;
Page 30
Lors de l’analyse des besoins, nous avons également vu que, lorsqu’un coureur aban-
donne une étape, il n’a pas de classement sur cette étape, et il n’a pas non plus de temps
mémorisé. Nous allons donc mettre en place une contrainte qui va nous assurer que cette
règle métier sera bien respectée.
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la partie "Contraintes" de la table
"resultatEtape" et choisissez "Ajouter un objet X Ajouter une contrainte de véri-
fication" :

8 2949 TP PA 00
• Nommez ensuite cette contrainte "chk_abandon" puis dans l’onglet
"Définition" saisissez la vérification ci-dessous et validez avec "OK" :

Mise en place avec SQL


En SQL, la création de cette contrainte se fait avec l’instruction suivante :

ALTER TABLE resultatEtape


ADD CONSTRAINT chk_abandon
CHECK (
( abandon = TRUE
AND classement IS NULL
TP 2
AND temps IS NULL
) Optimisation
OR par les contraintes
de la base
( abandon = FALSE
"Tour de France"
AND classement IS NOT NULL
AND temps IS NOT NULL Page 31
)
) ;

8 2949 TP PA 00
5. Création d’un domaine
Lors de l’analyse des besoins, nous nous sommes aperçus que, dans le monde du cyclisme,
les codes à 3 lettres majuscules étaient très fréquents (nationalité, équipes, épreuves…).
Nous allons donc créer un domaine "id_cyclisme" que nous pourrons réutiliser par la
suite.
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la partie "Domaines" et choisissez "Ajouter un
domaine" :

• Nommez ce domaine "id_cyclisme" puis dans l’onglet "Définition" saisissez le "Type


TP 2 de base", puis la vérification ci-dessous, la longueur de ce nouveau domaine et
validez avec "OK" :
Optimisation
par les contraintes
de la base
"Tour de France"

Page 32

8 2949 TP PA 00
Maintenant que le domaine est créé, il faudrait l’appliquer dans les différentes tables
concernées. Le problème, ici, c’est que pgAdmin (comme beaucoup de clients gra-
phiques) ne permet pas de modifier les types de colonnes si ce n’est pour proposer un
type proche. Nous allons devoir utiliser directement du SQL, ce qui, encore une fois,
justifie sa connaissance et son apprentissage !

Mise en place avec SQL


En SQL, la création de ce domaine se fait avec l’instruction suivante :

CREATE DOMAIN id_cyclisme


AS character(3)
CHECK (VALUE ~ '[A-Z][A-Z][A-Z]')
);

Une fois le domaine créé, il nous suffit de l’utiliser à la place de "character(3)" dans les
différentes tables :
• contratCoureur (idEquipe) ; • etape (idEpreuve)
• contratDirecteur (idEquipe) ; • participer (idEpreuve)
• coureur (nationalite) • pays (idPays)
• epreuve (idEpreuve) • resultatEtape (idEpreuve)
• equipe (idEquipe, nationalite)

Pour chaque table, il nous suffit de modifier le type. L’exemple suivant nous montre TP 2
l’instruction qui nous permet de modifier les types des colonnes "idEquipe" et "nationa-
lite" de la table "equipe". Inspirez-vous-en pour modifier toutes les tables : Optimisation
par les contraintes
de la base
ALTER TABLE equipe
"Tour de France"
ALTER COLUMN idEquipe TYPE id_cyclisme,
ALTER COLUMN nationalite TYPE id_cyclisme ; Page 33

6. Gestion de l’intégrité référentielle


Nous allons, ici, faire en sorte que la modification de l’identifiant d’une épreuve soit non
seulement possible, mais aussi automatiquement répercutée sur les tables contenant des
références. Pour cela, il faut configurer les clés étrangères des tables filles afin que l’ac-
tion réalisée sur l’événement "ON UPDATE" soit "CASCADE" et non plus "NO ACTION".

8 2949 TP PA 00
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la contrainte "fk_epreuve" de la table "etape" et
choisissez "Supprimer" :

• Cliquez ensuite avec le bouton droit sur la partie "Contraintes" de la table "etape"
et choisissez " Ajouter un objet X Ajouter une clé étrangère" :


TP 2

Optimisation
par les contraintes
de la base
"Tour de France"

Page 34

• Nommez cette contrainte "fk_epreuve" puis dans l’onglet "Définition" choisissez


"epreuve" dans le menu déroulant "Références". Dans l’onglet "Colonnes", choi-
sissez "idEpreuve" dans le menu déroulant "Colonne locale". Et enfin, dans l’onglet
"Action", choisissez l’action "CASCADE" pour l’événement "Lors d’une mise à jour"
et validez avec "OK" :

8 2949 TP PA 00


TP 2

Optimisation
par les contraintes
de la base
"Tour de France"

Page 35

Deux remarques :
• Cette modification n’est pas la seule à apporter. Il y a les tables “participer” et
“resultatEtape” qui s’appuient également sur la clé étrangère “idEpreuve” (direc-
tement pour “participer” et indirectement pour “resultatEtape”). Vous allez donc
devoir modifier également les clés étrangères dans ces 2 tables.
• Dans un environnement de production, ces manipulations “telles quelles” seraient,
bien évidemment, à proscrire. Dès lors que vous avez supprimé une contrainte de
clé étrangère, vous avez mis la base de données en péril. En effet, le temps que vous
reconstruisiez la nouvelle clé, la base a pu recevoir des données incohérentes…
Comment opérer lorsque l’on doit faire ce genre de manipulation ?
– Soit vous coupez les accès à la base de données (on débranche le câble réseau,
on ajoute temporairement une règle de pare-feu…).
– Soit vous faites vos opérations de suppression/création au sein d’une transac-
tion. Cette dernière solution est sans aucun doute celle à privilégier, et c’est
celle que nous verrons plus loin !

8 2949 TP PA 00
Mise en place avec SQL
Comme cela vient d’être dit, la suppression d’une contrainte de clé étrangère est loin
d’être anodine. Dans un environnement de production, il peut en résulter de terribles
conséquences. C’est pourquoi nous allons travailler ici avec des transactions :
START TRANSACTION ;
ALTER TABLE etape
DROP CONSTRAINT fk_epreuve ;
ALTER TABLE etape
ADD CONSTRAINT fk_epreuve FOREIGN KEY (idEpreuve)
REFERENCES epreuve (idEpreuve)
ON UPDATE CASCADE
ON DELETE NO ACTION ;
COMMIT;

Il suffit ensuite de vous inspirer de cette transaction pour procéder au remplacement des
contraintes de clés étrangères dans les tables "participer" et "resultatEtape". D’ailleurs,
rien ne nous empêche de tout faire au sein d’une même transaction :
START TRANSACTION ;
ALTER TABLE participer
DROP CONSTRAINT fk_participer_epreuve ;
ALTER TABLE participer
TP 2 ADD CONSTRAINT fk_participer_epreuve
FOREIGN KEY (idEpreuve)
Optimisation
par les contraintes REFERENCES epreuve (idEpreuve)
de la base ON UPDATE CASCADE
"Tour de France"
ON DELETE NO ACTION ;
ALTER TABLE resultatetape
Page 36
DROP CONSTRAINT fk_etape ;
ALTER TABLE resultatetape
ADD CONSTRAINT fk_etape
FOREIGN KEY (idEpreuve, idEtape)
REFERENCES etape (idEpreuve, idEtape)
ON UPDATE CASCADE
ON DELETE NO ACTION ;
COMMIT;
Dès lors, plus rien ne nous empêche de modifier l’identifiant du "Paris-Nice" de "PNC"
en "PNI". Vous pouvez d’ailleurs faire le test, soit via pgAdmin en modifiant directe-
ment l’identifiant dans l’éditeur de données (7e icone en forme de tableau), soit à l’aide
de l’instruction suivante :
UPDATE epreuve
SET idEpreuve = 'PNI'
WHERE idEpreuve = 'PNC' ;
Cette modification aura bien pour résultat la modification "en cascade" de toutes les
tables "filles" !

8 2949 TP PA 00
7. Et Win Design dans tout ça ?
Maintenant que vous comprenez l’objectif des contraintes, vous devez prendre
conscience que ces contraintes doivent être prises en compte dès les premières étapes
d’analyse et, donc, dès la conception du schéma conceptuel des données. Voici quelques
pistes qui devraient vous permettre d’intégrer les contraintes "métiers" dès les premières
esquisses conceptuelles.
• Prenons le cas du schéma conceptuel du Tour de France :

• Il suffit ensuite d’accéder aux attributs et types de la table "COUREUR", de sélec-


tionner la propriété sur laquelle on souhaite poser une contrainte (ici, "codeUCI")
et d’appuyer sur le bouton "Domaine de valeurs". Puis sur le bouton "Règles". Il
faut ensuite définir la contrainte (ici, "chk_codeUCI") et appuyer sur le bouton
"Composition". Dans l’onglet "Propriétés", il faut ajouter les propriétés qui vont
servir dans la contrainte. Et enfin, dans l’onglet Description, c’est là que l’on va
décrire la contrainte au niveau conceptuel (c’est-à-dire avec nos mots, il n’y a rien
d’orienté "technologie" à ce niveau) : TP 2

Optimisation
par les contraintes
de la base
"Tour de France"

Page 37

8 2949 TP PA 00
• À la génération du modèle logique, il suffit ensuite de se rendre de nouveau au
même endroit pour définir "techniquement" la contrainte, c’est-à-dire dans le
langage du SGBDR ciblé (puisque la génération du script SQL est l’étape suivante) :

• À l’étape suivante (il ne faut pas oublier de cocher la case qui concerne les
TP 2 contraintes dans les options de génération), on peut voir que la contrainte a bien
été intégrée au script SQL :
Optimisation
par les contraintes
de la base
"Tour de France"

Page 38

8 2949 TP PA 00
Et ça, c’est juste une infime partie des possibilités qu’offre un outil comme Win Design !

Encore une fois, l’important pour vous est avant tout de prendre l’habitude de manipuler
les outils. Que ce soit Win’Design, pgAdmin ou directement le SQL, rien ne s’obtient sans
pratique. C’est pourquoi je vous invite à travailler régulièrement sur ces outils et à chercher
à acquérir le maximum de savoir-faire. Soyez curieux, et recherchez toujours la manière
d’optimiser vos productions si vous voulez acquérir le maximum de compétences.

TP 2

Optimisation
par les contraintes
de la base
"Tour de France"

Page 39

8 2949 TP PA 00

Vous aimerez peut-être aussi