Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers
UNLCK
Libérer un enregistrement ou une zone de données
Lève le verrou posé par une lecture en mise à jour ou par IN *LOCK, sans rien écrire.
Syntaxe
C UNLCKfichier ER
C UNLCKzone ER
- Facteur 2 (33-42)
- Le fichier dont on libère l'enregistrement, ou la zone de données (ou la structure) liée à une zone de données par
DEFN. - Indicateurs (56-57)
- Facultatif : s'allume en cas d'erreur.
- Effet
- Le verrou est levé : une autre ouverture du fichier peut de nouveau modifier l'enregistrement. Le contenu n'est pas modifié. Le programme ne peut plus faire
UPDAT,DELETniOUTsans nouvelle lecture.
À quoi ça sert
Un CHAIN sur un fichier en mise à jour verrouille l'enregistrement. Si le programme décide finalement de ne rien modifier (contrôle refusé, sélection écartée), il doit le dire : sinon il reste verrouillé (premier exemple). UNLCK est la bonne réponse, plutôt qu'un UPDAT inutile.
Exemple 1 : Voir le verrou et le lever
H* UNLCK : un enregistrement lu reste verrouille tant qu'on le garde
FCLIENT3WUF E K DISK
E CMD 1 1 80
C*
C Z-ADD100 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C* Le client 100 est verrouille. Une mise a jour SQL, faite par une
C* autre ouverture du fichier, attend le delai puis echoue (56).
C Z-ADD80 LEN 155
C CALL 'QCMDEXC' 56
C PARM CMD,1
C PARM LEN 155
C *IN56 IFEQ '1'
C 'Refusee' DSPLY
C END
C* Apres UNLCK, la meme mise a jour passe
C UNLCKCLIENT3W
C Z-ADD80 LEN 155
C CALL 'QCMDEXC' 56
C PARM CMD,1
C PARM LEN 155
C *IN56 IFEQ '0'
C 'Acceptee'DSPLY
C END
C SETON LR
**
RUNSQL SQL('UPDATE JOBISQL.CLIENT3W SET SOLDE=SOLDE WHERE NUMCLI=100')
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Refusee
Acceptee
Après le CHAIN du client 100, un UPDATE SQL (lancé par QCMDEXC et RUNSQL) passe par une autre ouverture du fichier. L'enregistrement est verrouillé : l'ordre attend le délai de verrouillage (environ une minute) puis échoue, l'indicateur 56 s'allume (« Refusee »). Après UNLCK, le même ordre réussit (« Acceptee »).
Exemple 2 : UNLCK puis UPDAT
H* UNLCK puis UPDAT : le programme s'arrete
FCLIENT3WUF E K DISK
C*
C Z-ADD100 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C UNLCKCLIENT3W
C 'Libere' DSPLY
C UPDATCLI3WR
C 'Apres' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Libere
Erreur : RPG1221 - MAJ ou SUPP sur CLIENT3W sans READ ou CHAIN préalable (C G S D F).
Après le UNLCK (« Libere »), l'UPDAT est refusé : RPG1221.
Exemple 3 : UNLCK sur une zone de données
H* UNLCK : liberer une zone de donnees verrouillee par IN *LOCK
E CMD 1 1 80
C*
C* Zone de donnees creee dans QTEMP : elle disparait avec le travail
C Z-ADD80 LEN 155
C CALL 'QCMDEXC'
C PARM CMD,1
C PARM LEN 155
C *NAMVAR DEFN I3DTA NUMFAC 70
C *LOCK IN NUMFAC
C ADD 1 NUMFAC
C NUMFAC DSPLY
C UNLCKNUMFAC
C* La zone n'a pas ete ecrite : OUT est maintenant refuse
C OUT NUMFAC
C NUMFAC DSPLY
C SETON LR
**
CRTDTAARA DTAARA(QTEMP/I3DTA) TYPE(*DEC) LEN(7 0) VALUE(1000)
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1001
Erreur : RPG0412 - Zone comm données non allouée pour sortie (C G S D F).
La zone de données I3DTA est lue avec IN *LOCK (« 1001 » après l'ajout de 1 en mémoire). Le UNLCK abandonne la modification, et le OUT est alors refusé : RPG0412.
Le piège
Après UNLCK, il faut relire avant d'écrire : un UPDAT ou un DELET donne RPG1221, « MAJ ou SUPP sur CLIENT3W sans READ ou CHAIN préalable » (exemple 2) ; un OUT sur une zone de données donne RPG0412, « Zone comm données non allouée pour sortie » (exemple 3).
Un verrou fait attendre les autres : dans le premier exemple, l'ordre SQL patiente environ une minute (délai de verrouillage du fichier) avant d'échouer. Dans un programme interactif, libérez l'enregistrement avant d'afficher l'écran.
En RPG ILE full free
L'instruction UNLOCK du RPG ILE fait la même chose pour un fichier ou une zone de données.
chain numero client3w;
if solde >= 0;
unlock client3w;
endif;