Message d'erreur IBM i (AS/400)
CPF5026
Clé en double non admise pour le membre &4.
Gravité 30 · Erreur grave
Comment s'en sortir
Le programme a voulu écrire (ou modifier) un enregistrement dont la clé existe déjà, alors que le fichier, ou un fichier logique bâti dessus, impose des clés uniques.
Les causes les plus fréquentes
- Le programme écrit sans vérifier que la clé existe déjà : typiquement une reprise de traitement relancée après un plantage, qui réécrit ce qui avait déjà été écrit.
- L'unicité vient d'un autre fichier : le fichier écrit n'est pas unique, mais un fichier logique
UNIQUE, une clé primaire ou un index unique SQL bâti sur le même fichier physique l'est. - Un compteur de numérotation (numéro de commande, de facture) a été remis à zéro ou lu par deux travaux en même temps.
Diagnostiquer
/* Tous les fichiers logiques et index bâtis sur le fichier */
DSPDBR FILE(MALIB/MONFIC)
/* Leur chemin d'accès : clés et UNIQUE */
DSPFD FILE(MALIB/MONLF) TYPE(*ACCPTH)
Côté SQL, les index et contraintes d'unicité : QSYS2.SYSINDEXES et QSYS2.SYSCST.
Corriger
En RPG, testez l'existence avant d'écrire, ou captez l'erreur : le code d'état 01021 signale une clé en double.
chain (numero) MONFIC;
if %found(MONFIC);
update MONFICR; // la clé existe : on met à jour
else;
write MONFICR; // sinon on crée
endif;
En SQL, MERGE INTO fait la même chose en une instruction.
Supprimer le fichier logique UNIQUE pour faire passer l'écriture est la pire solution : la règle d'unicité protégeait vos données (un client, une facture = une seule clé). Trouvez pourquoi le programme écrit deux fois la même clé.
Ce que dit IBM
Cause
L'opération d'écriture ou de mise à jour dans le membre &4 n'a pas abouti car une clé en double a été trouvée dans le membre &4 de &2, dans &3.
Que faire
Reportez-vous au message CPF5009 pour identifier l'enregistrement ayant la clé en double.
Réponses possibles
| Réponse | Effet |
|---|---|
C | La demande est annulée. |
I | La demande est ignorée. |
Variables du message
Quand le système envoie le message, chaque variable est remplacée par une valeur réelle : un nom d'objet, de bibliothèque, un code...
| Variable | Type | Longueur |
|---|---|---|
| &2 | *CHAR |
10 |
| &3 | *CHAR |
10 |
| &4 | *CHAR |
10 |
Message d'interrogation
Ce message attend une réponse de l'opérateur,
par défaut C.
Réponses acceptées :
C, I.
Sur votre IBM i
Afficher la description complète du message :
DSPMSGD RANGE(CPF5026) MSGF(QSYS/QCPFMSG)
L'intercepter dans un programme CL, quand il est envoyé comme message d'échappement :
MONMSG MSGID(CPF5026) EXEC(DO)
/* traitement de l'erreur */
ENDDO