Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
Il vous faut remplacer sum( Montant-Facture) par
sum( aggr(
Only( Montant_Facture)
,
clé
))
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)
En faisant :
sum
( aggr(Only( Montant_Facture),clé,[N° document]
))
ça marche ! Ouf
Merci
Aie, non ça ne marche pas
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 ?
Au fait, d'où sort [N° Document] ? il n'apparait pas dans la structure des tables...
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 :