Aller au contenu

CPF4131

Erreur de niveau sur fichier &2 de &3, membre &4.

Gravité 40 · Fin anormale du programme ou de la fonction

Comment s'en sortir

Le programme a été compilé avec une ancienne version du fichier. Depuis, le fichier a changé (une zone ajoutée, retirée, agrandie), et le système refuse de l'ouvrir pour éviter que le programme lise des données décalées.

Ce qui se passe vraiment

Chaque format d'enregistrement a un identificateur de niveau, calculé à partir de ses zones. Le compilateur le recopie dans le programme. À l'ouverture, le système compare les deux : s'ils diffèrent, c'est CPF4131. On parle d'« erreur de niveau » ou de level check.

Les causes les plus fréquentes

  • Le fichier a été modifié (CHGPF, ALTER TABLE, DDS recompilée) sans recompiler les programmes qui l'utilisent.
  • Le programme ouvre un autre fichier que prévu : la liste de bibliothèques trouve la version de test au lieu de celle de production, ou l'inverse.
  • Un programme a été transféré d'une machine à une autre sans le fichier dans la même version.

Diagnostiquer

/* Identificateur de niveau actuel du fichier */
DSPFD      FILE(MALIB/MONFIC) TYPE(*RCDFMT)

/* Celui que le programme attend */
DSPPGMREF  PGM(MALIB/MONPGM)

/* Tous les programmes d'une bibliothèque qui utilisent le fichier */
DSPPGMREF  PGM(MALIB/*ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/REFS)

Puis SELECT WHPNAM FROM QTEMP.REFS WHERE WHFNAM = 'MONFIC' donne la liste des programmes à recompiler.

Corriger

/* La vraie solution : recompiler chaque programme concerné */
CRTBNDRPG  PGM(MALIB/MONPGM) SRCFILE(MALIB/QRPGLESRC) SRCMBR(MONPGM)

LVLCHK(*NO) (sur OVRDBF ou le fichier lui-même) fait disparaître le message, mais le programme lit alors les enregistrements avec l'ancien découpage : zones décalées, données fausses, sans aucune erreur. Ne l'utilisez que si vous êtes certain que les zones lues par le programme n'ont pas bougé, par exemple quand une zone a seulement été ajoutée en fin d'enregistrement et que le programme ne réécrit pas le fichier.

Ce que dit IBM

Cause

La demande d'ouverture concerne le fichier &1, mais c'est le fichier &2 de la bibliothèque &3 qui a été ouvert. Par conséquent, les identificateurs de niveau de format d'enregistrement fournis par le programme ne correspondent pas au fichier ouvert.

Que faire

Effectuez l'une des opérations suivantes, puis renouvelez votre demande :

  • Recompilez le programme.
  • Indiquez le paramètre LVLCHK(*NO) dans la commande de substitution appropriée : OVRDBF, OVRDSPF, OVRICFF, ou OVRPRTF.

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
&1 *CHAR 10
&2 *CHAR 10
&3 *CHAR 10
&4 *CHAR 10

Sur votre IBM i

Afficher la description complète du message :

DSPMSGD RANGE(CPF4131) MSGF(QSYS/QCPFMSG)

L'intercepter dans un programme CL, quand il est envoyé comme message d'échappement :

MONMSG MSGID(CPF4131) EXEC(DO)
  /* traitement de l'erreur */
ENDDO