Accueil du site > Les articles > Comment et pourquoi réorganiser un fichier DB2/400.
Version à imprimer Enregistrer au format PDF

Comment et pourquoi réorganiser un fichier DB2/400.

mercredi 11 août 2004, par Grégory Jarrige Visites  6829 Première mise en ligne le lundi 3 novembre 2003.

Jamais de problèmes de place sur votre AS/400 ? Il faut savoir qu’à chaque fois que vous supprimez un enregistrement dans un fichier base de données, la place occupée par cet enregistrement n’est pas récupérée. La commande DSPFD vous permet de connaître très facilement le nombre d’enregistrements d’un fichier, ainsi que le nombre d’enregistrements supprimés. Il est possible de récupérer la place perdue par ces enregistrements supprimés au moyen de la commande de réorganisation de fichier RGZPFM (à utiliser sur fichier physique uniquement). Attention, pour pouvoir réorganiser un fichier, il ne faut pas qu’il soit tenu par un travail ou un utilisateur, vous pouvez vous en assurer au moyen de la commande WRKOBJLCK (préciser *FILE pour le type de fichier). Le RGZPFM, en plus de récupérer la place des enregistrements supprimés dans le fichier physique, recrée les chemins d’accès de tous les fichiers logiques dépendants. Attention donc à ne pas lancer la réorganisation d’un très gros fichier un soir avant de quitter le travail, sinon vous pourriez vous en mordre les doigts (planning des travaux de nuit bloqué par un travail planté, sauvegarde journalière non réalisée, etc...). Une réorganisation de fichier est une opération qui n’est pas anodine, il convient d’y réfléchir et de la planifier (peut être un dimanche après-midi, quand la machine est inoccupée et que les utilisateurs sont ailleurs (on l’espère pour eux).

Nous allons voir ci-dessous un ensemble de petits programmes CL qui effectue la réorganisation des fichiers d’une bibliothèque. Ce module est intéressant car il va permettre d’apprendre plusieurs choses :

  • comment récupérer dans un fichier la liste des fichiers d’une bibliothèque
  • comment lire un fichier séquentiellement dans un programme CL
  • comment réorganiser les fichiers d’une bibliothèque (c’est bien pour ça que vous êtes venu, non ?)

A noter que les deux premiers points ci-dessus sont mis aussi en application par la commande GLOSSAIRE utilisée pour éditer la description des fichiers d’une bibliothèque.


La commande REORG :

La commande REORG a été conçue pour réorganiser tous les fichiers d’une bibliothèque qui contiennent des enregistrements supprimés. Si vous avez pris soin de placer cette commande en ligne (QGPL par exemple), le fait de taper la commande REORG et de presser la touche F4 fait apparaître un écran dans lequel il vous suffit de saisir le nom de la bibliothèque à réorganiser, avant de presser la touche ENTREE. Attention : la réorganisation est suspendue en file d’attente de travaux, de façon à ce que vous puissiez la libérer au moment opportun.

Enchaînements des programmes :

Commande REORG —> CL CREORGSBMJOB—> CL CREORG1CALL—> CL CREORG2

Emplacement des sources (les objets peuvent être placés dans QGPL) :

  • Commande DESCFIC : fichier source QGPL/QCMDSRC
  • CL CREORG, CREORG1 et CREORG2 : fichier source QGPL/QCLSRC

Source de la commande REORG :

CMD    PROMPT('REORGANISATION DE BIBLIOTHEQUE')
PARM   KWD(NOMBIB) TYPE(*CHAR) LEN(10) MIN(1) +
       PROMPT('Nom de bibliothèque :')

Source du CL CREORG rattaché à la commande REORG :

PGM PARM(&NOMBIB)

DCL VAR(&NOMBIB) TYPE(*CHAR) LEN(10)

SBMJOB CMD(CALL PGM(CREORG1) PARM(&NOMBIB)) +
JOB(REORG) HOLD(*YES)

FIN : ENDPGM

Source du CL CREORG1 lancé en batch par CREORG :

/* CE CL EXTRAIT LA LISTE DES FICHIERS D’UNE BIB. AU MOYEN */
/* D’UN DSPFD ET APPELLE LE CL CREORG2 QUI EFFECTUE LE */
/* RGZPFM DES FICHIERS QUI EN ONT BESOIN

*/

PGM PARM(&NOMBIB)

DCL VAR(&NOMBIB) TYPE(*CHAR) LEN(10)

/* CONTROLE EXISTENCE DE LA BIBLIOTHEQUE */

CHKOBJ OBJ(&NOMBIB) OBJTYPE(*LIB)
MONMSG MSGID(CPF0000) EXEC(DO)
SNDPGMMSG MSGID(CPF9897) MSGF(QSYS/QCPFMSG) +
MSGDTA(’Erreur sur bib. ’ *CAT &NOMBIB) +
TOPGMQ(*PRV) MSGTYPE(*INFO)
GOTO CMDLBL(FIN)
ENDDO

/* EXTRACTION DES DONNEES DE LA BIB &NOMBIB */

DSPFD FILE(&NOMBIB/*ALL) TYPE(*MBR) +
OUTPUT(*OUTFILE) FILEATR(*PF) +
OUTFILE(QTEMP/RGZFIC)
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(SAUT))

/* LANCEMENT REORGANISATION */

CALL PGM(CREORG2)

FIN : ENDPGM

Source du CL CREORG2 :

/* CE CL LIT LE FICHIER RGZFIC CRÉÉ PAR LE CL CREORG AFIN */
/* DE DÉTECTER LES FICHIERS QUI NÉCESSITENT UNE RÉORGANISATION */
/* (TOUT FICHIER DONT LE NOMBRE D’ENREGISTREMENTS SUPPRIMÉS */
/* EST SUPÉRIEUR À ZÉRO)

*/
/*

*/
/* ATTENTION : Pour pouvoir être compilé ce CL nécessite de */
/* créer temporairement un fichier "RGZFIC" au

*/
/* moyen de la commande DSPFD dans une bib. en

*/
/* ligne (se reporter au CL CREORG pour les

*/
/* paramètres à utiliser).

*/

PGM

DCLF FILE(RGZFIC)

LIRE : RCVF RCDFMT(QWHFDMBR)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(FIN))
IF COND(&MBNDTR *NE 0) THEN(DO)
RGZPFM FILE(&MBLIB/&MBFILE) MBR(&MBNAME)
MONMSG MSGID(CPF0000)
ENDDO
GOTO CMDLBL(LIRE)

FIN : ENDPGM

P.-S.

Alors, vous vous attendiez à quelque chose de beaucoup plus compliqué, pas vrai ?