TP : Manipulation de SGBD avec Delphi

Nous allons utiliser Delphi pour manipuler une base de données. L'accès aux bases de données se fait à travers une API nommée Borland Database Engine (BDE) commune à tous les produits de la marque.

Préparer la séance de travail

Mise en place de la base de données.

(1) Lancer le "module Base de données"

(2) Créer les tables correspondant à la gestion d'une bibliothèque (format STANDARD : base PARADOX)

Table Auteurs
NUMERO incrémentation automatique >0, clé primaire
NOM chaîne de caractères de taille 30
   
Table Livres
NUMERO incrémentation automatique >0, clé primaire
TITRE chaîne de caractères de taille 30
AUTEUR index entier sur un élément de la table Auteurs

(3) Remplir quelques champs des bases

Harry Potter, JK Rowling ( de 1 à 4)
Le Seigneur des Anneaux, JR Tolkien
Comment fragger, Anonyme
....

 

(4) Sauvegarder les différentes tables (livres.db, auteurs.db)

 

Administration BDE

(1) Lancer l'administrateur BDE

(2) Avec le menu contextuel du bouton droit, créer un nouvel alias : BIBLIO. (format STANDARD)

(3) Dans la fenêtre de gauche, affiner les propriétés. En particulier, préciser le chemin d'accès à la base (champ PATH)

 

Programme Delphi

Afficher le contenu d'une table

(1) Ouvrir un nouveau projet Delphi

(2) Créer un "Module de Données" (MD)

(3) Associer un composant TTable à chaque table de la base de données.

Le composant se trouve dans le menu "AccèsBD" et doit être posé dans le MD (et non pas sur la fiche). Avec l'inspecteur d'objets, renseigner les champs : DatabaseName, TableName et Name.

Remarque 1 : un composant comme TTable est dit non visuel.

Remarque 2 : si le drapeau ACTIVE est mis à true, la table est ouverte.

(5) Placer des TDataSource qui nous premettront d'afficher les différentes tables. Ce composant non visuel permet de faire une liaison entre la table et un composant visuel qui permet de la manipuler.

Renseigner les champs Name (DSLivresAff, DSAuteursAff) et DataSet (le nom du TTable correspondant)

(6) On s'intéresse maintenant à l'affichage des tables dans une fiche. Placer sur une fiche un composant de type TDBGrid. Renseigner les champs Name (LivresGrid par exemple) et DataSource.

Par défaut, il n'y a rien dans le champ DataSource.Aller dans le menu Fichier->Utiliser une unité et sélectionner le MD. On peut alors choisir parmis les composants TDataSource créés précédemment.

Si la propriété Active du composant TTable a été sélectionnée, le composant TGrid se remplit des infos de la table.

Réaliser une jonction

L'affichage de cette table n'est pas esthétique. On va modifier celui-ci pour voir apparaître non pas un numéro d'auteur mais le nom correspondant de l'auteur. On réalise alors ce que l'on appelle une jonction :

(7) Créer un composant TTable que l'on nommera Jonction. Associer ce composant à la table Livres.

(8) Double-cliquer sur la jonction. Une petite boîte de dialogue apparaît alors. Cliquer avec le bouton droit de la souris pour faire apparaître un menu contextuel. Sélectionner le menu "ajouter champs" et les ajouter tous.

(9) Toujours dans le menu contextuel : choisir "nouveau champ". Dans la boîte qui apparait alors : donner son nom : NOM_AUTEUR, son type : STRING, sa taille : 30, le type de champ : référence, la clé (étrangère pour la table courante) : AUTEUR, le dataset : TableAuteurs, la référence : NUMERO, le résultat : NOM

(10) Créer un Composant TDataSource associé à la jonction destiné à l'affichage de celle-ci. On le nommera DSJonctionAff.

(11) Placer un composant TBGrid sur un formulaire qui affiche la jonction. Il ne reste plus qu'à se débarasser du numéro d'auteur. Pour se faire, double-cliquer sur le composant GRID : on peut alors choisir quels champs afficher : chouette non ????

Modifier la base existante

On va essayer de modifier le titre des oeuvres existantes.

(12) Créer un composant TDataSource nommé DSLivresModif destiné à la modification de la table Livres.

(13) Placer sur un formulaire un composant TDBEdit attaché au champ TITRE de la base livres à travers le composant DS précédemment créé. Le nom du premier enregistrement doit apparaître.

(14) Placer sur le formulaire un composant TDBNavigator correctement initialisé. Lancer le programme...

Faire une requête sur une table avec TQuery

(15) Poser sur le MD un composant TQuery. On doit d'abord renseigner le champ DatabaseName et fixer la propriété active à true.

(16) La propriété SQL du composant contient la requête SQL que l'on veut effectuer sur la base

(16) On peut affihcer le résultat de la requête dans un composant TDBGrid en passant par un composant TDataSource.

Remarque 1 : Le composant TQuery se comporte exactement comme le composant TTable (ils sont à placer au même niveau)

Remarque 2 : Si on veut exécuter la reqête SQL en réponse à un événement, il faut utiliser la méthode ExecSQL sur l'instance de TQuery.

Aller plus loin

Proposer une saisie d'un nouveau livre et du nom de son auteur. Le nom de l'auteur ne sera pas ajouté à la base s'il existe déjà...

Opérations de base en Delphi (par programmation)

Le type TDataSet est le type de base pour les composants des bases de données comme TTable et TQuery. Cette classe propose de nombreuses méthodes pour manipuler une SGBD. Dans la suite, table désigne une instance de TDataSet.

Pour accéder à un champ de l'enregistrement courant du composant, on peut utiliser une commande telle que :
table.fieldByName['NOM']
En général, ce résultat doit être formaté en appliquant directement les méthodes : asString, asBoolean, asInteger, ... Changer la valeur du champ se fait par simple affectation.

On passe en mode édition pour le DataSet avec la méthode edit : table.edit;

Avec la méthode append, on ajoute un nouvel enregistrement en fin du DataSet. Pour valider une mise à jour, on peut utiliser les méthodes refresh ou post. Pour annuler, il suffit d'appeler la méthode cancel.

On se déplace d'enregistrement en enregistrement avec les méthodes prior (précédent), next (suivant), First (premier), last (dernier).

Avec ces informations, on peut réaliser très facilement une fiche qui offre les mêmes fonctionnalités que l'objet TDBNavigator sans celui-ci.