mercredi 24 juillet 2002

Composant Ibx


COMPOSANT IBX

IbTable

Ce composant encapsule une table dans une base de donnée. Il est souvent utilisé pour migrer plus aisément du bde à Interbase. Puisque Interbase est orienté client/serveur, les IbTable ne devraient pas être utilisé.

IbQuery

Ce composant permet d'exécuter des instructions SQL. On peut ainsi accéder à plusieurs tables simultanément.

IBUpdateSQL

Ce composant met à jours des données en lecture seule. Ce composant est utilisé conjointement avec un IbQuery ou IbDataset. Il permet d'insérer, mettre à jour, effacé et de rafraichir un ensemble de donnée qui ne peut être modifié habituellement. Ces opérations peuvent être générées automatiquement en effectuant un clique droit sur le composant.

IBDataset

Ce composant rassemble les caractéristiques d'un IbQuery et d'un IBUpdateSQL. Il est donc possible de récupérer des données, de mettre à jour des données, de supprimer des données et de rafraîchir des données

IbSQL

Ce composant permet d'exécuter des instructions SQL. On peut ainsi accéder à plusieurs tables simultanément. Ce composant ne peut être lié à des composants orienté donnés tel que dbedit, dbgrid... Il faudra alors prendre les valeurs retournées (pour un select) et l'affecter à un composant. Il est possible de faire exécuter à peu près n'importe commande SQL avec ce composant. Ce composant est plus rapide que les autres dû au fait qu'il n'offre pas d'interface orienté donné. Ce composant est unidirectionnel. Il faut donc ré exécuter la requête pour retourner au début des enregistrements. (pour un sélect).

IBStoredProc

Ce composant encapsule une procédure stockée sur un serveur Interbase. Une telle procédure ressemble à une fonction en pascal. On lui passe des paramètres et nous renvois un résultat. Elle est exécutée sur le serveur, ce qui allége le traffic réseau.

IBDataBase

Ce composant encapsule une connexion à Interbase. Toute application désirant se connecté à Interbase doit en posséder un.

IBTransaction

Ce composant fournit des transactions sur une connexion sur la base de donnée. Il est conseillé dans avoir un pour chaque composant exécutant des requêtes sur Interbase. On isole ainsi nos transactions, il est plus aisé de revenir en arrière si un problème survient lors d'un commit.

IBClientDataSet

Ce composant regroupe en fait un IBDataset et un DatasetProvider afin de retrouver des données et d'effectuer des mises à jour. Ce composant est très utile si vous désirez créer une application n-tiers.

Quelques-uns de ces composants seront utilisés dans notre programme afin de mieux les comprendre

samedi 13 juillet 2002

Intitiation à Interbase


INITIATION

Avant de pouvoir effectuer ce tutoriel adéquatement, il faudra que vous ayez installé Interbase Server et le client ainsi que ibconsole sur votre ordinateur. Les composants ibx sont aussi nécessaire. J'ai utilisé Interbase 6.01 disponible gratuitement chez Borland et aussi Ibconsole disponbile au même endroit.

Ibconsole

Ibconsole permet de gérer et de maintenir Interbase server, il vous permet d'exécuter toutes commandes SQL. Tout se fait à l'aide d'une interface graphique fort conviviale.

Histoire d'Interbase

Interbase existe depuis le millieu des années 80. La fiabilité et la puissance de cette basse de donnée, ont fait sa renommée. Borland a ouvert ses sources en l'an 2000. Le serveur est disponible sous Windows, Linux et quelques Unix. Il est même possible de le faire fonctionner sous MacOS X. Peu de ressource et d'espace disque sont nécessaire au fonctionnement d'Interbase. Nokia, Motorola, Boeing... sont quelques unes des nombreuses compagnies qui utilisent cette base de donnée.

Préparation


Démarrer Interbase manager, l'icone Interbase Guardian apparaîtra dans la barre des tâches en bas à droite.

