titre_site.jpg (51607 octets)

INDEX

Crée un fichier index pour la table en cours. Pour les tables Paradox et SQL, vous pouvez définir des repères d'index, mais vous ne spécifiez pas le nom d'un fichier index.

Syntaxe

Pour des tables .dbf

INDEX ON <expression clé> | <liste de champs>
   TAG <repère d'index>
      [OF <fichier .mdx> | ? | <masque de fichier .mdx>]
      [FOR <condition>]
[DESCENDING]
[UNIQUE]

et depuis dBase Plus

[UNIQUE | DISTINCT | PRIMARY ]

ou pour être compatible avec les fichiers .ndx de dBase III

INDEX ON <expression clé>
    TO <fichier .ndx> | ? | <masque de fichier .ndx>
    [UNIQUE]


ou pour les tables DB et SQL :

INDEX ON <liste de champs>PRIMARY | TAG <repère d'index> [UNIQUE]

Vous pouvez utiliser une forme spéciale de cette commande, INDEX ON <liste de champs> PRIMARY, pour créer un index primaire sur une table Paradox.


<expression  clé> | <liste de champs>

Pour les tables dBASE, <expression clé> spécifie le nom d'un champ Caractère, Numérique, Flottant ou Date. <expression clé> peut aussi être une expression dBASE de 220 caractères maximum avec des opérateurs ou des fonctions qui manipulent les valeurs de champs, ou une combinaison d'expressions et de champs. La longueur maximum de la clé (résultat de l'expression d'index évaluée <expression clé>) est de 100 caractères. Lorsque <expression clé> est basée sur plusieurs champs, tous les éléments de l'expression doivent être évalués au type caractère. Vous pouvez joindre plusieurs champs ou expressions en utilisant des opérateurs de concaténation de chaînes (+ ou -).

Pour les tables Paradox et SQL, les index ne peuvent pas inclure des expressions. Cependant, vous pouvez créer des index basés sur plusieurs champs. Dans ce cas, spécifiez la clé d'index comme une <liste de champs>, en séparant le nom de chaque champ par une virgule.

TAG <repère d'index>

Spécifie le nom du repère d'index ajouté dans un fichier index multiple .MDX. Si vous ne spécifiez pas de fichier .MDX, les repères d'index sont ajoutés dans le fichier .MDX d'exploitation.

Note : Comme les fichiers .MDX sont apparus avec dBase IV, cette option n'est pas disponible sous dbase III.

OF <fichier .mdx> | ? | <masque de fichier .mdx>

Spécifie le fichier index multiple .MDX dans lequel dBASE ajoute de nouveaux repères d'index. OF ? et OF <masque de fichier> affichent une boîte de dialogue dans laquelle vous pouvez sélectionner un fichier .MDX existant. Si vous spécifiez un fichier inexistant, dBASE le crée et y ajoute le repère d'index. Par défaut, dBASE affecte l'extension .MDX et sauvegarde le fichier dans le répertoire en cours.

Note : L'option <masque de fichier .mdx> n'est pas disponible sous dBase IV.


TO <fichier .ndx> | ?

Spécifie le nom d'un fichier index .NDX. Par défaut, dBASE affecte l'extension .NDX à <fichier 1> et sauvegarde le fichier dans le répertoire en cours. L'option ? affiche une boîte de dialogue dans laquelle vous spécifiez le nom du fichier cible et le répertoire de sauvegarde.

FOR <condition>    Cette option n'est pas disponible sous dbase III.

Restreint les enregistrements que dBASE inclut dans l'index à ceux qui satisfont à la <condition> spécifiée. Sans les options FOR <condition> ou UNIQUE, tous les enregistrements de la table sont inclus dans l'index.


DESCENDING

Crée l'index dans l'ordre décroissant (Z à A, 9 à 1, dates éloignées à dates rapprochées). Sans DESCENDING, INDEX crée un index dans l'ordre croissant.

UNIQUE

