Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers
COMIT
Valider les mises à jour d'une transaction
Valide définitivement 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 COMIT
C id COMIT ER
F KCOMIT
- Facteur 1 (18-27)
- Facultatif : un identifiant de validation (littéral ou zone) ; le compilateur l'accepte. Les exemples n'en utilisent pas.
- Indicateurs (56-57)
- Facultatif : s'allume en cas d'erreur de validation.
- 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 (Fen colonne 6, le reste blanc). - Effet
- Les changements de la transaction deviennent définitifs et une nouvelle transaction commence. Un
ROLBKqui suit n'annule plus ce qui a été validé (premier exemple).
À quoi ça sert
Une opération métier modifie souvent plusieurs enregistrements : deux comptes pour un virement, une commande et ses lignes. Sous contrôle de validation, tout est validé d'un coup par COMIT, ou annulé d'un coup par ROLBK. Le fichier doit être journalisé (CLIENT3W l'est).
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 : Valider une modification
H* COMIT : valider une mise a jour sous controle de validation
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 COMIT
C* Un ROLBK apres le COMIT n'annule plus rien
C ROLBK
C NUMERO CHAINCLIENT3W 99
C SOLDE DSPLY
C* Remise en etat, validee elle aussi
C Z-ADD1250.50 SOLDE
C UPDATCLI3WR
C COMIT
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 du client 100 passe à zéro, UPDAT, COMIT. Le ROLBK qui suit n'annule rien : la relecture donne toujours « 0 ». Une seconde transaction remet 1250,50 (« 125050 ») et la valide aussi.
Exemple 2 : Deux ajouts, une seule validation
H* COMIT : deux ajouts valides ensemble
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-ADD802 NUMCLI
C MOVEL'Test B' NOM
C WRITECLI3WR
C* Une seule validation pour les deux ajouts
C COMIT
C Z-ADD801 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C NOM DSPLY
C Z-ADD802 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C NOM DSPLY
C* Remise en etat
C DELETCLI3WR
C Z-ADD801 NUMERO
C NUMERO CHAINCLIENT3W 99
C DELETCLI3WR
C COMIT
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
Test B
Les clients 801 et 802 sont ajoutés, puis un seul COMIT valide les deux. Ils se relisent (« Test A », « Test B ») et sont supprimés, également validés.
Le piège
Sans le mot-clé COMIT sur la spécification F, la validation ne sert à rien : le compilateur le signale par QRG7099 (gravité 00, donc sans effet sur la compilation), « Aucun fichier défini sous contrôle de validation, mais opération COMIT ou ROLBK utilisée dans le programme ». Les changements sont écrits tout de suite, et un ROLBK ne les annule pas (voir l'exemple 3 de ROLBK).
Le contrôle de validation doit être démarré avant l'OPEN, donc fichier UC. Sans définition de validation, l'OPEN d'un fichier déclaré COMIT échoue : CPF4326, « Définition de validation *N non admise pour ouverture du membre CLIENT3W », vu par RPG comme RPG1217, « Message d'erreur CPF4326 émis pendant OPEN ».
En RPG ILE full free
En RPG ILE, le mot-clé COMMIT de DCL-F remplace la ligne de continuation ; COMMIT et ROLBK restent des instructions.
dcl-f client3w usage(*update:*output) keyed usropn commit;
...
update cli3wr clients;
commit;