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 :

Recherche d'une valeur minimale pour un critère


Sujet :

QlikView

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Par défaut Recherche d'une valeur minimale pour un critère
    Bonjour,

    J'essaye d'afficher un tableau présentant pour chacun de mes capteurs le niveau pour la date immédiatement supérieure à un critère (CurseurDate)

    J'ai testé 2 possibilités:

    La première:
    - dimension: Capteur et une expression calculée =min({$ < Date={">$(CurseurDate)"}>} Date)
    - expression: Niveau
    - résultat: pas d'erreur de syntaxe mais tableau vide

    La seconde:
    - dimension: Capteur et Date avec une condition >CurseurDate
    - expression: Niveau
    - limite dimensionnelle sur Date max 1 valeur
    - résultat: les dates affichées ne correspondent pas au critère, largement au delà

    Avez vous une idée ?

    Merci

  2. #2
    Modérateur

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

    Il faut jouer avec les agrégations pour obtenir ce genre de choses.


    Soient les données
    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
    Data:
    LOAD * INLINE [
    Capteur, Date, Niveau
    A, 1, 1
    A, 2, 2
    A, 3, 3
    A, 4, 4
    A, 9, 9
    B, 1, 10
    B, 4, 40
    B, 5, 50
    B, 6, 16
    ];
     
    SET vCurseurDate = 0;
    Dans un tableau droit, il faut mettre en dimension "Capteur" et en expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    min(
    	aggr(
    		if(Date = min({$ < Date={'>=$(vCurseurDate)'}>} TOTAL <Capteur> Date)
    		,
    		Niveau
    		)
    		, Date, Capteur)
    )
    Avec l'aggr, on calcul un tableau intermédiaire qui contient 2 dimensions : Date et Capteur.
    Sur ce tableau on récupère le Niveau pour lequel la date correspond à la date min (mais ">= vCurseurDate"), toute date confondue (en n'agrégeant que par Capteur avec le "TOTAL <Capteur>").


    Il y a sûrement plein d'autres façons de faire, mais celle-ci est la première qui me vient...


    On fait pareil pour obtenir la date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    min(
    	aggr(
    		if(Date = min({$ < Date={'>=$(vCurseurDate)'}>} TOTAL <Capteur> Date)
    		,
    		Date
    		)
    		, Date, Capteur)
    )

    Nom : cnWoUel.png
Affichages : 188
Taille : 15,7 Ko

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Par défaut
    Bonjour PhunkyBob

    J'ai créé le tableau avec les deux expressions proposées.
    Lorsque je ne rentre rien dans vCurseurDate , le tableau renvoi pour les capteurs sélectionnés les niveaux pour la première date de la plage - Ok
    Par contre si je rentre une date dans vCurseurDate, le tableau est vide: j'ai l'impression qu'il n’interprète pas correctement la variable vCurseurDate
    J'en tenté de rentrer la date au format DD/MM/AAAA hh:mm soit 02/01/2016 10:20 ou la valeur correspondante en numérique 42371.43 rien n'y fait.

    Merci

  4. #4
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 652
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 652
    Billets dans le blog
    6
    Par défaut
    Dans l'exemple que j'ai donné, j'ai utilisé des nombres "simples" à la place des dates (1, 2, 3, ...).

    Si on veut jouer avec des dates, il est impératif que dans le Set Analysis on mette quelque chose qui est au même format que le champ que l'on souhaite filtrer.


    Il faudra donc utiliser quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    min(
    	aggr(
    		if(Date = min({$ <Date={'>=$(=date(vCurseurDate))'}>} total <Capteur> Date)
    		,
    		Niveau
    		)
    		, Date, Capteur)
    )
    en supposant que le champ "Date" est au format par défaut renvoyé par "date()".

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Par défaut
    PhunkyBob

    Ma variable CurseurDate est déja comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =date(min([DateNiv])+CurseurJour+(CurseurHeure*60+CurseurMinute)/(60*24),'DD/MM/YYYY hh:mm')
    Elle est bien au format date car si dans une zone de texte j'ajoute +1 il me renvoi bien la date avec 1 jour de plus à la même heure

    J'ai modifié mon script pour remplacer la variable Date par DateNiv car je pensais que cela pouvait influencer la fonction date()
    Mon tableau est toujours vide

    Merci

  6. #6
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 652
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 652
    Billets dans le blog
    6
    Par défaut
    Mais est ce que votre champ "Date" est bien au format 'DD/MM/YYYY hh:mm' ? (qui n'est pas du tout un format standard)

    Si ce n'est pas le cas, vous pouvez essayer de créer un 2em champ date basé sur le premier, en forçant le format 'DD/MM/YYYY hh:mm' et faire le filtre du Set Analysis sur celui-ci.

    Pourquoi ne pouvez-vous pas mettre le format par défaut dans votre variable "CurseurDate" ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Par défaut
    Bonjour PhunkyBob,

    J'ai appliqué le format par défaut du script dans la variable CurseurDate et retiré la fonction date dans les expression proposées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    =date(min([DateNiv])+CurseurJour+(CurseurHeure*60+CurseurMinute)/(60*24),'DD/MM/YYYY hh:mm:ss[.fff]')
     
    min(
    	aggr(
    		if(DateNiv = min({$ < DateNiv={'>=$(CurseurDate)'}>} TOTAL <Capteur> DateNiv)
    		,
    		DateNiv
    		)
    		, DateNiv, Capteur)
    )
    Nom : Capture7.JPG
Affichages : 163
Taille : 22,4 Ko

    ça fonctionne !
    Je pensais que la fonction date agissait uniquement sur le format restitué, visiblement c'est pas le cas.


    Le tableau que j'avais créé avec en expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =min({$ <DateNiv={'>=$(CurseurDate)'}>} DateNiv)
    me renvoi également la bonne date
    Pour le niveau j'ai essayé de définir cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    min({$ < DateNiv={'=min({$ <DateNiv={'>=$(CurseurDate)'}>} DateNiv)'}>} Niveau)
    la partie en rouge étant la définition de la date correctement renvoyée
    En prenant le min d'une expression ne contenant qu'une valeur je devrais récupérer le Niveau correspondant à la date mais Qlikview indique "error in set modifier ad hoc element liste ',' or ')' expected alors que l'interpreteur indique "expression ok"
    Je ne comprend pas

    Merci

  8. #8
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 652
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 652
    Billets dans le blog
    6
    Par défaut
    Le Set Analysis est calculé avant toute chose, pour réduire un périmètre de calcul initial.

    Pour faire le filtre sur "la valeur qui va bien" ligne par ligne, il doit se faire avec un "if", comme dans l'expression que je vous ai indiquée plus haut.

Discussions similaires

  1. [VB6]recherche d'une valeur dans une table access
    Par fahmichebaane dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 19/04/2006, 16h26
  2. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 18h32
  3. [VBA] Recherche d'une valeur dans un autre fichiers puis
    Par Nicos77 dans le forum Général VBA
    Réponses: 11
    Dernier message: 24/03/2006, 12h24
  4. Réponses: 40
    Dernier message: 24/02/2006, 15h19
  5. [D6] Recherche d'une valeur dans un fichier
    Par Lung dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2005, 09h26

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