Démarrer Ibconsole,



cliquer ensuite sur le menu Server et ensuite register




Entrer SYSDBA dans la section <username> et masterkey dans la section <password> appuyer ensuite sur le bouton Ok.
L'image ci-dessous apparaîtra



Cliquer sur le +, différentes sections seront affichées. Sélectionner database, faites un clique droit de la souris et appuyer sur Create Database...





Entrer le nom d'alias et l'emplacement souhaité pour la base de donnée


Notez bien que le dialecte 1 et 2 ne devrait plus être utilisé. En dialecte 3, on doit déclarer nos champs de type TimeStamps si on désire avoir la date et heure (TDateTime). Si tout c'est bien déroulé, vous verrez l'écran ci-dessous apparaître.






Maintenant, vous pouvez créer des tables, générateur, trigger...
J'utiliserai un exemple de location de voiture réduit à l'essentiel afin de mieux vous faire comprendre l'utilisation d'Interbase grâce à delphi. Cet exemple sera utilisé tout au long de ce tutoriel.
Je vous invite à parfaire vos connaissances en SQL car je n'expliquerai pas en détail les commandes SQL effectuées. Vous pouvez vous renseigner sur le sujet à l'aide des sites que voici:
En cliquant sur l'onglet interractive SQL sous ibconsole et en allant dans le menu aide, vous avez un guide complet SQL.

Création d'une base de donnée

Notre exemple utilisera cinq tables.
Voici le diagramme de tables



Démarrer ibconsole, appuyer sur Interactive SQL. Entrer les valeurs suivantes
create table CLIENT (
NOCLIENT             INTEGER      not null,
NOM                  VARCHAR(30),
PRENOM               VARCHAR(30),
ADRESSE              VARCHAR(25),
NOVILLE              INTEGER,
NOPROVINCE           INTEGER,
TELEPHONE            VARCHAR(10),
NOPERMIS             VARCHAR(25),
DATEEXPERATION       VARCHAR(6),
CODEPOSTAL           VARCHAR(6),
constraint PK_CLIENT primary key (NOCLIENT)
);

create table LOCATION (
NOLOCATION           INTEGER not null,
NOCLIENT      INTEGER,
NOVEHICULE           INTEGER,
PRIX                 DECIMAL,
DATE_EMPRUNT         DATE,
DATE_RETOUR          DATE,
constraint PK_LOCATION primary key (NOLOCATION)
);

create table VEHICULE (
NOVEHICULE           INTEGER      not null,
MARQUE               VARCHAR(25),
ANNEE                INTEGER,
KM                   INTEGER,
constraint PK_VEHICULE primary key (NOVEHICULE)
);

create table VILLE (
NOVILLE              INTEGER                        not null,
NOMVILLE             CHAR(25)                       not null,
constraint PK_VILLE primary key (NOVILLE)
);

create table PROVINCE (
NOPROVINCE           INTEGER                        not null,
NOMPROVINCE          CHAR(25)                       not null,
constraint PK_PROVINCE primary key (NOPROVINCE)
);
Nous ajoutons ensuites les contraintes
alter table CLIENT
   add constraint FK_CLIENT_REFERENCE_VILLE foreign key (NOVILLE)
      references VILLE (NOVILLE);

alter table CLIENT
   add constraint FK_CLIENT_REFERENCE_PROVINCE foreign key (NOPROVINCE)
      references PROVINCE (NOPROVINCE);
      
alter table LOCATION
   add constraint FK_LOCCLIENT_REFERENCE_LOC foreign key (NOCLIENT)
      references CLIENT (NOCLIENT);
      
alter table LOCATION
   add constraint FK_LOCATION_REFERENCE_VEHICULE foreign key (NOVEHICULE)
      references VEHICULE (NOVEHICULE);

Toutes les contraintes ainsi que les tables sont créées. La prochaine étape est la création des générateurs.

jeudi 11 juillet 2002