Empêche l'ajout dans l'index de plusieurs enregistrements de même valeur qu'<expression clé>. dBASE n'inclut dans l'index que le premier enregistrement avec cette valeur. Sans l'option UNIQUE ou FOR <condition>, tous les enregistrements de la table sont inclus dans l'index. Pour les tables SQL, spécifie la création d'un index unique qui empêche la saisie de clés d'index en double dans une table.

DISTINCT   Plus2_5-Icon.jpg (1250 octets)

Empêche les enregistrements multiples avec la même valeur <expression clé> d'être inclus dans la table; une telle tentative provoque une erreur de violation de clé (key violation error). Les enregistrements marqués comme supprimés ne sont jamais inclus dans un index DISTINCT. Les index DISTINCT ne peuvent être créés que pour des tables DBF.

PRIMAIRY  Plus2_5-Icon.jpg (1250 octets)

Indique que l'index est la clé primaire de la table. Pour les tables de DBF, l'index PRIMARY est un index distinct qui est désigné comme l'index primaire, il n'a pas d'autre signification particulière. Pour des tables DB et SQL, la clé primaire a une signification particulière. Une table ne peut avoir qu'une seule clé primaire.

 ico_MsDos.jpg (1668 octets)  dbasedos.gif (376 octets) vdb5.gif (351 octets) Description



Utilisez INDEX pour organiser les données afin d'effectuer des recherches rapides et un affichage ordonné. INDEX ne modifie pas réellement l'ordre des enregistrements dans une table, mais crée un fichier index dans lequel les enregistrements sont classés par ordre numérique, caractère ou date en fonction de la valeur d'une expression clé. Comme l'index d'un livre, avec des entrées ordonnées et des numéros de page correspondants, un fichier index contient des expressions clés ordonnées avec des numéros d'enregistrements correspondants. Lorsque la table est utilisée avec un index maître, le contenu de la table apparaît dans l'ordre spécifié par l'index.

A la fin d'une opération d'indexation, le nouveau fichier index devient l'index maître, et le pointeur d'enregistrement est positionné sur le premier enregistrement de la table indexée. dBASE ferme tous les autres index, excepté ceux dont les repères d'index se trouvent dans le fichier .MDX d'exploitation (le cas échéant) de même nom que la table.

Ordre de tri


Dans un index, les enregistrements sont généralement classés dans l'ordre croissant, avec les plus petites valeurs de clés au début de l'index. Avec le jeu de caractères DOS de page de code 437 (US), les clés caractères sont ordonnées selon l'ordre ASCII (de A à Z, puis de a à z) ; les clés numériques sont ordonnées de la plus petite à la plus grande valeur ; et les clés dates sont ordonnées de la date la plus rapprochée à la date la plus éloignée. Incluez la fonction UPPER( ) dans l'expression clé pour convertir toutes les lettres minuscules en lettres majuscules et réaliser l'ordre alphabétique pour les champs de type caractère.

Note :    Vous pouvez inverser l'ordre d'un index en classant les enregistrements dans l'ordre décroisssant, avec le mot réservé DESCENDING. Vous ne pouvez utiliser DESCENDING qu'avec les repères d'index .MDX.

Si une fonction est utilisée dans une expression clé, n'oubliez pas que l'index est ordonné en fonction de la sortie de la fonction. Ainsi, lorsque vous utilisez FIND ou SEEK, ou tout ce qui accède à la valeur clé d'un enregistrement, incluez l'expression clé entière. Par exemple, INDEX ON SOUNDEX(NOM) TO NOMS crée un index ordonné sur les valeurs renvoyées par SOUNDEX( ). Lorsque vous recherchez des données par la valeur clé, vous devez inclure l'expression clé entière, telle que SEEK SOUNDEX("Jean") au lieu de SEEK "Jean".

Même <Valeur Clé>

