Florent Merel
Le « writeback » sur les dimensions (XMLA, SSAS & Co)
Simulation sur les dimensions
Par Florent Merel publié le 27/11/2007 à 20:35, lu 2492 fois, 5 pages
 4 | Les scripts
Les scripts utilisés ici vont permettre de simuler une embauche, un transfert et un départ d'employé. Ce qui se traduit en termes de requêtes XMLA par un Insert, un Update puis un Delete de membre dans « Employee Hierarchy». Au début de la simulation cette hiérarchie comprend les membres suivants :
 
Membres de la dimension EMPLOYEE

Membres de la dimension EMPLOYEE

 
Cette requête va ajouter l'employé « MILAN KUNDERA » dans la section 1 de la division B

<Insert xsi:type="Insert" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

  xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" 

  xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" 

  xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">

  <Object>

    <Database>MSBI_WATCH</Database>

    <Cube>$DIM EMPLOYEE</Cube>

    <Dimension>DIM EMPLOYEE</Dimension>

  </Object>

  <Attributes>

    <Attribute>

      <AttributeName>Employee</AttributeName>

      <Keys>

        <Key xsi:type="xsd:string">MILAN KUNDERA</Key>

      </Keys>

    </Attribute>

    <Attribute>

      <AttributeName>Section</AttributeName>

      <Keys>   

        <Key xsi:type="xsd:int">1</Key>

      </Keys>

    </Attribute>

    <Attribute>

      <AttributeName>Division</AttributeName>

      <Keys>

        <Key xsi:type="xsd:string">B</Key>

      </Keys>

    </Attribute>

  </Attributes>

</Insert>

La requête d'insertion se compose de 2 sous-parties principales :
  1. Object qui va permettre de désigner l'objet sur lequel appliquer la modification, ici en l'occurrence la dimension « DIM EMPLOYEE » de la base « MSBI_WATCH »
  2. Attributes qui va décrire le membre à rajouter grâce à la liste de ces attributs. Les attributs sont une combinaison key/value et il est nécessaire de typer les données (http://www.w3.org/TR/xmlschema-2/#built-in-primitive-datatypes).
    A l'exception des champs auto-incrémentés (SU_EMPLOYEE), tous les attributs d'un membre doivent être renseignés (http://technet.microsoft.com/en-us/library/ms365403.aspx)
On exécute donc cette requête, et... ...voici le résultat :
 
Ajout d'un employee

Ajout d'un employee

 
En rafraîchissant la vue sur « Employee Hierarchy » on voit apparaître l'employé.

Que s'est il passé au niveau du moteur OLAP ? Via cette requête on demande l'ajout d'un membre à la hiérarchie et de lui-même le cube va reprocesser les différents objets sur lesquels cette modification à des répercutions, ici en l'occurrence les différentes hiérarchies de la dimension Employee et le cube.
En explorant les données du datamart on peut remarquer que la ligne concernant notre employé a été ajoutée à la table MSTB_DIM_EMPLOYEE.
 
Table des employées

Table des employées

 
Lorsqu'on effectue du writeback sur les données de fait, les écritures se font dans une table séparée de la table de faits (table de writeback). Ceci permet de garder un historique des modifications et éventuellement de les supprimer par la suite. Ici, au contraire, les modifications impactent directement la table de dimension, on ne peut donc pas revenir aussi facilement sur ces updates : en tenir compte dans le cas d'une implémentation en projet.
A l'instar d'un update via une requête SQL, le script XMLA se compose d'une partie avec la valeur des nouveaux attributs et d'une partie permettant de désigner le membre à modifier (la clause WHERE) :

<Update xsi:type="Update" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

  xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" 

  xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" 

  xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">

  <Object>

    <Database>MSBI_WATCH</Database>

    <Cube>$DIM EMPLOYEE</Cube>

    <Dimension>DIM EMPLOYEE</Dimension>

  </Object>

  <Attributes>

    <Attribute>

      <AttributeName>Section</AttributeName>

      <Keys>

        <Key xsi:type="xsd:int">2</Key>

      </Keys>

    </Attribute>

    <Attribute>

      <AttributeName>Division</AttributeName>

      <Keys>

        <Key xsi:type="xsd:string">A</Key>

      </Keys>

    </Attribute>

  </Attributes>

  <Where>

    <Attribute>

      <AttributeName>Employee</AttributeName>

      <Keys>

        <Key xsi:type="xsd:string">MILAN KUNDERA</Key>

      </Keys>

    </Attribute>

    <Attribute>

      <AttributeName>Section</AttributeName>

      <Keys>

        <Key xsi:type="xsd:int">1</Key>

      </Keys>

    </Attribute>

    <Attribute>

      <AttributeName>Division</AttributeName>

      <Keys>

        <Key xsi:type="xsd:string">B</Key>

      </Keys>

    </Attribute>

  </Where>

  <MoveWithDescendants>true</MoveWithDescendants>

</Update>

Une fois exécutée cette requête a permis de transférer l'Employee de la section B-1 vers la section A-2
 
Employé transféré

Employé transféré

 
Pour la forme, voici une requête de type suppression, encore une fois, on peut facilement faire le rapprochement avec une requête de type SQL (delete from where) :

<Drop xsi:type="Drop" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

  xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" 

  xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" 

  xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">

  <Object>

    <Database>MSBI_WATCH</Database>

    <Cube>$DIM EMPLOYEE</Cube>

    <Dimension>DIM EMPLOYEE</Dimension>

  </Object>

  <Where>

    <Attribute>

      <AttributeName>Employee</AttributeName>

      <Keys>

        <Key xsi:type="xsd:string">MILAN KUNDERA</Key>

      </Keys>

      </Attribute>

    <Attribute>

      <AttributeName>Section</AttributeName>

      <Keys>

        <Key xsi:type="xsd:int">2</Key>

      </Keys>

    </Attribute>

    <Attribute>

      <AttributeName>Division</AttributeName>

      <Keys>

        <Key xsi:type="xsd:string">A</Key>

      </Keys>

    </Attribute>

  </Where>

  <DeleteWithDescendants>true</DeleteWithDescendants>

</Drop>

Le membre n'est plus dans la hiérarchie :
 
Départ d'un employé

Départ d'un employé

 
L'objectif de cet exemple était de montrer comment modifier les dimensions. Les mesures associées à ces membres sont encore à null. L'ajout d'un employé n'a pas d'intérêt si on n'associe pas de salaire à cette personne, aussi, on ne peut dissocier le writeback sur les dimensions du writeback sur les mesures (encore une fois, je vous renverrai vers l'article suivant : http://www.techheadbrothers.com/Articles.aspx/write-back-ecriture-cubes-approche-leaf-to-top-page-1 si des projets de ce type vous tentent).
 
» Démarrer une discussion
 
Discussion démarée par Renaud Harduin le 27/11/2007 à 23:17, 1 commentaire(s).