Delphi Bases de Donnees
Delphi Bases de Donnees
Delphi Bases de Donnees
Mme DJIDEL
Mme DJIDEL
Mme DJIDEL
Mme DJIDEL
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 :
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
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.
Mme DJIDEL
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
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
Horizontalement ou
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 :
Mme DJIDEL
Mme DJIDEL
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 :
10
Mme DJIDEL
. Cela
et
Refaire la mme manip avec deux autres DBEdit et ce, pour les autres
champs de notre base (NumOrdre, Prnom et Age).
11
Mme DJIDEL
12
Mme DJIDEL
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...
13
Mme DJIDEL
end;
14
Mme DJIDEL
Va au premier enregistrement
Last
Va au dernier enregistrement
Prior
Next
MoveBy(I)
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)
Mme DJIDEL
DisableControls
EnableControls
EOF
Edit
Voil, c'est tout compilez, testez.... le source doit maintenant ressembler ceci : le
source du projet
16
Mme DJIDEL
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).
17
Mme DJIDEL
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
On peut dfinir plusieurs index secondaires et par consquent obtenir diffrents tris
en fonction de l'index utilis.
19
Mme DJIDEL
20
Mme DJIDEL
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;
21
Mme DJIDEL
Pour bien comprendre ces notions, vous pouvez tlcharger l'exemple suivant
: source.
22
Mme DJIDEL
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
23
Mme DJIDEL
24
Mme DJIDEL
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.
Pour les crer, se rfrer au tutorial sur ce sujet en conservant l'alias TEST
25
Mme DJIDEL
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.
Mme DJIDEL
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
Mme DJIDEL
Delphi nous affiche gauche les champs index de Table1 et droite, tous les
champs de Table2.
Mme DJIDEL
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
31
Mme DJIDEL
Le 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
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
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.
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.
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
35
Mme DJIDEL
Indiquez la table et le champ de cette base qui doivent tre modifis suite au choix dans cette
liste droulante.
Mme DJIDEL
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.
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
38
Mme DJIDEL
En cliquant sur la proprit SQL du Query1, on va pouvoir entrer nos requtes SQL
qui permettront de filtrer joindre etc...
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"
39
Mme DJIDEL
40
Mme DJIDEL
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.
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
42
Mme DJIDEL
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) +'%"');
43
Mme DJIDEL
DataModule2.Query1.SQL.Add ('WHERE
"'+UpperCase(Edit1.Text) +'%"');
DataModule2.Query1.Active:=True;
end;
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.
SELECT *
FROM mouvements
WHERE Upper(LivreEmprunte) LIKE :ParamNomLivre
44
Mme DJIDEL
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.
Sources du programme
45
Mme DJIDEL
Mme DJIDEL
A noter que pour du SQL, le sghma suivant est tout fait valable :
Utilisation :
Proprits de DataBase1 :
Proprits de Table1
47
Mme DJIDEL
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
Test
48
Mme DJIDEL
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 :
Cliquez sur
Choisissez l'onglet System DSN
49
Mme DJIDEL
50
Mme DJIDEL
51
Mme DJIDEL
Retour au sommaire
Une des solutions pour utiliser une base Access est de passer par ADO.
Connexion de la base :
Mme DJIDEL
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
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.
Mme DJIDEL
aucune base.
Vrifiez que votre votre serveur MySQL est lanc.
Cliquez sur
pour crer une nouvelle connexion
Donnez MYSQL comme nom de pilote. Choisissez un nom pour votre
55
Mme DJIDEL
Cliquez sur
Mme DJIDEL
Testez.
57
Mme DJIDEL
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
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 :
, on a un message
59
Mme DJIDEL
Un premier programme
La page de base. Placer un logo et un titre:
Mme DJIDEL
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
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....
Testez, a marche...
62
Mme DJIDEL
63
Mme DJIDEL
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 :
Ces libells correspondent des ttes de colonne. Ce sont les nom des champs de
notre table. Les lignes sous cette ligne seront nos enregistrements.
64
Mme DJIDEL
65
Mme DJIDEL
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