Dans certaines tables, plusieurs enregistrements peuvent partager la même <valeur de clé>. Utilisez l'option UNIQUE pour n'inclure que le premier enregistrement de même valeur clé dans l'index. INDEX avec l'option UNIQUE a un effet identique à l'indexation d'une table avec SET UNIQUE ON. dBASE ne prend en compte les index UNIQUE qu'une seule fois. Une valeur de clé précédemment cachée n'est donc pas automatiquement mise à jour lorsqu'elle est modifiée. Pour mettre à jour explicitement toutes les valeurs de clé dans un index UNIQUE, utilisez REINDEX.

FOR : Mettre des conditions

FOR <condition> limite les enregistrements dont les valeurs des expressions clés sont incluses dans l'index aux enregistrements qui satisfont à la condition spécifiée. Par exemple, si vous utilisez INDEX ON NOM + PRENOM TO EMPLOYES FOR SALAIRE > 24000, dBASE inclut uniquement dans l'index les enregistrements dont les salaires des employés sont supérieurs à 24 000 F. La condition FOR ne peut inclure les champs calculés. Liste des fonctions pouvant être utilisées dans <expression clé> et FOR <condition>

Utiliser un index


Lorsqu'une table a été indexée, utilisez LOOKUP( ), SEEK, SEEK( ) et FIND pour récupérer des données. La structure d'un fichier index permet l'utilisation de ces commandes pour localiser rapidement les valeurs de l'expression clé.

Mise à jour des enregistrements

Lorsque vous exécutez APPEND, BROWSE, CHANGE, EDIT, INSERT, PACK, REPLACE, @...GET ou UPDATE, dBASE met à jour automatiquement tous les fichiers index ouverts. Les fichiers index fermés lorsque des modifications sont effectuées dans une table peuvent être ouverts et mis à jour en utilisant REINDEX.
Les fichiers index multiples simplifient la mise à jour des index, puisque dBASE met à jour tous les index dont les repères appartiennent aux fichiers .MDX spécifiés par USE...ORDER ou SET ORDER. dBASE ouvre automatiquement un fichier .MDX d'exploitation (le cas échéant) lorsque vous ouvrez la table associée.

INDEX ... TAG

INDEX...TAG crée un index et ajoute le repère d'index dans un fichier index multiple. Si vous n'incluez pas OF <fichier>, INDEX...TAG ajoute le repère d'index dans le fichier .MDX d'exploitation. Visual dBASE crée le fichier .MDX d'exploitation ou le fichier spécifié s'il n'existe pas déjà.
INDEX...TAG ferme tous les index ouverts, excepté les repères d'index du fichier .MDX d'exploitation ou du fichier .MDX spécifié. Si des repères d'index du fichier .MDX spécifié ne sont pas ouverts, dBASE les ouvre.

Différence INDEX et SORT


INDEX est similaire à SORT, une autre commande qui vous permet de trier une table. A l'opposé de INDEX, SORT réorganise physiquement les enregistrements de la table, ce qui représente un traitement très long pour des fichiers volumineux. Pour maintenir l'ordre de tri, les nouveaux enregistrements doivent être placés au bon emplacement en utilisant INSERT ou bien la table entière doit être retriée. De plus, SORT ne supporte pas SEEK, SEEK( ) ou FIND, ce qui ralentit la localisation des données dans une table triée.

 

Plus2_5-Icon.jpg (1250 octets) xDML vers ooDML

Il n'existe aucune méthode directe pour remplacer cette commande en OODML, cependant, il y a des objets INDEX et la méthode CreateIndex() de l'objet base de données. Lorsqu'elle est utilisée sur une table locale, la méthode CreateIndex() nécessite que la table soit utilisée exclusivement. Voir SET EXCLUSIVE

Pour créer une balise d'index pour un DBF.
D'abord, vous devez créer une instance de l'objet DBFINDEX, assigner les propriétés appropriées, puis utilisez la méthode CreateIndex() de l'objet base de données. Pour ce faire, procédez comme suit:

