Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
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 ?

1 Solution

Accepted Solutions
YoussefBelloum
Champion
Champion

Bonjour bckaps69

Ci-joint le QVW attaché,

ca marche pour le jeu de données que tu a mis sur le Thread,

Essaye et di moi

View solution in original post

13 Replies
YoussefBelloum
Champion
Champion

Bonjour,

tout est clair jusqu’à la date DateValo.. cette date corresponds a quoi exactement ?

bckaps69
Contributor
Contributor
Author

C'est une date aléatoire

brunobertels
Master
Master

Bonjour

Tu trouveras une solution a ton problème avec la fonction intervalmatch

https://help.qlik.com/fr-FR/sense/February2018/Subsystems/Hub/Content/Scripting/ScriptPrefixes/Inter...

YoussefBelloum
Champion
Champion

Bonjour Bruno,

en fait je crois que c'est un peu plus compliqué que ca.. pour moi la solution serait eventuellement de combiner la fonction intervalmatch avec la technique "canonical date" et quelque conditions dans le script.

si tu a une solution plus simple et testée, n'hésite pas a la partager avec nous

YoussefBelloum
Champion
Champion

Hi rwunderlich‌ hope you're doing well, maybe you can take a look here ?

Maybe I need to translate to save your time:

here OP have two tables, 1 price table (with DatePrice) and 1 Quantity table (DateStock), with an Article Id linking these two tables

he wants to calculate the valuation (Qty*price) using a single Date field (be able to select every day, 365 day per year)

where:

1.     on each date selected, the price should be equal to the price which correponds to a DatePrice that is equal or lower than the Date selected


AND


2.     on each date selected, the Qty should be equal to the Qty which correponds to a DateStock that is equal or lower than the Date selected


I was thinking about a combination of Intervalmatch and Canonical Date technique..

ogautier62
Specialist II
Specialist II

Bonjour,

Si je comprends bien tu veux faire une valorisation de stock en FIFO,

Si la qté augmente : il faut prendre le prix à date (donc date immédiatement inférieure ou égale dans VALO)

Si la qté diminue : il faut décrémenter au prix le plus ancien, et pas forcément à la date inférieure :

au 04/02 tu en rentre 12 à 99 = 12*99

au 28/02 tu en sors 3 : il te reste 9 valorisés à 99

au 30/04 tu en sors 2 : reste 7 valorisés  à 99 (et non pas 102)

Il faut commencer par valoriser les entrées (le stock augmente) à la date de valo<=

(par interval match) donc :

04/02 +12   12*99

ensuite on place les sorties

ici :

28/02   - 3

30/04  -2

reste donc 7 à 99 unité = 7*99

sur un cas plus compliqué :

+5 à 99 le 01/01

+7 à 102 le 02/01

- 6 le 03/01

si tu es en fifo tu décrémente d'abord les 5 à 99 +1 à 102, restent 6 à 102

su tu es en lifo tu décrémente d'abord 6 à 102, restent 5 à 99 + 1 à 102

if faut dans ce cas faire une boucle sur une table des E/S

cdt

YoussefBelloum
Champion
Champion

Bonjour bckaps69

Ci-joint le QVW attaché,

ca marche pour le jeu de données que tu a mis sur le Thread,

Essaye et di moi

brunobertels
Master
Master

Bonjour Youssef

En effet çà parait plus compliqué qu'initialement et hélas non je n'ai pas de solution : trop novice pour ce cas

Bruno

cje
Employee
Employee

Bonjour,

Principe de base de Qlik : limiter au maximum les calculs complexes dans les formules et faire jouer l’associativité à plein afin de maximiser les performances. Une solution très simple consiste à appliquer le principe de l’associativité dans ce cas précis.

Au regard des données de l’exemple, la base tarifaire est mensuelle, mais les mouvements de stocks sont eux aléatoire et quotidiens sur une période donnée. Pour qu’on puisse associer un tarif à une date de stock donnée, il faut juste un élément de rapprochement et de comparaison.

Ici, j’ai pris le mois couplé à l’année et à l’article. Bien entendu, dans la vraie vie ce sera certainement plus complexe, mais cela donne une base de départ pour la compréhension.

Donc, pour s’en sortir, il faut qu’on crée un pont entre le tarif et le stock sur une base article/mois/année . Pour ce faire, on crée un champ « Code tarif » qui est la concaténation des champs mois/année/code article dans les 2 tables. L’association entre le bon prix et le bon article pour une période donnée va se faire automatiquement, par associativité.

Ensuite, pour éviter les problèmes de modélisation liés à la redondance des champs identiques dans les tables (pour éviter les tables de clés synthétiques, on ne doit garder qu’un seul champ faisant le pont entre 2 tables), on élimine tous les champs non nécessaires dans l’une ou l’autre des tables. J’ai ici conservé le champ article dans la table des stocks mais en toute logique, il faudrait le conserver dans la table de référence, c’est-à-dire le tarif. Ca ne change pas grand-chose sur un petit modèle. Sur un modèle avec des dizaines de millions de lignes de mouvement, ça peut induire sur la performance.

Le résultat est en pièce jointe (Qlikview 12.2).

Cdt

Christophe Jouve

Principal Solution Architect

De : bruno bertels

Envoyé : lundi 14 mai 2018 18:21

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

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