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

Discussion :

Calcul d'un effectif selon catégorie [WebI Xi3]

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut Calcul d'un effectif selon catégorie
    Bonjour à tous,

    Depuis peu, j'ai accès à l'éditeur de requêtes sur Infoview (BO XI3). Je débute donc dans l'édition de mes rapports et je me trouve confrontée aux premières difficultés, d'où mon post d'aujourd'hui. J'essaie de faire des calculs en utilisant des contextes où/dans mais je n'y arrive pas .

    J'ai un Univers A d'où j'ai créé une requête A avec :
    - 2 champs:
    • A_ID
    • A_dosage

    - 4 filtres:
    • dosage non nul
    • dosage différent de -1
    • famille du produit dans une liste
    • date supérieure au 01/06/2014


    J'ai un Univers B d'où j'ai créé une requête B avec :
    - 3 champs:
    • B_ID
    • B_age
    • B_sexe

    - 1 filtre:
    • date supérieure au 01/06/2014

    J'ai réuni mes 2 univers en fusionnant la dimension A_ID et la dimension B_ID pour donner la dimension ALL_ID.

    J'ai créé une nouvelle information de type nombre ALL_age en convertissant la dimension B_age.

    J'ai créé une nouvelle information de type chaine ALL_sexe en convertissant la dimension B_sexe.

    J'ai créé une nouvelle information de type chaine ALL_ageCategorie avec une formule =Si([ALL_age]<30;"<30";Si([ALL_age]>=30 Et [ALL_age]<=50;"30-50";Si([ALL_age]>50;">50")))

    J'ai créé un indicateur de type nombre ALL_dosage en convertissant la dimension A_dosage.

    J'ai posé un filtre sur le rapport du type ALL_dosage est non nul (je ne sais pas si ce filtre est utile puisque le filtre dosage non nul existe déjà dans ma requête A)

    Je souhaite créer un tableau avec 2 calculs pour chacune des 3 catégories d'age:

    1. les moyennes des dosages par catégorie d'age: OK, ça fonctionne en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Moyenne([ALL_dosage]) Dans ([ALL_ageCategorie])
    2. les effectifs par catégorie d'age: KO, j'ai testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nombre([ALL_ID]) Dans ([ALL_ageCategorie])
    => KO ça me sort un chiffre différent pour chaque catégorie d'age mais chiffre aberrant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nombre([ALL_ID])([ALL_dosage] =2,42)
    ' 2,42 est juste un exemple pour tester
    => KO les cases restent vides

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Nombre([ALL_ID])([ALL_dosage] =2,42) Dans ([ALL_ageCategorie])
    => KO les cases restent vides


    Pourriez-vous m'aider pour ma formule du calcul de l'effectif des dosages par catégories d'age ?

    Merci par avance.

  2. #2
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Bon, je viens de tester différentes manips et j'ai réussi à obtenir les chiffres que je voulais mais sans comprendre pourquoi Donc si qqn peut m'expliquer, ça serait sympa...

    Pour les effectifs par catégorie d'age, quand je testais Nombre([ALL_ID]) Dans ([ALL_ageCategorie]), ça me sortait des chiffres aberrants correspondants à la somme totale de mes lignes par catégorie, sans tenir compte du filtre sur le rapport "Dosage non nul"
    >> A quoi sert un filtre sur un rapport s'il ne s'applique pas partout ?

    J'ai testé Nombre([ALL_ID]) Où (Non(EstNul([ALL_dosage])))
    => KO

    J'ai testé Nombre([ALL_ID]) Où (Non(EstNul([A_dosage])))
    => OK
    => en prenant la dimension d'origine et non l'indicateur que j'ai construit, ça fonctionne

    J'ai testé Nombre([ALL_ID]) Où (Non(EstNul([A_dosage]))) Dans ([ALL_ageCategorie])
    => OK
    => en prenant la dimension d'origine et non l'indicateur que j'ai construit, ça fonctionne, peu importe que je dise "dans chaque catégorie"

    Quelqu'un peut-il m'apporter des explications sur ce calcul ?

    Merci ++

  3. #3
    Membre expérimenté
    Avatar de bastoonet
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 011
    Points : 1 342
    Points
    1 342
    Par défaut
    Essaye avec des "Si alors sinon" au lieu des "Où", je trouve que ça réagit mieux lorsqu'il y a des fusions entre requetes...

    exemple :
    si (Non(EstNul([ALL_dosage]))) alors Nombre([ALL_ID])
    ~ Bastoonet ~

    Consultant BI

  4. #4
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Salut !

    Merci pour ta proposition mais ça ne fonctionne pas, ni avec l'indicateur ALL_dosage ni avec la dimension d'origine A_dosage.

    Au final, toutes les formules suivantes ne fonctionnent pas (elles me donnent toutes l'effectif total par age sans tenir compte du dosage non nul) :

    * avec indicateur créé ALL_dosage:
    Nombre([ALL_ID]) Dans ([ALL_ageCategorie])
    Nombre([ALL_ID]) Où (Non(EstNul([ALL_dosage])))
    Nombre([ALL_ID]) Où (Non(EstNul([ALL_dosage]))) Dans ([ALL_ageCategorie])
    Si(Non(EstNul([ALL_dosage]))) Alors Nombre([ALL_ID])

    * avec dimension d'origine A_dosage:
    Si(Non(EstNul([A_dosage]))) Alors Nombre([ALL_ID])
    Si(Non(EstNul([A_dosage]))) Alors Nombre([ALL_ID]) Dans ([ALL_ageCategorie])



    ça fonctionne pour les 2 formules suivantes:

    * avec dimension d'origine A_dosage:
    Nombre([ALL_ID]) Où (Non(EstNul([A_dosage])))
    Nombre([ALL_ID]) Où (Non(EstNul([A_dosage]))) Dans ([ALL_ageCategorie])


    Du coup, mes questions:
    1. pourquoi doit-on mettre le dosage non nul dans la formule étant donné qu'il y a déjà un filtre "dosage non nul" sur le rapport ? le filtre sur le rapport ne sert-il qu'à l'affichage et pas aux calculs ?
    2. pourquoi ne puis-je pas utiliser mon indicateur ALL_dosage dans mes calculs ? quelle est la différence avec la dimension d'origine A_dosage ?

    Voilà, je sais que j'ai obtenu le bon résultat mais par chance... et j'aimerai bien comprendre histoire de ne pas me retrouver confrontée au même problème plus tard.
    Merci pour votre aide

  5. #5
    Membre expérimenté
    Avatar de bastoonet
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 011
    Points : 1 342
    Points
    1 342
    Par défaut
    Les fusions sont toujours compliquées.
    Je paris que tes formules fonctionnent lorsque tu as une seule requete.

    Sinon des pistes pour tes questions...

    1. pourquoi doit-on mettre le dosage non nul dans la formule étant donné qu'il y a déjà un filtre "dosage non nul" sur le rapport ? le filtre sur le rapport ne sert-il qu'à l'affichage et pas aux calculs ?

    As-tu filtré sur l'objet fusionné ? Le même filtre sur le tableau directement fonctionne-t-il ?


    2. pourquoi ne puis-je pas utiliser mon indicateur ALL_dosage dans mes calculs ? quelle est la différence avec la dimension d'origine A_dosage ?

    Peux-être qu'en faisant ton =non (estnul (A_dosage)) dans la définition de l'indicateur cela fonctionnerai ?

    Pour comprendre le fonctionnement des variables et fusion, le mieux est d'afficher tous les indicateurs et tes variables dans un meme tableau, tu verra ainsi toutes les valeurs d'origine et les valeurs calculées. (a faire avec et sans fusion)
    ~ Bastoonet ~

    Consultant BI

  6. #6
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Hello !

    Tout d'abord, merci de m'aider à mieux comprendre BO. Hier, comme je n'arrivais pas à comprendre le multi-univers, j'ai commencé par la base et j'ai passé la journée à travailler sur des exemples plus simples. J'ai donc testé les formules de somme et de comptage sur une seule requête, ça fonctionne . J'ai ensuite rebasculé sur mon rapport multi-univers. Voici où j'en suis.

    J'ai testé comme tu dis de partir du tableau des données sources. Je n'ai mis aucun filtre sur mon rapport. Et j'ai ajouté mes colonnes au fur et à mesure en regardant le nombre de lignes total.

    Tableau 1 (sans la dimension fusionnée ALL_ID):
    Je mets la colonne A_ID
    => j'ai 44 lignes, ça me parait logique
    J'ajoute la colonne A_dosage
    => j'ai 44 lignes, ça me parait logique
    J'ajoute la colonne ALL_dosage (indicateur dont la formule est = [A_dosage] )
    => j'ai toujours 44 lignes, ça me parait toujours logique


    Tableau 2 (sans la dimension fusionnée ALL_ID):
    Je mets la colonne B_ID
    => j'ai 480 000 lignes, ça me parait logique
    J'ajoute la colonne B_age
    => j'ai 480 000 lignes, ça me parait logique
    J'ajoute la colonne ALL_age (information dont la formule est = [B_age] et la dimension associée est B_ID)
    => j'ai 480 000 lignes, ça me parait logique


    Tableau 3 (avec la dimension fusionnée ALL_ID):
    Je mets la colonne ALL_ID
    => j'ai 480 000 lignes, ça ne me parait pas logique
    J'ajoute la colonne ALL_dosage
    => j'ai 480 000 lignes, ça ne me parait pas logique
    J'ajoute la colonne A_dosage
    => j'ai 44 lignes, ça ne me parait pas logique

    De tout ça, voici ce que j'en conclus: le tableau 3 prouve que mon filtre dosage non nul de ma requête A ne s'applique pas sur ma dimension fusionnée ALL_ID. En mode rapport, BO ne garde pas uniquement les lignes communes à mes 2 requêtes mais toutes les lignes de chaque requête, et c'est en fonction des colonnes que je mets dans mon tableau que les filtres se font (selon si je prends une variable de ma requête A filtrée ou si je prends un autre champ). Correct ?

    Quand je fais des calculs,
    si je fais: =Nombre([A_ID]), j'obtiens 44
    si je fais: =Nombre([ALL_ID]) Où (Non(EstNul([A_ dosage]))), j'obtiens 44
    si je fais: =Nombre([ALL_ID]) Où (Non(EstNul([ALL_ dosage]))), j'obtiens 480000

    Si je prends A_dosage, BO comptera toujours 44 lignes car A_dosage existe seulement pour 44 ID, tous les autres ID n'auront pas de A_dosage (même vide). Correct ?
    Si je prends ALL_dosage, BO comptera toujours 480 000 lignes, car ALL_dosage est un indicateur créé après coup et donc BO met ce champ pour tous mes ID, même si ce champ est vide. Correct ?

    Et c'est donc à se demander quel est l'intérêt de créer un indicateur ALL_dosage. Et bien ,je crois avoir vu un intérêt.
    Si dans un tableau, je tape la formule =Nombre([ALL_ dosage]), j'obtiens les bons chiffres.
    Si dans un tableau, je tape la formule =Nombre([A_ dosage]), j'obtiens les mauvais chiffres car ça fait comme un distinct où ça ne compte qu'une fois les valeurs identiques (exemple: en vrai, j'ai 16 valeurs, mais ça n'affiche que 15 car j'ai 2 valeurs identiques).
    Donc quand on veut faire des calculs (comptage ou somme ou autre), il ne faut pas les faire sur la dimension même si c'est un format nombre, il faut OBLIGATOIREMENT la transformer en indicateur. Correct ?

    Dernier point concernant les informations créées: il faut leur associer une dimension: comment choisir cette dimension? Par exemple, j'ai mon champ B_age. J'ai créé une information ALL_age dont la formule est = B_age.
    Si j'associe la dimension B_ID à ALL_age, tout est ok.
    Si j'associe la dimension ALL_ID à ALL_age, tout est ok.
    Si j'associe la dimension B_age à ALL_age, tout est ok.
    Donc comment choisir ?

    Désolée pour ce post très long, mais pas si simple de résumer ses questions quand on a du mal à comprendre .

    Merci +++ pour les conseils.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 364
    Points : 551
    Points
    551
    Par défaut
    Bonjour,

    Bon, on va reprendre du début :

    Dans BO on utilise 3 types d'objets Dimensions, Indicateurs, Informations.

    Lorsque tu fais une requête puis lorsque tu fais un tableau, le comportement par défaut de l'appli est de regrouper les dimensions et d'agréger les indicateurs. Ce qui fait que dans un tableau, tu as un groupe de valeurs de dimensions unique pour chaque ligne. L'indicateur se recalcule normalement à la volée.

    Les données extraites par la requête sont enregistrées dans le document et ce sont ces enregistrements qui sont utilisées pour créer des tableaux et des graphiques. Il est donc tout à fait possible d'avoir 50 champs dans la requête et de n'en utiliser que 3 dans un tableau. Les dimensions se regrouperont pour éviter l'affichage des doublons et les indicateurs s'agrégeront (le plus souvent leur valeur s'additionnera) pour que l'affichage soit cohérent avec le niveau de détail affiché.

    Les Informations sont des objets destinés à préciser le sens d'une dimension et, à ce titre, elles sont toujours rattachées à une dimension. Dans Web Intelligence, chaque valeur de dimension reçoit au maximum une valeur d'information. En imaginant que ta dimension soit [Client] et l'information associée [N° téléphone], tu ne pourras avoir qu'un numéro de téléphone par client.

    Concernant les documents avec plusieurs requêtes et si tu dois mixer des données en provenance de plusieurs sources dans le même tableau, les dimensions communes aux requêtes affichées dans le tableau doivent être fusionnées. En XI3, on ne fusionne que les dimensions (et en BI4, on fusionne aussi les informations pour la plus grande joie des développeurs ).

    Si les requêtes s'appuient sur le même univers et qu'elles contiennent des dimensions communes celles-ci seront fusionnées automatiquement par défaut (XI3).
    La fusion de deux dimensions en provenance de 2 requêtes crée une troisième dimension (la dimension fusionnée).

    Soit la requête R1 qui contient la dimension D1 ramenant les valeurs a,b,c.

    et la requête R2 contenant D2 ramenant b,c,d.

    La dimension fusionnée de ces deux requête DF contiendra a,b,c,d.

    Mais dans Web Intelligence en XI, la dimension fusionnée est un objet différent des dimensions initiales mêmes si elles sont compatibles.

    Aussi si tu fais un tableau contenant D1 et DF, il ne t'affichera que les lignes en correspondance avec D1 (exit la valeur d).

    Il est donc important, dans un tableau qui croise les données de deux requêtes que les dimensions qui y figurent soient exclusivement des dimensions fusionnées (sauf si on à une bonne raison de faire autrement) sinon il peut y avoir des trous dans les résultats.

    On ne fusionne pas les informations en XI3, il est donc possible d'incorporer dans un tableau des données qu'on aurait pas pu y mettre autrement en créant une variable Information à partir de dimensions. Pour que cela fonctionne raisonnablement bien, il faut que la dimension à laquelle l'information est rattachée, soit elle même fusionnée et que l'information respecte la règle ci-dessus (paragraphe 3).

    La fonction Nombre() utilisée par défaut compte effectivement les valeurs distinctes. Si on veut lui faire compter toutes les lignes, il faut lui ajouter un paramètre =Nombre([Ma_Valeur];Tous). Note que si tu utilises l'éditeur de formule, lorsque tu sélectionnes une fonction dans la colonne éponyme, il t'affiche en bas du volet le prototype de la fonction (ce qu'elle fait et les paramètres qu'elle attend) et si ça ne suffit pas tu as un lien hypertexte vers l'aide détaillée. Il ne faut pas hésiter à l'utiliser elle est le plus souvent bien fichue et avec des exemples.

    Voilà je n'ai peut être pas répondu à toutes tes questions mais j'espère avoir été assez clair et levé un coin de voile.

    Cordialement,

  8. #8
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Salut !

    Merci pour tes explications, lues telles quelles, oui elles me semblent claires mais j'ai encore du mal

    Pour la fonction Nombre(), j'ai été voir l'aide comme tu m'as dit et j'ai vu que le paramètre Distinct/Tout est facultatif. Si on ne spécifie pas ce paramètre, les valeurs par défaut sont Distinct pour toutes les dimensions et Tout pour tous les indicateurs. => Problème résolu

    Pour les histoires de fusions, je suis ok pour dire que dans les tableaux, il faut mettre les dimensions fusionnées. Mais, j'ai toujours un problème de filtre si je fais comme ça… Si je créé un tableau en ajoutant la colonne ALL_ID puis la colonne ALL_sexe puis la colonne ALL_age puis la colonne ALL_dosage alors j'ai mes 480 000 lignes. Comme je veux filtrer sur le dosage, si je mets un filtre sur le rapport (j'ai aussi testé sur le bloc), "ALL_dosage est non nul", ça ne me change rien, j'ai toujours 480 000 lignes. Pourquoi ?

    Encore un problème du même ordre avec les informations. A l'origine, B_age est une dimension de type nombre. Je vais peut-être avoir des calculs à faire dessus, donc j'ai créé une variable IndicateurAge =[B_age]. Je dois aussi regrouper mes ages par catégories.
    cas 1 : Je créé donc une information AgeCatégorieFrom_B_age, j'associe cette information à ALL_ID et je tape la formule =Si([B_age]<30;"<30";Si([B_age]>=30 Et [B_age]<=50;"30-50";Si([B_age]>50;">50"))). Dans mes tableaux, cette information AgeCatégorieFrom_B_age fonctionne.
    cas 2 : J'ai aussi testé de créer une information AgeCatégorieFrom_ALL_age, j'associe cette information à ALL_ID et je tape la formule =Si([ALL_age]<30;"<30";Si([ALL_age]>=30 Et [ALL_age]<=50;"30-50";Si([ALL_age]>50;">50"))). Dans mes tableaux, cette information AgeCatégorieFrom_ALL_age fonctionne.
    cas 3 : J'ai aussi testé de créer une information AgeCatégorieFrom_IndicateurAge, j'associe cette information à ALL_ID et je tape la formule =Si([IndicateurAge]<30;"<30";Si([IndicateurAge]>=30 Et [IndicateurAge]<=50;"30-50";Si([IndicateurAge]>50;">50"))). Dans mes tableaux, cette information AgeCatégorieFrom_IndicateurAge ne fonctionne pas.

    Pouvez-vous m'expliquer pour quelle raison dans les cas 1 et 2, ça fonctionne mais pas dans le cas 3 ?

    Voilà, beaucoup de questions car je débute totalement, j'ai fait la formation WebI il y a 10 mois, je n'ai jamais pu pratiquer et là on me demande du jour au lendemain de créer un rapport à partir de 2 univers différents

    Un grand merci pour votre patience et vos conseils.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 364
    Points : 551
    Points
    551
    Par défaut
    Il n'y a pas forcément d'intérêt à créer une variable de type indicateur pour faire des calculs et dans le cas présent je n'en vois aucun.

    On peut très bien faire des calculs sur des dimensions.

    Créer une variable de type indicateur permettra de bénéficier de l'agrégation automatique des valeurs telle que je l'ai décrite dans mon premier post. Pour permettre cette agrégation automatique, cette variable devra contenir une fonction d'agrégation Somme(), Nombre(), Min(), Max, Moyenne() ou bien reposer sur d'autres indicateurs.

    Dans ton cas, je ne vois pas la valeur ajoutée à utiliser un indicateur pour créer des classes d'âge qui de toutes les façons s'appuieront sur des dimensions.

    Après, pourquoi, une information créée à partir d'un indicateur non standard et reliée à une dimension qui n'a rien à voir avec le calcul fait pour la déterminer ne fonctionne pas, j'avoue que je n'en sais rien.

    Je n'ai pas vu le type d'objet de [ALL_Dosage] : Indicateur où Dimension.

    Les filtres de rapports sont moins susceptibles avec les dimensions qu'avec les indicateurs.
    Si [ALL_Dosage] est un indicateur et que tu le mettes au niveau du rapport. Je crois que Web Intelligence va l'agréger en fonction des dimensions qu'il connait et comme au niveau du rapport il n'y en a aucune il va faire le total de [ALL_Dosage] la valeur sera non nulle et il laissera tout passer.

    Si c'est une dimension, C'est que [ALL_Dosage] n'est jamais nul, le champ contient un espace, une chaîne vide, ou si c'est un numérique 0 auquel un format de nombre spécifique a été appliqué.

    Si [ALL_Dosage] est un indicateur, je testerais ce qui suit :

    Création d'une variable (Dimension)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FlagDosage = [ALL_Dosage] Dans(
    [liste];[des];[dimensions];[du];[tableau])
    Et je poserais un filtre de bloc dessus (est nul ou <>0) --sans garantie.

    Par ailleurs, si tu ne veux pas voir les dosages nuls pourquoi ne les filtres-tu pas dans ta requête.

    j'ai fait la formation WebI il y a 10 mois
    Comme bizutage c'est pas mal !!!


    Cordialement,

  10. #10
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Salut !

    On peut très bien faire des calculs sur des dimensions
    Ah ? j'étais persuadée que si j'avais besoin de faire des calculs sur des variables de type dimension, il fallait d'abord que je les convertisse en indicateur. Car même pour un calcul de moyenne, je me retrouve avec le même souci que mon calcul d'effectif (distinct ou pas distinct). C'est ce que j'explique juste après.

    [ALL_Dosage] est de type indicateur. Dans les lignes qui suivent, je renomme mon indicateur [ALL_Dosage] en [Indicateur_ALL_Dosage] pour plus de clarté.

    Jusque-là, j'avais créé un indicateur [Indicateur_ALL_Dosage] = [Dimension_A_dosage] et dans une colonne de mon tableau, la formule suivante ne marchait pas
    =Nombre([ALL_ID]) Où (Non(EstNul([Indicateur ALL_Dosage]))) ne marche pas

    Si je créé une dimension [Dimension_ALL_Dosage] = [Dimension_A_dosage] alors
    =Nombre([ALL_ID]) Où (Non(EstNul([Dimension_ALL_Dosage]))) marche

    Car ça revient au même que
    =Nombre([ALL_ID]) Où (Non(EstNul([Dimension_A_Dosage])))

    Mais j'ai alors un souci sur ma moyenne…

    Si je créé un indicateur [Indicateur_Moyenne_de_l_indicateur_ALL_Dosage] = Moyenne [Indicateur_ALL_dosage] alors dans une colonne de mon tableau
    =[Indicateur_Moyenne_de_l_indicateur_ALL_Dosage] marche
    =Moyenne([Indicateur_ALL_dosage]) marche

    Si je créé un indicateur [Indicateur_Moyenne_de_la_dimension_ALL_Dosage] = Moyenne [Dimension_ALL_Dosage] alors
    =[Indicateur_Moyenne_de_ la_dimension_ALL_Dosage] ne marche pas
    =Moyenne([Dimension_ALL_dosage]) ne marche pas
    Ici, ça fait un distinct des valeurs: si plusieurs valeurs sont identiques, une seule est comptabilisée dans ma moyenne. Du coup, dans le cas présent, il est impératif que je convertisse ma dimension [Dimension_A_dosage] en indicateur [Indicateur_ALL_Dosage], non ?

    Si [ALL_Dosage] est un indicateur, je testerais ce qui suit :
    Création d'une variable (Dimension)
    J'ai testé le flag mais je n'ai pas réussi à le faire fonctionner . Dans le tableau, les valeurs n'apparaissent que si je mets la colonne A_ID. Dès que je mets la colonne ALL_ID, je n'ai plus rien.

    si tu ne veux pas voir les dosages nuls pourquoi ne les filtres-tu pas dans ta requête.
    >> c'est ce que j'ai fait. Dans ma requête A (1er univers), j'ai mis A_dosage non nul. Dans ma requête B (2ème univers), je n'ai aucun champ en rapport avec le dosage. Mais à aucun moment, je n'ai pu faire de requête combinée pour dire je ne veux que les lignes présentes dans A et dans B. Du coup, BO me sort toutes les lignes de mes 2 requêtes. C'est tout mon problème car je pensais qu'il allait de lui-même ne garder que les lignes communes entre les 2 univers et qu'il m'aurait donc été inutile de filtrer après coup dans le rapport. Je ne sais pas si c'est impossible à faire dans BO ou bien si c'est juste moi qui ne sait pas faire

    Merci encore si vous avez la patience de m'aider.

    Bonne journée !

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 364
    Points : 551
    Points
    551
    Par défaut
    Bonjour,

    Je me suis mal exprimé ou tu n'as pas tout lu :

    On peut faire des calculs ou autres transformations à partir de dimensions. Ta transformation en classes en est un exemple, elle n'a aucun besoin de transiter par un indicateur.

    Dès l'instant où tu ajoutes des fonctions d'agrégation dans ta Variable (Somme(), Moyenne(), Nombre()), il est d'usage d'en faire une variable de type indicateur de manière à ce que les agrégations se fassent automatiquement en fonction des dimensions du tableau.

    Par ailleurs Moyenne() est une fonction dont je me méfie tout particulièrement. Posée en pied de tableau ou de rupture elle effectue la somme des valeurs de chaque ligne du tableau divisée par le nombre des valeurs. Positionnée dans le corps du tableau, elle donne des résultats tordus sauf si on manipule habilement les opérateurs de contextes pour lui faire rendre raison. Si tu en as la possibilité, je te conseille vivement de calculer ta moyenne à la main [Total des dosages] /[Nombre des valeurs pertinentes]. Cela te permet notamment de contrôler que le numérateur et le dénominateur sont corrects avant de faire l'opération.

    Si la valeur numérique [A_Dosage] est une dimension, je comprends qu'il te manque parfois des données.
    Peux-tu poster un tableau avec les données que tu souhaites précisant si les objets d'origine sont des Indicateurs ou des Dimensions.
    Pour être sûr de son coup, il va probablement falloir manipuler les opérateurs de contextes et ils ne pardonnent pas l'à peu près.

    Si on envisage de filtrer les valeurs non nulles dans la requête, les requêtes combinées ne peuvent pas être une réponse, ce n'est pas fait pour ça. Il est possible en revanche d'obtenir un résultat en utilisant une sous-requête (2 requêtes sur un même univers) ou en filtrant une requête avec les résultats d'une autre requête (si les 2 requêtes ne proviennent pas du même univers et que le volume de données de la requête filtrante n'est pas trop important).

    Cordialement,

  12. #12
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    On peut faire des calculs ou autres transformations à partir de dimensions. Ta transformation en classes en est un exemple, elle n'a aucun besoin de transiter par un indicateur.
    Ah, ok, si j'ai bien tout compris, pour mes ages, aucun intérêt de passer par un intermédiaire indicateur pour construire mes catégories étant donné que c'est du texte et qu'il n'y aura pas de calculs dessus. Autant construire les catégories directement depuis la dimension d'origine. Par contre, si j'avais eu à calculer des moyennes d'age ou des médianes d'age, alors là, il aurait fallu que je créé un indicateur age et ensuite :
    - soit je construis d'autres indicateurs (moyenne, médiane) à partir de l'indicateur age
    - soit je ne construis pas d'autres variables et je tape directement mes formules dans mon tableau (=moyenne ou bien total/effectif pour être sure de pas faire d'erreur de contexte)



    Voici ce que j'ai dans mon 1er univers:
    A_ID (dimension) A_dosage (dimension)
    123 1.02
    456 2.05
    789

    Voici ce que j'ai dans la requête A de mon 1er univers puisque je filtre sur dosage non nul:
    A_ID (dimension) A_dosage (dimension)
    123 1.02
    456 2.05

    Voici ce que j'ai dans mon 2ème univers:
    B_ID (dimension) B_age (dimension) B_sexe (dimension)
    123 25 Homme
    456 33 Femme
    789 42 Homme
    101112 36 Homme
    131415 51 Femme

    Voici ce que j'ai dans la requête B de mon 2ème univers puisque je filtre sur date de dosage (je ne mets pas la date dans les champs de ma requête puisque je ne l'utiliserai pas après, elle me sert juste à filtrer):
    B_ID (dimension) B_age (dimension) B_sexe (dimension)
    123 25 Homme
    456 33 Femme
    789 42 Homme
    101112 36 Homme

    Voici ce que je voudrai (pour ensuite faire un tableau croisé et un graphique):
    ID age catégorie sexe dosage
    123 25 <30 Homme 1.02
    456 33 30-50 Femme 2.05


    Voici ce que j'ai fait (enfin, j'ai fait pleins de trucs, mais je garde ce qui semble utile ^^):
    - fusion de A_ID avec B_ID pour former une dimension ALL_ID
    - création d'un indicateur ALL_dosage dont la formule est = A_dosage
    - création d'une information AgeCategorie =Si([B_age]<30;"<30";Si([B_age]>=30 Et [B_age]<=50;"30-50";Si([B_age]>50;">50"))), associée à la dimension ALL_ID
    - création d'une information Sexe = [B_sexe], associée à la dimension ALL_ID
    - création d'une information Age = [B_age], associée à la dimension ALL_ID

    Si je créé un tableau vertical comme suit:
    - dimension ALL_ID
    - puis dimension d'origine B_age
    - puis information AgeCategorie
    - puis dimension d'origine B_sexe
    - puis indicateur ALL_dosage
    Alors j'ai des cellules vides dans ma colonne ALL_dosage
    Dimension ALL_ID Dimension B_age Information AgeCategorie Dimension B_sexe Indicateur ALL_dosage
    123 25 <30 Homme 1.02
    456 33 30-50 Femme 2.05
    789 42 30-50 Homme
    101112 36 30-50 Homme

    Si je créé un tableau vertical comme suit:
    - dimension ALL_ID
    - puis dimension d'origine B_age
    - puis information AgeCategorie
    - puis dimension d'origine B_sexe
    - puis dimension d'origine A_dosage
    Alors je n'ai pas le droit de mettre ma colonne A_dosage (Impossible de déposer ici. Objet incompatible)


    Si je créé un tableau vertical comme suit:
    - dimension ALL_ID
    - puis information Age
    - puis information AgeCategorie
    - puis information Sexe
    - puis indicateur ALL_dosage
    Alors j'ai des cellules vides dans ma colonne ALL_dosage
    Dimension ALL_ID Information age Information AgeCategorie Information sexe Indicateur ALL_dosage
    123 25 <30 Homme 1.02
    456 33 30-50 Femme 2.05
    789 42 30-50 Homme
    101112 36 30-50 Homme



    Si je créé un tableau vertical comme suit:
    - dimension ALL_ID
    - puis information Age
    - puis information AgeCategorie
    - puis information Sexe
    - puis dimension d'origine A_dosage
    Alors j'obtiens ce que je veux
    Dimension ALL_ID Information age Information AgeCategorie Information sexe Dimension A_dosage
    123 25 <30 Homme 1.02
    456 33 30-50 Femme 2.05

    Du coup, si je ne veux que les dosages non vides, il m'a fallu prendre la dimension d'origine A_dosage. Et pour pouvoir avoir le sexe et l'age, il m'a fallu créer des informations.
    Je précise que dans tout ce que je viens d'écrire au-dessus, je n'ai mis aucun filtre sur mon rapport. Quelle aurait été ta méthode pour obtenir mon tableau final ?

    Merci +++

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 364
    Points : 551
    Points
    551
    Par défaut
    Si je comprends bien le dernier tableau est celui souhaité ?

    Dans ce cas ton problème est résolu sauf si pour A_ID, il peut y avoir plusieurs dosages => Est-ce le cas ?

    Si cela te gêne (mais pourquoi ?), tu aurais pu mettre [A_ID] au lieu de [ALL_ID], ça aurait aussi supprimé les lignes vides (c'est à dire celles qui n'ont aucune correspondance dans la requête2).

    Et effectivement, pour ajouter des valeurs de dimensions non synchronisées dans un tableau, il faut les transformer en informations (jusqu'à la XI3) en créant une variable attachée à une des dimensions fusionnées.

    Reste-t-il une question en suspens ?

    Cordialement,

  14. #14
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Il ne peut y avoir qu'un seul dosage pour chaque A_ID.
    Oui, j'aurai pu mettre A_ID au lieu de ALL_ID, ça m'aurait donné le même nombre de lignes que de mettre A_dosage.
    Donc oui, au final, j'obtiens bien ce que je veux mais je ne trouve pas ça "naturel".
    Est-ce que ma façon de faire est la bonne ?

    Car ce qui me parait plus naturel ça aurait été de mettre ALL_dosage, de ne m'occuper que des "nouvelles" variables, en évitant de prendre des variables d'origine.
    Etant donné que c'est un indicateur créé à partir de la dimension A_dosage, je m'attendais à ce que =Nombre([ALL_ID]) Où (Non(EstNul([Indicateur ALL_Dosage]))) fonctionne. Or ce n'est pas le cas.
    Alors que =Nombre([A_ID]) Où (Non(EstNul([Indicateur ALL_Dosage]))) fonctionne.
    Et =Nombre([ALL_ID]) Où (Non(EstNul([Indicateur A_Dosage]))) fonctionne.

    Donc oui j'ai bien le bon résultat final mais je ne comprends toujours pas pour quelle rasion =Nombre([ALL_ID]) Où (Non(EstNul([Indicateur ALL_Dosage]))) ne fonctionne pas

    Si t'arrives à m'expliquer

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 364
    Points : 551
    Points
    551
    Par défaut
    Bonjour,

    La fonction EstNul() permet de savoir si dans un champ contenu dans une ligne, il y a quelque chose ou rien. Pour cela il faut qu'il y ait une ligne (un enregistrement).

    Pour des raisons d'affichage et probablement d'esthétique dans le cas de jeux de données multi-requêtes, le fait que le tableau soit bien rectangulaire n'implique pas qu'il y ait des enregistrements correspondants pour chaque cellule. En l'occurrence, ta fonction EstNul() est tout à fait opérationnelle s'il y a un champ à tester dans la requête B. S'il 'y en a pas, il n'y a pas de test non plus. En conséquence le tableau ne peut pas être filtré car le champ à tester n'existe tout simplement pas.

    Même si ce qu'on voit dans BO est un tableau, il est toujours préférable de raisonner en terme de jeu de données que de cellules avec cet outil. Les tableaux sont construits à la volée en fonction des données à afficher. On n'est pas dans le même cas qu'Excel où les tableaux préexistent et sont complétés ou non avec des informations.

    Cordialement,

  16. #16
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Hello,

    La fonction EstNul() permet de savoir si dans un champ contenu dans une ligne, il y a quelque chose ou rien. Pour cela il faut qu'il y ait une ligne (un enregistrement).
    >> OK, je comprends mieux: dans mon tableau de calculs, cette fonction EstNul ne peut pas fonctionner parce qu'elle n'est pas rattachée à une ligne de données. Alors que si je pose un filtre "Indicateur ALL_dosage non nul" sur mon tableau des données sources (Dimension ALL_ID,Information age,Information AgeCategorie,Information sexe,Indicateur ALL_dosage), là ça fonctionne.

    On n'est pas dans le même cas qu'Excel où les tableaux préexistent et sont complétés ou non avec des informations.
    Et si j'ai bien tout compris, quand je mets dans mon tableau de données sources la colonne A_dosage au lieu de ALL_dosage, le filtre se fait en quelque sorte de lui-même car dans ma requête j'avais mis A_dosage non nul et donc BO n'affiche que les lignes avec des A_dosage: BO n'a pas comblé par du vide le champ A_dosage pour tous les ID. Alors que si ça avait été sous Excel, j'aurais eu mes 400 000 ID et seulement 44 auraient eu le champ A_dosage rempli, les 400 000 - 44 auraient eu le champ A_dosage vide mais existant. Sur BO, ce champ A_dosage n'existe même pas pour les 400 000 - 44.

    ça commence doucement à s'éclaircir dans mon esprit. Rien de tel que la pratique pour maitriser la bête

    Un énorme MERCI à toi dlra_ ainsi qu'à bastoonet, pour votre aide précieuse, votre patience et toutes vos explications.
    A bientôt pour de nouvelles questions
    Bonne journée !

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

Discussions similaires

  1. Calcul d'un total selon les champs du formulaire
    Par pierre_gomes dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 09/10/2011, 20h18
  2. select dynamique selon selon catégorie
    Par conquering_lion dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/04/2011, 10h58
  3. [MySQL] Calculer le nombre de sous-catégories
    Par Moxostoma dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 10/11/2008, 17h41
  4. Calcul entre 2 dates selon des paramètres
    Par jibileg dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/05/2007, 12h48

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