i = new DBFIndex()
i.indexName := "name of tag"      // ou fichier .NDX
i.expression := "expression pour indexer"
i.type := 0                       // 0 = MDX, 1 = NDX
_app.databases[1].createIndex( "NomTable", i )


Pour créer un index pour tout autre type de table.
Outre DBFIndex, il est existe également l'objet Index, qui est essentiellement là pour une utilisation avec tout autre type de table.

i = new Index()
i.indexName := "nom de l'index"
i.fields := "champ à indexer"
_app.databases[1].createIndex( "tableName", i )


L'objet Index a les propriétés suivantes : casesensitive, descending et unique.

ico_duflp.gif (1875 octets) dUFLP :

IndexTags.cc

Classe conçue pour permettre au développeur d'obtenir un tableau d'informations sur un fichier d'index .MDX, ou de permettre à un utilisateur de sélectionner une balise d'index à partir d'un formulaire qui affiche les noms des index et des expressions

Cretable7.prg

Programme conçu pour obtenir un fichier au format.txt (cretable7.txt) qui est le code pour recréer une table et ses index.

usage : 

set procedure to :duflp:cretable7.prg additive
cretable7("MaTable.dbf")
ou
creatable7("*.dbf")  // pour obtenir le code de tous les
                        fichiers situés dans le dossier

 

bug_jpg.jpg (2635 octets)  Bien comprendre

Indexer avec une date

Ne pas utiliser le DTOC() pour convertir une date en une chaîne, mais DTOS(). Dans de nombreux formats de date, le jour vient avant le mois ou le mois vient avant le jour et l'année, il en résulte des enregistrements dans le mauvais ordre.

La valeur de l'expression clé doit toujours avoir la même longueur

Ne créez pas un index dont la longueur de l'expression clé varie d'un enregistrement à un autre. Plus précisément, ne pas utiliser TRIM () ou LTRIM () pour supprimer les blancs à partir de chaînes à moins que vous compensiez en ajoutant assez d'espaces pour s'assurer que les valeurs de la clé de l'index sont toutes de la même longueur. L'opérateur - concatène des chaînes tout en réorganisant les espaces de fin. Des longueurs variables de la clé peuvent causer des index corrompus. N'utilisez jamais de fonctions telles que CHR( ), LTRIM( ), RTRIM( ), TRIM( ) et IIF( ) qui modifient la longueur de champ dans l'expression clé.

L'index créé l'est suivant les fonctions utilisées

Si une fonction est utilisée dans une expression clé, gardez à l'esprit que l'index est ordonnée en fonction du résultat de la fonction. Ainsi, lorsque vous utilisez la recherche pour une clé particulière, vous devez rechercher l'expression clé qui a été générée. Comme indiqué dans la partie description, par exemple, INDEX ON SOUNDEX(nom) crée un index des noms classés par les valeurs retournées par SOUNDEX(). Lors d'une tentative de trouver des données par la valeur de la clé, il vous faudra utiliser quelque chose comme SEEK SOUNDEX ("Jean") plutôt que de chercher "Jean".

FOR <condition> limite les enregistrements inclus dans l'index à ceux qui répondent à la condition spécifiée. Par exemple, si vous utilisez INDEX ON Nom + Prenom TO Employes FOR Salaire > 24000, dBASE Plus ne comprend dans l'index que les enregistrements des employés avec des salaires plus élevés que 24 000 €. La condition FOR ne peut pas inclure des champs calculés.

Plus2_5-Icon.jpg (1250 octets) Index : distinct, primary et unique

Vous pouvez utiliser un index pour vous assurer qu'il n'y a pas de valeurs de clé dupliquées. Par exemple, dans une table de clients, à chaque client est attribué son propre numéro d'identification. Pour empêcher un client existant d'utiliser le numéro
d'identification d'un autre client, vous pouvez créer un type spécial d'index sur le champ Code client. Pour DB et des tables SQL, ce type d'index est appelé un index unique : la valeur clé pour chaque enregistrement de la table doit être unique. Pour les tables de type DBF, ce type d'index est appelé un index distinct; un index unique pour une table DBF a une signification différente. Pour plus de clarté, les termes DBF sont utilisés.

