ACTUALITÉS

PRINCIPE DE BASE

Le principe est de propager le filtre positionné sur une table à l’ensemble des tables qui en dépendent. Par exemple, si on filtre les factures sur l’année en cours, on veut également ne récupérer que les lignes de factures de l’année en cours. Pour ce cas simple, il s’agit de détecter la relation entre la table Facture et la table LigneFacture pour récupérer le filtre paramétré sur la 1ere table et l’appliquer à la 2nde.

Dans le paramétrage ONYX :

– le filtre « YEAR(Facture.DateFacture) = YEAR(GETDATE()) » est positionné sur la table facture
– il est marqué comme propagé 

– le champ LigneFacture.ReferenceFacture référence le champ Facture.Reference
– le champ LigneFacture.ReferenceFacture est obligatoire (NOT NULL)

Lors du captage de la table Facture, le requête suivante est générée : 

SELECT 
                Facture.* 

FROM 

                Facture 

WHERE 

                YEAR(Facture.DateFacture) = YEAR(GETDATE())


Lors du captage de la table LigneFacture, le requête suivante est générée :

SELECT 
                 LigneFacture.* 

FROM 

                 LigneFacture 

                 JOIN Facture 

                            ON LigneFacture.ReferenceFacture = Facture.Reference 

                            AND YEAR(Facture.DateFacture) = YEAR(GETDATE())

Généralisation

 

Lors du captage d’une table, on recherche toutes les tables ayant des filtres propagés dont elle dépend directement ou non puis on applique l’ensemble des filtres trouvés. 
Exemple :

Si les tables A et B ont respectivement les filtres propagés FAet F
– le captage de la table C doit tenir compte du filtre F

– le captage de la table D doit tenir compte des filtre FAet FB

Cas problématiques

Boucles

 

La recherche des filtres propagés applicables à une table se fait par parcours de l’arbre des dépendances entre les tables.  Cet arbre peut toutefois contenir des boucles :

Dans ce cas, il faut détecter qu’il y a une boucle afin de ne rechercher les dépendances indéfiniment.

Chemins multiples

 

L’arbre des dépendances entre les tables peut également contenir des chemins multiples entre une table et la table sur laquelle est positionné un filtre propagé :

Dans l’exemple ci-dessus, si un filtre propagé est positionné sur la table A, ce filtre est propagé à la table D par les chemins suivants : 
– A→B→D

– A→B→C→D

Cela pose un problème lors de la construction de la requête de captage de la table D, elle aurait en effet les jointures suivantes :

FROM 
             D 

             JOIN B ON D.IdB = B.IdB 

             JOIN A ON B.IdA = A.IdA AND F

             JOIN C ON D.IdC = C.IdC 

             JOIN B ON C.IdB = B.IdB 

             JOIN A ON B.IdA = A.IdA AND FA

Les tables A et B apparaissent deux fois dans la requête, ce qui provoque une erreur de syntaxe. 
Il faut construire la requête avec les jointures suivantes :

FROM
             D

             JOIN C ON D.IdC = C.IdC 

             JOIN B ON D.IdB = B.IdB AND C.IdB = B.IdB

             JOIN A ON B.IdA = A.IdA AND FA