Aller au contenu

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éponseEffet
CLa demande est annulée.
ILa 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...

VariableTypeLongueur
&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