Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Écriture et contrôle des fichiers

COMMIT

Valider ou annuler une transaction

COMMIT valide définitivement les modifications faites depuis la dernière validation, ROLBK les annule.

Syntaxe

COMMIT;
COMMIT(E);
ROLBK;
ROLBK(E);
(E)
Une erreur positionne %ERROR et %STATUS.
commit (mot-clé de dcl-f)
Sur la déclaration du fichier, rend ses modifications dépendantes du contrôle de validation. Le contrôle lui-même se démarre par la commande STRCMTCTL avant l'ouverture.
Effet
COMMIT rend définitifs les ajouts, modifications et suppressions du groupe. ROLBK remet les fichiers dans l'état de la dernière validation.

À quoi ça sert

Une transaction regroupe plusieurs modifications qui doivent réussir ensemble : un virement débite un compte et en crédite un autre. Les fichiers journalisés déclarés avec le mot-clé commit participent : on exécute commit; à la fin du groupe, rolbk; en cas d'anomalie.

Le contrôle de validation doit être démarré avant l'ouverture : STRCMTCTL LCKLVL(*CHG) CMTSCOPE(*JOB), souvent lancé par QCMDEXC, avec usropn sur le fichier. À la fin, ENDCMTCTL.

Exemple 1 : ROLBK puis COMMIT

**free
// COMMIT et ROLBK : valider ou annuler un groupe de modifications.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-f clientw usage(*update : *output : *delete) keyed commit usropn
      extdesc('JOBISQL/CLIENTW') extfile(*extdesc);

dcl-pr qcmdexc extpgm('QCMDEXC');
  cmd char(200) const;
  lng packed(15:5) const;
end-pr;

dcl-s ancien like(solde);

// Le controle de validation doit etre demarre avant d'ouvrir le fichier.
qcmdexc('STRCMTCTL LCKLVL(*CHG) CMTSCOPE(*JOB)' : 200);
open clientw;

// Premier groupe : un ajout et une modification, puis ROLBK.
numcli = 900;
nom    = 'Client a annuler';
ville  = 'Pau';
solde  = 50;
datcre = d'2026-09-30';
write clientwr;
chain (100) clientw;
ancien = solde;
solde  = 0;
update clientwr;

chain (900) clientw;
snd-msg 'Avant ROLBK : 900 trouve = ' + %char(%found(clientw));
rolbk;
chain (900) clientw;
snd-msg 'Apres ROLBK : 900 trouve = ' + %char(%found(clientw));
chain (100) clientw;
snd-msg 'Apres ROLBK : solde du 100 = ' + %char(solde) + ' (avant : ' + %char(ancien) + ')';

// Second groupe : on valide avec COMMIT, la modification est definitive.
numcli = 900;
nom    = 'Client valide';
ville  = 'Pau';
solde  = 50;
datcre = d'2026-09-30';
write clientwr;
commit;
rolbk;
chain (900) clientw;
snd-msg 'COMMIT puis ROLBK : 900 trouve = ' + %char(%found(clientw));

// Nettoyage : on supprime le client 900 et on valide cette suppression.
delete clientwr;
commit;

close clientw;
qcmdexc('ENDCMTCTL' : 200);

*inlr = *on;

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

Avant ROLBK : 900 trouve = 1
Apres ROLBK : 900 trouve = 0
Apres ROLBK : solde du 100 = 1250.50 (avant : 1250.50)
COMMIT puis ROLBK : 900 trouve = 1

Un client est ajouté et le solde du 100 est mis à zéro. %FOUND montre le client ajouté, puis rolbk; annule tout : le client 900 a disparu et le solde du 100 est revenu à 1250.50. Dans le second groupe, commit; valide l'ajout : le rolbk; qui suit ne l'annule plus. Le programme supprime ensuite le client et valide.

Exemple 2 : Ouverture sans contrôle de validation

**free
// COMMIT : un fichier declare avec COMMIT ne s'ouvre pas sans controle de validation.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-f clientw usage(*update : *output : *delete) keyed commit usropn
      extdesc('JOBISQL/CLIENTW') extfile(*extdesc);

dcl-pr qcmdexc extpgm('QCMDEXC');
  cmd char(200) const;
  lng packed(15:5) const;
end-pr;

// Essai 1 : pas de STRCMTCTL, l'ouverture echoue.
open(e) clientw;
snd-msg 'OPEN sans STRCMTCTL : erreur = ' + %char(%error) + ', statut = ' + %char(%status(clientw));
snd-msg 'Fichier ouvert : ' + %char(%open(clientw));

// Essai 2 : avec STRCMTCTL, l'ouverture reussit.
qcmdexc('STRCMTCTL LCKLVL(*CHG) CMTSCOPE(*JOB)' : 200);
open(e) clientw;
snd-msg 'OPEN apres STRCMTCTL : erreur = ' + %char(%error) + ', ouvert = ' + %char(%open(clientw));
close clientw;
qcmdexc('ENDCMTCTL' : 200);

// Essai 3 : sans (E), l'erreur arrete le programme.
open clientw;
snd-msg 'Cette ligne ne s''affiche pas';

*inlr = *on;

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

OPEN sans STRCMTCTL : erreur = 1, statut = 1217
Fichier ouvert : 0
OPEN apres STRCMTCTL : erreur = 0, ouvert = 1
Erreur : RNQ1217 - Message d'erreur CPF4326 reçu pendant OPEN.

Le fichier est déclaré avec commit. Sans STRCMTCTL, open(e) échoue avec %STATUS 1217 (%OPEN reste à 0) ; après STRCMTCTL, il réussit. Sans (E), l'échec arrête le programme sur RNQ1217, qui cite le message CPF4326.

Le piège

Sans STRCMTCTL, un fichier COMMIT ne s'ouvre pas. L'erreur est RNQ1217 avec le message CPF4326 (exemple 2) : le contrôle de validation doit être démarré avant le open, d'où le usropn. Et pensez à valider : un groupe sans commit n'est pas définitif.