Message d'erreur IBM i (AS/400)
CPF2817
Commande de copie interrompue à la suite d'une erreur.
Gravité 40 · Fin anormale du programme ou de la fonction
Comment s'en sortir
CPF2817 ne dit rien de la vraie cause : il signale seulement que la copie (CPYF, CPYSRCF, CPYFRMSTMF…) s'est arrêtée à cause d'une erreur. La raison se trouve dans les messages juste avant lui.
Ce qui se passe vraiment
C'est un message de fin, qui clôt une série. Le système a d'abord envoyé un ou plusieurs messages précis (fichier introuvable, membre en cours d'utilisation, enregistrement refusé, zone numérique invalide…), puis CPF2817 pour dire que la commande est abandonnée. Lire uniquement CPF2817 ne sert à rien.
Les causes les plus fréquentes
- Fichier ou membre introuvable (CPF2864, CPF3142, CPF3141) ou verrouillé (CPF3130).
- Droit manquant sur le fichier source ou le fichier cible.
- Formats incompatibles : longueur d'enregistrement différente, données non convertibles avec
FMTOPT(*MAP). - Doublons de clé dans un fichier cible à clé unique.
Diagnostiquer
/* Le message utile est juste au-dessus de CPF2817 */
DSPJOBLOG
En batch, utilisez DSPJOBLOG sur le travail terminé, ou en SQL :
SELECT MESSAGE_ID, MESSAGE_TEXT
FROM TABLE(QSYS2.JOBLOG_INFO('*'))
ORDER BY ORDINAL_POSITION DESC
Lisez les messages remontés avant CPF2817 et corrigez celui-là.
Corriger
Traitez la cause du message précédent, puis relancez. Dans un CL, interceptez l'erreur pour la traiter proprement :
CPYF FROMFILE(MALIB/FICSRC) TOFILE(MALIB/FICCIB) MBROPT(*ADD)
MONMSG MSGID(CPF2817) EXEC(DO)
/* consulter l'historique du travail, prévenir l'exploitation */
ENDDO
Mettre un MONMSG CPF2817 qui ne fait rien cache l'échec : la suite du CL continue comme si les données étaient copiées. Une copie ratée sans alerte, c'est un fichier cible vide ou partiel qu'on découvre le lendemain.
Ce que dit IBM
Cause
Une erreur s'est produite lors de la copie du fichier.
Que faire
Consultez les messages affichés précédemment. Corrigez les erreurs, puis renouvelez la demande.
Sur votre IBM i
Afficher la description complète du message :
DSPMSGD RANGE(CPF2817) MSGF(QSYS/QCPFMSG)
L'intercepter dans un programme CL, quand il est envoyé comme message d'échappement :
MONMSG MSGID(CPF2817) EXEC(DO)
/* traitement de l'erreur */
ENDDO