Vous êtes sur la page 1sur 18

Delphi et Interbase

DELPHI et INTERBASE,
Premiers pas

Traditionnellement, Delphi et les bases de donnes font bon mnage. De la dire


que Delphi est loutil idal pour dvelopper des frontaux de bases de donnes, il
ny a quun pas que vous pouvez franchir. En ralit, ce serait une vue assez
restrictive des trs larges possibilits offertes par cet outil de dveloppement.

Bien que le sujet ai t souvent abord, le nombre de personnes qui ont encore
du mal utiliser le couple infernal Delphi et Interbase est assez important si on
en croit la lecture des News Groups sur le sujet. Voici donc une modeste
contribution pour aider tous ceux qui dsirent aborder le sujet pas pas, en
vitant nombres dcueils.

Nous considrerons que vous avez tlcharg Interbase (client et serveur), et la


dernire version de IBExpress et que ceux ci sont correctement installs sur
votre PC. Le serveur Interbase peut bien sr tre install sur un Pc du rseau
autre que votre machine de travail. Vous pouvez complter la lecture de ce
tutorial par les excellents tutoriaux de Henry Cesbron Lavau sur le Web ladresse :
http://www.develo ppez.com/hcesbronlavau/IB6Delphi6.htm

Premire tape : Cration dun nouveau projet


Fichier / Nouveau / Application
Fichier / Nouveau / Module de donnes

Slectionnez longlet Interbase, puis le composant TIBDatabase et dposez le


sur le Datamodule, que nous avons nomm DM et enregistr dans lunit

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

uDm.pas. Nous renommons notre composant IBDB que nous trouvons plus
pratique que IBDatabase1.

Double cliquez sur le composant que vous venez de dposer et renseignez les
zones afin de vous connecter la base sample.GDB que nous vous proposons
avec ce tutoriel.

Comme vous pouvez le


constater sur la photo ci-
contre, nous avons choisi :

Une connexion distante


Indiqu notre adresse IP
Slectionn le Protocole
TCP
Indiqu le chemin et le
nom de la base
Renseign le login
SYSDBA et le mot de
passe masterkey qui
sont ceux par dfaut
Slectionn un jeu de
caractre par dfaut.

Avant de refermer, nhsitez pas cliquer sur le bouton Tester afin de vous
assurer que la connexion se passe bien. Si ce nest pas le cas, un
renseignement est faux.

Deuxime tape : Ajouter une transaction

Dans la palette de composant Interbase, slectionnez un composant


TIBTransaction (le cinquime en partant de la gauche) et dposez le sur le
Datamodule.

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Renseignez la proprit DefaultDatabase en slectionnant le nom du


composant TIBDatabase. Cliquez sur le composant de base de donnes IBDB
(TIBDatabase) et renseignez la proprit DefaultTransaction en indiquant la
transaction que nous venons de dposer et que nous avons no mm IBTrans.

Dans la photo ci- contre, le


renseignement des proprits du
composant TIBDataBase.

Trs bien mais A quoi sert la transaction ?

Merci de poser la question. Interbase est un moteur de base de donnes transactionnel. Les
transactions supportent gnralement 3 ordres
Start Dmarre la transaction
Commit Approuve la transaction
RollBack Annule la transaction

Daccord, mais quoi a sert ?


Supposons le cas suivant :

Vous tes chargs (votre application) de dbiter le compte de Monsieur A pour crditer le
compte de monsieur B
Votre programme commence dbiter le compte A et soudain, panne de courant.
Dans un systme de fichier non transactionnel, monsieur A est dbit, alors que
monsieur B nest pas crdit, la somme disparue

Dans un systme transactionnel, le compte de monsieur A ne sera rellement dbit que


lorsque la transaction aura t approuve par un Commit.
StartTransaction
Dbit du compte A
Crdit du compte B
Commit
JJM - www.delp hicenter.net Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Si un incident se passe durant lopration, le programme utilisera lordre RollBak pour


annuler la transaction dmarre par StartTransaction

Avant daller plus loin, notez que


Une transaction globale ne peut satisfaire tous les besoins dune
application.
Quune transaction doit tre ouverte et referme aussi tt que possible.

Pour simplifier, sachez que la transaction conserve une copie de toutes les
modifications. Si vous conservez vos transaction ouvertes du dbut la fin de
lapplication, votre programme va devenir de plus en plus lent, Interbase va
avoir de plus en plus de travail Si vous utilisez la mme transaction pour
tous les composant Query ou Table, quallez vous commiter ou annuler ?
toutes les modifications, sur nimporte quelle table ?

