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 Before update
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
trigger
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 ?
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 ?
Christian Massé (Volubis.fr)
(sans texte)
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
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
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
trigger before UPDATE
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 !
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 !
Christian Massé (Volubis.fr)
(sans texte)
Merci cela fonctionne .