Définitions : |
|
|
|
Visualisation sur la commande DSPFD |
|
|
|
|
|
|
Si le programme applicatif et le programme trigger s'exécutent sous le même contrôle de validation, un arrêt anormal du programme trigger entraînera le Rollback de toutes les opérations qui lui sont associées. |
Ecriture d'un programme trigger : |
|
|
Attention aux cas suivants, provoquant une erreur : |
|
|
|
|
code complet |
|
*=========== définition des paramètres reçus ========================= Dptr s * Ddata DS based(ptr) D fichier 10 D biblio 10 D membre 10 D evenem 1 D moment 1 D niv_verrou 1 D filler1 3 D ccsid 9B 0 D filler2 8 * enregistrement avant, déplacement et longueur D dep_enrav 9B 0 D lg_enrav 9B 0 * description des zones nulles avant (déplacement et longueur) * il y a un octet par zone dans l'enregistrement * contenant 0 (la zone est significative) * 1 (elle est nulle) D dep_desav 9B 0 D lg_desav 9B 0 |
* enregistrement après (idem) D dep_enrap 9B 0 D lg_enrap 9B 0 * zones nulles D dep_desap 9B 0 D lg_desap 9B 0 D filler3 16 D variable 9900A Dparam S 9999 Dlgparam S 9B 0 Ddep S 9B 0 Dprtap s * Denregap E DS EXTNAME(db2nullpf) PREFIX(ap) D based(ptrap) dprtnap s * dnullap ds based(ptrnap) D codart_nap 1 D libart_nap 1 D datcrt_nap 1 D prix_nap 1 |
*=========== variables pour API envoi de messages =================== D ERRDS DS D LGDS 1 4B 0 INZ(16) D LGERR 5 8B 0 D MSGID 9 15 D RESERV 16 16 D MSGFL DS D MSGF 10 INZ('QCPFMSG') D MSGL 10 INZ('*LIBL') D ID S 7 INZ('CPF9898') D MSGTXT S 50 INZ('prix invalide (doit être >0)') D LENTXT S 9B 0 INZ(50) D MSGTYP S 10 D PGMQ S 10 INZ('*PGMBDY') D STACK S 9B 0 D KEY S 9B 0 |
* mise en place du paramètre reçu C eval ptr = %addr(param) * * mise en place du buffer après * C if dep_enrap <> 0 C eval ptrap = ptr + dep_enrap C endif C if dep_desap <> 0 C eval ptrnap = ptr + dep_desap C endif * si libart est à blanc alors ==> valeur nulle c if aplibart = *blank c eval libart_nap = '1' c endif * vérification du prix (doit être positif) C if apprix <= 0 C exsr env_msg C endif * mettre date du jour dans DATCRT c time datcrt C return |
* C env_msg begsr * * envoi d'un message diagnostic au pgm applicatif * * pour expliquer les raisons de l'erreur (cela laisse une trace) * * C CALL 'QMHSNDPM' C PARM ID C PARM MSGFL C PARM MSGTXT C PARM LENTXT * type *diag C PARM '*DIAG' MSGTYP C PARM PGMQ * deux niveaux au dessus (au pgm applicatif) C PARM 2 STACK C PARM KEY C PARM ERRDS |
* * envoi d'un message escape( erreur) au système * * c'est lui qui annule l'action base de données * C CALL 'QMHSNDPM' C PARM ID C PARM MSGFL C PARM MSGTXT C PARM LENTXT * *escape pour arrêter le traitement C PARM '*ESCAPE' MSGTYP C PARM PGMQ * un niveau au dessus ==> DB2 C PARM 1 STACK C PARM KEY C PARM ERRDS C endsr |
|
|
|
|
|
|
exemple, on trace le cumul des prix modifiés : ....................................................................... : CREATE TRIGGER VIN_CUMUL AFTER UPDATE OF CAV_PRIX : : ON BDVIN9/MA_CAVE : : REFERENCING OLD TABLE AS OCAVE : : NEW TABLE AS NCAVE : : FOR EACH STATEMENT MODE DB2SQL : : : : BEGIN : : DECLARE AV_CUMUL DEC(11, 2); : : DECLARE AP_CUMUL DEC(11, 2); : : : : SELECT SUM(CAV_PRIX) INTO AV_CUMUL FROM OCAVE ; : : SELECT SUM(CAV_PRIX) INTO AP_CUMUL FROM NCAVE ; : : : : INSERT INTO AF4TEST/CUMUL VALUES(NOW() , AV_CUMUL, AP_CUMUL) ; : : END : :.....................................................................: suite à un ordre : update bdvin9/ma_cave set cav_prix = cav_prix * 1,5 |
|
|
|
|
|
|
SQLSTATE est amené à remplacer SQLCOD/SQLCODE (orientation ISO) |
|
Tout cela pouvant être réalisé depuis iSeries Navigator
Puis propriétés
© AF400 - Volubis