Vous êtes sur la page 1sur 67

Support de cours DELPHI

Enseignante Mme DJIDEL

Institut National De Formation Professionnelle Pins


Maritimes Annexe Ruisseau

Mme DJIDEL

support de cours DELPHI

Table des matires


Cration de la base de donnes-------------------------------------------------------------------------------------------3
Cration d'un programme exploitant une base de donnes dj cre l'aide de l'expert fiche base
de donnes : -------------------------------------------------------------------------------------------------------------------6
(sans l'aide de l'expert fiche base de donnes) --------------------------------------------------------------------- 10
Modifier le contenu des champs par programmation. ------------------------------------------------------------ 13
Se dplacer dans une base de donnes; ------------------------------------------------------------------------------ 15
Cration d'un index secondaire; tri de la base ---------------------------------------------------------------------- 17
Faire une recherche dans une base de donne --------------------------------------------------------------------- 20
Filtrer une base de donnes --------------------------------------------------------------------------------------------- 22
Utilisation d'un DataModule --------------------------------------------------------------------------------------------- 23
Lier deux tables Relation matre-dtail ou relation un--plusieurs entre deux tables-------------------- 25
Que veut on faire ?--------------------------------------------------------------------------------------------------- 25
Cration des 2 tables :----------------------------------------------------------------------------------------------- 25
Utilisation d'un DataModule------------------------------------------------------------------------------------------ 26
Connexions nos tables ----------------------------------------------------------------------------------------------- 26
Liaison des deux tables------------------------------------------------------------------------------------------------- 28
Faisons le point sur l'architecture--------------------------------------------------------------------------------- 30
Test du programme -------------------------------------------------------------------------------------------------- 30
Utilisation d'une liste de choix pour rentrer une donne--------------------------------------------------------- 32
Le DBCombobox----------------------------------------------------------------------------------------------------- 32
Indiquer le contenu de la liste droulante du DBComboBox ---------------------------------------------- 32
Indiquer la table et le champ modifier ------------------------------------------------------------------------ 34
Le DBLookUpComboBox ou comment remplir la liste l'aide d'une table --------------------------- 34
Cration de la table -------------------------------------------------------------------------------------------------- 34
Indiquez le contenu de la liste droulante du DBLookUpComboBox.---------------------------------- 36
Indiquez la table et le champ de cette base qui doivent tre modifis suite au choix dans cette liste
droulante. ------------------------------------------------------------------------------------------------------------- 36
Quelle valeur s'affiche dans le DBLookUpCombobox ? --------------------------------------------------- 36
Trier, filtrer, la liste de choix -------------------------------------------------------------------------------------- 37
SQL Structured Query Language ---------------------------------------------------------------------------------------- 38
Construction d'un exemple----------------------------------------------------------------------------------------- 39
Modification de la requte SQL l'excution. Requtes paramtres SQL. -------------------------------- 43
Solution pour adapter la requte SQL une entre utilisateur sans utiliser les requtes SQL
paramtres. ----------------------------------------------------------------------------------------------------------- 43
1

Mme DJIDEL

support de cours DELPHI

Utilisation des requtes paramtres.---------------------------------------------------------------------------- 44


Utilisation du composant TDataBase ---------------------------------------------------------------------------------- 46
Utilisation : ------------------------------------------------------------------------------------------------------------ 47
Exemple : Suppression de la demande de mot de passe ---------------------------------------------------- 48
Utilisation d'une base ACCESS l'aide de ODBC + BDE. ----------------------------------------------------------- 49
Dclaration de la base de donne dans l'ODBC :------------------------------------------------------------- 49
Utilisation d'une base ACCESS l'aide d'ADO.----------------------------------------------------------------------- 52
Connexion de la base : ---------------------------------------------------------------------------------------------- 52
Test de la connection ------------------------------------------------------------------------------------------------ 53
Utilisation des composants DbExpress pour lire une base MySQL (D6 et plus). ---------------------------- 54
Introduction : ---------------------------------------------------------------------------------------------------------- 54
Lecture d'une base MySQL existante : ----------------------------------------------------------------------------- 54
Connexion la base :------------------------------------------------------------------------------------------------ 54
Connection d'un ensemble de donnes (DataSet) l'aide d'un SQLClientDataSet------------------- 56
Accder aux donnes. ----------------------------------------------------------------------------------------------- 57
Testez.------------------------------------------------------------------------------------------------------------------- 57
Rendre les donnes modifiables. --------------------------------------------------------------------------------- 58
Nota :-------------------------------------------------------------------------------------------------------------------- 58
Questions a qui a une rponse... :--------------------------------------------------------------------------------- 59
Utilisation de QuickReport pour faire des impressions d'lments d'une base de donnes.------------ 60
Introduction : ---------------------------------------------------------------------------------------------------------- 60
Un premier programme --------------------------------------------------------------------------------------------- 60
Aller plus loin avec QuickReport -------------------------------------------------------------------------------- 62
Utilisation d'Excel comme base de donnes. ------------------------------------------------------------------------ 64
Introduction : ---------------------------------------------------------------------------------------------------------- 64
Constitution de notre base : ---------------------------------------------------------------------------------------- 64
Accs notre base par Delphi : ----------------------------------------------------------------------------------- 66

Mme DJIDEL

support de cours DELPHI

Cration de la base de donnes


dernire mise jour le : mercredi 30 octobre 2002

Ce premier programme va tre fait en deux temps :

Cration de la base de donnes elle mme


Cration du programme Delphi permettant de voir, ajouter, supprimer des
lments de la base. Cette cration se fera l'aide de l'assistant Expert fiche
base de donnes.

Cration de la base de donnes


Choisir dans le menu : Outils / Module base de donnes. Le module de
gestion de base de donnes se charge. (Dans Delphi 2 ouvrir directement le
module base de donnes partir du menu dmarrer de windows).

Cration d'un alias:


Un alias sera quivalent un chemin. Par exemple, on peut dfinir que TEST sera
quivalent c:\basededonnees\mabase
Dans le module de gestion de base de donnes, faire Outils / Gestionnaire d'alias
puis cliquez sur le bouton Nouveau

Mme DJIDEL

support de cours DELPHI

Dans la case Alias de la base, entrez TEST, puis cliquez sur parcourir pour
entrer le chemin d'accs. Cliquez alors sur provisoire puis sur enregistrer
sous sans rien changer pour enregistrer le changement (l'ajout de l'alias).

Cration de la table :

Faire Fichier / Nouveau / Table puis choisir Paradox 7


Entrez alors la composition des champs telle que dans cette image :

Les types reprsentent les types des valeurs associes aux champs ex: A comme
alphabtique ou N comme numrique. Vous pouvez voir tous les types disponibles
en cliquant avec le bouton droit dans la colonne Type. Le type + permet une
4

Mme DJIDEL

support de cours DELPHI

incrmentation numrique automatique. Dans notre exemple, ce champ servira


d'index primaire (cl) notre base. Ce champ permet de distinguer les
enregistrements les uns des autres. Par dfaut la base sera trie selon cette cl.
Double cliquez dans la colonne index ligne Num pour dire que Num est un index.
La taille reprsente le nombre de caractres que pourra avoir le contenu des champs
( ex: ici, les noms pourront tre rentrs sur maximum 15 caractres).

Faire enregistrer sous puis dans alias, choisir TEST. Donner un nom votre
base ex: annuaire0. Sauver.
Vous pouvez sortir du module de gestion de base de donnes.

Voil, votre base de donnes est cre. Il nous reste l'exploiter.

Mme DJIDEL

support de cours DELPHI

Cration d'un programme exploitant une


base de donnes dj cre l'aide de
l'expert fiche base de donnes :
dernire mise jour le : mercredi 30 octobre 2002

Votre base de donnes doit dj tre cre. Si ce n'est pas le cas, cliquez ici

Dans le menu de Delphi, faire Fichier / Nouveau. Dplacer les onglets l'aide des
petites flches pour aller chercher l'onglet "Affaires". Pour Delphi 2, dans le menu
de delphi faire Base de donnes / Expert fiche.

Une boite de dialogue s'ouvre vous demandant "Quelle type de fiche voulez vous
que l'expert cre ?

Laissez les rponses par dfaut (crer une fiche simple et crer une fiche avec
TTable). Cliquez sur suite.

Mme DJIDEL

support de cours DELPHI

Dans la case Lecteur ou nom d'alias, choisissez l'alias que nous avons cr
("TEST"). Cliquez alors sur le nom de votre table (annuaire0.db). Cliquez sur suite.

Vous devez alors indiquer quels sont les champs de la base que vous souhaitez
utiliser. Vous pouvez les slectionner tous en cliquant sur le bouton ">>". Cliquez
sur suite.
Choisissez alors une disposition pour les champs

Mme DJIDEL

support de cours DELPHI

Horizontalement ou

