Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers

ROLBK

Annuler les mises à jour d'une transaction

Annule les ajouts, modifications et suppressions faits depuis le dernier COMIT ou ROLBK sur les fichiers déclarés avec le mot-clé COMIT.

Syntaxe

     C                     ROLBK
     C                     ROLBK                       ER
     F                                              KCOMIT
Indicateurs (56-57)
Facultatif : s'allume en cas d'erreur d'annulation.
Spécification F, ligne suivante
Le fichier doit être déclaré sous contrôle de validation : une ligne de continuation avec K en colonne 53 et le mot-clé COMIT en colonnes 54-59.
Effet
Le fichier retrouve l'état du dernier COMIT : les ajouts disparaissent, les modifications et suppressions sont défaites. Les zones du programme gardent leurs valeurs.

À quoi ça sert

ROLBK est la sortie de secours d'une transaction : une saisie incohérente, un stock insuffisant, une erreur à la deuxième écriture. Plutôt que de défaire à la main (remettre l'ancien solde, supprimer la ligne ajoutée), on annule la transaction entière.

Le programme démarre le contrôle de validation lui-même : STRCMTCTL LCKLVL(*CHG) par QCMDEXC avant l'OPEN (le fichier est donc déclaré UC), puis ENDCMTCTL à la fin. Il commence par un ENDCMTCTL dont l'erreur est ignorée (indicateur 56), pour le cas où une définition de validation est déjà active : sinon STRCMTCTL échoue avec CPF8351, « Contrôle de validation déjà actif ». Le fichier CLIENT3W est journalisé.

