Page 1 sur 1

Trigger Before update

Posté : lun. 07 déc. 2009, 17:41:05
par lohezic
Bonjour,

J'ai une table TABA dont une zone dépend d'une autre . Quand on met à jour la ZONEA on doit mettre à jour la ZONEB après avoir passer par de nombreux calculs. La ZONEA pouvant être mise à jour à plusieurs endroits nous pensons mettre à jour la ZONEB par trigger . Nous pensons utiliser le trigger before update pour éviter la récursivité de maj , mais après plusieurs possibilité d'alimentation de cette ZONEB, celle ci garde toujours son ancienne valeur.
Avez vous une solution ?

Merci d'avance

trigger

Posté : lun. 07 déc. 2009, 18:21:13
par cmasse
Bonjour,

votre trigger est-il écrit en SQL PSM ou en RPG ?

s'il est écrit en RPG, vous avez alors passé la cde ADDPFTRG, avez vous pensé au paramètre ALWREPCHG qu'il faut impérativement mettre à *YES pour que vos modifications soient répercutées dans la base ?

(sans texte)

Posté : mar. 08 déc. 2009, 10:00:36
par lohezic
Bonjour,

Le trigger est en RPG , il a été rattaché au fichier avec ALWREPCHG à YES.
Voici le trigger :

H DECEDIT('0,') DATEDIT(*YMD/)
$* Paramètres du programme
$* . Zone par curseur dans format
D PDON DS
D WDON 1 2400
D WPOIAV 49 52B 0
D WLGIAV 53 56B 0
D WPOIAP 65 68B 0
D WLGIAP 69 72B 0
$* . Longueur
D PLON S 2A
$* Zone de données "Apres"
D WESSAP E DS EXTNAME(FICESSPF)
D PREFIX(AP_)
D
$* Position
D WPOS S 5 0
$* Longueur
D WLON S 5 0

C *ENTRY PLIST
C PARM PDON
C PARM PLON

$* Chargement de l'Image "Avant"
C EVAL WPOS = WPOIAP +1
C EVAL WLON = WLGIAP
C EVAL WESSAP = %SUBST(PDON:WPOS:WLON)
C EVAL AP_ESSABR = %SUBST(AP_ESSLIB:1:10)
$* Fin de programme
C return

Lors de la mise à jour le trigger est bien appelé mais le résultat de la zone ESSABR ne change pas. Je n'ai pas mis de update sur le fichier car pour moi le trigger before était pour éviter l'update récursif. J'ai quand même essayé mais le résultat est le même.

Merci de votre aide

trigger before UPDATE

Posté : mar. 08 déc. 2009, 13:45:15
par cmasse
je pense que le problème est le suivant :

1/ vous créez une zone de stockage ayant sa propre mémoire sous forme de DS externe

2/ vous COPIEZ dans cette zone les données originales qui elles sont qq part dans le paramètre en entrée PDON

3/ vous modifiez une partie(AP_ESSABR) de la copie WESSAPP, mais c'est l'original qu'il fallait modifier.
En effet ce sont les données du paramètre qui vont dans la table.


pour cela deux possibilités :

a/ remettre les données à leur place d'origine, par exemple
%SUBST(PDON:WPOS:WLON) = WESSAP, en fin de programme.

b/ mettre la DS directement sur les données plutôt que de les copier en basant la DS sur un pointeur, par exemple BASED(prtap) et écrivez
ptrap = %ADDR(PDON) + WPO à la place du %SUBST( )


Dernier point, vous avez raison, ne faites pas d'UPDATE sur le fichier, modifier le paramètre en entrée suffit !

(sans texte)

Posté : mar. 08 déc. 2009, 14:19:06
par lohezic
Merci cela fonctionne .