Verticalement ( choisir pour avoir des rsultats


similaires dans la suite de l'exemple) ou

Dans une grille.


Faire "suite"

Choisir si vous voulez les libells gauche ou droite (pour l'exemple : prendre
gauche)
Faire "suite" puis terminer en laissant coch "gnrer une fiche matre" et pour
gnration de fiche : "fiche seulement".
Delphi vous a gnr une fiche :

Votre programme est termin !!


Lancez le avec F9 Vous remarquerez que vous n'avez pas le droit de modifier le
champ NumOrdre. Ce champ (rappelez vous il est en auto incrmentation), est en
lecture seule.

Ce que Delphi a fait automatiquement pour vous :

Mme DJIDEL

support de cours DELPHI

Delphi a plac un composant TTable


sur la fiche. Ce composant
nous donne un accs notre base de donnes. Sa proprit
DataBaseName contient notre alias TEST et sa proprit TableName
contient le nom de notre base de donnes (annuaire0.db).

Delphi a galement insr un Composant TDataSource


Ce
composant sert de canal (d'intermdiaire) entre le composant TTable
et d'autres composants. Ces derniers permettent par exemple de
visionner le contenu de la table. Ce sont par exemple les TDBEdit et
TDBNavigator.Sa liaison avec le composant TTable est matrialis
par sa proprit DataSet que Delphi a rempli pour vous avec le nom
de votre composant TTable c'est dire "Table1"

Delphi a insr autant de TDBEdit


que de champ. Il les a
nomms Edit suivi du nom du champ. Les TDBEdit sont relis au
TDataSource par l'intermdiaire de leur proprit DataSource. Delphi
a rempli cette proprit pour vous (en y crivant "DataSource1" qui
est le nom de notre TDataSource). Delphi a galement rempli la
proprit DataField avec le nom du champ de notre base de donnes
dont le contenu sera afficher dans le TDBEdit.

Delphi a insr un composant


TDBNavigator
ce composant permet
de se dplacer parmi les enregistrements de la base de donnes et
mme d'en ajouter ou d'en retirer. Ce composant est galement reli
notre base de donnes par l'intermdiaire de sa proprit DataSource
qui doit contenir le nom d'un TDataSource (ici : "DataSource1").

Mme DJIDEL

support de cours DELPHI

Exercice pratique : rajoutez sur la fiche un DBGrid (Onglet


ContrleBD de la barre des composants de Delphi) Entrez
DataSource1 dans sa proprit DataSource. Vous avez ainsi cr le
pont entre le DBGrid et votre base de donnes. Observez : si vous
mettez la proprit Active de votre Table1 true, vous voyez
immdiatement le contenu de votre base de donnes sous forme d'un
tableau dans le DBGrid ! Lancez votre programme ...

A ce stade, votre programme doit ressembler ce source.

(sans l'aide de l'expert fiche base de


donnes)
dernire mise jour le : dimanche 26 aot 2001

Votre base de donnes doit dj tre cre. Si ce n'est pas le cas, cliquez ici
Rappelez-vous le schma vu la leon prcdente :

Dans l'onglet AccsBD, prenez un composant Table


et placez le sur
votre fiche (Form1). Ce composant nous donne un accs notre base de
donnes.

Entrez dans sa proprit DatabaseName le nom de votre


alias
(TEST si vous avez suivi la cration de la base
tel que dcrite dans ce tutorial).

10

Mme DJIDEL

support de cours DELPHI

Dans sa proprit TableName, entrez le nom de votre


table

Rendez actif le composant Table1 en mettant sa proprit Active "True"

Toujours dans l'onglet AccsBD, prenez un composant DataSource


et
placez le sur votre fiche. Ce composant sert de canal (d'intermdiaire) entre
le composant TTable et d'autres composants. Ces derniers permettent par
exemple de visionner le contenu de la table. Ce sont par exemple les
TDBEdit et TDBNavigator.

Entrez "Table1" dans sa proprit DataSet


assure sa liaison avec le composant Table.

. Cela

Il faut maintenant ajouter les composants qui vont nous permettre de


visualiser et modifier notre base de donnes.

Dans l'onglet ContrleBD, prenez un composant DBNavigator

et

placez le sur la fiche.


ce composant permet
de se dplacer parmi les enregistrements de la base de donnes et mme d'en
ajouter ou d'en retirer.

Reliez ce ContrleBD notre DataSource en affectant DataSource1 sa


proprit DataSource

Toujours dans l'onglet ContrleBD, prenez un composant DBEdit


et
placez le sur la fiche. Affectez sa proprit DataSource
DataSource1
et sa proprit DataField au nom de
l'un des champs de notre base de donnes par exemple
"Nom"

Refaire la mme manip avec deux autres DBEdit et ce, pour les autres
champs de notre base (NumOrdre, Prnom et Age).

11

Mme DJIDEL

support de cours DELPHI

Votre programme est termin !!


Lancez le avec F9. Vous remarquerez que vous n'avez pas le droit de modifier le
champ NumOrdre. Ce champ (rappelez vous il est en auto incrmentation), est en
lecture seule.

Exercice pratique : rajoutez sur la fiche un DBGrid (Onglet ContrleBD de la


barre des composants de Delphi). Entrez DataSource1 dans sa proprit
DataSource. Vous avez ainsi cr le pont entre le DBGrid et votre base de donnes.
Lancez votre programme. Le DBGrid reprsente votre base sous forme d'un
tableau.

12

Mme DJIDEL

support de cours DELPHI

Modifier le contenu des champs par


programmation.
dernire mise jour le : samedi 18 mars 2000

Reprenez l'exemple cr prcdemment l'aide de l'expert (avec ajout du DBGrid)


ou tlchargez le ici (ce source ne peut marcher que si vous avez cr votre base de
donnes conformment la leon 1)
Il existe deux faons d'accder (lire ou crire) au contenu des champs: par le n du
champ ou par son nom.

Accs par le n du champ


Les objets TTable possdent un tableau de champs Fields. Attention, ce tableau
commence l'indice 0.
Dans notre exemple, si on fait UneVariable:=Table1.Field[0].AsString Une
Variable contiendra la valeur du premier champ.
AsString est une proprit qui permet de convertir le type natif du champ en string..
Il existe AsInteger, AsFloat, AsBoolean, AsCurrency, AsDateTime et AsVariant.
Si on met par exemple UneVariable:=Table1.Field[0].AsFloat et si le champ
contient un string, cela dclenche une exception.

Si ce n'est dj fait : dans la clause uses de la Form2, ajoutez l'unit Dialogs (pour
pouvoir utiliser un ShowMessage)
Ajouter un bouton votre projet. Implmentez sa mthode OnClick avec la ligne
suivante:
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(Table1.Fields[0].AsString);
end;
Lancez votre programme pour le tester...

Par la mme mthode, vous avez un accs en criture. Ajoutez un bouton et


implmentez sa mthode OnClick avec les lignes suivantes:
procedure TForm2.Button2Click(Sender: TObject);
begin
Table1.Edit;
Table1.Fields[0].AsString:= 'coucou';

13

Mme DJIDEL

support de cours DELPHI

end;

Table1.Edit permet de se mettre en mode Edition. C'est indispensable pour pouvoir


modifier un champ.
Lancez votre programme pour le tester...
L'inconvnient de cette mthode est qu'il faut connatre l'emplacement des champs.
Si on modifie l'ordre des champs, notre programme ne fonctionnera plus
correctement. il est donc prfrable d'accder par le nom du champ.

Accs par le nom du champ


La fonction FieldByName nous permet un accs par le nom du champ :
function FieldByName(const FieldName: string): TField;

Cette fonction nous permet d'accder directement aux proprits et mthodes


spcifiques d'un champ dont on connat le nom.
On peut donc modifier l'implmentation de l'vnement OnClick de notre premier
bouton:
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(Table1.FieldByName('Nom').AsString);
end;

et l'implmentation de l'vnement OnClick de notre second bouton :


procedure TForm2.Button2Click(Sender: TObject);
begin
Table1.Edit;
Table1.FieldByName('Nom').AsString:= 'coucou';
end;

Lancez votre programme pour le tester...

14

Mme DJIDEL

support de cours DELPHI

Se dplacer dans une base de donnes;


dernire mise jour le : samedi 29 janvier 2000

Se dplacer dans la base


Reprenez l'exemple cr prcdemment l'aide de l'expert (avec ajout du DBGrid)
ou tlchargez le ici (ce source ne peut marcher que si vous avez cr votre base de
donnes conformment la leon 1)
Le but de cette leon est de dcouvrir les procdures qui servent se dplacer dans
une base de donnes sans passer par le composant DBNavigator.
Le composant TTable dispose de plusieurs mthodes permettant de se dplacer
dans la base:
First

Va au premier enregistrement

Last

Va au dernier enregistrement

Prior

Se place l'enregistrement prcdent

Next

Se place l'enregistrement suivant

MoveBy(I)

Se dplace de I enregistrement. Si I>0 on se dplace vers la fin de la base sinon


vers le dbut.

Par exemple, sur votre fiche, ajoutez un bouton. Affectez sa proprit caption
First. Double cliquez dessus afin d'implmenter l'vnement OnClick ainsi :
procedure TForm2.Button1Click(Sender: TObject);
begin
Table1.First;
end;

Rajoutez d'autres boutons afin de tester les autres mthodes. Pour la mthode
MoveBy, ajouter un TEdit afin de pouvoir faire varier le I.
A ce stade, votre projet doit ressembler ceci : source du projet. (ce source ne peut
marcher que si vous avez cr votre base de donnes conformment la leon 1)

Se dplacer dans la base de donnes afin d'effectuer un traitement dans un


champ
15

Mme DJIDEL

support de cours DELPHI

Les modes de dplacement expliqus ci-dessus permettent galement d'examiner


tous les enregistrements afin d'en effectuer un traitement.
Exemple: Nous allons mettre en majuscule tous les caractres des champs Nom.
Pour cela, nous allons nous servir en plus des mthodes ci dessus, des mthodes
suivantes:

DisableControls

Permet de rendre inactif les contrles branchs


cette table (acclre donc le traitement en vitant
des affichages inutiles dans nos DBEdit etc.

EnableControls

Les remet actifs

EOF

(End Of File) renvoie true si la table est vide, aprs


un appel Last ou si un appel la mthode Next
choue du fait que l'on est dj au dernier
enregistrement. c'est ce dernier point qui nous
intresse dans notre exemple. (Il existe aussi BOF:
Begin Of File)

Edit

Place notre table en mode dition

FieldByName('NomChamp').AsString; Voir la leon consacre ce sujet

Ajoutez sur votre fiche un bouton. Implmentez sa mthode OnClick :


procedure TForm2.Button6Click(Sender: TObject);
begin
Table1.DisableControls;//rend inactif les contrles
try
Table1.First; // se place sur le premier enregistrement
while not Table1.EOF do
begin
Table1.Edit; // se place en mode dition;
Table1.FieldByName('Nom').AsString:=AnsiUpperCase(Table1.FieldByName('Nom')
.AsString);
Table1.Next;// va l'enregistrement suivant
end;
finally // le try finally permet d'tre sur que l'on remet les contrles
actifs mme s'il y a une exeption
Table1.EnableControls;// remet actif les contrles
end;

Voil, c'est tout compilez, testez.... le source doit maintenant ressembler ceci : le
source du projet

16

Mme DJIDEL

support de cours DELPHI

Cration d'un index secondaire; tri de la


base
dernire mise jour le : samedi 12 janvier 2002

Reprenez l'exemple cr prcdemment l'aide de l'expert (avec ajout du DBGrid)


ou tlchargez le ici (ce source ne peut marcher que si vous avez cr votre base de
donnes conformment la leon 1)

Par dfaut, votre base de donne est trie dans l'ordre donn par notre index
principal c'est dire dans notre exemple, par n d'ordre.
La cration d'un index vous permettra de trier les enregistrements selon un autre
ordre et de faciliter les recherches au sein de la base de donnes.
Ajout d'un index secondaire
L'ajout d'un index secondaire va se faire partir du Module de base de donnes (le
programme qui nous avait permis de crer notre base de donnes).
Avant de rentrer dans le ce Module de base de donnes, il faut mettre False la
proprit "active" du Table1 de notre programme (si ce n'est pas dj fait) sous
peine de ne pouvoir modifier la base de donnes (car dj prise par notre
application).

Ouvrez le Module de base de donnes (menu Outils / Module base de


donnes) puis icne de gauche "Ouverture d'une table".

Dans la case alias, choisissez TEST et dans Nom choisissez "annuaire0.db".


Choisissez Table / Restructurer. Dans la liste droulante sous "proprits de
la table:" slectionnez "index secondaires".

17

Mme DJIDEL

support de cours DELPHI

Cliquez sur le bouton "dfinir". En utilisant les boutons "flches gauche et


droite", vous pouvez choisir les champs qui seront indexs. Choisissez Nom
et Age comme Champs indexs.

Vrifiez que la case "maintenu" est coche.


Sortez en cliquant sur OK. Donnez par exemple "Index Nom et age" comme
nom d'index.

Trier les enregistrements


Pour trier les enregistrements, il suffit d'affecter

la valeur "Index Nom et Age" la proprit IndexName de notre Table1


ou "Nom;Age" la proprit IndexFieldNames.

Il n'y a pas besoin de compiler le programme pour voir l'effet obtenu : l'effet est
immdiat si la proprit active du composant Table1est true et ce, ds la
modification dans l'inspecteur d'objet. On remarquera que si on affecte une valeur
IndexFieldNames, la valeur de IndexName est mis blanc. Rciproquement si vous
affectez une valeur IndexName, IndexFieldNames est mis blanc.
Nos champs indexs taient dans l'ordre Nom puis Age. Par consquent, le tri
obtenu est un tri selon le nom. Pour les enregistrements ayant le mme nom on a un
tri par ge.

18

Mme DJIDEL

support de cours DELPHI

On peut dfinir plusieurs index secondaires et par consquent obtenir diffrents tris
en fonction de l'index utilis.

On peut, bien sur, affecter ces proprits par programmation.


Exemple : ajouter un bouton et implmentez sa mthode OnClick de la faon
suivante :
procedure TForm2.Button1Click(Sender: TObject);
begin
Table1.indexName:='Index Nom et age';// tri par nom puis ge; utilisation
de indexName
end;

Ajoutez un autre bouton et implmentez sa mthode OnClick de la faon suivante :


procedure TForm2.Button2Click(Sender: TObject);
begin
Table1.IndexFieldNames:='NumOrdre';
//revient au tri donn par l'index principal; utilisation de
IndexFieldNames
end;

A ce stade, votre source doit ressembler : source


Lancez votre programme pour le tester...

19

Mme DJIDEL

support de cours DELPHI

Faire une recherche dans une base de


donne
dernire mise jour le : samedi 12 janvier 2002

Reprenez l'exemple cr dans la leon 6 ou tlchargez son source

Une fonction FindKey et une procdure FindNearest permettent de rechercher un


enregistrement dans une base de donnes.

Pour FindKey comme pour FindNearest, la recherche se fait par rapport au


champ index. Si l'on veut par exemple chercher le premier enregistrement
dont le champ Nom contient DUPONT, il faudra s'assurer que notre base de
donnes est indexe sur le champ Nom avant de dclencher FindKey ou
FindNearest.

FindKey recherche un enregistrement dont le(s) champ(s) correspondant


l'index sont strictement gaux la (aux) valeur(s) passe(s) en paramtre.
Par exemple, si l'on a index l'aide de l'index 'Nom et age':
Table1.FindKey([Edit1.Text]) cherchera l'enregistrement dont la valeur
contenue dans le champ Nom est gale Edit1.Text.
Rappelez vous : Nom et age est un index qui correspond dans l'ordre aux
champs indexes Nom et Age. On peut donc faire une recherche la fois sur
le nom et sur l'age. Table1.FindKey([Edit1.Text,10]) cherchera
l'enregistrement dont la valeur contenue dans le champ Nom est gale
Edit1.Text et dont la valeur du champ age est gale 10.
FindKey est une fonction qui renvoie true si l'enregistrement recherch a t
trouv, false sinon.
Exemple : Dans la clause uses, ajoutez l'unit Dialogs (pour pouvoir utiliser
un ShowMessage) puis placez un bouton et un TEdit (pour pouvoir entrer le
nom) sur votre fiche et implmentez l'vnement OnClick du bouton de la
faon suivante :

procedure TForm2.Button3Click(Sender: TObject);


begin
Table1.indexName:='Index Nom et age';
// ainsi la recherche se fera sur le champ Nom
if not Table1.FindKey([Edit1.Text]) then ShowMessage ('non trouv');
// FindKey recherche l'enregistrement qui contient dans
//le champ Nom le contenu de Edit1

20

Mme DJIDEL

support de cours DELPHI

end;

Pour tester la possibilit de faire une recherche sur le nom et l'age : ajouter un
bouton et deux TEdit (un pour le nom (Edit2) et un pour l'age( Edit3) ) puis
implmentez l'vnement OnClick du bouton :
procedure TForm2.Button4Click(Sender: TObject);
begin
Table1.indexName:='Index Nom et age';
// ainsi la recherche se fera sur le champ Nom
if not Table1.FindKey([Edit2.Text,StrToInt(Edit3.Text)])
then ShowMessage ('non trouv');
// FindKey recherche l'enregistrement qui contient dans
// le champ Nom le contenu de Edit1
end;

FindNearest fonctionne d'une faon similaire FindKey mais il recherche


l'enregistrement le plus proche de la valeur entre. Pour le tester, ajoutez un
bouton et un TEdit puis implmentez son vnement OnClick :

procedure TForm2.Button4Click(Sender: TObject);


begin
Table1.IndexFieldNames:='NumOrdre';
// ainsi la recherche se fera sur le n d'ordre
Table1.FindNearest([StrToInt(Edit4.Text)]);
// FindNearest permet de se placer sur l'enregistrement
//qui correspond au mieux au critre
// ici : que le champ NumOrdre contient la valeur numrique
//crite dans Edit4.Text.
end;

A ce stade, le source doit ressembler ceci : source.

21

Mme DJIDEL

support de cours DELPHI

Filtrer une base de donnes


dernire mise jour le : vendredi 24 aot 2001

Reprenez l'exemple cr dans la leon 6 ou tlchargez son source


Si ce n'est dj fait, mettez la proprit de Table1 True.

Les proprits de TTable permettant de filtrer

La proprit Filtered permet de rendre le filtre oprant. Placez le True


La proprit Filter (de type string) permet de mettre un filtre afin de ne
prendre en compte qu'une partie de la base de donnes.
Par exemple, dans l'inspecteur d'objet, affectez la proprit Filter la chane
de caractre 'D*' et mettez la proprit Filtered True. Vous ne voyez plus
dans le DBGrid que les enregistrements dont le contenu du champ Nom
commence par D. Vous pouvez galement utiliser utiliser des filtres du type :
Nom='D*' or Age=40
La proprit FilterOptions permet d'indiquer si l'on veut tenir compte de la
case (majuscule minuscule). Pour cela, double cliquez sur la proprit puis
mettez True foCaseInsensitive. FilterOptions prend alors la valeur
[foCaseInsensitive].
Si par exemple vous avez mis dans la proprit Filter Nom='d*', le DBGrid
vous affiche tous les enregistrements dont le contenu du champ Nom
commence par D ou par d.

Pour bien comprendre ces notions, vous pouvez tlcharger l'exemple suivant
: source.

22

Mme DJIDEL

support de cours DELPHI

Utilisation d'un DataModule


dernire mise jour le : dimanche 26 aot 2001

A l'utilisation, mettre nos composants servant atteindre nos bases de donnes (les
DataSource, Table ...) sur une ou des form se servant de ces bases peut se rvler
pas tre trs pratique.
Delphi nous permet, si on le dsire, de regrouper tous ces composants non visuel
non pas sur une form mais sur un DataModule. A l'image d'une Form, un
DataModule permet d'y dposer des composants. Le DataModule, contrairement
une Form n'est pas visuel. On ne peut donc y dposer des composants visuels.
Comme pour une Form, A chaque DataModule correspond une Unit.
Concrtement, allez dans fichiers / nouveaux (suivi de autres si vous tes en D6)
puis onglet Nouveaux : choisir Module de donnes

Sur ce DataModule, vous pouvez y placer des DataSource, Table etc...

23

Mme DJIDEL

support de cours DELPHI

Attention, il faut se rappeler que ce DataModule correspond une Unit (par


exemple Unit2).
Pour pouvoir utiliser les composants qui y sont placs partir d'une autre Unit, par
exemple un DBGrid plac sur la form1, il faut placer Unit2 dans la clause Uses de
l'Unit comportant le DBGrid.
uses
Windows, ... Forms, Dialogs, Unit2;

Suite du tutorial sur les DataModule venir (en construction)

24

Mme DJIDEL

support de cours DELPHI

Lier deux tables


Relation matre-dtail ou relation un-plusieurs entre deux tables
dernire mise jour le : samedi 13 octobre 2001

Que veut on faire ?

Supposez la cas suivant :


Vous tes bibliothcaire et vous devez crer un programme qui gre les prts de vos
livres.
Vous avez besoin de connatre en permanence :

Vos clients (coordonns, n de leur carte d'adhrant ...). Ces renseignement


figureront dans une table.
Les mouvements de vos livres (qui les a emprunt, quand, sont ils rendus ...).
Ces mouvements feront l'objet d'une autre table.

Vous souhaitez, lorsque vous consultez les mouvements de vos livres, voir en
mme temps les coordonns de l'emprunteur. Vous voulez donc qu' chaque fois
que vous vous placez sur un enregistrement de la table contenant un mouvements,
la table contenant les clients se place automatiquement sur l'enregistrement
correspondant au client correspondant.
C'est une relation un--plusieurs car un client ne correspondra qu'un seul
enregistrement de la table des clients (c'est en fait un champ index). Par contre, il
peut y avoir plusieurs enregistrements de la table des mouvements qui contiennent
le mme client dans le champ correspondant.

Cration des 2 tables :

Pour les crer, se rfrer au tutorial sur ce sujet en conservant l'alias TEST

Une pour vos clients que l'on nommera Annuaire.

Bien mettre les champ NumClient et Nom en Index

25

Mme DJIDEL

support de cours DELPHI

Une qui stockera les mouvements et que l'on nommera Mouvements

Utilisation d'un DataModule

Pour cet exemple, bien que ce ne soit pas indispensable, nous allons utiliser un
DataModule. Placez le tel que vu dans le tutorial sur ce sujet.

Connexions nos tables

Sur ce DataModule, placez 2 composants Table et 2 composants DataSource


26

Mme DJIDEL

support de cours DELPHI

Entrez le nom de l'Alias de notre base de donn dans le champ DataBaseName de


Table1 et Table2

Faisons pointer Table1 vers la table Annuaire.DB modifiant sa


proprit TableName :

Faisons de mme pour Table2 mais en le faisant pointer vers Mouvements.DB :

Reste "brancher" nos DataSources vers leur table respective.


Affecter Table1 la proprit DataSet de DataSource1

et Table2 la proprit DataSet de DataSource2

Nous avons donc fini de placer les composants qui servent accder nos tables. Il
faut maintenant placer des composants qui nous permettrons de visualiser, modifier
ces tables.
Dans la Form1, placez deux DBGrid (Onglet ContrleBD de la palette de
composants).
Nous allons utiliser leur proprit DataSource pour "brancher" chaque DBGrid vers
leur DataSource respectif. Ils pourront ainsi afficher respectivement les contenus de
la Table 1 et de la Table2.
27

Mme DJIDEL

support de cours DELPHI

Observez la proprit DataSource de l'un deux, Delphi ne nous en propose aucun.


Normal, nos DataSources sont placs l'extrieur de notre Form1.
Dans le uses de l'Unit1, il faut ajouter l' Unit2
uses
Windows, ... Forms, Dialogs, Unit2;

Affecter DataSource1 la proprit DataSource du DBGrid1

et DataSource2 la proprit DataSource du DBGrid2.


Ds maintenant, mettez true la proprit Active de Table1 et Table2, vous devez
voir vos tables (sans doute vides chez vous...). Profitez-en pour lancer votre
programme et commencer remplir la base. Pour la suite de l'exemple, faite
attention ce que les n des clients rentrs dans les mouvements correspondent
un NumClient existant de l'annuaire.

Liaison des deux tables

Affectons DataSource2 la proprit MasterSource de Table1 (ainsi, Table1 est li


DataSource2 qui lui mme est li Table2
Il nous reste dsigner quel champ de Table1 servira de lien avec quel champ de
Table2.
Pour cela, cliquez sur les ... droite de la proprit MasterFields de notre Table1
28

Mme DJIDEL

support de cours DELPHI

Delphi nous affiche gauche les champs index de Table1 et droite, tous les
champs de Table2.

Cliquez sur le champ NumClient de la colonne Champs Dtail et sur NumClient de


la colonne Champs matre, puis sur le bouton Ajouter.

Le lien est fait : un enregistrement de Table2 sera li un enregistrement de Table1


: celui qui a le mme n de client
29

Mme DJIDEL

support de cours DELPHI

A noter que cela a chang les proprits MasterFields et IndexFieldNames de


Table1. MasterFields a pris le nom du champ de Table2 (Client) qui doit tre li
avec le champ de Table1 dsign par la valeur d'IndexFieldNames (NumClient).
Faisons le point sur l'architecture

Table1 et Table2 pointent respectivement vers Annuaire.DB et vers


Mouvements.DB travers leurs proprits DataBaseName et TableName.
DataSource1 et DataSource2 pointent respectivement vers Table1 et Table2
et donc en fait vers Annuaire.DB et Mouvements.DB. Il le font par le biais
de leur proprit DataSet
Table1, et donc en ralit la table Annuaire.DB, sait qu'il a une liaison de
type matre-dtail (ou "liaison un--plusieurs" si vous prfrez) avec la table
Mouvements.DB puisque l'on a plac DataSource2 dans sa proprit
MasterSource.
Table1, et donc en ralit la table Annuaire.DB, sait que le champ
NumClient de la table Annuaire.DB et le champ Client de la table
Mouvements.DB sont lis. Il le sait par l'intermdiaire de ses champs
MasterFields et IndexFieldNames.

Test du programme

Vrifiez que les proprits Active de Table1 et Table2 sont True. Lancez le
programme (F9). A chaque fois que l'on se dplace dans Table2, Table1 se place
automatiquement sur l'enregistrement correspondant. Le DBGrid1 n'affiche plus
que lui.

30

Mme DJIDEL

support de cours DELPHI

31

Mme DJIDEL

support de cours DELPHI

Utilisation d'une liste de choix pour rentrer


une donne
dernire mise jour : samedi 13 octobre 2001

Dans les bases de donnes, il arrive frquemment de vouloir que le choix de


l'utilisateur se limite un certain nombre de possibilits. Si on reprend l'exemple de
notre bibliothque, on ne souhaite pouvoir entrer dans les mouvements (entres,
sorties de livres) que des livres prsents dans notre inventaire. Cela vitera par
exemple de saisir Delphi deux au lieu de Delphi2

Le DBCombobox

Le DBCombobox va nous permettre de rentrer "en dur" la liste de choix par


l'intermdiaire de sa proprit Items.
Reprenez la base de donne vue la leon 10 ou tlchargez la. Le cas chant,
donnez lui "TEST" comme nom d'alias (cf leon 1 pour se rappeler comment on
donne un nom d'alias).
Reprenez le projet construit la leon 10 ou tlchargez le.
Ajoutez un DBCombobox (onglet ContrleBD) sur la form1

Indiquer le contenu de la liste droulante du DBComboBox

Il faut maintenant remplir la liste qui se droulera. Cliquez sur les ... droite de la
proprit Items
et rentrez la liste de livre de votre
inventaire.

32

Mme DJIDEL

Lancez le programme (F9). Cliquez sur


liste de choix se drouler.

support de cours DELPHI

de votre DBComboBox. Vous voyez la

A ce stade, mme si vous slectionnez une valeur, cela ne rentrera rien dans votre
base de donne car on a pas encore indiqu la table et le champ qu'il faudra
modifier. Si vous slectionnez une valeur, le DBComboBox reste
vide
33

Mme DJIDEL

support de cours DELPHI

Il reste vide car ce qu'il affiche est justement la donne du champ de la table
concerne. Pas de table indique => rien d'affich.

Indiquer la table et le champ modifier

Choisissez le DataSource qui correspond la table concerne l'aide de la


proprit DataSource du DBCombobox (ici DataSource2).
Choisissez le Champ concern l'aide de la proprit DataField (ici
LivreEmprunte)

Lancez le programme. Dplacez-vous dans le DBGrid, vous verrez que ce qui


s'affiche dans le DBCombobox est bien la valeur du champ LivreEmprunte de
l'enregistrement courant.
Inversement, vous pouvez modifier la valeur en question par le biais de la liste de
choix du DBCombobox.

La plupart d'entre vous sont en train de se dire que c'est bien gentil tout cela, mais il
va falloir recompiler chaque fois que l'on ajoute un livre dans l'inventaire !
Effectivement, la solution DBCombobox est certainement bien pour rentrer par
exemple "vrai ou faux" ou "oui ou non" et encore, si on a pas de problme de
langue, mais ce n'est certainement pas la bonne solution pour grer notre
bibliothque. La bonne solution est d'afficher le contenu d'un champ d'une table.
C'est le rle du DBLookUpComboBox.

Le DBLookUpComboBox ou comment remplir la liste l'aide d'une table


Cration de la table

Crons une nouvelle table pour notre base de donnes nommes Livres.db
(voir Leon 1) :
Respectez les indications suivantes. Commencez la remplir. Pour gagner du
temps, vous pouvez la tlcharger. Placez bien ce fichier dans le mme dossier que
les autres tables utilises pour ce tutorial (L'alias reste ainsi valide pour cette table)

34

Mme DJIDEL

support de cours DELPHI

La liste droulante du DBLookUpComboBox va tre remplie l'aide d'un champ


de la table livre.

Placez un TTable (qui se nommera Table3) et un DataSource (DataSource3)


sur notre DataModule.
Connectez Table3 la Base TEST
en choisissant la
Table Livre
Connectez le DataSource3 Table3 par l'intermdiaire de sa proprit
DataSet.
Mettez la proprit Active du Table3 True.

Placez un DBLookUpComboBox (onglet ContrleBD) sur la


Form1.
Ce composant est l'quivalent d'un DBComboBox,
mais il permet de remplir la liste droulante partir d'une table.

35

Mme DJIDEL

support de cours DELPHI

Indiquez le contenu de la liste droulante du DBLookUpComboBox.

Indiquez au DBLookUpComboBox qu'il doit remplir sa liste l'aide des


donnes que lui fournira le DataSource3 : Modifiez la proprit ListSource
du DBLookUpComboBox
Indiquez le ou les champ afficher dans la liste droulante l'aide de sa
proprit ListField.
Ici, par exemple, on verra
les champ NumLivre et NomLivre. (Sparer les champ par un ";").
Il faut maintenant indiquer quel champ sera transmis suite la slection par
l'utilisateur d'un lment dans la liste droulante :

Indiquez la table et le champ de cette base qui doivent tre modifis suite au choix dans cette
liste droulante.

Exactement de la mme faon que pour le DBCombobox, indiquez quel


champ de quelle Table doit recevoir cette donne.
.
Le champ point par DataField doit tre du mme type que le champ point
par KeyField.

Lancez le programme, testez.

Actuellement, la liste droulante apparat ainsi :


On voit bien, dans la liste, les champs NumLivre et NomLivre.
Ce qui s'affiche dans le DBLookUpComboBox
est le
premier des champs dcrits par la proprit ListField et donc le champ NumLivre.
Il est probable que vous prfreriez voir le nom du livre et non un simple numro.

La proprit ListFieldIndex permet d'indiquer lequel des champs points par


ListField doit s'afficher dans cette partie. 0 affichera le premier (ici
NumLivre) 1 affichera le 2 (ici NomLivre) etc... Pour continuer l'exemple,
entrez 1 dans cette proprit ListFieldIndex.

Quelle valeur s'affiche dans le DBLookUpCombobox ?

Ce qui est affich dans


est l'lment de la liste
droulante qui a une valeur telle que, pour l'enregistrement en cours, son champ
36

Mme DJIDEL

support de cours DELPHI

point par KeyField est gal la valeur du champ point par ListField. En d'autres
termes, si vous vous dplacez dans votre DBGrid, vous ne verrez une valeur
s'afficher dans
que si le nom du livre contenu dans
l'enregistrement en cours du DBGrid existe dans la liste droulante du
DBLookUpComboBox.
Petite exprience : si vous avez suivi le cours depuis le dbut sans rien modifier,
vous avez la possibilit de rentrer dans la table "Livres" des noms de livres de 30
caractres alors que dans le champ "LivreEmprunte" de la table "Mouvements",
vous tes limit 15 caractres. Lancez le programme, et slectionnez dans la liste
droulante un nom de livre suprieur 15 caractres. Seulement les 15 premiers
caractres du nom sont pris par la table "LivreEmprunte" et donc seulement les 15
premiers caractres apparaissent dans le DBGrid. Rsultat, on a pas la mme chane
de caractre dans "NomLivre" que dans le champ "LivreEmprunte". On ne verra
donc pas de valeur s'afficher dans le
DBLookUpComboBox
Il est vident que pour un cas rel, il aurait fallu que le nombre de caractres
autoriss pour LivreEmprunte et NomLivre soit le mme.
Il aurait mme mieux valu, dans le champ LivreEmprunte, non pas stocker le nom
du livre mais un numrique correspondant au champ NumLivre de la table Livres.
On aurait alors mis NumLivre dans la proprit KeyField du
DBLookUpComboBox avec toujours LivreEmprunte dans la proprit DataField.

Trier, filtrer, la liste de choix

Pour trier la liste de choix, il suffit d'utiliser un index. Crez par exemple un index
secondaire nomm IndexNomLivre indexant le champ NomLivre (cf leon 6)
affectez IndexNomLivre la proprit IndexName de table3. Si vous relancez le
programme, la liste de choix est trie par ordre alphabtique.
Pour des filtres / tris plus subtils, vous pouvez utiliser un Query au lieu de la table3.
Pour plus d'explications et mieux comprendre les Query : cf Leon 11
Source du programme

37

Mme DJIDEL

support de cours DELPHI

SQL Structured Query Language


dernire mise jour : lundi 15 octobre 2001

SQL est un langage d'interrogation de bases de donnes relationnelles telles que


Oracle, Sybase, Microsoft SQL Server, Access etc...
Le propos de ce tutorial n'est pas de donner une vue exhaustive de ce langage mais
d'indiquer comment utiliser ce langage avec Delphi. Un site de rfrence pour le
langage SQL :http://perso.wanadoo.fr/philippe.notez/sql/sql.htm
Vous pourrez aussi utiliser le constructeur SQL fournis avec Delphi.
Souvenez-vous, une architecture d'accs une base de donnes telles qu'on l'a vue
prcdemment tait de ce style:

Table1 est reli la base de donne par l'intermdiaire de sa proprit


DataBaseName et TableName. Table1 reprsente donc directement une table.
DataSource1 est reli des donnes par l'intermdiaire de sa proprit DataSet.
Les composants tels que les DBGrid qui voudront accder aux donnes le feront au
travers du DataSource.
On vient de voir que SQL est un langage d'interrogation des bases de donnes.
C'est donc un composant qui se "place" entre la base de donnes et le DataSource.
Query1 "reprsente" les donnes au mme titre que Table1 reprsentait des
donnes. DataSource permet de les exploiter; d'y accder.

38

Mme DJIDEL

support de cours DELPHI

En cliquant sur la proprit SQL du Query1, on va pouvoir entrer nos requtes SQL
qui permettront de filtrer joindre etc...

Construction d'un exemple

Dans cet exemple, on considrera que vous avez dj cr votre base de donnes et
que son alias se nomme TEST. La base de donnes utilise est celle de la
leon "lier 2 tables"

Commencez un nouveau projet. Ajoutez-y un DataModule


Placez-y un DataSource et un Query (onglet AccsBD)

39

Mme DJIDEL

support de cours DELPHI

Affectez TEST la proprit DataBaseName de Query1


Affectez Query1 la proprit DataSet de DataSource1. D'o le nouveau
schma
:
Il faut maintenant pouvoir afficher les valeurs que nous renverra la base suite
une requte SQL.
Placez un DBGrid sur la Form1.
Dans l'unit1, dclarez l'Unit2 dans le Uses.
Affectez DataModule2.DataSource1 sa proprit DataSource.
Cliquez droite de la proprit SQL de Query1

Entrez une requte SQL. Par exemple

40

Mme DJIDEL

support de cours DELPHI

qui permettra de slectionner et donc d'afficher via le DBGrid tous les


champs (*) de la table mouvements en filtrant pour ne voir que le client 1002
Pour voir le rsultat, il suffit de mettre la proprit Active du Query1 True.
Rsultat :

Pouvoir modifier les donns d'une table affich par l'intermdiaire d'une reqte SQL

Si vous testez le programme actuel, vous verrez qu' l'excution, il vous est
impossible de modifier les donnes. Pour pouvoir les modifier, il faut mettre la
proprit RequesLive True. Attention, seuls les donnes issu d'une requte SQL
simple pourront tre modifies. En particulier, les requtes faisant appel plusieurs
tables ne permettront pas la modification des donnes.

Version Entreprise uniquement :

Une autre faon de faire pour rentrer les requtes SQL dans la proprit SQLdu
Query1 est de se servir du constructeur SQL. Pour cela, cliquez avec le bouton de
droite sur le composant Query1 puis slectionnez Constructeur SQL.

41

Mme DJIDEL

support de cours DELPHI

Les entres ci-dessus vont nous donner la requte suivante :

42

Mme DJIDEL

support de cours DELPHI

Modification de la requte SQL


l'excution.
Requtes paramtres SQL.
dernire mise jour : samedi 15 dcembre 2001

Retour au sommaire
Reprenons l'exemple du chapitre portant sur le SQL.
Nous avions donner l'exemple de requte :
SELECT client FROM mouvements WHERE livreemprunte="Delphi2"
Cette requte est fixe en dur dans le programme. Il serait souhaitable de pouvoir
permettre par exemple l'utilisateur de rentrer le nom du livre recherch dans un
Edit.

Solution pour adapter la requte SQL une entre utilisateur sans utiliser les requtes SQL
paramtres.

Une des solutions, est de lire par exemple un Edit puis de fabriquer une nouvelle
requte SQL par un simple traitement de chane de caractre du type :
DataModule2.Query1.SQL.Add( 'SELECT * FROM mouvements');
DataModule2.Query1.SQL.Add ('WHERE Upper(LivreEmprunte) LIKE
"'+UpperCase(Edit1.Text) +'%"');

Cette requte affichera les enregistrements de la table mouvements dont le contenu


de Edit1.Text mis en majuscule sera gal au dbut du champ LivreEmprunte mis en
majuscule. Concrtement, si Edit1.Text vaut "delphi", la dernire ligne de la
requte SQL contenu dans Query1.SQL vaudra :
WHERE Upper(LivreEmprunte) LIKE "delphi%");

Par consquent, les livres Delphi 1, Delphi2 etc seront affichs.


Pour tester cet exemple, partez de l'exemple que vous avez construit au chapitre
portant sur le SQL. Ajoutez un bouton sur la fiche puis implmentez son
vnement OnClick comme suit :
procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.Query1.Active:=False;
DataModule2.Query1.SQL.Clear;
DataModule2.Query1.SQL.Add( 'SELECT * FROM mouvements');

43

Mme DJIDEL
DataModule2.Query1.SQL.Add ('WHERE
"'+UpperCase(Edit1.Text) +'%"');
DataModule2.Query1.Active:=True;
end;

support de cours DELPHI


upper(LivreEmprunte) LIKE

Utilisation des requtes paramtres.

Nous allons rentrer, dans la proprit SQL de notre Query, une requte contenant
un paramtre. Il suffira de modifier le contenu de ce paramtre pour avoir une
requte adapte l'entr d'une valeur dans un Edit.
La premire chose faire est de rajouter un paramtre dans la liste des paramtres
de notre Query. Ce paramtre pourra alors tre utilis dans une requte SQL.

Dans la DataModule, cliquez sur le Query puis, cliquez droit sur Params puis
sur Ajouter un lment.

Dans l'inspecteur d'objet, Affectez ParamNomLivre sa proprit Name


Mettez la proprit DataType FtString.

Dans la proprit SQL du Query, entrez :

SELECT *
FROM mouvements
WHERE Upper(LivreEmprunte) LIKE :ParamNomLivre

44

Mme DJIDEL

support de cours DELPHI

Notez les points (:) devant ParamLivre. En SQL, cela indique que ce qui suit est un
paramtre. SQL remplacera, avant d'effectuer la requte, :ParamNomLivre par le
contenu de ce paramtre.
Notre programme n'aura plus qu' s'occuper de changer la valeur du paramtre
ParamLivre (atteignable par Quey1.Param[0] ) pour faire varier la requte SQL.

Pour cela, ajoutez un bouton sur form1 et implmentez sa mthode OnClick


comme suit :

procedure TForm1.Button2Click(Sender: TObject);


begin
DataModule2.Query1.Active:=False;
DataModule2.Query1.Params[0].AsString :=UpperCase(Edit1.Text)+'%';
DataModule2.Query1.Active:=True;
end;

Lancez le programme entre une valeur dans l'Edit, testez...

Sources du programme

45

Mme DJIDEL

support de cours DELPHI

Utilisation du composant TDataBase


Retour au sommaire
Jusqu' prsent, nous utilisions une architecture simplifie dans laquelle les
composants Table pointaient directement sur des tables de la base de donnes par
l'intermdiaire de ses proprits DataBaseName et TableName.
Pour plusieurs raisons, il peut tre judicieux faire pointer les composants TTable
nom pas directement vers 'une base mais par l'intermdiaire d'un composant
TDataBase.
Par exemple, lorsque notre base comporte un grand nombre de table il sera plus
facile de changer d'Alias dans cette nouvelle architecture (une seule proprit d'un
seul composant modifier)

En fait, TDatabase permet, dans une application de base de donnes, de contrler


prcisment la connexion avec une base de donnes base sur le BDE.
Utilisez un objet TDatabase quand une application de base de donnes base sur le
BDE ncessite l'une des options suivantes sur la connexion avec une base de
donnes :

Connexion persistante avec la base de donnes.


Accs personnalis un serveur de bases de donnes.
Contrle des transactions.
Alias BDE spcifique l'application

Il n'y a pas vraiment d'inconvnient l'utilisation de cette architecture. Elle a


l'avantage de faciliter certaines volution de votre programme.
46

Mme DJIDEL

support de cours DELPHI

A noter que pour du SQL, le sghma suivant est tout fait valable :

Utilisation :

Placez les 3 composants suivants sur votre form ou votre DataModule:

Proprits de DataBase1 :

Donnez un "nom de base de donnes" en modifiant la proprit DataBaseName du


composant DataBase1. Ce nom ne correspond pas un alias existant. Ce peut tre
ce que vous voulez, n'importe quelle chane de caractre. Par exemple "toto" ou
"BaseTest". Choisissons pour l'exemple BaseTEST

Indiquez DataBase1 la base de donnes qu'il devra utiliser.

Proprits de Table1

Pour le composant Table1, d'habitude, on entrait directement l'alias de la base dans


sa proprit DataBaseName. Cette fois ci, nous allons rentrer le "nom de base de
donnes" que l'on avait informe pour la proprit DataBaseName du DataBase1
(ici, "BaseTest").
Cliquez droite de la proprit DataBaseName du Table1. Vous verrez qu'il vous
propose de BaseTest.
C'est ainsi que vous crez la jonction entre le Table1 et le DataBase1.

47

Mme DJIDEL

support de cours DELPHI

Il faut, comme d'habitude, lui indiquer la table de cette base que l'on va vouloir
exploiter. Modifier la proprit TableName comme suit :

Proprits de DataSource1

Pas de nouveaut, choisir Table1pour sa proprit DataSet.

Test

Placez par exemple un DBGrid et connectez le DataSource1 en choisissant


DataSource1 dans la proprit DataSource du composant DBGrid1.
Mettez True la proprit Active de Table1 et vous verrez le contenu de votre table
dans DBGrid1.

Exemple : Suppression de la demande de mot de passe

On a vu que le composant TDataBase reprsente la base de donnes. On peut donc


par l'intermdiaire de ses proprits modifier certains comportements. Par exemple,
si on utilise une base Access, on peut faire en sorte qu'il ne nous demande plus le
mot de passe s'il n'y en a pas besoin.
Pour cela, il suffit de mettre la proprit LoginPrompt False.

48

Mme DJIDEL

support de cours DELPHI

Utilisation d'une base ACCESS l'aide de


ODBC + BDE.
dernire mise jour : mardi 16 avril 2002

Retour au sommaire
Une des solutions pour utiliser une base Access est de passer par le BDE et ODBC.
Dclaration de la base de donne dans l'ODBC :

Allez dans le panneau de configuration de Windows (Dmarrer, Paramtre,


Panneau de configuration).

Cliquez sur
Choisissez l'onglet System DSN

Cliquez sur Add, Slectionnez "Microsoft Access Driver (*.mdb)".

49

Mme DJIDEL

support de cours DELPHI

Cliquez sur Terminer.


Entrez un nom dans "Data Source Name" (ici TestOdbcBdeAccess)
Entrez une description (ici Test)
Cliquez sur Select pour choisir votre fichier base de donne (ici test.mdb) et
enfin cliquez sur OK

A partir de cet instant, on en est rammen au cas normal d'utilisation du BDE. En


effet, allez dans l'administrateur BDE (Panneau de configuration/ administrateur
BDE). TestOdbcBdeAccess y est bien prsent.

50

Mme DJIDEL

support de cours DELPHI

51

Mme DJIDEL

support de cours DELPHI

Utilisation d'une base ACCESS l'aide


d'ADO.
Dernire mise jour : mardi 16 avril 2002

Retour au sommaire
Une des solutions pour utiliser une base Access est de passer par ADO.
Connexion de la base :

Placez un composant ADOConnection (Onglet ADO) sur la Form.


Cliquez sur la proprit ConnectionString

Cliquez sur Construire...


Choisissez dans l'onglet fournisseur "Microsoft Jet 4.0 OLEDB
Provider" puis cliquez sur suivant.

Slectionnez votre base de donnes Access.


52

Mme DJIDEL

support de cours DELPHI

Cliquez sur "tester la connexion"


Si vous n'avez pas de mot de passe votre base, placez la proprit
LoginPrompt de votre ADOConnection False. Cela vitera qu'il ne vous
pose la question du mot de passe.

Validez pour sortir.


Vrifiez que la proprit connected de l'ADOConnection est True.
Placez un composant ADOTable
Slectionnez ADOConnection1 pour sa proprit Connection. ADOTable1
est alors reli notre base par l'intermdiaire de ADOConnection1.
Slectionnez le nom de votre table dans sa proprit TableName.
Rendez-le actif via sa proprit Active.
Enfin, placez un DataSource
DataSet

reli notre ADOTable via sa proprit

Test de la connection

Placez un DBGrid
Reliez le la source de donne grce sa proprit
DataSource
Vous devez voir apparatre le contenu de votre Table. Si ce n'est pas le cas,
vrifiez la proprit connected de l'ADOConnection et la proprit Active de
l'ADOTable.

53

Mme DJIDEL

support de cours DELPHI

Utilisation des composants DbExpress pour


lire une base MySQL (D6 et plus).
Retour au sommaire
Introduction :

Bon, j'ai pas mal galr pour russir faire quelque chose qui donne satisfaction.
Les composants DBExpress sont relativement nouveaux pour moi. L'aide n'est pas
trs explicite et je n'ai rien trouv de satisfaisant sur le net. Bref, pas mal de
ttonnements. Il faut donc considrer ce tutorial comme tant en BtaTest. Je suis
preneur de toutes les observations. Je m'interroge en particulier sur 2 trucs (voir en
fin de cette page).

Depuis la version 6 (pro et +), Borland a introduit des composants DbExpress. Ces
composants permettent entre autres d'attaquer des bases MySQL.
Le site http://phidels.com tant entirement bas sur du PHP + MySQL, j'ai voulu
tester la chose.
Pr-requis :

Avoir une version de Delphi qui possde les composants DbExpress (D6 pro
et +)
Avoir MySQL install sur votre poste. Personnellement, je l'avais install via
le "pack" EasyPHP (gratuit) sur http://www.easyphp.org/ Pour tlcharger
uniquement MySQL : http://www.mysql.com/
Avoir cr une base de donnes qui vous servira de support l'exemple
suivant.
Personnellement, pour ce genre de manip, j'utilise phpMyAdmin livr avec
EasyPHP.

Lecture d'une base MySQL existante :


Connexion la base :

Comme d'habitude, on va construire un exemple.


54

Mme DJIDEL

support de cours DELPHI

Ouvrez Delphi, commencez un nouveau projet.


Allez, on va prendre de bonnes habitudes, on va ouvrir un DataModule.
(Fichier, Nouveau, Module de donnes).
Sur ce Module de donnes, placez un composant
SQLConnection.
Dans la "vue arborescente des objets", on voit notre SQLConnection mais
avec un point d'interrogation devant. Normal, il n'est pour l'instant connect

aucune base.
Vrifiez que votre votre serveur MySQL est lanc.

Double cliquez sur votre SQLConnection

Cliquez sur
pour crer une nouvelle connexion
Donnez MYSQL comme nom de pilote. Choisissez un nom pour votre

connexion (ici : testmysql)


Dans le champ Database, placez le nom de votre base de donne (ici
MaBaseMySQL). Il faut se rappeler que le nom d'une base de donnes en
MySQL est en ralit le nom du dossier dans lequel sont placs ses fichiers.
Dans le champ HostName, entrez le nom rseau de l'ordi qui contient la
base. Si c'est l'ordi sur lequel tourne le programme, vous pouvez mettre
localhost comme nom.
Effacez la valeur qui se trouve dans le champ LocaleCode. ( noter qu'un
lecteur m'a fait la remarque suivante : Sans mettre un nom de user, la manip
plante, alors qu'en mettant simplement le user root, la connexion se
fait. Chez moi, pas besoin...

55

Mme DJIDEL

support de cours DELPHI

Cliquez sur

afin de tester la connexion. Vous devez obtenir

A noter que le point d'interrogation a disparu


et que
Delphi a rempli pour vous, entre autres, les champs ConnectionName,
DriverName... de votre SQLConnection.
Si vous n'en avez pas besoin et si vous ne souhaitez pas voir s'afficher la
boite de dialogue demandant l'utilisateur et le mot de passe, mettrez False
sa proprit LoginPrompt.

Connection d'un ensemble de donnes (DataSet) l'aide d'un SQLClientDataSet

Placez un SQLClientDataSet sur le DataModule

Indiquez-lui, via sa proprit DBConnection, qu'il doit utiliser votre


SQLConnection pour se connecter la
base
.
Placez un SELECT dans la proprit CommandText du SQLClientDataSet.
Par exemple : SELECT * FROM unetable
o unetable est une table de votre base.
56

Mme DJIDEL

support de cours DELPHI

Accder aux donnes.

L, on en est un stade dj vu dans les autres tutoriaux BDD :

Placez un DataSource sur notre dataModule et le connecter notre


SQLClientDataSet via sa proprit
DataSet.

Actuellement, le diagramme de nos connexions correspond ceci

Sur votre fiche (Form1) placez un DBGrid et un DBNavigator.


Dans le uses de la form1, ajoutez le nom de l'unit corespondant votre
DataModule2 (Unit2 si vous n'avez rien renomm)
Dans la proprit DataSource du DBNavigator, slectionez votre
DataSource.
Dans la proprit DataSource du DBGrid, slectionez votre DataSource.

Testez.

Vrifiez que la proprit Connected de votre SQLConnection est True. Placez la


proprit Active de votre SQLDataSet True. Vous devez voir vos DBEdit se
remplir.

i vous avez un message d'erreur du style


vrifiez la clef LocaleCode en double cliquant sur le SQLConnection (l'effacer).
Vrifiez galement la valeur de LocaleCode dans la proprit Params du
SQLConnection (l'effacer).

57

Mme DJIDEL

support de cours DELPHI

Pour tre plus propre, et prendre de bonnes habitudes, remettez Connected


du SQLConnection False. Cela fait galement passer la proprit Active du
SQLDataSet False.
Dans l'vnement OnShow de la fiche Form1, placez le code suivant :

procedure TForm1.FormShow(Sender: TObject);


begin
DataModule2.SQLConnection1.Connected:=True;
DataModule2.SQLClientDataSet1.Active:=True;
end;

Rendre les donnes modifiables.

Actuellement, si vous modifiez une donne dans votre DBGrid, vous aurez beau
cliquer sur le V (validation) du DBNavigate, lorsque vous fermez le programme et
que vous l'ouvrez de nouveau, vous voyez que vos modifications n'ont pas t
crites dans la base.
Ajoutez un bouton sur votre fiche. Implmentez son vnement OnClick comme
suit :
procedure TForm1.Button1Click(Sender: TObject);
var MaxErrors:integer;
begin
MaxErrors:=1;
{extrait de l'aide : MaxErrors indique le nombre maximum d'erreurs
tolres
par le fournisseur avant d'interrompre l'opration d'actualisation.
Initialisez MaxErrors 1 pour indiquer qu'il n'y a pas de limite
au nombre d'erreurs.}
{Pour MySQL, ce que l'on m'a dit, MySQL ne tolre qu'une seule
erreur.}
DataModule2.SQLClientDataSet1.ApplyUpdates(MaxErrors);
end;

En cliquant sur le bouton, les lments modifis iront vers la base de donnes.
Nota :

Dans cette configuration, si vous voulez ajouter un DBEdit ou autres DBMemo sur
votre fiche, pour le connecter, il faudra, comme pour le DBGrid, slectionner le
datasource pour sa proprit DataSource. Il faudra aussi slectionner le champ que
vous voulez voir, et ce via sa proprit DataField.
Attention, vous ne pourez voir les champs slectionnables dans la liste de choix et
donc vous ne pourrez slectionner ce champ que si le SQLConnection1.connected
58

Mme DJIDEL

support de cours DELPHI

est true et le SQLClientDataSet1.Active est true (les modifier dans l'inspecteur


d'objet. Une fois la manip faite, les remettre False.)
Questions a qui a une rponse... :

Je l'ai dit au dpart, il faut donc considrer ce tutorial comme tant en BtaTest. Je
suis preneur de toutes les observations. Je m'interroge en particulier sur 2 trucs :

Pourquoi, dans le DBNavigator, lorsque l'on clique sur


d'erreur :

A quoi sert exactement la clef LocalCode ?

, on a un message

59

Mme DJIDEL

support de cours DELPHI

Utilisation de QuickReport pour faire des


impressions d'lments d'une base de
donnes.
Retour au sommaire
Introduction :

QuickReport est un ensemble de composants dits par


qusoft http://www.qusoft.com/ qui permettent d'imprimer des tats issus de vos
bases de donnes. QuickReport est fourni avec les Delphi pro et +

Un premier programme
La page de base. Placer un logo et un titre:

Commencez un nouveau projet,


Placez un composant QuickReport,
Dveloppez sa proprit Bands. Placez HasTitle True.

Une bande apparat en haut de la page du composant QuickReport

Le contenu de cette bande apparatra sur la premire

page de notre rapport.


Placez un TQRLabel dans cette bande. Mettez par exemple 'Titre du rapport'
dans sa proprit Caption. Ajustez comme vous le dsirez sa proprit Color,
Font etc...
60

Mme DJIDEL

support de cours DELPHI

Cliquez avec le bouton droit de la souris sur le QuickRep. Cliquez sur


Prvisualiser.
Pour amliorer votre Premire page, vous pouvez ajouter une image
(typiquement le logo de votre compagnie). Placez un TQRimage dans la
bande. Ajustez sa taille. Choisissez votre image via la proprit Picture et
enfin, placez si besoin sa proprit Stretch true.

Afficher les donnes de la base de donnes.

Nous allons ajouter une bande qui affichera ces donnes. Pour cela,
dveloppez la proprit Bands du QuickRep1 et placez la proprit

HasDetail True.
Il va falloir indiquer cette Bande ce que l'on veut voir y apparatre. Plus
particulirement, les donnes de quelle Table de quelle Base de Donnes.
Pour l'exemple, nous allons utiliser la base de donnes dmo de Delphi.
Placez un composant TTable
sur la Form1. Choisissez l'alias DBDemos
pour sa proprit DataBaseName
et customer.db
pour sa proprit TableName.
.
Placez un QRDBText dans la bande Dtail.

.
Il faut maintenant indiquer que le contenu du QRDBText sera un
enregistrement contenu dans la table. Slectionnez Table1 pour la proprit
DataSet du QRDBText et Company pour sa proprit SataField.

61

Mme DJIDEL

support de cours DELPHI

Faites un clic droit sur le TQuickReport. Slectionnez 'Prview'. Vous

obtenez
On a bien notre image et notre
titre en haut. La bande dtail apparait avec le premier enregistrement de
notre table et pour le champ slectionn (company). La bande se rpte
autant de fois que l'on a d'enregistrement. Dans la prvisualisation, vous
pouvez aller voir toutes le pages.
Entranez-vous formater un peu tout a : On peut jouer sur les couleurs, les
polices, rajouter du texte....

Lancer la prvisualisation et l'impression l'excution

Ajoutons deux boutons : Un pour la prvisualisation et un autre pour


l'impression directe.
Implmentons leurs vnemenyts OnClick ainsi :

procedure TForm1.Button2Click(Sender: TObject);


begin
QuickRep1.Preview;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
QuickRep1.Print;
end;

Testez, a marche...

Aller plus loin avec QuickReport

Double cliquez sur le notre QuickRep1. Vous obtenez la fentre "Paramtres


de l'tat"

62

Mme DJIDEL

support de cours DELPHI

Mettez 2 "nombre de colonnes". Cliquez sur Appliquer puis sur


Prvisualiser. Vous verrez que vos rsultats apparaissent maintenant sur 2
colonnes.
Cochez Bas de page et En-tte de page. Cliquez sur OK. vous verrez que
Delphi vous a ajout 2 bandes. Placez un QRLabel sur chacune de ces
bandes. Donnez une valeur distincte dans leur caption respectif, par exemple
"Bas de page" et "Entete de page". Lancez une prvisualisation. Vous
constatez que vos pages ont maintenant une entte et un pied de page. A
noter que les deux bandes auraient pu tre ajoutes en placant deux QRBand
sur le TQuickRep et en donnant respectivement leur proprit BandType
les valeurs rbPageHeader et rbPageFooter.
Toujours dans la fentre Paramtres de l'tat, cochez En-tte de colonne et
rcapitulatif. Dans chacune des 2 bandes qui viennent d'tre cres, placez
un QRLabel de faon pouvoir voir, l'aide d'une previsualisation ce que
QuickReport en fait. Vous constaterez que l'entte de colonne, comme son
nom l'indique est plac en haut de chaque colonne de chaque page. Le
rcapitulatif est plac la fin du document.

Charger le source de l'exemple

63

Mme DJIDEL

support de cours DELPHI

Utilisation d'Excel comme base de donnes.


Retour au sommaire
Introduction :

Microsoft nous met disposition un Driver ODBC pour Excel. Ne rvons pas, cela
ne va pas remplacer SQL Serveur ou autre. Par contre, cela peut tre trs pratique
pour rcuprer des donnes d'une feuille Excel vers une autre base de donnes.
Constitution de notre base :

Ouvrez une nouvelle feuille Excel et entrez les libells suivants :

Ces libells correspondent des ttes de colonne. Ce sont les nom des champs de
notre table. Les lignes sous cette ligne seront nos enregistrements.

Remplissez la colonne indice (par exemple 1 sur la ligne 1 2 sur la ligne 2


etc..). L'important est de ne pas avoir deux lignes identiques.
Donnez un nom la zone constitue de cette ligne et des lignes en dessous
qui reprsenteront nos enregistrements :
Insertion / Nom / Dfinir

Donnez un nom notre table : ici, TableAnnuaire.

64

Mme DJIDEL

support de cours DELPHI

Sauvez votre Feuille Excel par exemple sous baseexcel.xls.

Dans Dmarrer / Panneau de configuration, cliquez sur


Dans l'onglet "source de donnes utilisateur", cliquez sur "ajouter" et
slectionnez le driver Microsoft Excel Driver:

Cliquez sur "Terminer"


Remplissez les Edit comme suit :

65

Mme DJIDEL

support de cours DELPHI

Cliquez sur Options et dcochez lecture seule


Cliquez sur slectionnez un classeur et indiquez le chemin et le nom de votre
fichier excel.
Cliquez sur OK.

Accs notre base par Delphi :

Pour viter des messages d'erreur, laissez l'Excel ouvert avant de charger et
de lancer l'exemple.
On est maintenant ramen au cas classique d'accs une Base de donnes
par Delphi. Si vous le souhaitez, vous pouvez tlcharger le source de
l'exemple

66