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
Ken colonne 53 et le mot-cléCOMITen 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;