Il est important de dissocier les transactions en utilisant autant de


composants que ncessaire en fonction des besoins de lapplication.

Lexemple ci-dessous dmontre lemploi dune transaction indpendante de


celle dfinie par dfaut.

Procedure UpdateMatable(MaChaine : String);


Const
cMaRequeteUpdate = UPDATE MaTable SET MonChamp=%S;
begin
With TIbSQL.Create(Nil) do
begin
try
Database := IBDB;
Transaction := TibTransaction.Create(Self);
Transaction.StartTransaction;
SQL.Text := Format(cMaRequeteUpdate,[MaChaine]);
try
ExecQuery;
Transaction.Commit;
Except
On E: Exception do
begin
ShowMessage(UpdateMatable + #13 + e.message);
if Transaction.InTransaction then
Transaction.RollBack;
end;
end;
finally
Free;
end;
JJM - www.delp hicenter.net Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

end;
end;

Troisime tape : Ajouter une requte (TIBQuery)

De nouveau dans la palette Interbase, slectionnez un composant TIBQuery


(le second en partant de la gauche) et dposez le sur le DataModule.

Double cliquez sur le champ de la proprit


DataBase, le nom de la connexion la base
apparat. Si cest pas le cas, slectionnez
dans la liste droulante.
La transaction par dfaut se renseigne
toute seule

Cliquez sur le bouton de la proprit SQL (


droite) et saisissez votre requte SQL

Ex : Select * From MaTable ou MaTable


correspond au nom dune table de la base

Quatrime tape : Ajouter un TIBUpdateSQL

De nouveau dans la palette Interbase, slectionnez un composant


TIBUpdateSQL (le sixime en partant de la gauche) et dposez le sur le
DataModule. Donnez lui un nom et double clichez sur la proprit
UpdateObject de notre TIBQuery. Le nom de notre nouveau composant
apparat.

A quoi sert le UpdateSQL ?


JJM - www.delp hicenter.net Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

A grer automatiquement les oprations de modification / Ajout / Effacement et


Rafrachissement.

Si vous disposez dune version entreprise de Delphi, un assistant vous aide


remplir les quatre requtes. Sinon, voici un exemple de requte Update (vous
trouverez les autres dans le projet exemple joint)
update TB_PLANNER
set
PLA_PK = :PLA_PK,
STARTTIME = :STARTTIME,
ENDTIME = :ENDTIME,
SUBJECT = :SUBJECT,
COLOR = :COLOR,
IMAGE = :IMAGE,
CAPTION = :CAPTION,
NOTES = :NOTES
where
PLA_PK = :OLD_PLA_PK

Notez le double point devant dans lexpression STARTTIME = :STARTTIME Ceci


indique Delphi quil sagt dun paramtre qui sera renseign automatiquement
par la valeur correspondante.

Nb : Ne perdez pas de temps renseigner les autres requtes maintenant,


vous aurez tout loisir de le faire ensuite en vous inspirant de lexemple joint
tlcharger.

Cinquime tape : Ajouter une un TDATASource

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Quest ce donc que ce composant, quoi sert-il ?


Delphi distingue les composants daccs aux donnes des composants dits
visuels (Ex : un champ de saisie). Pour relier les composants invisibles aux
composants visuels, on utilise un composant tiers, le TDataSource.

Extrait de laide de Delphi

Utilisez TDataSource pour :

Fournir un canal entre un ensemble de donnes et les contrles


orients donnes d'une fiche permettant ainsi l'affichage, les
dplacements, et la modification des donnes de l'ensemble de
donnes sous-jacent.

Maintenant que nous savons quoi sert le composant, voyons comment


lemployer.

Pour connecter le composant de base de


donnes avec le DataSource indiquez
simplement le nom du composant dans la
proprit DataSet

Donnez un nom au DataSource

Notez que le composant TDataSource peut glement servir connecter deux


tables (requtes) pour crer une relation Matre Dtail.
Si vous utilisez deux requtes
Exemple :
Requte 1 =
SELECT ID, CHAMP1, CHAMP2 From TableMaitre
Requte 2 =
SELECT IDMAITRE, CHAMP1, CHAMP2 From TableDETAIL WHERE IDMAITRE=:ID

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Le renseignement de la relation IDMAITRE=:ID peut tre automatiquement mis


jour par Delphi. Pour ce, il suffit dindiquer le DataSource qui rfrence la
requte1 dans la proprit DataSource de la requte 2.

Pour une relation entre deux tables, le principe est le mme, Datasource qui
rfrence Table1 dans proprit Datasource de table2 et renseignement du
champ MasterField de Table2.

Sixime tape : Ajouter un composant Visuel

Au tout dbut du tutoriel, nous avons cr une nouvelle application qui a cr


une fiche vierge.
Slectionnez lunit Unit1 et dclarez lunit uDm dans la section
implementation comme dans lexemple ci-dessous
implementation
uses uDm;
{$R *.dfm}

Slectionnez la fiche, puis un composant Grille dans la palette ContrleBD (le


premier en partant de la gauche) et dposez le sur la fiche.
Renseignez la proprit DataSource de la grille (choisissez avec la liste
droulante), la liaison du composant visuel avec la table ou requte (non
visuelle) est faite.

Enregistrez le projet, les bases de votre premire application Delphi Interbase


sont poses.

Septime tape : Dcouverte des notions essentielles

En premier lieu, pour voir le rsultat de votre requte, il est indispensable


dindiquer au programme que vous le souhaitez.

MonQuery.Active :=True ; Ouvre la requte


MonQuery.Active :=False ; ferme la requte

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Le fait douvrir une requte, ouvre automatiquement la connexion si celleci est


ferme. Pour ouvrir explicitement une connexion, utilisez linstruction suivante :

IBDB.Connected:=True;

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Quest ce qui change par rapport une base de donne


de type fichier ?

En premier lieu, en environnement Client Serveur on a pour habitude de ne faire


transiter par le rseau que les informations essentielles.

En mode fichier, une requte sur une table Paradox via le BDE (borland Database
Engine) rapatrie toutes les donnes vers votre application. Ceci sexplique par le
fait que nous navons pas, dans ce cas, un programme dit le serveur qui fait
la slection pour nous.

En mode client Serveur, la requte est excute sur le serveur et seul le rsultat
est rapatri.

Donnes partielles

Cette logique, simple apprhender, joue parfois quelques tours au dveloppeur


qui na pas lhabitude. Un systme de bufferisation automatique limite le nombre
de lignes rellement retourns par une requte. Les lignes ne seront appeles
que lorsque lapplication les demandera explicitement (Dplacement du curseur
dans une ligne de donnes = Fetch). Ceci sexplique aisment par le fait que, par
nature, il est inutile de tenter dafficher une information portant sur 10 000
lignes.

Le cas classique est la DBCombolistBox qui utilise une requte SQL et qui
naffiche quune seule ligne alors que la table en contient dix et plus.. La
raison est assez simple comprendre. Ce composant nappelle pas les lignes
automatiquement mais simplement la premire. Le fetch ne porte que sur une
ligne. Pour afficher toutes les lignes, utilisez linstruction maTIBQuery.FecthAll ;

Mise jour de linformation sur diffrents postes

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Autre cas classique, les modification effectue sur un poste ne sont pas visibles
sur un autre. Ceci peut paratre bizarre, mais cest entirement normal.
La raison ? Cest la logique mme du mode client Serveur. Les donnes affiches
dans votre programme, le client, ne sont en ralit quune copie partielle un
instant T de la base qui rside dans le serveur. Pour vrifier que vous disposez
de la dernire mise jour, vous devez rafrachir les donnes. Le seul vrai moyen
de rafrachir les donnes et de rejouer la requte. La fermer et la rouvrir.

Lexemple de code ci-dessous permet de fermer et de rouvrir une requte en


gardant le curseur sur la mme ligne. Gnralement, cette action est invisible
pour lutilisateur.

procedure TDM.GenericRefresh(DataSet: TDataSet);


Var Bmk : TBookMark;
begin
// Raffraichi via Fermeture + Ouverture
// sans cette option les maj ne sont pas visibles
With DataSet do
begin
if Active then
begin
Bmk := GetBookmark;
Try
Active:=False;
Active:=True;
GotoBookMark(Bmk);
finally
FreeBookmark(Bmk);
end;
end;
end;
end;

Les cls auto-incrmentes.

Dans une application classique, la gestion des cls auto-incrmentes sont


assures par le moteur auxiliaire (BDE, ODBC). Avec Interbase, la cration de la
cl doit tre explicite.

En rgle gnrale, la cration dune cl auto-incrmente passe par les tapes


suivantes :
JJM - www.delp hicenter.net Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

- Un Trigger Before Insert (Dclencheur automatique avant insertion)


- Un gnrateur
- Une procdure stocke (pas obligatoire mais conseill surtout dans les
versions antrieures Delphi6)
- Un vnement dans le programme Delphi

Le dclencheur

CREATE TRIGGER TB_PLANNER_BI FOR TB_PLANNER


ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.PLA_PKID IS NULL) THEN
NEW.PLA_PKID = GEN_ID(GEN_PLA_PKID,1);
END

