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

BIRT Discussion :

Est il possible de créer une liste (avec groupement) de crosstab ?


Sujet :

BIRT

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Est il possible de créer une liste (avec groupement) de crosstab ?
    Voici mon problème sur lequel je m'arrache les cheveux depuis quelques jours:

    Je souhaite construire un rapport qui aura la forme suivante:

    pour agence1:

    crosstab


    pour agence2:

    crosstab


    pour agence3:

    crosstab

    ...

    Bien entendu chaque crosstab n'incluant que les données relatives à l'agence en cours

    Ce type de structure est elle réalisable ?

    Dans le cas d'un dataset classique, ca ne pose pas de souci, mais quand il s'agit de faire les regroupements par agence à partir d'un data cube, les choses se corsent...

    Merci de m'aider !!

    Merci

  2. #2
    Membre régulier Avatar de rotsilaina
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Madagascar

    Informations forums :
    Inscription : Octobre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Bonjour!

    Si je comprends très bien, vous voulez créer un seul report incluant 3 crosstab différents. Si oui, c'est possible.
    Vous n'avez qu'à créer votre propre template avec 3 crosstab.
    Puis, vous allez créer 3 datasets différents ayant chacun sa propre requette.
    Avec les 3 nouveaux datacubes, vous allez paramettrer chaque ligne et chaque colonne des crosstabs.

    Cordialement rotsilaina.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour votre réponse, mais je pense que je n'ai pas été assez clair dans la description de mon probleme:

    Il n'y a qu'un seul dataset qui renvoi

    un client, une type , une agence, un montant.

    mon cross tab a sur un axe le client et sur l'autre axe le type. le montant étant la mesure.

    Je n'ai pas 3 crosstab a créer.
    Ils doivent etre générés dynamiquement.
    Si il y a 3 agences alors il y aura 3 crosstab, si il y a 10 agences, il y aura 10 crosstabs (1 par agence).

    Pour gérer cette itération, le composant list me parait adapté.

    La dimension agence est une dimension de mon data cube, mais qui n'est pas utilisé dans mon cross tab, je veux m'en servir comme regroupement.
    Cependant j'ai l'impression que Birt gere mal, pour ne pas dire pas du tout, les listes (regroupements) à partir de cubes.
    Cela provient peut etre du fait que les cross tab n'ont été ajoutés que récemment...

    Si quelqu'un à une idée

  4. #4
    Membre éprouvé
    Avatar de lazarel
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2007
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2007
    Messages : 893
    Points : 1 164
    Points
    1 164
    Par défaut
    Bonjour,

    Bon alors ...
    Il n'y a qu'un seul dataset qui renvoi

    un client, une type , une agence, un montant.
    C'est une obligation pour toi .... soit mais tu risque de pas aller trés loin

    Pour gérer cette itération, le composant list me parait adapté.
    Oui ok nous sommes d'accord

    Pour le reste c'est extrèment simple il n'existe pas de liaison possible pour les Data Cube utilisé dans BIRT (en 2.2.0) . Pas de paramètre passé implique pas de possibilité de rafraichir ton tableaux croisés à chaque itération de ta liste.

    Conclusion dans l'absolue cela risque d'être dur, la solution consiste à utiliser JasperReports qui est la solution idéale !!! pour les tableaux croisés dynamique, avec l'imbriquation d'un sous-rapport contenant le tableaux croisés.

    Par contre si tes colonnes "type" sont prédéfinies (statique), et que tes "clients" sont non prédéfini (dynamique) il te suffit d'utiliser un tableaux classique. Ca marche trés bien et le résultat sera identique

    Cordialement Lazarel

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    J'ai réussi a résoudre le problème en passant pas une variable JavaScript.

    Il faut créer une variable dans la méthode initialize du rapport (onglet script)
    ex: codeAgence=null

    Créer une table à partir d'un dataSet puis définir de manière classique le binding et le groupe.

    Insérer ensuite le cross tab dans la table. (Bien entendu, a cette étape, il n'y a aucun lien entre le groupe de la liste et le cross tab. On aura alors un cross tab pour chaque rupture de la liste (mais a chaque fois identique).

    Selectionner la ligne de la table dans laquelle se situe le cross tab et dans la méthode onRender affecter à la variable créée la valeur du champs qui sert de regroupement dans la table

    ex: codeAgence = row["DTW_ID_AGENCE"]

    Ca y est le tour est joué !!

    Merci a tous de votre aide !!

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 385
    Points : 321
    Points
    321
    Par défaut
    Peux-tu décrire précisément la procédure que tu as mis en place ?

    J'ai exactement le même problème. J'ai 2 listes imbriquées (ANNEE et LIEU) et à l'intérieur de la seconde liste, je souhaite afficher un tableau croisé.

    J'ai crée un dataset me retournant pour chaque [ANNEE, LIEU, CATEGORIE D'ENTITE] le nombre d'entité correspondant.

    J'ai crée un datacube basé sur ce dataset.

    J'ai crée un crossstab basé sur ce datacube.

    J'utilise 2 variables javascript : CURRENT_ANNEE et CURRENT_LIEU_COD. Ces variables sont fonctionnels car j'arrive à afficher des tableaux basé sur des requêtes paramétrées.

    Comment as-tu paramétré ton dataset, ton datacube, ton crosstab ?

    merci

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Si j'ai bien compris ton problème, tu as deux listes imbriquées et ton crosstab est a chaque fois identique car tu n'arrives pas a le lier aux elements de ta listes.

    IL faut que tu initialises tes variables dans le initialize comme écrit dans le post précédent.

    Ensuite que tu affectes à ces variables la valeur de tes listes (dans la méthode onRender de ta table, dans le detail, la ou se trouve ton crosstab
    ex: var1 = ???
    var2 = ??? , voir post précédent)
    et enfin, il faut que tu appliques un filtre sur ton crosstab afin de ne "laisser passer" que les données égales à tes 2 variables (j'ai oublié de le préciser ds le post précédent).

    Bon courage !

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 385
    Points : 321
    Points
    321
    Par défaut
    Merci.

    Ça fonctionne.

    Par contre j'ai un maintenant autre problème.

    Comme je l'ai dit, j'ai 2 listes imbriquées : la première itère sur les années et la seconde sur des lieux.

    Mon crosstab représente l'évolution du nombre d'entités par type d'entités (ligne) pour le lieu courant. Les entêtes de colonnes sont donc des années. Par exemple, si je suis sur l'année 2005 dans la liste, le crosstab va afficher l'évolution de 1995 à 2005 ([année courante - 10; année courante]).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TYPE     | 1995 | 1996 | .... | 2005
    --------------------------------------
    A        |    5 |    6 | .... |   14
    B        |    7 |    3 | .... |    8
    .
    .
    .
    --------------------------------------
    TOTAL    |  100 |   96 | .... |  108
    Dans cette configuration, je ne peux pas filtrer les données du crosstab pour le lieu courant car cette information n'est pas affichée dans le crosstab. Ppar contre, cette information est dans le dataset et dans le datacube !

    Du coup, j'ai ajouté le lieu dans la dimension "type" et je rend le champ lieu invisible. Ainsi, je peux filtrer les données pour le lieu courante. Et là, c'est un peu moche car la colonne contenant le champ lieu s'affiche (sans la valeur du lieu), ce qui décale le type d'entités assez grossièrement.

    Le composant "Datacube" est relativement jeune, ce qui peut expliquer ses manques. J'espère que dans les prochaines versions, ce composant sera enrichie de nouvelles fonctionnalités.

    Merci encore tony pour ton aide

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 385
    Points : 321
    Points
    321
    Par défaut
    Finallement en cachant (visibility = false) les niveaux à filtrer et en définissant la largeur des cellules à 0 cela donne l'affichage escompté.

    Voici la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    [LIST:YEAR]
    --[LIST:COUNTRY]
     
                                             | [CUSTOMER_TYP] | TOTAL
          ------------------------------------------------------------------
          [YEAR] | [COUNTRY] | [PRODUCT_TYP] |     [NB_SALES] | 
          ------------------------------------------------------------------
          TOTAL                              |                |
     
    --[/LIST:COUNTRY]
    [/LIST:YEAR]
    Je filtre le crosstab sur les niveaux YEAR et COUNTRY avec les valeurs courantes de la liste. Je rends invisible ces 2 libellés et je définie la largeur des cellules dans lesquelles sont situées ces libellés à 0.

    Et le tour est joué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    [LIST:YEAR = 2005]
    --[LIST:COUNTRY = 'FR']
     
                    | Entreprise | Individuel | TOTAL
          --------------------------------------------
          Jeux      |         50 |         70 |   120
          Livres    |         20 |         75 |    95
          --------------------------------------------
          TOTAL     |         70 |        145 |   215
     
    --[/LIST:COUNTRY]
    [/LIST:YEAR]

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/08/2015, 12h00
  2. Réponses: 0
    Dernier message: 09/03/2014, 21h30
  3. Réponses: 3
    Dernier message: 09/03/2014, 02h46
  4. Réponses: 2
    Dernier message: 20/03/2012, 16h43
  5. Réponses: 3
    Dernier message: 19/07/2010, 08h42

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