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 :

[BIRT] Création d'un group header de façon dynamique ?


Sujet :

BIRT

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut [BIRT] Création d'un group header de façon dynamique ?
    Bonjour,

    Voici mon problème :

    J'ai réalisé un report sous BIRT qui m'affiche des données ordonnées par niveau.

    exemple :

    niveau 1 : pays
    niveau 2 : ville
    Lorsqu'on arrive au dernier niveau, on affiche la liste des destinataires associés à ce niveau.

    Actuellement je peux afficher le dernier niveau et les destinataires :

    Rennes :
    dest 1
    dest 2
    ...

    Nantes :
    dest 3
    dest 4
    ...

    ...

    Je peux afficher le premier niveau :
    France
    Rennes :
    dest 1
    dest 2
    ...

    Nantes :
    dest 3
    dest 4
    ...

    ...

    Mais il arrive parfois que le nombre de niveaux ne se limite pas à 2 mais à plus.
    Et c'est là que mon problème se pose.

    Je peux compter mon nombre de niveaux mais comment faire pour ajouter autant de lignes dans mon élément table qu'il y a de niveaux ?
    Existe-t-il un moyen d'ajouter, par du code, des header group ?

    Merci d'avance.

    Suolan.

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Vu qu'il n'y a pas de réponse de proposée, je suppose mon problème est impossible à résoudre.
    Ou alors personne n'a compris mon problème...

    Je laisse encore quelques jours avant de clôturer le sujet, on ne sait jamais

    Bon week end.

    Suolan.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 143
    Points : 1 353
    Points
    1 353
    Par défaut C'est possible
    C'est possible de coder ceci , mais je ne suis pas assez technique pour vous fournir le code exact.

    Dans le principe , vous pouvez même créer tout en tableau rien que par du code.

    Mon astuce :

    1) créer un objet caché qui vous compte les valeurs de chaque groupe ( ou un champs calculé dans votre SQL )

    2) coder sur le tableau ( sur le onRender du tableau je pense ) qqch du style si champs dans xyz , alors newGroupHeader etc.

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Merci pour la réponse.
    Je sais maintenant que c'est possible.

    Dans un livre sur BIRT, j'ai vu qu'on pouvait ajouter des group dans le onPrepare de la Table.

    Le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (params["codeClassification"] != null){
        importPackage( Packages.org.eclipse.birt.report.engine.api.script.element);
     
        var groupCondition = StructureScriptAPIFactory.createGroup();
     
        groupCondition.setKeyExpr("row[\"A\"]");
     
        groupCondition.setSortDirection("asc");
        groupCondition.setSortType("asc");
     
        this.addGroup(sortCondition);
    }
    1) le import est OK, il est reconnu par BIRT
    2) var groupCondition = StructureScriptAPIFactory.createGroup(); => la fonction createGroup() pour la classe StructureScriptAPIFactory est inconnue. J'ai vérifé dans l'API.
    3) this.addGroup(sortCondition); => d'où sort le 'sortCondition' ?

    J'en arrive à la conclusion que c'est faisable mais que même les livres sur le sujet ne savent pas comment faire (les auteurs ne savent pas coder ou je ne sais pas lire).

    Même ici, le sujet n'est pas fréquent voire inexistant.

    Le seul moyen est de créer le report entièrement par du code mais à partir de JAVA et non de BIRT. Ce que je ne veux pas faire.

    La manipulation de l'API BIRT n'est pas simple.
    Si jamais quelqu'un s'y aventure, je suis toujours intéressée car j'aimerais trouver une solution à mon problème.

    Merci d'avance.

    Suolan.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 143
    Points : 1 353
    Points
    1 353
    Par défaut Question passée
    J'ai passée cette question à un développeur Actuate BIRT.

    Par ailleurs , si vous etes sur Paris , je peux vous emprunter le bouquin de formation API BIRT officiel ( celui d'Actuate... )


  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Merci pour votre aide (ça fait bizarre d'être vouvoyée quand même).

    Et non, je ne suis pas sur Paris

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    J'ai abandonné l'idée d'ajouter un header group par du code.

    Mais j'ai une autre idée et par conséquent une autre question

    Est-il possible d'ajouter dynamiquement un champ Dynamic Text ?

    J'arrive maintenant à afficher ma hiérarchie.
    Pour le faire, j'ai créé 8 dynamic text (car je connais maintenant le nombre maximal de niveau dans une hiérarchie) contenant le libellé de mes niveaux. (config["lib1"] par exemple).

    Ce qui me donne de manière très moche pour une hiérarchie à 2 niveaux :
    France







    Rennes

    En blanc dans le report...

    Alors voilà, comment faire pour ne plus avoir ces blancs ?
    Je pense donc qu'il serait bien de créer des dynamic text que lorsqu'on en a besoin, mais comment faire ?

    Et si c'est possible comment ajouter ensuite la valeur que je souhaite afficher dans ces Dynamic Text créés ?

    Ou alors à l'inverse comment supprimer les dynamic text qui sont en trop et qui ont une valeur = "" (ou null si c'est plus pratique).

    J'espère avoir été claire et surtout qu'une réponse existe

    Merci d'avance et bonne soirée.

    Suolan.

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    J'ai trouvé comment faire
    J'ai spécifié les tailles des colonnes de mon tableau en pourcentage et je n'ai plus de blanc qui s'affiche... Simple en fait !

    Mon rapport fonctionne très bien. Ma hiérarchie est nickel mais j'ai une super exception :

    Caused by: org.eclipse.birt.data.engine.core.DataException: A BIRT exception occurred: Error evaluating Javascript expression. Script engine error: TypeError: La valeur par défaut de l'objet est introuvable (DataSet[Niveaux].__bm_onFetch#2)
    Script source: DataSet[Niveaux].__bm_onFetch, line: 1, text:
    __bm_onFetch(). See next exception for more information.


    Je pense savoir d'où vient le problème mais je ne sais pas comment le résoudre.

    Pour faire ma hiérarchie j'ai créé deux dataSet : DataTable et Niveaux
    Ces dataSet sont utilisés dans des Tables : table1 et table2

    table2 est "imbriquée" dans table1.

    J'ai besoin de certaines informations de la table1 dans le on Fetch de la table2.
    J'ai donc créé dans les propriétés Binding de table2 des colonnes pointant sur celles de table1.

    Ce qui me donne pour le binding de table2 :
    nom de colonne : ID_MER_NIV
    expression : row._outer["ID_MER"]

    Dans le on Fetch de table2, je fais appel à la colonne ID_MER_NIV de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (dataSetRow["ID_C1"] == row["ID_MER_NIV"])
    Et je pense que c'est cette ligne-là qui me génère l'exception.
    Les autres n'étant que du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     config["lib1"] = dataSetRow["L_C1"];
    Ce que je trouve bizarre c'est que mon report fonctionne comme il faut.

    Savez-vous pourquoi j'ai cette erreur ?
    Comment faut-il utiliser récupérer ma colonne ID_MER_NIV si ce que j'ai fait n'est pas correct ?

    Merci d'avance.
    Suolan.

    PS : Je suis toujours sur le même report mais le problème ne correspond plus au titre du sujet. Merci de me dire s'il faut que je clos celui-ci et que j'en rouvre un autre

  9. #9
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Bonjour,

    Est-ce possible d'avoir le contenu COMPLET de ton OPEN et FETCH s'il te plaît ?

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    BiM,

    Je n'ai rien dans le Open et dans le Fetch j'ai ceci :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    if (dataSetRow["ID_C1"] == row["ID_MER_NIV"] && dataSetRow["ID_C1"] != null)
    {
       config["lib1"] = dataSetRow["L_C1"];
       config["lib2"] = null; 
       config["lib3"] = null; 
       config["lib4"] = null;
       config["lib5"] = null;
       config["lib6"] = null;
       config["lib7"] = null;
       config["lib8"] = null;
    }
    if (dataSetRow["ID_C2"] == row["ID_MER_NIV"] && dataSetRow["ID_C2"] != null)
    {
       config["lib1"] = dataSetRow["L_C1"];
       config["lib2"] = dataSetRow["L_C2"];
       config["lib3"] = null; 
       config["lib4"] = null;
       config["lib5"] = null;
       config["lib6"] = null;
       config["lib7"] = null;
       config["lib8"] = null;
    }
    if (dataSetRow["ID_C3"] == row["ID_MER_NIV"] && dataSetRow["ID_C3"] != null)
    {
       config["lib1"] = dataSetRow["L_C1"];
       config["lib2"] = dataSetRow["L_C2"]; 
       config["lib3"] = dataSetRow["L_C3"]; 
       config["lib4"] = null;
       config["lib5"] = null;
       config["lib6"] = null;
       config["lib7"] = null;
       config["lib8"] = null;
    }
    if (dataSetRow["ID_C4"] == row["ID_MER_NIV"] && dataSetRow["ID_C4"] != null)
    {
       config["lib1"] = dataSetRow["L_C1"];
       config["lib2"] = dataSetRow["L_C2"]; 
       config["lib3"] = dataSetRow["L_C3"]; 
       config["lib4"] = dataSetRow["L_C4"];
       config["lib5"] = null;
       config["lib6"] = null;
       config["lib7"] = null;
       config["lib8"] = null;
    }
    if (dataSetRow["ID_C5"] == row["ID_MER_NIV"] && dataSetRow["ID_C5"] != null)
    {
       config["lib1"] = dataSetRow["L_C1"];
       config["lib2"] = dataSetRow["L_C2"]; 
       config["lib3"] = dataSetRow["L_C3"]; 
       config["lib4"] = dataSetRow["L_C4"];
       config["lib5"] = dataSetRow["L_C5"];
       config["lib6"] = null;
       config["lib7"] = null;
       config["lib8"] = null;
    }
    if (dataSetRow["ID_C6"] == row["ID_MER_NIV"] && dataSetRow["ID_C6"] != null)
    {
       config["lib1"] = dataSetRow["L_C1"];
       config["lib2"] = dataSetRow["L_C2"]; 
       config["lib3"] = dataSetRow["L_C3"]; 
       config["lib4"] = dataSetRow["L_C4"];
       config["lib5"] = dataSetRow["L_C5"];
       config["lib6"] = dataSetRow["L_C6"];
       config["lib7"] = null;
       config["lib8"] = null;
    }
    if (dataSetRow["ID_C7"] == row["ID_MER_NIV"] && dataSetRow["ID_C7"] != null)
    {
       config["lib1"] = dataSetRow["L_C1"];
       config["lib2"] = dataSetRow["L_C2"]; 
       config["lib3"] = dataSetRow["L_C3"]; 
       config["lib4"] = dataSetRow["L_C4"];
       config["lib5"] = dataSetRow["L_C5"];
       config["lib6"] = dataSetRow["L_C6"];
       config["lib7"] = dataSetRow["L_C7"];
       config["lib8"] = null;
    }
    if (dataSetRow["ID_C8"] == row["ID_MER_NIV"] && dataSetRow["ID_C8"] != null)
    {
       config["lib1"] = dataSetRow["L_C1"];
       config["lib2"] = dataSetRow["L_C2"]; 
       config["lib3"] = dataSetRow["L_C3"]; 
       config["lib4"] = dataSetRow["L_C4"];
       config["lib5"] = dataSetRow["L_C5"];
       config["lib6"] = dataSetRow["L_C6"];
       config["lib7"] = dataSetRow["L_C7"];
       config["lib8"] = dataSetRow["L_C8"];
     
    }
    Bon je sais c'est barbare

    Merci,
    Suolan.

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    J'ai fait quelques essais dans mon on Fetch.
    J'ai enlevé les lignes que l'on peut voir dans le post ci-dessus.

    J'ai mis ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    i = row._outer["ID_MER"];(row._outer["ID_MER"] = colonne de DataTable)
    config["id"] = dataSetRow["ID_C1"];
    config["id2"] = i;
    i a été déclaré dans initialize, valeur par défaut = 0;
    Je remarque dans le preview que la valeur row._outer["ID_MER"] est affichée et peut bien être utilisée dans mon on Fetch.
    C'est pareil si j'utilise : row["ID_MER_NIV"] (colonne de Niveaux) qui est égale à row._outer["ID_MER"].

    Si j'ajoute une condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    i = row._outer["ID_MER"];
    config["id"] = dataSetRow["ID_C1"];
    config["id2"] = i;
    if (i == 47)
    {
        config["lib1"] = "coucou";
    }
    coucou s'affiche bien, config["id"] et config["id2"] aussi.
    Mais j'obtiens toujours cette erreur-ci :

    Caused by: org.eclipse.birt.data.engine.core.DataException: A BIRT exception occurred: Error evaluating Javascript expression. Script engine error: TypeError: La valeur par défaut de l'objet est introuvable (DataSet[Niveaux].__bm_onFetch#13) Script source: DataSet[Niveaux].__bm_onFetch, line: 1, text:__bm_onFetch(). See next exception for more information.Error evaluating Javascript expression. Script engine error: TypeError: La valeur par défaut de l'objet est introuvable (DataSet[Niveaux].__bm_onFetch#13) Script source: DataSet[Niveaux].__bm_onFetch, line: 1, text:__bm_onFetch() at org.eclipse.birt.data.engine.core.DataException.wrap(DataException.java:114) at org.eclipse.birt.data.engine.script.ScriptEvalUtil.evaluateJSAsExpr(ScriptEvalUtil.java:552) at org.eclipse.birt.data.engine.script.JSMethodRunner.runScript(JSMethodRunner.java:79) at org.eclipse.birt.report.engine.script.internal.DtEScriptExecutor.handleJS(DtEScriptExecutor.java:71) ... 97 more


    Apparemment je ne peux pas faire de condition sur ce champ sans avoir d'erreur.
    Si qui est bien dommage car il me faut ces conditions.

    Y-a-t-il une astuce, un truc qu'il faudrait faire ?

    Merci d'avance.

    Suolan.

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Finalement j'ai réussi à faire ce que je voulais sans passer par mes config.

    J'ai réuni mes deux requêtes en une seule (avec des difficultés), ce qui fait que j'avais toutes les données qu'il me fallait dans une seule table.

    J'ai ensuite fait 9 groupes basés sur les 9 ID de mes niveaux.

    Ces groupes sont cachés si l'ID associé est null.

    Et c'est tout.
    J'ai galéré pour rien en fait, tout n'était que question de requête.

    Merci pour votre aide.

    Suolan.

    PS : est-ce que je mets le sujet à "résolu" même si la solution n'a plus de rapport avec ce que j'ai demandé à l'origine (création dynamique des header group) ?

  13. #13
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Ca reste une création dynamique de header. Enfin, c'est comme ça que je les fait également.

    Donc, oui, tu peux mettre ton sujet à

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

Discussions similaires

  1. LDAP : aide pour création de users, groups etc
    Par longbeach dans le forum Sécurité
    Réponses: 0
    Dernier message: 23/05/2009, 08h34
  2. Réponses: 4
    Dernier message: 23/01/2009, 11h12
  3. création de miniatures et header()
    Par magicbisous-nours dans le forum Langage
    Réponses: 6
    Dernier message: 16/10/2008, 14h21
  4. Création site pour groupe de musique
    Par mascletjp dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 18/12/2007, 11h10

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