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