Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
bckaps69
Contributor
Contributor

Calcul en fonction d'un tarif qui évolue dans le temps

Bonjour,

Je vous soumets une problématique que je n'arrive pas à optimiser.

D'un côté, j'ai une table VALO avec :

Article     DateTarif     Prix

ART-1     01/01/18     99

ART-1     01/03/18     102

D'un autre côté, j'ai une table STOCK avec :

Article     DateStock     Qté

ART-1     31/01/18         12

ART-1     28/02/18          9

ART-1     31/03/18          7

J'aimerai calculé ma valorisation à date, c'est à dire obtenir cela :

Article     DateValo     Qté     Valo

ART-1     04/02/18     12        1188 (12x99)

ART-1     28/02/18     9          891 (9x99)

ART-1     30/04/18     7          714 (7x102)

Avez-vous une solution à me proposer ?

13 Replies
sfatoux72
Partner - Specialist
Partner - Specialist

Je pense que c'est cela que tu veux :

community_1485698.png

SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 €;-# ##0,00 €';
SET TimeFormat='hh:mm:ss';
SET DateFormat='DD/MM/YYYY';
SET TimestampFormat='DD/MM/YYYY hh:mm:ss[.fff]';
SET FirstWeekDay=0;
SET BrokenWeeks=0;
SET ReferenceDay=4;
SET FirstMonthOfYear=1;
SET CollationLocale='fr-FR';
SET MonthNames='janv.;févr.;mars;avr.;mai;juin;juil.;août;sept.;oct.;nov.;déc.';
SET LongMonthNames='janvier;février;mars;avril;mai;juin;juillet;août;septembre;octobre;novembre;décembre';
SET DayNames='lun.;mar.;mer.;jeu.;ven.;sam.;dim.';
SET LongDayNames='lundi;mardi;mercredi;jeudi;vendredi;samedi;dimanche';


//////////////////////////////////////
// Données de base
//////////////////////////////////////
VALO:
Load *
Inline [
Article, DateTarif, Prix
ART-1, 01/03/18,102
ART-1, 01/01/18, 99
]
;

STOCK:
Load *
Inline [
Article, DateStock, Qté
ART-1, 31/03/18, 7
ART-1, 28/02/18, 9
ART-1, 31/01/18, 12
]
;


//////////////////////////////////////
// Création d'un calendrier
//////////////////////////////////////
LET vMinDate = Num(Makedate(2018,1,1));
LET vMaxDate = Num(Makedate(2018,5,31));

ChampDate:
LOAD date($(vMinDate)+IterNo()-1) as MaDate
AUTOGENERATE (1)
WHILE $(vMinDate)+IterNo()-1<= $(vMaxDate);

Calendrier:
LOAD
MaDate as Date,
Year(MaDate) as Année,
'T ' &
Num(Ceil(Month(MaDate)/3),'(ROM)0') as Trimestre,
Month(MaDate) as Mois,
MonthEnd(MaDate)as DateFinMois,
Week(MaDate) as Semaine,
Weekday(MaDate) as JourSemaine,
Day(MaDate) as Jour
RESIDENT ChampDate;

DROP TABLE ChampDate;
SET vMinDate = ;
SET vMaxDate = ;


//////////////////////////////////////
// Création des date de début et de fin
//////////////////////////////////////
Left Join(VALO)
Load
Article, //Clé jointure
DateTarif, //Clé jointure
DateTarif as DateTarifDebut,
If(Previous(Article) = Article, Previous(DateTarif)-1, DayStart(Now())) as DateTarifFin
Resident VALO
Order by DateTarif desc;


Left Join(STOCK)
Load Distinct
Article, //Clé jointure
DateStock, //Clé jointure
DateStock as DateStockDebut,
If(Previous(Article) = Article, Previous(DateStock)-1, DayStart(Now())) as DateStockFin
Resident STOCK
order by DateStock desc;



//////////////////////////////////////
// Association des quantité et prix par article et date
//////////////////////////////////////
Left Join (VALO)
IntervalMatch(Date)
Load DateTarifDebut, DateTarifFin Resident VALO;

Left Join (STOCK)
IntervalMatch(Date)
Load DateStockDebut, DateStockFin Resident STOCK;

Drop Field DateTarifDebut;
Drop Field DateTarifFin;
Drop Field DateStockDebut;
Drop Field DateStockFin;

Join(VALO)
Load *
Resident STOCK;

Drop table STOCK;
Rename table VALO to VALO_STOCK;

bckaps69
Contributor
Contributor
Author

Bonjour à tous,

Merci pour vos réponses et pour votre aide. J'ai réussi à obtenir ce que je souhaitais.

Dans le même genre d'idée, je vous soumets une autre problématique.

J'ai d'un côté une table de conversion comptable avec les champs suivants :

Domaine FamilleSous-familleCompte
A0101601000
A0201602000
A0202602200
A03603000
A0304603400

Et de l'autre côté une table article :

ArticleDomaineFamilleSous-famille
ART-01A0101
ART-02A0201
ART-03A03
ART-04A0301
ART-05A0304

J'aimerai pouvoir rapprocher ces deux tables pour affecter le compte comptable à chaque article. Pas de problème particulier pour les articles 1, 2, et 5. En revanche, j'aimerai obtenir pour l'article 4 le compte 603000 (en l'absence de sous-famille, je remonte sur la famille uniquement.

Merci d'avance pour vos pistes.

YoussefBelloum
Champion
Champion

Bonjour Julien

moi personnellement je suis toujours curieux et je veux toujours aller au bout d'un probleme, j'aimerai beaucoup que tu partage avec nous ce qui a marché pour toi, ce que tu a rajouté. de marquer ce thread comme résolu (en marquant ta propre réponse comme correcte si aucune des solutions proposés n'a vraiment marché a 100%).

Aussi, pour que tout le monde puisse se retrouver en faisant les recherches, je t'invite (si tu veux bien) a créer un thread dédié a chaque problématique.

cje
Employee
Employee

Bonjour,

Une méthode simple et rapide consiste à rapprocher les deux tables par jointure ouverte (full join), et à remplacer les valeurs de comptes vides par une valeur récupérée dans un mapping.

D’autres méthodes sont possibles - certainement plus élégantes, celle-ci est un exemple.

Tout se fait au moment du chargement des données.

Commentaires dans le script de chargement.

Cdt

Christophe Jouve

De : Julien Roblès

Envoyé : mardi 15 mai 2018 14:16

À : Christophe Jouve <Christophe.Jouve@qlik.com>

Objet : Re: - Calcul en fonction d'un tarif qui évolue dans le temps