Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Modélisation en étoiles avec 2 tables de fait

Bonjour,

Voici ma structure :

1 table "dimension" CLIENT :

"N° client"

"Secteur"

"Nom"

"prénom"

....

1 table "dimension" PRODUIT :

"Ref"

"Désignation"

"groupe produit"

....

1 table "dimension" CALENDRIER

"date"

"mois"

"année"

....

puis,

1 table "de fait" FACTURE :

"N° client"

"date"

"Ref"

"Qte facture"

"Montant facture"

.....

1 table "de fait" AVOIR :

"N° client"

"date"

"Ref"

"Qte facture"

"Montant facture"

......

Mon objectif : c'est de calculer le CA net 'facture - avoir' en fonction d'une classification Client et/ou Produits et en fonction du temps.

Problème : En faisant cette structure qlikview me génère un cycle donc ça ne va pas

Merci d'avance pour vos remarques et analyses

Mathieu

16 Replies
rlp
Creator
Creator

Il vous faut remplacer sum( Montant-Facture) par

sum( aggr(

               Only( Montant_Facture)

               ,

               clé

))

Not applicable
Author

En faisant cela j'obtiens :

- Le bon chiffre pour la cde1

- Pour la cde 2, j'ai comme résultat :  Le CA de la cde 2 - le CA de la cde 1

Car la cde 1 a des refs identiques à la cde 2  (sur la même date)

Not applicable
Author

En faisant :

 

sum

( aggr(Only( Montant_Facture),clé,[N° document]

))

ça marche ! Ouf

Merci

Not applicable
Author

Aie, non ça ne marche pas

rlp
Creator
Creator

Quelles sont les dimensions de votre tableau ?

En fait, j'utlisais Only() pour éviter les double compte, en pensant que seule la clé déterminait un Montant_Facture: peut être que le problème vient de là ?

Pourriez-vous poster uen application, quitte à charger de fausses données ou à les brouiller ?

rlp
Creator
Creator

Au fait, d'où sort [N° Document] ? il n'apparait pas dans la structure des tables...

Not applicable
Author

Les dimensions de mon tableau :

ANNEE / MOIS / N° DOCUMENT

Comme expressions j'utilise :

 

sum

( aggr(DISTINCT( Montant_Facture),[N° document],clé

))

J'ai rajouté le N° document (qui est le N° de la facture) afin de localiser le problème. Normalement je ne l'utilise pas.

La clé : CLIENT DATE REF ne permet pas d'identifier le montant_Facture. En effet, 1 même client peut passer plusieurs commandes à la même date et sur des mêmes ref

Autre question par rapport à la clé : si un client n'effectue pas d'avoir ne risque t'il pas d'être exclu même s'il à une facture?

Désolé je ne peux pas vous donner plus d'infos, je pars en vacances dans 10 min.

Je vous fournirai plus de données à mon retour

Merci d'avance pour votre aide

Ci dessous le code que j'utilise :

//---------------------------------------------------------------------------------------------//DebutH = now(1);                                                         // Récupère l'heure où le script s'exécute ////---------------------------------------------------------------------------------------------//
//CREATION DU CALENDRIER (Considéré comme une dimension TEMPS)---------------------------------//LET vDateMin = Num(MakeDate(2010,1,1));LET vDateMax = Num(MakeDate(2015,1,1)); //code init : Floor(YearEnd(AddMonths(Today(), 12)));-//LET vDateToday = Num(Today());

TempCalendar:LOAD$(vDateMin) + RowNo() - 1 AS DateNumber,Date($(vDateMin) + RowNo() - 1) AS TempDateAUTOGENERATE 1WHILE $(vDateMin)+IterNo()-1<= $(vDateMax);

MasterCalendar:LOADTempDate AS DATE,Day(TempDate) AS Day,Month(TempDate) AS Month,Year(TempDate) AS Year,Today() as DayNowRESIDENT TempCalendar ORDER BY TempDate ASC;
DROP TABLE TempCalendar;
LET vDateMin = Num(MakeDate(2010,1,1));LET vDateMax = Num(MakeDate(2015,1,1));  //code init : Floor(YearEnd(AddMonths(Today(), 12)));-//LET vDateToday = Num(Today());
//---------------------------------------------------------------------------------------------//
//CHARGEMENT INITIAL (données NAV) SANS RENOMMAGE ---------------------------------------------//OLEDB CONNECT TO xxxxxxxxxxxxxxxxx

//Dimension CLIENT --------------------------------------------// SQL SELECT AdrPTT1,
    AdrPTT2,
    AdrPTT3,
    "Bloqué" as Blocked,
    "Code postal",
    "Code vendeur",
    Nom,
    "N°" as CLIENTS,
    "Prénom",
    "Secteur client",
    Ville
FROM "xxxxxxxxxx".dbo."a_Client";

ARTICLE :                                     
//Dimension ARTICLE --------------------------------------------//SQL SELECT "Bloqué",
    "Code axe principal 1",
    "Code axe principal 2",
    "Code catégorie article",
    "Code groupe produits",
    "CODE INVENTAIRE",
    "Désignation",
    "N° article" as REF
FROM "xxxxxxxxx".dbo."a_Article";

FACTURE:                                      
//Table de fait Facture------------------------------------------//SQL SELECT "Date comptabilisation" as DATE,
    "Montant" as Montant_Facture,
    "N°" as REF,
    "N° client facturé" as CLIENTS,
    "N° document",
    "Quantité" as "Qte_Facture"
FROM "xxxxxxxxx".dbo."a_ET Facture + Ligne  Vente";

AVOIR :                                             
//Table de fait Avoir--------------------------------------------//SQL SELECT "Date comptabilisation" as DATE,
    Montant as Montant_Avoir,
    "N°",
    "N° client facturé" as CLIENTS,
    "Quantité" as Qte_Avoir,
    REF as REF
FROM "xxxxxxxx".dbo."a_ET Facture + Ligne Avoir";
//-----------------------------------------------------------------------------------------------//
//CREATION DE LA LINK TABLE ---------------------------------------------------------------------//
// Elimination des doublons propres à FACTURE
tmp_Link_Table:NoConcatenateLOAD DISTINCT
    
DATE,
    
CLIENTS,
    
REFRESIDENT FACTURE ;
// Elimination des doublons propres à AVOIRConcatenate( tmp_Link_Table )LOAD DISTINCT
    
CLIENTS,
    
DATE,
    
REFRESIDENT AVOIR ;
// Elimination des doublons dus aux combinaisons présentes dans les deux tables de fait
Link_Table :NoConcatenateLOAD DISTINCT
     *RESIDENT tmp_Link_Table ;
DROP TABLE tmp_Link_Table ;
FOR EACH table IN 'FACTURE' , 'AVOIR' , 'Link_Table'
 
    
LEFT JOIN ($(table))
    
LOAD
             
// champs_de_jointure               CLIENTS ,
             
DATE ,
             
REF,
             
//clé additionnelle              CLIENTS & '|&|' & DATE & '|&|' & REF as clé
    
RESIDENT $(table) ;

    
// On ne garde les champs problématiques que dans la Link_Table     IF '$(table)' <> 'Link_Table' THEN

         
DROP FIELDS CLIENTS , DATE , REF FROM $(table) ;

    
ENDIF
  NEXT table ;
//---------------------------------------------------------------------------------------------//FinH = now(1);                                                                  // Récupère l'heure où le script s'arrête ////---------------------------------------------------------------------------------------------//


CLIENT :