Déclaration des index dans le dictionnaire
Introduction
Le dictionnaire de données décrit pour chaque table les index permettant d'y accéder. Un index est caractérisé par une lettre clé utilisée par les programmes afin de préciser le choix du ou des index à utiliser pour accéder aux tables.
La gestion de fichiers d'Harmony est particulièrement riche au niveau des fonctionnalités apportées par les index. Notamment une même lettre clé peut permettre d'accéder à plusieurs tables différentes ou peut être définie plusieurs fois avec des compositions différentes ou encore peut porter de manière sélective sur certaines lignes particulières d'une table. Ces fonctionnalités n'existent pas directement dans les index classiques d'une base de données SQL où chaque index ne permet d'accéder qu'à une seule table unique, ne comporte qu'une seule description et accède de manière inconditionnelle à toutes les lignes d'une table.
Pourtant ces fonctionnalités des index de la gestion de fichiers d'harmony peuvent être apportées facilement et de manière complètement transparente grâce à des tables intermédiaires. Ces tables intermédiaires sont alimentées automatiquement par les déclencheurs opérant sur les tables de base.
Exemples
L'index permettant d'accéder aux tiers (c'est à dire à la table des clients, la table des fournisseurs, la table des prospects …) est simulé par la création d'une table des tiers, dans laquelle, pour chaque tiers l'on précisera s'il s'agit d'un client, d'un fournisseur ou d'un prospect.
La table des statistiques de ventes comporte plusieurs codes représentant. On décrira autant index utilisant la même lettre que de codes représentant. Pour SQL, la table intermédiaire des statistiques par représentant permet de simuler le fonctionnement de ces index.
La table des écritures comptables comporte des écritures lettrées et des écritures non lettrées. Harmony permet de définir un index conditionnel ne portant que sur les écritures non lettrées. Les écritures non lettrées forment un sous-ensemble de la table des écritures. Pour SQL, la table intermédiaire des écritures non lettrées fera office d'index conditionnel sur l'ensemble des écritures.
Rappels terminologiques
L'identifiant d'une table est un code d'un caractère qui distingue chaque table d'un fichier Harmony. Il est obligatoire pour les fichiers comportant des tables différentes.
Le code condition est un code d'un caractère déterminant si une entrée doit être générée dans l'index d'une table pour une ligne particulière. Dans la description de l'index soumis à une condition on indique le nom du champ servant de code condition ainsi que l'opérateur de la condition et sa valeur. Le code condition peut être un des champs qui compose l'index ou non. Il peut correspondre à l'identifiant de la table ou non.
Les types d'index
Lors de la description d'un index dans le dictionnaire de données, le paramètre type d'index SQL permet de définir comment l'index d'Harmony doit être traité dans le cas d'une utilisation avec un serveur SQL. La suite de ce chapitre décrit les différents types d'index pris en compte.
Les déclencheurs
Un déclencheur (en anglais trigger) est une procédure stockée SQL qui est automatiquement exécutée par le moteur SQL lors de la mise à jour d'une table (requêtes insert, update ou delete). Elle s'exécute avec la mise à jour de la table dans le cadre d'une transaction, c'est à dire que si l'opération effectuée par le déclencheur n'aboutit pas, la mise à jour de la table n'est pas non plus effectuée. Ceci permet de garantir l'intégrité référentielle de la base de données.
Lors de la création des tables dans SQL par XPSQL.dhop, celui-ci crée automatiquement les tables intermédiaires nécessaires ainsi que les déclencheurs pour les alimenter. Une mise à jour directe d'une table par une requête SQL met également à jour les tables intermédiaires de manière tout à fait automatique et transparente.
Index normal
Pour un fichier Harmony, lorsqu'une lettre clé donnée permet d'accéder à une table et une seule, l'index peut-être déclaré de type normal. Il devient un simple index dans la base SQL avec pour composition les champs décrits dans le dictionnaire.
Il peut être éventuellement soumis à une condition. Plusieurs cas doivent alors être envisagés :
La condition correspond strictement à l'identifiant de la table. Dans ce cas elle est ignorée dans l'index, puisque toutes les lignes de la table correspondent obligatoirement à la condition.
La condition définit un sous-ensemble de la table courante et l'opérateur de la condition est l'égalité. Dans ce cas, le code condition est ajouté en majeur dans les champs qui composent l'index. La lecture par cet index ne retient que les lignes pour lesquels la condition est remplie. Remarque : Si le sous-ensemble correspondant aux lignes répondant à la condition est peu important, il peut être plus judicieux de définir cet index de type conditionnel pour accélérer les écritures et réduire l'espace disque.
La condition définit un sous-ensemble de la table courante mais l'opérateur de comparaison n'est pas l'égalité. Dans ce cas, l'index ne peut pas être défini de type normal, mais doit impérativement être de type conditionnel.
Exemple 1
L'index "Index_A" du fichier GTFSTA de Divalto Achat-Vente permet d'accéder exclusivement à la table STA. Le code condition CE1 correspond à l'identifiant de la table STA.
Exemple 2
L'index "Index_A" du fichier CCFTSC de Divalto Comptabilité permet d'accéder exclusivement à la table CS. Il ne comporte aucune condition particulière.
Index multi-tables
Pour un fichier Harmony, lorsqu'une même lettre clé permet d'accéder à plusieurs tables différentes l'index peut-être déclaré de type multi-tables. Plusieurs cas sont à envisager :
L'identifiant de la table est un des champs de l'index. On peut envisager de déclarer l'index de type avec identifiant.
La composition des différents index avec la même lettre clé ne comporte pas les mêmes champs selon les tables auxquels elle permet d'accéder. Ce cas n'est pas pris en compte par XLANSQL. Il s'agit d'une incompatibilité totale et il convient de modifier l'application.
La composition des différents index est la même quelle que soit la table. Dans ce cas, XLANSQL gère une table intermédiaire avec les champs de l'index. Chaque ligne de la table intermédiaire pointe sur la ligne correspondante dans la table cible.
Exemple
Pour le fichier GTFPCF de Divalto Achat-Vente, la lettre clé 'A' permet d'accéder aux clients, aux prospects, aux fournisseurs, aux autres tiers et aux représentants. La description de l'index est la même pour toutes les tables. Une table intermédiaire est automatiquement créée dans la base SQL (la table des "Tiers" avec une nature de tiers et une référence à la table du tiers correspondant).
Index avec identifiant
Pour un fichier Harmony, lorsqu'une même lettre clé permet d'accéder à plusieurs tables différentes et que l'index inclut l'identifiant de la table à laquelle il permet d'accéder, l'index peut-être déclaré de type avec identifiant.
Avantages
Contrairement à l'index de type multi-tables, l'index avec identifiant n'a pas besoin de table intermédiaire. Chaque index de chaque table devient alors un simple index de la table SQL.
De plus chaque index peut avoir une description différente. Toutefois, pour une lettre clé donnée, la taille totale des champs des l'index doit être identique pour tous les index. Si pour un index cette taille est plus courte, il convient d'ajouter un filler dans la description de l'index.
Incompatibilité
Cependant, il y a deux différences majeures dans l'utilisation des index avec identifiant au niveau de la programmation qui peuvent nécessiter une adaptation des programmes qui les utilisent.
L'identifiant de la table doit impérativement être positionné dans la clé avant tout accès en lecture. En effet c'est la valeur de l'identifiant dans la donnée tdf.key qui permet de savoir à quelle table s'adresse la requête. Une tentative d'accès sans une valeur de l'identifiant correcte dans la clé provoque une erreur fatale spécifique lors de l'accès à une base SQL, alors qu'elle n'en génère pas lors d'un accès à un fichier Harmony.
Lors d'une lecture séquentielle d'une table SQL pour un code identifiant donné, une tentative de lecture après la dernière ligne de la table renvoie un code de détection de fin de fichier (H_EOF), alors que la lecture d'une table Harmony renvoie la première ligne de la table avec l'identifiant suivant.
Exemple
Pour le fichier GTFTAB de Divalto Achat-Vente, la lettre clé 'A' permet d'accéder à toutes les tables de paramètres du fichier (Libellés des familles de tarif, mode de règlements, taux de tva, etc…). L'index contient l'identifiant de la table à laquelle il permet d'accéder. L'application positionne toujours l'identifiant dans la clé avant un accès.
Index multi-descriptions
Pour un fichier Harmony, lorsqu'une même lettre clé permet d'accéder à une seule table, mais que cette lettre clé est utilisée dans plusieurs index avec des descriptions différentes mais homogènes, l'index peut-être déclaré de type multi-descriptions.
Pour cet index, XLANSQL gère une table intermédiaire contenant les champs de l'index de référence et pointant sur les lignes correspondantes de la table de base.
Descriptions homogènes
"Descriptions différentes mais homogènes" signifie que les champs qui composent chaque index avec la même lettre clé sont différents, mais que chaque index comporte le même nombre de champs et que chacun des champs a la même nature (alphanumérique, numérique,…) et la même longueur dans tous les index. Les descriptions des clés différentes mais non homogènes ne sont pas prises en compte par XLANSQL et constituent une incompatibilité totale.
Référence pour la table intermédiaire
Pour les index de type multi-descriptions, le paramètre "Référence pour la table intermédiaire" doit être coché pour un et un seul des index de la lettre clé considérée. Cette description sera utilisée pour la création de la table intermédiaire
Exemple
Pour le fichier GTFSTAT de Divalto Achat-Vente, la lettre clé 'K' permet d'accéder à la table STA. Cette table contient un tableau de trois codes représentant. La lettre 'K' est utilisée par trois index de description homogène, chacune avec un des trois codes représentant. Le premier index est défini comme "référence pour la table intermédiaire". XLANSQL gère automatiquement la table intermédiaire des statistiques de ventes par représentant.
Index conditionnel
Pour un fichier Harmony, lorsqu'une lettre clé permet d'accéder à une table et une seule et que le code condition définit un sous-ensemble de la table, l'index peut-être déclaré de type conditionnel.
XLANSQL gère une table intermédiaire avec les champs de l'index pour les lignes qui répondent à la condition.
Exemple
La table C8 du fichier CCFDCE de Divalto Comptabilité contient des écritures "non lettrées" pour lesquels le condition Ce4 est égal à 1. Les écritures "non lettrées" constituent un sous-ensemble de l'ensemble des écritures. L'index "index_D_C8" permet d'accéder spécifiquement aux écritures "non lettrées". XLANSQL gère automatiquement une table des écritures "non lettrées" pour cet index.