La procdure stocke

CREATE PROCEDURE TB_PLANNER_AUTOINC


RETURNS (
NEW_VALUE INTEGER)
AS
BEGIN
NEW_VALUE = GEN_ID(GEN_PLA_PKID, 1); SUSPEND;
END

Lappel de la procdure stocke depuis Delphi

function TDM.GetAutoInc(IBObjectName: String): Integer;


Var IBSQl : TIbSql;
begin
// Rcupration de la valeur d'un gnrateur autoInc
IBSQl := TIbSql.Create(Nil);
Try
With IBSql do
begin
DataBase:=IBDB;
Transaction:=TIbTransaction.Create(Nil);
Transaction.DefaultdataBase:=IBDB;
Try
Transaction.Active:=True;
SQL.Text:='SELECT NEW_VALUE FROM '+IBObjectName+'_AUTOINC';
ExecQuery;
Try
Result := FieldByName('NEW_VALUE').asInteger;
Finally
CLose;
end;
finally
Transaction.Active:=False;
Transaction.Free;
end;
end;
finally
IbSql.Free;

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

end;
end;

// * Evnnements pour grer les actions sur la table * //

procedure TDM.IBQNewRecord(DataSet: TDataSet);


begin
// renseigne la cl primaire de type Gnrateur
IBQPLA_PKID.asInteger:=GetAutoInc('TB_PLANNER');
// pour l'exemple, la date de dbut = maintenant
IBQSTARTTIME.AsDateTime:=Now;
IBQEndTIME.AsDateTime:=IncMinute(IBQSTARTTIME.AsDateTime,15);
end;

Notez qu partir de Delphi 6, la proprit GeneratorField des composants pour


Interbase permet dappeler le gnrateur directement, sans passer par la
procdure stocke.

Mais au fait, pourquoi se proccuper de rcuprer la valeur de la cl auto -


incrmente puisque un dclencheur (Trigger) se charge de la renseigner ?
Dans une relation matre Dtail, votre programme besoin de connatre la cl de
la table Matre pour renseigner la table dtail.

Voici que sachve ce tutorial. Nous esprons quil vous aura apport ce que vous
cherchiez..

Si vous ntes pas familiers avec Interbase,


- Vous pouvez consulter le tutorial Comment configurer Interbase : Premiers pas.
Pour aller plus loin :
- Les excellents tutoriaux de Henry Cesbron Lavau sur le Web ladresse :
http://www.developpez.com/hcesbronlavau/IB6Delphi6.htm
Fichier tlcharger : SampleIB.Zip
L'exemple est crit en Delphi6.
Cet exemple dispose de 3 units
uMain.pas source de l'interface IHM
uDM.Pas source pour manager la base IB (traditionnellent spars du IHM)
uInitInterbase.pas : Sert dans l'exemple pour initialiser la base partir d'un fichier ini (joint)
Vous trouverez galement

La base dessai et Les scripts SQL pour gnrer la base d'essai.

Si vous ne parvenez pas tlcharger lexemple, essayez sur le site http://www.plusfacile.com/

Auteur du tutorial : jjm@plusfacile.com

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Configuration du serveur Interbase de BorlandTM

Ou trouver Interbase ?
Sur le site de Borland
http://www.borland.com/devsupport/interbase/opensource/

Ou sur le site de IBPhoenix


http://www.ibphoenix.com/ibp_download.html#100B2

Le programme dinstallation de Interbase installe diffrents outils et notamment


IBConsole.

Cliquez sur le menu Server et choisissez


loption de menu Register

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Configuration du serveur Local (si sur votre PC)

Rien de bien particulier, si ce nest le fait que


vous devez spcifier une description, le login et
le password masterkey par dfaut

Configuration du serveur distant

Le serveur distant peut, sans aucune


distinction, tre votre PC ou un PC du
rseau dont vous connaissez
ladresse IP

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Enregistrement de la base dans IBConsole

Cette tape na rien dobligatoire.