Un indice distinct est créé avec l'option DISTINCT pour les tables DBF, et l'option UNIQUE pour les tables DB et SQL. Quand une table a un index distinct, toute tentative de créer une entrée en double de la clé, soit en ajoutant un nouvel enregistrement avec une valeur en double ou en changeant un enregistrement existant de sorte que son champ clé fasse doublon avec un autre enregistrement, provoque une erreur de violation de clé (key violation error). L'enregistrement nouveau ou modifié n'est pas écrit dans la table. Les
Index distinct pour les tables DBF ne comprennent jamais les enregistrements qui sont marqués comme supprimés.

Une table peut aussi avoir un index distinct désigné comme son index primaire, ou une clé primaire. Un index primaire est généralement créé pour le champ ID ou des champs qui identifient chaque enregistrement de la table. Par exemple, si vous pouvez
indexer sur le nom du client, leur champ ID est ce qui identifie de façon unique chaque client, et c'est le champ que vous utilisez pour la clé primaire. Pour les tables DB, la clé primaire d'une table fixe l'ordre par défaut pour les enregistrements de la table, et vous devez avoir une clé primaire pour créer d'autres index secondaires. Pour les tables DBF, une clé primaire n'a pas vraiment de signification particulière, autre que d'auto-documenter le champ de clé primaire de la table. L'option PRIMARY est utilisée pour créer l'index primaire. Pour les tables DB et SQL, un index primaire ne peut ne pas avoir d'autres options que la liste des champs.

Les tables DBF supportent une sorte d'index qui permet de valeurs de clé dupliquées dans la table, mais ne montre que le premier présent dans l'index. Ce sont les index uniques, à ne pas confondre avec les index unique distincts utilisés par les tables DB et SQL. Par exemple, vous pouvez être intéressé par les noms des villes dans lesquelles vos clients résident. En utilisant un index unique, chaque ville ne figure qu'une fois (par ordre alphabétique), peu importe combien de clients que vous avez dans
cette ville.
La valeur de la clé de l'index d'un enregistrement est testée uniquement lorsque l'enregistrement est ajouté ou mis à jour. Par exemple, supposons que vous avez un index unique sur le champ Ville, et  un enregistrement à la fois pour   "Biarritz" et "Caen". Si vous ajoutez un nouveau enregistrement avec pour ville "Biarritz", il n'apparaît pas dans l'index, bien que la table soit mise à jour avec le nouvel enregistrement. Si vous modifiez ensuite le premier enregistrement, qui a été répertorié dans l'index, de «Biarritz» à «Caen», alors il devient caché car il existe déjà un enregistrement avec "Caen" dans l'index. Il ne va pas non plus exposer automatiquement l'autre enregistrement "Biarritz", parce que l'enregistrement n'a pas été mis à jour, donc pas d'enregistrements pour "Biarritz" à ce moment dans l'index. L'ordre REINDEX mets explicitement à jour toutes les valeurs clé dans un index unique.

L'indexation d'une table avec SET UNIQUE ON a le même effet que INDEX avec l'option UNIQUE. Avec les tables DB et SQL, il crée un index distinct. Avec les tables DBF, il crée un index unique.

Reconstruire un fichier Index

Voir le code de la fonction Unique()

retour

Sources :

Aide Visual dbase V5.7
http://www.dbase.com/Knowledgebase/INT/xb2vdb7oodml/x2oodml.htm
Aide dBase Plus 2.6.0

dUFLP version W

Retour à l'accueil

Si vous voyez des erreurs, ou souhaitez apporter des compléments, n'hésitez pas à le signaler.

Les informations de cette page sont données à titre indicatif et ne se substituent pas à celles contenues dans l'Aide de votre version de dBase qui reste la meilleure documentation.

Dernière modification : lundi 13 septembre 2010

©  M.Abraham.