Exemple 1 : Annuler une modification

     H*  ROLBK : annuler une mise a jour
     FCLIENT3WUF  E           K        DISK                           UC
     F                                              KCOMIT
     E                    CMD     1   2 80
     C*
     C*  Controle de validation demarre avant l'ouverture
     C*  (ENDCMTCTL d'abord : on ignore l'erreur si rien n'est actif)
     C                     Z-ADD9         LEN    155
     C                     CALL 'QCMDEXC'              56
     C                     PARM           CMD,2
     C                     PARM           LEN    155
     C                     Z-ADD22        LEN    155
     C                     CALL 'QCMDEXC'
     C                     PARM           CMD,1
     C                     PARM           LEN    155
     C                     OPEN CLIENT3W
     C                     Z-ADD100       NUMERO  50
     C           NUMERO    CHAINCLIENT3W             99
     C                     Z-ADD0         SOLDE
     C                     UPDATCLI3WR
     C*  Dans la transaction, le nouveau solde est visible
     C           NUMERO    CHAINCLIENT3W             99
     C           SOLDE     DSPLY
     C                     ROLBK
     C*  Apres ROLBK, le solde d'origine est revenu
     C           NUMERO    CHAINCLIENT3W             99
     C           SOLDE     DSPLY
     C                     CLOSECLIENT3W
     C                     Z-ADD9         LEN
     C                     CALL 'QCMDEXC'
     C                     PARM           CMD,2
     C                     PARM           LEN    155
     C                     SETON                     LR
**
STRCMTCTL LCKLVL(*CHG)                                                          
ENDCMTCTL

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

        0
   125050

Le solde est mis à zéro par UPDAT. Dans la transaction, la relecture montre « 0 ». Après ROLBK, elle montre « 125050 » : le solde d'origine est revenu.

Exemple 2 : Annuler un ajout

     H*  ROLBK : un ajout annule
     FCLIENT3WUF  E           K        DISK                      A    UC
     F                                              KCOMIT
     E                    CMD     1   2 80
     C*
     C*  Controle de validation demarre avant l'ouverture
     C*  (ENDCMTCTL d'abord : on ignore l'erreur si rien n'est actif)
     C                     Z-ADD9         LEN    155
     C                     CALL 'QCMDEXC'              56
     C                     PARM           CMD,2
     C                     PARM           LEN    155
     C                     Z-ADD22        LEN    155
     C                     CALL 'QCMDEXC'
     C                     PARM           CMD,1
     C                     PARM           LEN    155
     C                     OPEN CLIENT3W
     C                     Z-ADD801       NUMCLI
     C                     MOVEL'Test A'  NOM
     C                     WRITECLI3WR
     C                     Z-ADD801       NUMERO  50
     C           NUMERO    CHAINCLIENT3W             99
     C  N99      NOM       DSPLY
     C                     ROLBK
     C           NUMERO    CHAINCLIENT3W             99
     C                     MOVEL'0'       ABS     1
     C   99                MOVEL'1'       ABS
     C           ABS       DSPLY
     C                     CLOSECLIENT3W
     C                     Z-ADD9         LEN
     C                     CALL 'QCMDEXC'
     C                     PARM           CMD,2
     C                     PARM           LEN    155
     C                     SETON                     LR
**
STRCMTCTL LCKLVL(*CHG)                                                          
ENDCMTCTL

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Test A
1

Le client 801 est ajouté et se relit (« Test A »). Après ROLBK, le CHAIN ne le trouve plus (indicateur 99 allumé, « 1 »).

Exemple 3 : Sans le mot-clé COMIT

     H*  ROLBK sans le mot-cle COMIT : rien n'est annule
     FCLIENT3WUF  E           K        DISK                           UC
     E                    CMD     1   2 80
     C*
     C*  Controle de validation demarre avant l'ouverture
     C*  (ENDCMTCTL d'abord : on ignore l'erreur si rien n'est actif)
     C                     Z-ADD9         LEN    155
     C                     CALL 'QCMDEXC'              56
     C                     PARM           CMD,2
     C                     PARM           LEN    155
     C                     Z-ADD22        LEN    155
     C                     CALL 'QCMDEXC'
     C                     PARM           CMD,1
     C                     PARM           LEN    155
     C                     OPEN CLIENT3W
     C                     Z-ADD100       NUMERO  50
     C           NUMERO    CHAINCLIENT3W             99
     C                     Z-ADD0         SOLDE
     C                     UPDATCLI3WR
     C                     ROLBK
     C           NUMERO    CHAINCLIENT3W             99
     C           SOLDE     DSPLY
     C*  Remise en etat manuelle
     C                     Z-ADD1250.50   SOLDE
     C                     UPDATCLI3WR
     C           NUMERO    CHAINCLIENT3W             99
     C           SOLDE     DSPLY
     C                     CLOSECLIENT3W
     C                     Z-ADD9         LEN
     C                     CALL 'QCMDEXC'
     C                     PARM           CMD,2
     C                     PARM           LEN    155
     C                     SETON                     LR
**
STRCMTCTL LCKLVL(*CHG)                                                          
ENDCMTCTL

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

        0
   125050

Même scénario que le premier, mais la spécification F n'a pas la ligne COMIT. Le ROLBK n'annule rien : la relecture donne toujours « 0 ». Le programme remet ensuite lui-même 1250,50 (« 125050 »).

Le piège

ROLBK n'annule que les fichiers déclarés avec COMIT. Sans le mot-clé (exemple 3), le compilateur ne fait que prévenir : QRG7099, gravité 00, « Aucun fichier défini sous contrôle de validation, mais opération COMIT ou ROLBK utilisée dans le programme ». Le programme compile, tourne, et ne défait rien.

Ce qui a été validé par COMIT ne s'annule plus (exemple 1 de COMIT). Placez le COMIT à la fin de la transaction complète, pas après chaque écriture.

En RPG ILE full free

En RPG ILE, la même instruction ROLBK existe ; le fichier se déclare avec le mot-clé COMMIT de DCL-F.

dcl-f client3w usage(*update:*output) keyed usropn commit;
...
write cli3wr clients;
if %error;
  rolbk;
endif;