IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

QlikView Discussion :

Calcul sur le M-1 de la sélection


Sujet :

QlikView

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2017
    Messages : 66
    Points : 39
    Points
    39
    Par défaut Calcul sur le M-1 de la sélection
    Bonjour,

    Dans mon QV, j'ai à peu près la table suivante :

    ANNEEMOIS QTE
    201911 100
    201912 50
    202001 200
    202002 100
    202003 20
    202004 150
    ….. ….

    Ma selection se fait sur l'ANNEEMOIS. J'ai des données qui se calcule en fonction de l'ANNEEMOIS et la difficulté se situe sur le fait que je voudrais également avoir des données qui se calcule sur l'ANNEEMOIS - 1. Le problème est lorsque nous sommes sur la sélection de l'ANNEEMOIS = 202001.... Si je fais $(=ANNEEMOIS)-1, j’obtiendrai 202000..... Comment pourrais-je faire pour avoir la somme des QTE de 201912 (lorsque ANNEEMOIS sélectionnée = 202001) ?
    J'ai essayé de faire une formule dans une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let vAnneeMois_moins_un=IF(RIGHT(($(=ANNEEMOIS)-1),2)='00',(LEFT($(=ANNEEMOIS),4)-1)&12,$(=ANNEEMOIS)-1);

    et ensuite d'utiliser cette variable dans mon calcul : sum({<ANNEEMOIS={$(=vAnneeMois_moins_un)}>}QTE) mais cela ne fonctionne pas....

    Merci beaucoup !

  2. #2
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 649
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 649
    Points : 2 529
    Points
    2 529
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a plusieurs problèmes dans votre expression.

    Problème 1 : concaténation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT($(=ANNEEMOIS),4)-1)&12
    Vous concaténez une chaîne de caractères et un nombre.
    Ce n'est pas conseillé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT($(=ANNEEMOIS),4)-1)&'12'


    Problème 2 : définition de la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let vAnneeMois_moins_un = ...
    L'utilisation de "LET" signifie "je souhaite que tu évalues tout de suite le résultat de cette expression".
    Or vous ne voulez pas que cela soit évalué tout de suite, vous souhaitez obtenir cette chaîne de caractères dans la variable.
    Il faut donc utiliser "SET" pour déclarer la variable.



    Problème 3 : évaluation immédiate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RIGHT(($(=ANNEEMOIS)-1),2)
    Le fait d'utiliser "$(...)" dans un script va immédiatement évaluer le contenu. Il ne faut donc pas utiliser cette syntaxe.
    Ma technique, c'est d'écrire "$_(" puis de remplacer par "$" concaténé à "(". On peut aussi utiliser la concaténation de "chr(39)", mais c'est vite illisible.


    L'expression que vous voulez obtenir à la fin est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF(RIGHT($(=ANNEEMOIS) - 1, 2)='00',(LEFT($(=ANNEEMOIS),4)-1)&'12', $(=ANNEEMOIS)-1)
    Il faut donc la déclarer comme celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SET vAnneeMois_moins_un = IF(RIGHT($_(=ANNEEMOIS) - 1, 2)='00',(LEFT($_(=ANNEEMOIS),4)-1)&'12', $_(=ANNEEMOIS)-1);
    LET vAnneeMois_moins_un = replace('$(vAnneeMois_moins_un)', '$_(', '$' & '(');


    Problème 4 : évaluation de la nouvelle condition
    Par la suite, l'appel de la variable "vAnneeMois_moins_un" retournera une chaîne de caractères qu'il faudra elle aussi évaluer.
    Votre expression devra être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum({$ <ANNEEMOIS={"$(=$(vAnneeMois_moins_un))"}>} QTE)
    (un "$(=...)" pour demander l'évaluation et un "$(...)" pour récupérer la variable)



    Alternatives
    Personnellement, si j'avais à créer une variable qui retourne le mois précédent, j'aurais utilisé les fonctions de date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET vAnneeMois_moins_un = $_(=date(addmonths(date#(ANNEEMOIS, 'YYYYMM'), -1), 'YYYYMM'));
    LET vAnneeMois_moins_un = replace('$(vAnneeMois_moins_un)', '$_(', '$' & '(');
    (notez que l'évaluation globale de l'expression est directement inclue pour encadrer mon expression afin d'éviter de devoir la réécrire à chaque utilisation)

    Ainsi, j'utiliserai dans mon expression d'application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum({$ <ANNEEMOIS={"$(=vAnneeMois_moins_un)"}>} QTE)

    Une autre alternative consiste à charger un nouveau champ qui contient l'ANNEEMOIS précédent et se baser sur cette valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ANNEEMOIS_precedent:
    LOAD
    DISTINCT ANNEEMOIS,
    text(date(addmonths(date#(ANNEEMOIS, 'YYYYMM'), -1), 'YYYYMM')) AS ANNEEMOIS_precedent
    RESIDENT data;
    (en s'assurant avoir bien TOUS les mois présents dans la table)

    Et notre expression dans l'appli sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum({$ <ANNEEMOIS=P(ANNEEMOIS_precedent)>} QTE)

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2017
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci pour vos réponses, je ne connaissais pas du tout cette histoire d'évaluation immédiate et cela va beaucoup m'aider .
    Vos solutions semblent marcher à merveille dans mon rapport .
    J'ai cependant une remarque concernant le point suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET vAnneeMois_moins_un = $_(=date(addmonths(date#(ANNEEMOIS, 'YYYYMM'), -1), 'YYYYMM'));
    LET vAnneeMois_moins_un = replace('$(vAnneeMois_moins_un)', '$_(', '$' & '(');
    Mon champ ANNEEMOIS est un champ de type chaîne de caractères dans ma base Oracle.... Si j'utilise votre code, cela risque de me poser un problème tôt ou tard non ? Sinon ce serait effectivement la solution la plus appropriée.

    Concernant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum({$ <ANNEEMOIS=P(ANNEEMOIS_precedent)>} QTE)
    A quoi correspond le caractère "P" svp ?


    Merci !

  4. #4
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 649
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 649
    Points : 2 529
    Points
    2 529
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Aurel2340 Voir le message
    Mon champ ANNEEMOIS est un champ de type chaîne de caractères dans ma base Oracle.... Si j'utilise votre code, cela risque de me poser un problème tôt ou tard non ? Sinon ce serait effectivement la solution la plus appropriée.
    J'utilise la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date#([texte], [format])
    (notez le #) qui permet de dire "je lis une chaîne de caractères mais il faut que j'en déduise une date sachant que le format est [format]".
    Ensuite j'utilise la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date([une_date], [format])
    qui permet de dire "j'ai une date que je veux afficher selon un certain format".

    Il ne devrait donc pas y avoir de problème.
    S'il y en a un, il faut rajouter une fonction sur la date afin de bien dire à QV qu'on veut un texte.



    Citation Envoyé par Aurel2340 Voir le message
    Concernant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum({$ <ANNEEMOIS=P(ANNEEMOIS_precedent)>} QTE)
    A quoi correspond le caractère "P" svp ?
    "P([champ])" est une fonction d'ensemble qui permet de dire "retourne toutes les valeurs de [champ] qui sont compatibles".
    Ainsi,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ANNEEMOIS=P(ANNEEMOIS_precedent)
    signifie "ne prends pas en compte la sélection de ANNEEMOIS, mais prends à la place toutes les valeurs de ANNEEMOIS qui sont dans la liste de ANNEEMOIS_precedent actuellement possibles".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul sur requete
    Par nicoolas dans le forum Access
    Réponses: 3
    Dernier message: 11/01/2005, 16h50
  2. [débutant] calcul sur date
    Par Regis.C dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 04/01/2005, 10h51
  3. Resutlat de calcul sur date formaté
    Par neness dans le forum SQL
    Réponses: 6
    Dernier message: 16/06/2004, 15h34
  4. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55
  5. Réponses: 4
    Dernier message: 15/12/2002, 04h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo