Vous êtes sur la page 1sur 12

Delphi et Interbase

DELPHI et INTERBASE ,
TM TM

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.

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
uDm.pas. Nous renommons notre composant IBDB que nous trouvons plus
pratique que IBDatabase1.

JJM http://www.PlusFacile.com, Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

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 tutorial.

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.

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 nomm IBTrans.

JJM http://www.PlusFacile.com, Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

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

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

JJM http://www.PlusFacile.com, Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

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;
end;
end;

JJM http://www.PlusFacile.com, Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

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 ?


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

JJM http://www.PlusFacile.com, Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

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 http://www.PlusFacile.com, 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 http://www.PlusFacile.com, 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

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 http://www.PlusFacile.com, Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

Quest ce qui change par rapport


une base de donnes 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

Autre cas classique, les modification effectue sur un poste ne sont pas visibles
sur un autre. Ceci peut paratre bizarre, mais cest entirement normal.
JJM http://www.PlusFacile.com, Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

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. Voir galement :
http://www.developpez.com/upload/kloo/interbase/IB6compteur.htm

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


suivantes :
- Un Trigger Before Insert (Dclencheur automatique avant insertion)
JJM http://www.PlusFacile.com, Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

- 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;
end;
end;
JJM http://www.PlusFacile.com, Oct 2001
Spcialistes de lhbergement dapplications internet Delphi et Interbase
Delphi et Interbase

// * 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 complter le tutorial par : Configurer Interbase, Premiers pas
http://teamb-fr.developpez.com/JJM/Interbase/configIB.htm (PDF 445 Ko, 5 pages)

Pour aller plus loin :


- Les excellents tutoriaux de Henry Cesbron Lavau et de Kloo et Sylvain James sur le Web :
http://www.developpez.com/hcesbronlavau/IB6Delphi6.htm
http://www.developpez.com/upload/kloo/interbase/IB6compteur.htm

Fichier tlcharger :
http://teamb-fr.developpez.com/jjm/Interbase/configIB.zip (42 Ko)
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 (traditionnellement 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 http://www.PlusFacile.com, Oct 2001


Spcialistes de lhbergement dapplications internet Delphi et Interbase