L'auteur Christophe Chenavier France Membre Simple # 0000000023 enregistré le 14/10/2004 http://www.corwin.fr 57 ans CHENAVIER Christophe 80440 BOVES de la société Corwin Fiche personnelle
Note des membres pas de note
Contributions > 04 - DBF : Tables
Contrôle des index
# 0000000201
ajouté le 01/06/2005 07:47:40 et modifié le 01/06/2005
consulté 9188 fois
Niveau
initié
Cette fonction IndexOK contrôle tous les index d'une table et retourne un message d'erreur si un problème est détecté.
Le principe de vérification est simple, pour chacun des index on vérifie d'abord que le nombre d'enregistrements dans l'index correspond bien à celui de la table, puis que les clefs sont bien croissantes, puis dans l'ordre inverse qu'elles sont bien décroissantes.
Code source :
*!* Objet : Contrôle des index *!* Auteur : C.Chenavier *!* Version : 1.00 - 08/02/2005
FUNCTION IndexOk
LPARAMETERS cTable
LOCAL nAl, cCollate, cDelete, nBaseRec, nBaseRecAll LOCAL I, nTagRec, vOldVal, vCurVal, cErreur, cFiltre
*** On recherche le nombre d'enregistrements de la table *** sans aucun index actif
LOCATE
M.nBaseRecAll = 0 DOWHILENOTEOF()
M.nBaseRecAll = M.nBaseRecAll + 1 SKIP ENDDO
FOR I = 1 TOTAGCOUNT() && Pour chaque Index
M.nBaseRec = M.nBaseRecAll
M.cFiltre = SYS(2021, I) IFNOTEMPTY(M.cFiltre) && S'il existe un filtre d'index
M.nBaseRec = 0 && on calcul le nombre d'enregistrements SETORDERTO&& correspondant à ce filtre
LOCATE DOWHILENOTEOF() IFEVALUATE(M.cFiltre)
M.nBaseRec = M.nBaseRec + 1 ENDIF SKIP ENDDO ENDIF
SETORDERTO I SETCOLLATETOIDXCOLLATE(I)
LOCATE
M.nTagRec = 0
M.vOldVal = EVALUATE(KEY()) SCAN
M.nTagRec = M.nTagRec + 1 IF M.nTagRec > M.nBaseRec
M.cErreur = "Erreur sur l'index " + ORDER() + ; " : l'index trouve plus d'enregistrements qu'il en existe dans la table." EXIT ENDIF
M.vCurVal = EVALUATE(KEY()) IFDESCENDING() = .F. IF M.vCurVal < M.vOldVal && On vérifie que les clefs sont bien croissantes
M.cErreur = "Erreur sur l'index " + ORDER() + ; " : les clefs ne sont pas ordonnées de façon croissante." EXIT ENDIF ELSE IF M.vCurVal > M.vOldVal && On vérifie que les clefs sont bien décroissantes
M.cErreur = "Erreur sur l'index " + ORDER() + ; " : les clefs ne sont pas ordonnées de façon décroissante." EXIT ENDIF ENDIF
M.vOldVal = M.vCurVal ENDSCAN IFEMPTY(M.cErreur) AND M.nTagRec <> M.nBaseRec
M.cErreur = "Erreur sur l'index " + ORDER() + ; " : l'index ne trouve pas le bon nombre d'enregistrements dans la table." ENDIF ENDFOR USE
Christophe, ton code n'est pas compatible avec VFP6 : tu y as mis un TRY CATCH ENTRY ....
A+
Jean à Grenoble