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 :

Evaluation dynamique de formule dans table


Sujet :

QlikView

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 83
    Points : 107
    Points
    107
    Par défaut Evaluation dynamique de formule dans table
    Bonjour à tous,

    Débutant en Qlikview (V12.0), je recherche à évaluer dynamiquement une formule .

    Exemple simplifié de ce que je souhaite :



    Bornes :
    load * inline [
    borne,critere
    b1,'2014,2015'
    b2,2016
    ]
    ;

    Ventes:
    load * Inline [
    Year, Region, Qte, Totalx
    2016, Asia, 15, 35
    2016, America, 20, 35
    2015, Asia, 30, 70
    2015, America, 40, 70
    2014, America, 40, 100
    ]



    je batis une table

    Dimension :
    borne
    critere

    expression :

    formule = $(vFormule(critere))

    avec variable vFormule = '=sum({1<Year={' & $1 & '}>}Qte)'
    Dans ma table j'obtiens :

    Nom : A161005025919.jpg
Affichages : 144
Taille : 10,5 Ko

    mais je voudrais en fait pouvoir exécuter mon expression formule

    J'ai essayé différentes possibilités mais je n'obtiens jamais de résultat :

    par exemple : $(=vFormule(critere))



    L'exemple ici est forcèment simplifié mais l'idée est la même dans mon projet.

    Par avance merci .

  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,

    Le SetAnalysis est quelque chose qui est évalué AVANT l'agrégation par dimension.

    Quand un graphique a une expression avec un SetAnalysis, il va en premier réduire le périmètre de données, et ensuite, pour chaque valeur de "borne / critère", il va faire le calcul.

    Pour avoir une interprétation "ligne par ligne", il faut utiliser la fonction "if" dans l'expression.

    Quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum({1 <Year=>} if(index(critere, Year) > 0, Qte))
    Le plus simple est quand même de faire en sorte que vos dimensions "borne" soient directement liées aux faits par "Year".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Bornes :
    load * inline [
    borne,critere
    b1,'2014,2015'
    b2,2016
    ]
    ;
     
    LEFT JOIN (Bornes)
    LOAD 
    	borne,
    	SubField(critere, ',') AS Year
    RESIDENT Bornes
    ;
     
    Ventes:
    load * Inline [
    Year, Region, Qte, Totalx
    2016, Asia, 15, 35
    2016, America, 20, 35
    2015, Asia, 30, 70
    2015, America, 40, 70
    2014, America, 40, 100
    ];
    Il suffira de mettre comme expression :

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 83
    Points : 107
    Points
    107
    Par défaut
    Merci pour votre réponse mais je voulez justement éviter l'utilisation des IF imbriqués , solution que j'utilise actuellement, mais qui m'oblige à revenir sur mes formules à chaque fois en cas de modification
    (à savoir ajout de bornes)

    En effet, ma table "Bornes" est une table qui est créée de façon dynamique par macro à partir d'une liste de variables.

    Connaitriez-vous une autre solution pour gérer ce problème de façon plus dynamique ?


    Items:
    load * Inline [
    Duree, Valeur
    52,12
    65,125
    105,10
    ]
    ;

    /* valeur factice géré par le code avec limite variable
    Bornes :
    load * inline [
    Borne,Limite
    b1,60
    b2,120
    ]
    ;
    Au final je voudrais arriver à cette sorte de table

    Nom : A161006023440.jpg
Affichages : 131
Taille : 5,8 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    Avec occurence = 
     
    if(Borne = 'b1',
    count({$<Duree={"$(vX1)"}>}ID),
    	if(Borne='b2',
    	...................................
     
    avec variables vX1... calculé par macro qui contiennent  les limites souhaitées. 
    )
    Sans avoir à gérer les IF.



    La solution des tables liées ne fonctionne pas dans le cas présent car ma table "Bornes" est une table totalement indépendante, et les limites sont renseignées
    par saisie directe de variable.

    Par avance merci pour votre aide .

  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 nostradamus Voir le message
    Merci pour votre réponse mais je voulez justement éviter l'utilisation des IF imbriqués , solution que j'utilise actuellement, mais qui m'oblige à revenir sur mes formules à chaque fois en cas de modification
    (à savoir ajout de bornes)

    Je crois que vous avez mal lu ma réponse, car elle ne propose pas de faire des "if imbriqués".
    Elle propose de faire 1 seul "if", qui sera traité automatiquement en fonction des limites liées à la borne de la ligne courante.


    Au début, vous parliez d'une liste de valeurs. Dans votre dernier post, vous parlez de limites chargées dans le script, puis de limites dynamiques définies dans dans variables.
    J'ai un peu du mal à comprendre ce que vous souhaitez faire...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 83
    Points : 107
    Points
    107
    Par défaut
    Effectivement je me suis mal expliqué.

    Initialement j'ai une table de fait avec une heure, durée par intervention

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    EX : HeureDebut,Duree,........
    
    Je crée une table de façon dynamique (la structure m'importe peu) de telles sorte que je puisse compte
    le nombre d'occurence par intervalle de durée .
    
    (Les limites ne sont pas figées - recrées par utilisateur dans l'IHM).
    
    EX ; 
    Borne, LimiteInferieure,LimiteSuperieure 
    B1,0,100
    B2,101,200
    .....
    
    
    Borne , LimitesBornes
    B1,'>0<=100'
    B2,'>100'
    ......
    
    
    
    
    Au final, j'aimerais avoir un chart final de cette façon
    
    Borne,Limite,NombreOccurence
    B1,100, Count({$<Limite<=VALEUR DE LA LIMITE DU CONTEXTE DE LIGNE COURANT>}........)  // 
    
    
    mais je n'arrive pas à récupérer l'information voulue de la ligne active.
    En espérant avoir était plus clair

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut
    Bonjour.
    Avec une table comme ça :
    Borne, LimiteInf, LimiteSup
    B1,0,50
    B2,50,80
    B3,80,999

    vous pouvez créer une expression =sum(if(Duree>LimiteInf and Duree<=LimiteSup,1,0))

  7. #7
    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
    mais je n'arrive pas à récupérer l'information voulue de la ligne active.
    Comme je vous l'ai expliqué plus haut, le Set Analysis est calculé AVANT l'agrégation par dimension, afin de réduire le périmètre global.


    Mais du coup, vos limites sont dans des variables ou dans une table ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 83
    Points : 107
    Points
    107
    Par défaut
    Effectivement, je suis vraiment trop .......

    Merci à vous deux

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

Discussions similaires

  1. Requête SQL dynamique avec nom de table dans une variable
    Par jonjack dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 15/09/2011, 14h37
  2. ajout dynamique dans Table
    Par lifeisgood dans le forum ASP.NET
    Réponses: 7
    Dernier message: 09/05/2007, 16h20
  3. Créer dynamiquement une ligne dans une table
    Par brazza dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/02/2007, 11h18
  4. [VBA-E] Tableau Croise Dynamique données dans table access
    Par winner103 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/11/2006, 11h49
  5. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50

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