Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
HugoGarnier
Contributor II
Contributor II

Intervalmatch

Bonjour,

 

Mon tarif a une date de validité sur une période définie par une date de début ([Date d'application du tarif]) et une date de fin ([Fin de validité du tarif]).

Je récupère les tarifs dans une table avec la catégorie tarifaire ([CAT_TARIFAIRE]) et la référence du tarif (CLASS ) qui sont concaténées (CLASSCAT):

 

Dim_tarif_Année:

LOAD
[Date d'application du tarif],

[Fin de validité du tarif],
CLASS & [CAT_TARIFAIRE] as CLASSCAT

from … ;

 

Exemple :

Pour la CLASSCAT A1 :

Début -> 01/04/2012

Fin -> 16/10/2014

J’ai une table où les années tarifaires sont définies par une date de début et une date de fin :

Année_tarifaire:

LOAD * INLINE [
    Année_tarif, Date début tarif, Date fin tarif
    2010, 01/04/2010, 31/03/2011
    2011, 01/04/2011, 31/03/2012
    2012, 01/04/2012, 31/03/2013
    2013, 01/04/2013, 31/03/2014
    2014, 01/04/2014, 31/03/2015
    2015, 01/04/2015, 31/03/2016
    2016, 01/04/2016, 31/03/2017
    2017, 01/04/2017, 31/03/2018
    2018, 01/04/2018, 31/03/2019
    2019, 01/04/2019, 31/03/2020
];

 

Je veux pouvoir obtenir un tarif par catégorie tarifaire et par année tarifaire.

Ma table Année_tarifaire me permet de faire un intervalmatch.

J’ai donc:

Join données:
intervalmatch([Fin de validité du tarif])
LOAD [Date début tarif], [Date fin tarif]

 

Cela fonctionne mais je n’obtiens que l’année liée à la date de fin.

Or, ce que je veux c’est récupérer toute les années qui correspondent à la période du tarif.

 

Donc pour l’exemple précédent on a :

01/04/2012 -> 31/03/2013      (année tarifaire 2012)

01/04/2013 -> 31/03/2014      (année tarifaire 2013)

01/04/2014 -> 16/10/2014      (année tarifaire 2014)

 

L’objectif est d’obtenir une table avec mon CLASSCAT et les années tarifaires qui sont contenues dans la période de validité du tarif ( du 1/04/2012 au 16/10/2014).

 

Exemple :

CLASSCAT, année_tarifaire

CLASS1CAT1,2012

CLASS1CAT1,2013

CLASS1CAT1,2014

CLASS2CAT1,2013

…..

 

Je ne vois pas comment faire, quelqu’un aurait-il une solution ?

Merci beaucoup

1 Solution

Accepted Solutions
lcloatre
Partner - Creator III
Partner - Creator III

Bonjour,

As-tu essayé en faisant l'inverse ?

Join données:
intervalmatch([Date fin tarif])
LOAD [Date début validité], [Date fin validité]

View solution in original post

9 Replies
lcloatre
Partner - Creator III
Partner - Creator III

Bonjour,

As-tu essayé en faisant l'inverse ?

Join données:
intervalmatch([Date fin tarif])
LOAD [Date début validité], [Date fin validité]

HugoGarnier
Contributor II
Contributor II
Author

Ah oui je n'avais pas essayé, je n'aurais pas pensé que la solution serait aussi simple, merci beaucoup !!
HugoGarnier
Contributor II
Contributor II
Author

Bonjour,

J'ai un petit soucis avec la solution que tu m'as données.

Alors cela fonctionne très bien avec les tarifs des produits qui sont les mêmes que ceux de mon année tarifaire

(c'est d'ailleurs le cas pour une grande partie de mes produits).

Par exemple:

Pour un tarif avec une date de début et une date de fin suivante:

01/04/2011 - 31/03/2015

Nous récupérons bien les années : 2011, 2012, 2013 et 2014

 

Or, nous avons un problème avec les produits qui ont une date de fin de validité de tarif différente de celles présentes dans ma table 'Année_tarifaire'.

 

Exemple:

Pour un tarif avec une date de début et une date de fin :

01/04/2011 - 01/01/2015

Nous récupérons bien les années : 2011, 2012, 2013

Mais pas l'année 2014 qui doit normalement être récupéré.

Mais pour que ce soit le cas il faudrait que la 'Date fin tarif' correspondant à l'année 2014 (31/03/2015) soit comprise entre le 01/04/2011 et le 01/01/2015

 

Je ne vois pas du tout comment faire, as-tu une idée?

Ce n'est pas simple d'expliquer le problème et ça doit l'être encore plus pour le comprendre, je reste à disposition pour des informations supplémentaires.

Merci beaucoup

ezkurdim
Contributor II
Contributor II

Bonjour Hugo,

Essaye ceci:

Join données:
intervalmatch([Date début tarif])
LOAD [Date début validité], [Date fin validité]

HugoGarnier
Contributor II
Contributor II
Author

Bonjour,

J'ai utilisé cette technique mais j'ai le même problème si le produit a une date de début de validité de tarif différente de celles présentes dans ma table 'Année_tarifaire'.

 

Par exemple (l'exemple est différent que celui utilisé dans mon dernier post):

Pour un tarif avec une date de début et une date de fin :

01/01/2011 - 01/02/2015       

(date de début et de fin de validité de tarif différentes de celles présentes dans ma table 'Année_tarifaire')

Nous récupérons les années : 2010,2011, 2012, 2013

Avec intervalmatch([Date fin tarif])

Et Nous récupérons les années : 2011,2012,2013,2014

Avec intervalmatch([Date début tarif]) 

 

J’ai également un autre problème, lorsque j'ai une petite période de tarif pour un produit où ni la date de fin ni la date de début de tarif n'est comprise dans cette période, je ne peux pas récupérer l'année tarifaire.

Voici un exemple:

Si ma date de tarif pour mon produit est la suivante:

08/05/2010 - 31/12/2010

Je devrais récupérer l'année tarifaire 2010.

Or ma période de tarif 2010 est:

01/04/2010 - 31/03/2011

Et ni la date de début de tarif ni la date de fin de tarif n'est comprise dans la période de tarif de mon produit.

 

Aurais-tu une solution?

Merci beaucoup.

ezkurdim
Contributor II
Contributor II

Hello Hugo,

Sans chercher à optimiser je te propose la solution suivante.

L'idée est de générer toutes les dates comprises dans ton intervale de date de tes produits.

Ensuite on fait un IntervalMatch.

J'ai ensuite rapatrié l'Année dans la table des produits (Selon ton besoin de modélisation et l'utilisation de tes tables, tu peux agir autrement.).

PS: j'ai fait un chargement Inline avec un preceding load de la table des produits pour les besoins de l'exemple.

ProduitsTarifTemp:
  Load 
	DateD+(iterNo()-1) as DateX,
	DateD,
	DateF,
    CLASS,
    CAT_TARIFAIRE,
	CLASS & CAT_TARIFAIRE as CLASSCAT
  WHILE iterNo() <= (DateF - DateD) + 1
;
load * Inline [
DateD,	DateF,	CLASS,	CAT_TARIFAIRE
01.04.2012,	16.10.2014,	A,	1
01.04.2011,	01.01.2015,	B,	1
01.01.2011, 01.02.2015, C, 1
08.05.2010, 31.12.2010, D, 1
];

AnneTarif:
LOAD * INLINE [
    Année_tarif, Date début tarif, Date fin tarif
    2010, 01.04.2010, 31.03.2011
    2011, 01.04.2011, 31.03.2012
    2012, 01.04.2012, 31.03.2013
    2013, 01.04.2013, 31.03.2014
    2014, 01.04.2014, 31.03.2015
    2015, 01.04.2015, 31.03.2016
    2016, 01.04.2016, 31.03.2017
    2017, 01.04.2017, 31.03.2018
    2018, 01.04.2018, 31.03.2019
    2019, 01.04.2019, 31.03.2020
];

inner join(ProduitsTarifTemp)
IntervalMatchLink:
IntervalMatch(DateX)
load [Date début tarif], [Date fin tarif] resident AnneTarif ;

Inner Join(ProduitsTarifTemp)
load * Resident AnneTarif;


ProduitsTarif:
  Load Distinct
	DateD, DateF, CLASS, CAT_TARIFAIRE, CLASSCAT, Année_tarif
resident ProduitsTarifTemp;

drop table ProduitsTarifTemp;

 

HugoGarnier
Contributor II
Contributor II
Author

Bonjour,

Merci beaucoup pour cette réponse ça m'aide beaucoup, j'avais pensé à quelque chose du genre dans mon premier script mais je ne connaissais pas la fonction de script iterNo, je t'en suis très reconnaissant.

Malheureusement, je ne sais pas si c'est ton cas mais quand j'ai testé ton code je me retrouve avec une table ProduitTarif vide.

Après plusieurs test je me rend compte que c'est le iterNo qui ne fonctionne pas.

Je m'explique, j'ai trouvé un exemple d'utilisation de la fonction iterNo sur https://help.qlik.com/fr-FR/qlikview/November2017/Subsystems/Client/Content/Scripting/CounterFunctio...

Ici, on change le jour de la date et non l'année, ce qui fait que le script suivant fonctionne:

LOAD 
   IterNo() as Day,
   Date( StartDate + IterNo() - 1 ) as Date
   While StartDate + IterNo() - 1 <= EndDate;



LOAD * INLINE

[StartDate, EndDate

2014-01-22, 2014-01-26

];

Et charge bien la table suivante:

Day     Date
1	2014-01-22
2	2014-01-23
3	2014-01-24
4	2014-01-25
5	2014-01-26

Or, lorsque je change le format de la Date pour que le iterNo affecte l'année et non le jour :

LOAD 
   IterNo() as Day,
   Date( StartDate + IterNo() - 1 ) as Date
   While StartDate + IterNo() - 1 <= EndDate;

 

LOAD * INLINE

[StartDate, EndDate

22-01-2014, 22-01-2016


];

Je me retrouve avec une table vide, est-ce normal?

 

As-tu les mêmes résultats ou cela fonctionne-t-il pour toi?

Merci beaucoup .

ezkurdim
Contributor II
Contributor II

Bonjour Hugo,

Cela fonctionne parfaitement chez moi.

Je pense que c'est dû au format de date de mon exemple!

Mon format de date est le suivant : SET DateFormat='DD.MM.YYYY';

Tu travailles probablement avec le format DD/MM/YYYY.

Essaye de  changer le format des dates de mon exemple pour le calquer sur le tien.

 

HugoGarnier
Contributor II
Contributor II
Author

Bonjour Ezkurdim,

C'était bien le format de la date qui était initialisé en 'DD/MM/YYYY' à la création de mon application QlikView.

J'ai donc fait les changements et cela fonctionne, mais le chargement de l'application est assez long (2 minutes 27).

Pour cause le chargement de 18 millions de lignes dans ma table Tarifs_Final ( équivalent de ta table ProduitsTarifTemp ) :

18M lignes fetched.PNG

Je ne trouve pas de moyen pour optimiser le chargement, penses-tu qu'il y en a un?

Dans tout les cas je te remercie pour tes réponses qui m'ont beaucoup aidé et me permettent d'avoir un résultat satisfaisant 🙂

Bonne journée.