ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Contrôle des index   



L'auteur

Christophe Chenavier
France France
Membre Simple
# 0000000023
enregistré le 14/10/2004
http://www.corwin.fr
53 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é 5371 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0

Description

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


IF EMPTY(M.cTable)
   RETURN ''
ENDIF

IF EMPTY(JUSTEXT(M.cTable))
   M.cTable = FORCEEXT(M.cTable, "DBF")
ENDIF

M.nAl = SELECT(0)
SELECT 0

TRY
   USE (M.cTable) AGAIN
   M.cErreur = ''
CATCH
   M.cErreur =  "Erreur : la table " + M.cTable + " est introuvable."
ENDTRY

IF NOT EMPTY(M.cErreur)
   SELECT (M.nAl)
   RETURN M.cErreur
ENDIF

M.cCollate = SET("COLLATE")
M.cDelete = SET("DELETE")

SET DELETE OFF


*** On recherche le nombre d'enregistrements de la table
*** sans aucun index actif
LOCATE
M.nBaseRecAll = 0
DO WHILE NOT EOF()
   M.nBaseRecAll = M.nBaseRecAll + 1
   SKIP
ENDDO

FOR I = 1 TO TAGCOUNT()        && Pour chaque Index
    M.nBaseRec = M.nBaseRecAll
    M.cFiltre = SYS(2021, I)
    IF NOT EMPTY(M.cFiltre)    && S'il existe un filtre d'index
        M.nBaseRec = 0         && on calcul le nombre d'enregistrements
        SET ORDER TO           && correspondant à ce filtre
        LOCATE
        DO WHILE NOT EOF()
           IF EVALUATE(M.cFiltre)
              M.nBaseRec = M.nBaseRec + 1
           ENDIF
           SKIP
        ENDDO
    ENDIF

    SET ORDER TO I
    SET COLLATE TO IDXCOLLATE(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())
       IF DESCENDING() = .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
    IF EMPTY(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

SELECT (M.nAl)
SET COLLATE TO M.cCollate
SET DELETE &cDelete

RETURN M.cErreur
Commentaires
le 02/06/2005, Jean à Grenoble a écrit :
Christophe, ton code n'est pas compatible avec VFP6 : tu y as mis un TRY CATCH ENTRY ....

A+
Jean à Grenoble


Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2019.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3