Delphi peut accder une base mme si
celle-ci nest pas registered sur le
serveur. Toutefois, si vous souhaite z
accder la base depuis IBConsole, il est
impratif de lenregistrer.
Notez que dans ce cas, signal la base
est plus appropri que Enregistrer
puisquil ny a aucune action de sauvegarde
attache lopration.

Enregistrement sur serveur local ou distant

Indiquez le chemin complet de la base.


Indiquez un nom dalias (nous avons laiss
Sample.GDB, mais nous aurions pu mettre
Mabase)

Indiquez le login, puis le password et le


default Character Set.

Notez que la saisie des informations


peut prter confusion en ce sens que
les liblls sont sous les champs
renseigner.

Pour mener bien ces oprations, il faut videmment que la base existe dj.
Vous pouvez la crer partir de IBConsole, ou la gnrer partir dun script.
Cest ce que nous allons voir dans le paragraphe qui suit.
JJM - www.delp hicenter.net Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Crer la base partir dun script.

Idalement, il est prfrable de crer deux scripts. Le premier pour crer la base,
le second pour la renseigner.
Pourquoi ? Vous pouvez bien sr crer un script global, mais Interbase va
rechigner sur le Dialect 3 et vous proposer de crer un Dialect 1. En soit, ce nest
pas trs grave. Sauf que dans certains cas, lutilisation du Dialect 1 interdira
certains ordres du script qui ncessitent le Dialect 3. Pour viter ce genre de
dsagrment, autant prendre de bonnes habitudes en sparant la cration de la
base du script de renseignement.

Remarquez la ligne CREATE DATABASE '192.168.1.2:d:\ibdata\sample\sample.gdb'


Celle indique la chane de connection vers la base. Bine videmment, si vous
envisagez de mettre votre base ailleurs, vous devrez modifier cette chane. Dans
le mme esprit, ladresse IP que vote indiquerez doit correspondre ladresse IP
de la machine sur laquelle est install votre Serveur Interbase

La ligne USER 'SYSDBA' PASSWORD 'masterkey' Indique le login et password qui


sera utilis pour la connexion la base. Ceux ci-doivent exister avant de lancer
le script.
Nb : SYSDBA et masterkey est le couple par dfaut de tout serveur interbase
nouvellement install.

Exemples de scripts (les scripts complets sont joints)

Script de cration de la base

SET SQL DIALECT 3;

CREATE DATABASE '192.168.1.2:d:\ibdata\sample\sample.gdb'


USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 2048
DEFAULT CHARACTER SET ISO8859_1;

Script de cration des lments (domaines, tables, dclencheurs, donnes, ect)


CREATE DOMAIN DOMCAPTION AS VARCHAR(50) CHARACTER SET ISO8859_1;

CREATE GENERATOR GEN_PLA_PKID;

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

SET GENERATOR GEN_PLA_PKID TO 5;

CREATE TABLE TB_PLANNER (


PLA_PKID DOMPKID NOT NULL,
PLA_PK DOMGUI NOT NULL collate ISO8859_1,
STARTTIME DOMDATETIME,
ENDTIME DOMDATETIME,
SUBJECT DOM_LARGE_TEXT100 collate ISO8859_1,
COLOR DOMINTEGER,
IMAGE DOMINTEGER,
CAPTION DOMSMALLINT,
NOTES DOM_VC4096 collate ISO8859_1);

INSERT INTO TB_PLANNER (PLA_PKID, PLA_PK, STARTTIME, ENDTIME, SUBJECT, COLOR,


IMAGE, CAPTION, NOTES) VALUES (3, '{B101CA0B-D4B8-45A8-9344-28741EFB4946}',
'10/24/2001 10:14:17', '10/24/2001 10:20:17', 'Rendez vous chez..', NULL, NULL,
NULL, 'Nouveau texte');

COMMIT WORK;

La suite du script est dans larchive jointe

Fichiers tlcharger (sur www.developpez.com):


SampleIB.Zip
L'exemple est crit en Delphi6.

Cet exemple dispose de 3 units

uMain.pas source de l'interface IHM

uDM.Pas source pour manager la base IB (traditionnellent spars du IHM)

uInitInterbase.pas : Sert dans l'exemple pour initialiser la base partir d'un fichier ini (joint)

Vous trouverez galement

La base dessai et

Les scripts SQL pour gnrer la base d'essai.

Si vous ne parvenez pas tlcharger lexemple, essayez sur le site


http://www.plusfacile.com/Didactiels/Interbase/

Auteur du tutorial : jjm@delphicenter.net

JJM - www.delp hicenter.net Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase