Colonnes calculées dans les tables de la base de données de Mercator

0000002651     -      09/08/2016

 

Les versions de Mercator Majuro ultérieures au 23/07/2016 reconnaissent et gèrent correctement les colonnes calculées dans les tables suivantes :

  • toutes les tables de signalétiques : CLI, FOU, STOCK, GEN, ANA, DEST, ...
  • PIEDS_V et LIGNES_V
  • PIEDS_A et LIGNES_A
  • PIEDS_D et LIGNES_D
  • PIEDS_C et LIGNES_C
  • ACTIONS

L'intérêt des colonnes calculées en SQL est multiple :

  • Simplifier des requêtes d'extraction de données qui font toujours appel au même calcul.
  • Indexer des zones calculées afin d'optimiser des clauses where faisant appel à ce calcul.
  • Diminuer le nombre d'accès en lecture puisque, sauf si spécifié, une colonne calculée n'est pas matérialisée dans la base de données mais est virtuelle.

Une colonne calculée peut se créer via les outils clients de SQl Server :

En TSQL, la création d'une colonne calculée se fait comme suit :

  • Colonne virtuelle :
    ALTER TABLE PIEDS_V ADD JOU_PIECE as (rtrim(JOURNAL)+' '+ltrim(str(PIECE)))
     
  • Colonne persistante : 
    ALTER TABLE PIEDS_V ADD JOU_PIECE as (rtrim(JOURNAL)+' '+ltrim(str(PIECE))) PERSISTED

Sans être exhaustif, voici quelques considérations relatives aux colonnes calculées :

  • Pour être indexée, une colonne calculée doit être persistante.
  • Une colonne persistante ne peut contenir qu'une expression déterministe (pas d'accès aux autres tables, aux autres enregistrements de la table, à GETDATE(), ...)
  • Si une colonne persistante utilise une fonction utilisateur, celle-ci doit contenir WITH SCHEMABINDING.
  • Lors de la création de l'expression, il y a lieu de tenir compte de tous les cas possibles et d'éviter, notamment, les divisions par zéro. Par exemple pour une colonne calculée S_MARGE dans la table STOCK, il faut tester si le dénominateur (s_dpa) n'est pas nul : case when s_dpa=0 then -1 else s_prix_ht/s_dpa end

Dans Mercator, les colonnes (dans les LinesEditors) ou les textbox issues de colonnes calculées sont toujours affichées en lecture seule. Il faut aussi bien prendre en compte que la valeur est uniquement calculée par SQL Server et jamais par l'interface de Mercator. Il n'y a donc aucun rafraîchissement de ces valeurs en dehors d'une relecture depuis la base de données SQL.

Les colonnes calculées ne sont pas supportées par les versions Legacy et Aruba de Mercator. Elles ne peuvent donc PAS être utilisées dans le cadre d'un scénario 2.