Générateur dans Interbase


GÉNÉRATEUR

Les générateurs sont employés afin que chaque enregistrement soit unique. Sous Paradox, le type de donnée employé pour effectuer cette opération est autoinc. Puisque Interbase est orienté client/serveur, c'est le serveur qui doit créer la valeur et non le client. Si la valeur était créée au niveau client, il deviendrait alors possible d'avoir plusieurs champs avec la même valeur.

Un tel comportement doit être évité dans une architecture telle que celle d'Interbase. À chaque insertion d'une valeur dans une table un champ utilisé par un générateur sera incrémenté.

Nous continuer avec l'exemple du chapitre précédent. Nous allons créer 5 générateurs, 1 par table.

Création de générateur

La syntaxe est CREATE GENERATOR nom générateur
Dans la table client, nous avons un champ noclient, ce champ est unique à chaque client. Il ne peut donc y avoir deux valeurs identiques. Nous devons donc créer un générateur pour ce champ. Pour cette table il suffira de faire

CREATE GENERATOR CLIENT_GenId;

La création des autres générateurs se fera par
CREATE GENERATOR LOCATION_GenId;
CREATE GENERATOR VEHICULE_GenId;
CREATE GENERATOR VILLE_GenId;
CREATE GENERATOR PROVINCE_GenId;
 

J'ai l'habitude de rajouter _GenId afin de savoir plus aisément que c'est un générateur.
Il est plus facile de le reconnaître dans le code, si on doit l'utiliser.

Trigger

Nous utiliserons les triggers lors de l'évènement "before insert" afin incrémenter automatiquement les clé primaires. En laissant ce travail à Interbase, nous réduisons les erreurs possibles pouvant être faites par les programmeurs. Le code ci-dessus permettra de créer tous les triggers nécessaire au projet.

SET TERM ^;
CREATE TRIGGER TRIG_CLIENT_GenId FOR CLIENT
ACTIVE BEFORE INSERT AS
BEGIN
  IF ( NEW.NOCLIENT IS NULL ) THEN
    NEW.NOCLIENT = GEN_ID(CLIENT_GenId,1);
END


SET TERM ^;
CREATE TRIGGER TRIG_VILLE_GenId FOR VILLE
ACTIVE BEFORE INSERT AS
BEGIN
  IF ( NEW.NOVILLE IS NULL ) THEN
    NEW.NOVILLE = GEN_ID(VILLE_GenId,1);
END

SET TERM ^;
CREATE TRIGGER TRIG_LOCATION_GenId FOR LOCATION
ACTIVE BEFORE INSERT AS
BEGIN
  IF ( NEW.NOLOCATION IS NULL ) THEN
    NEW.NOLOCATION = GEN_ID(LOCATION_GenId,1);
END

SET TERM ^;
CREATE TRIGGER TRIG_PROVINCE_GenId FOR PROVINCE
ACTIVE BEFORE INSERT AS
BEGIN
  IF ( NEW.NOPROVINCE IS NULL ) THEN
    NEW.NOPROVINCE = GEN_ID(PROVINCE_GenId,1);
END

SET TERM ^;
CREATE TRIGGER TRIG_VEHICULE_GenId FOR VEHICULE
ACTIVE BEFORE INSERT AS
BEGIN
  IF ( NEW.NOVEHICULE IS NULL ) THEN
    NEW.NOVEHICULE = GEN_ID(VEHICULE_GenId,1);
END

Conseil

Puisque nous utilisons les triggers et que nos clés primaires (noclient, noville...) ne peuvent être nulles, il est possible de réduire le trafic réseau. Au niveau client, nous allons mettre la propriété Required des dataset, query... de nos clés primaire à false. Cette technique va être prochainement expliquée. Ce conseil m'a été donné par Sylvain James.

Sylvain James a créé un utilaire pour automatiser la création des générateurs et trigger, vous pouvez le télécharger ici