Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Créér un calendrier

Bonjour,

Je débute sur Qlikview

Voici ma structure. J'ai :

1 table FACTURE avec toutes les factures (CLIENT, DATE, QTE, ARTICLE, MONTANT FACTURE,.....)

1 table AVOIR avec tous les avoirs ((CLIENT, DATE, QTE, ARTICLE, MONTANT AVOIR,.....)

1 table CLIENT avec tous les clients (CLIENT, ADRESSE, N° TEL, VENDEUR,.......)

Donc j'ai :

CLIENT en liaison avec FACTURE et en liaison avec AVOIR avec comme clé le champ CLIENT

Le but :

Avoir un tableau regroupement la somme des MONTANT FACTURE + MONTANT AVOIR par client, vendeur, article et par année trimestre mois

Problème :

Dans mon tableau, j'utilise le champ DATE de la table FACTURE. Du coup, les données de la table AVOIR ne sont pas prises en compte.

Avez vous une façon de faire? Faut'il passer par une gestion d'un calendrier et lier les tables FACTURE et AVOIR avec ce calendrier? Si oui, comment créer ce calendrier?

Merci d'avance

Mathieu

1 Solution

Accepted Solutions
almamy_diaby
Creator
Creator

Bonjour,

Regarde le code suivant,ça devrait t'aider.

FACTURE :

load

date(trim(DATE),'DD/MM/YYYY') as DATE,

champ2,

....

ChampN

From FACTURE ;

AVOIR :

load

date(trim(DATE),'DD/MM/YYYY') as DATE,

champ2,

....

ChampN

From AVOIR ;

//  ***************  CALENDRIER*******************************************

DATES_TEMP:

LOAD distinct date(trim(DATE),'DD/MM/YYYY') as DATE

RESIDENT FACTURE WHERE (len(DATE)>0);

LOAD distinct date(trim(DATE),'DD/MM/YYYY') as DATE

RESIDENT AVOIR WHERE (len(DATE)>0);

NoConcatenate

DATES:

Load distinct date(DATE) as QUERY_DATE

RESIDENT DATES_TEMP

ORDER BY KEY_DATE ASC;

drop table DATES_TEMP;

LET varMinDate = round(Num(Peek('QUERY_DATE', 0,'DATES')));

LET varMaxDate = round(Num(Peek('QUERY_DATE', -1,'DATES')));

TEMPCALENDRIER:

LOAD $(varMinDate) + rowno() - 1 AS Num,

           date($(varMinDate) + rowno() - 1) AS TempDate

AUTOGENERATE $(varMaxDate) - $(varMinDate) + 1;

CALENDRIER:

LOAD distinct trim(date(TempDate)) AS DATE,

Week(TempDate) AS SEMAINE,

Year(TempDate) AS ANNEE,

Month(TempDate) AS MOIS,

Day(TempDate) AS JOUR,

Weekday(TempDate) AS JOUR_SEMAINE,

'T' & ceil(month(TempDate) / 3) AS TRIMESTRE,

MonthName(TempDate) AS MOIS_ANNEE,

Week(TempDate)&'-'&Year(TempDate) AS SEMAINE_ANNEE

RESIDENT TEMPCALENDRIER ORDER BY TempDate ASC;

La date du calendrier étant la table de référence et celle que doit prendre au niveau de ton axe d'analyse temporel.

Lorsqu'on fait une sélection au niveau de l'axe d'analyse, alors tout ce qui est en rapport avec cette selection réagit et se met à jour pour cette sélection ( Technologie associative ) . De ce fait, quand tu sélectionne une date au niveau du calendrier , c'est comme si tu avais sélectionné la même date dans tes différentes tables chargées.

Tu peux aller sur le lien http://community.qlik.com/thread/80141?tstart=0

pour avoir d'amples informations

View solution in original post

2 Replies
Not applicable
Author

j'ai trouvé ça hier et ça marché   j espère que ça t aidera c simple et efficace : il se base sur les délclencheur :

Pour sélectionner une période entre deux dates quelconques, sans analysis set ni macro :
1. Créer deux tables DatesDebut et DatesFin, contenant les dates.
2. Ajouter un trigger sur la sélection de DatesDebut et DatesFin sélectionnant la plage correspondante dans la dimension temps principale (détail ci-dessous).
3. Ajouter deux sliders de style « Calendar » pour DatesDebut et DatesFin.
4. C'est prêt !

Je reprends en détail :

1.

DatesDebut:
LOAD date as date_debut resident calendar;

DatesFin:
LOAD date as date_fin resident calendar;

Les deux tables ne sont pas liées à d'autres.

2.

Ouvrir les propriétés du document grâce au menu « Settings > Document Properties... » et aller dans l'onglet des déclencheurs (« Triggers »).
Dans la liste « Field Event Triggers » (événements sur champs), sélectionner date_debut et ajouter une action sur le « OnSelect », de type « Select in Field ». Dans Field, mettez "date" (le nom du champ date dans la dimension temps) et dans Search String, l'expression suivante :

= if(not isnull(getfieldselections(date_debut)),
if(min(date_debut) > max(date_fin),
'=' & min(date_debut),
'>=' & min(date_debut) & '<=' & max(date_fin)))

Faites de même avec le champ date_fin, avec l'expression :

= if(not isnull(getfieldselections(date_fin)),
if(min(date_debut) > max(date_fin),
'=' & min(date_debut),
'>=' & min(date_debut) & '<=' & max(date_fin)))

Si les deux bornes sont sélectionnées et dans le bon ordre, la sélection comprendra toutes les dates entre ces deux bornes. Si une seule borne est sélectionnée, on trouvera seulement les dates situées au-dessus ou au-dessous de la borne.

3.

Avec le style « Calendar », l'utilisateur saisit une date au format jj/mm/aaaa à l'aide d'un calendrier. C'est le plus commode car le style « Slider » ne donne pas de bons résultats avec un champ date (illisible à cause de la graduation).

Une macro fait l'affaire également mais les triggers sont infiniment plus rapides.

almamy_diaby
Creator
Creator

Bonjour,

Regarde le code suivant,ça devrait t'aider.

FACTURE :

load

date(trim(DATE),'DD/MM/YYYY') as DATE,

champ2,

....

ChampN

From FACTURE ;

AVOIR :

load

date(trim(DATE),'DD/MM/YYYY') as DATE,

champ2,

....

ChampN

From AVOIR ;

//  ***************  CALENDRIER*******************************************

DATES_TEMP:

LOAD distinct date(trim(DATE),'DD/MM/YYYY') as DATE

RESIDENT FACTURE WHERE (len(DATE)>0);

LOAD distinct date(trim(DATE),'DD/MM/YYYY') as DATE

RESIDENT AVOIR WHERE (len(DATE)>0);

NoConcatenate

DATES:

Load distinct date(DATE) as QUERY_DATE

RESIDENT DATES_TEMP

ORDER BY KEY_DATE ASC;

drop table DATES_TEMP;

LET varMinDate = round(Num(Peek('QUERY_DATE', 0,'DATES')));

LET varMaxDate = round(Num(Peek('QUERY_DATE', -1,'DATES')));

TEMPCALENDRIER:

LOAD $(varMinDate) + rowno() - 1 AS Num,

           date($(varMinDate) + rowno() - 1) AS TempDate

AUTOGENERATE $(varMaxDate) - $(varMinDate) + 1;

CALENDRIER:

LOAD distinct trim(date(TempDate)) AS DATE,

Week(TempDate) AS SEMAINE,

Year(TempDate) AS ANNEE,

Month(TempDate) AS MOIS,

Day(TempDate) AS JOUR,

Weekday(TempDate) AS JOUR_SEMAINE,

'T' & ceil(month(TempDate) / 3) AS TRIMESTRE,

MonthName(TempDate) AS MOIS_ANNEE,

Week(TempDate)&'-'&Year(TempDate) AS SEMAINE_ANNEE

RESIDENT TEMPCALENDRIER ORDER BY TempDate ASC;

La date du calendrier étant la table de référence et celle que doit prendre au niveau de ton axe d'analyse temporel.

Lorsqu'on fait une sélection au niveau de l'axe d'analyse, alors tout ce qui est en rapport avec cette selection réagit et se met à jour pour cette sélection ( Technologie associative ) . De ce fait, quand tu sélectionne une date au niveau du calendrier , c'est comme si tu avais sélectionné la même date dans tes différentes tables chargées.

Tu peux aller sur le lien http://community.qlik.com/thread/80141?tstart=0

pour avoir d'amples informations