Utilisation des triggers

09/03/2013 00:00

Les triggers permettent d'automatiser certaines tâches lors de l'enregistrement des données dans les fichiers (ou tables selon la terminologie).

 

Voici un petit exemple d'analyse : chaque commercial et chaque article est obligatoirement rattaché à un et un seul magasin. La liaison se fait avec la zone IDMAGASIN stockée dans les fichiers COMMERCIAL et ARTICLE.

 

 

Code sans trigger :

 

Je vais maintenant procéder à l'ajout d'un enregistrement dans le fichier ARTICLE, cet ajout se faisant suite à la saisie dans une fiche article. Le magasin ayant été choisi en amont (lors de l'entrée dans le logiciel par exemple), son identifiant a été stocké dans une variable : geIdMagasin

Voici le code sans trigger : à chaque fois que l'on ajoutera un enregistrement dans un fichier possédant une zone IDMAGASIN il faudra affecter cette zone sous forme : .IDMAGASIN = geIdMagasin.

 

Il se peut qu'une bonne partie des fichiers d'une analyse aient besoin d'une telle clé étrangère, ce qui peut représenter au final beaucoup de lignes de code pour cette affectation ... avec les risques d'oubli ou de mauvaise écriture qui vont avec.

 

Code avec trigger :

 

Tout d'abord il faut dire à l'application qu'il existe un trigger (ou des) qu'il faudra appeler lors de la mise à jour des fichiers. Voici la syntaxe dans ce petit cas d'école  (je vous laisse le soin d'aller consulter la doc WinDev pour le détail de cette fonction).

 

Pour celà il faut créer une fonction globale qui sera la fonction appelée lors de chaque mise à jour de fichier.

 

Ensuite vous devez indiquer à Windev qu'il doit appeler cette procédure lors de chaque mise à jour. Des filtres passés en paramètres permettent d'effectuer cette action seulement dans certains cas. Dans notre cas ce sera sur tous les fichiers avant l'ajout d'enregistrements.

 

 

A chaque fois qu'un ajout devra être fait sur tous les fichiers (paramètre "*"), la fonction MonTrigger sera appelée, ce qui vous affranchira de l'écriture de l'affectation de la zone IDMAGASIN. Il est bien entendu possible de mettre en paramètre une liste de fichiers (par exemple : "ARTICLE,COMMERCIAL"). Le dernier paramètre indique que la fonction doit être appelée avant l'ajout.

 

Et voici le corps de la fonction MonTrigger :

 

 

Pour aller plus loin :

 

Si on a deux fichiers c'est simple à écrire. Maintenant si on en a 58 on ne va pas faire 58 SELON, ce serait du travail inutile, pénible et source de bugs. Voici une solution élégante et simple :

 

Tout d'abord une fonction qui permet de tester l'existence d'une rubrique dans un fichier :

 

Version alternative plus simple avec utilisation du résultat d'une fonction pour le retour Vrai / Faux. Les RC avant et après les expressions garantissent que le mot recherché est bien complet et non une partie (par exemple présence d'une zone IDMAGASIN_SECONDAIRE).

 

 

Ensuite le code du trigger :

Attention :

 

Les triggers ne sont pas appelés dans le cas d'utilisation de requêtes pour les mises à jour (INSERT, UPDATE, DELETE).