Trigger Before update

RPG (3 et 4, free), CL, SQL, etc...
Répondre
lohezic
Messages : 8
Enregistré le : lun. 07 déc. 2009, 16:55:10

Trigger Before update

Message 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

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

trigger

Message 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 ?
Christian Massé (Volubis.fr)

lohezic
Messages : 8
Enregistré le : lun. 07 déc. 2009, 16:55:10

(sans texte)

Message 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

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

trigger before UPDATE

Message 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 !
Christian Massé (Volubis.fr)

lohezic
Messages : 8
Enregistré le : lun. 07 déc. 2009, 16:55:10

(sans texte)

Message par lohezic »

Merci cela fonctionne .

Répondre