Aller au contenu

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 K en colonne 53 et le mot-clé COMIT en colonnes 54-59 (F en colonne 6, le reste blanc).
Effet
Les changements de la transaction deviennent définitifs et une nouvelle transaction commence. Un ROLBK qui 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;