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érateurDans 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
Aucun commentaire:
Enregistrer un commentaire