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 :

[4.3] [Design] Grouper les données par date (jour-mois-année) en tenant compte du fuseau horaire


Sujet :

BIRT

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [4.3] [Design] Grouper les données par date (jour-mois-année) en tenant compte du fuseau horaire
    Bonjour à tous,

    Je bute depuis quelques jours sur un problème qui me semblait tout simple au début, et qui en fait soit ne l'est pas tellement, soit est révélateur de mon incompétence. Comme je préfère me dire que je ne suis pas totalement incompétent, on va partir du principe que le problème n'est pas super simple.

    Je récupère des données d'une base postGres, avec un dataSet contenant une requête directe vers la base dans le rptdesign.

    Les données enregistrées en base contiennent des dates. Je voudrais faire un groupe dans mon tableau de résultats sur une de ces dates, et regrouper les données par jour, dans le fuseau horaire demandé (paramètre d'entrée).

    Cas concret : je demande toute les données du 04/10/2013 dans le fuseau Europe/Paris : je reçois tout plein de données, dont la fameuse date, au format date-time. Mais certaines de ces données sont datées du 04/10/2013 00h37.

    Or j'ai demandé à Birt de grouper mes données sur le champ date, à qui je fais évidemment subir quelques modifications, étant donné qu'il ne faut prendre en compte ni les heures, ni les minutes, ni les secondes.
    Je lui demande donc de grouper sur l'expression suivante :
    BirtDateTime.year(row["dateClass"])+"/"+BirtDateTime.month(row["dateClass"])+"/"BirtDateTime.day(row["dateClass"])

    Et forcément, il ne prend pas en compte le fuseau horaire (j'ai vérifié en regardant les sources du code de ces fonctions).
    Du coup, je me retrouve avec un groupe de données du 03/10/2013 avec quelques lignes, qui pourtant affichent bien dans le tableau une date du 04/10, étant donné que le formatage de date fonctionne bien et prend en compte le fuseau horaire fourni. Malheureusement, on ne peut pas appliquer de formatage dans la définition des groupes.

    J'ai tenté plein d'autres solutions : les fonctions javascript natives disponibles getDate(), getMonth(), getYear() indiquent dans leur javadoc qu'elles expriment le nombre retourné en utilisant le temps local, mais ça ne fonctionne visiblement pas.

    Dans le package BirtDateTime, le plus rageant, c'est que les fonctions DiffXXX utilisent, elles, le fuseau horaire, mais elles ne me sont d'aucun intérêt.

    Quelqu'un aurait-il une solution miracle à proposer ? (ou alors pourrait me faire remarquer rapidement que je suis un boulet parce que je suis passé à côté de LA solution triviale, évidente, et idéale ?)

    Merci d'avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2009
    Messages
    529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2009
    Messages : 529
    Points : 836
    Points
    836
    Par défaut
    Salut,

    Comment le paramètre "Fuseau horaire" est il actuellement exploité dans le rapport: dans la requête SQL uniquement ou également dans des scripts birt? Si tu crées un Dynamic text dans le rapport avec l'expression ci dessous, il affiche le fuseau horaire sélectionné ou autre chose genre GMT?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Timezone="+reportContext.getTimeZone().getDisplayName();
    Au final le rapport est généré par le viewer Eclipse ou une appli java utilisant l'API birt?

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Version de birt : 4.3.0
    Birt est intégré dans une application Java, qui instancie le moteur Birt et lui fait passer le fuseau horaire, entre autres.
    Donc le rptdesign connaît bien le fuseau horaire, l'affiche, et s'en sert correctement pour le formatage des date-time.

    Le fuseau horaire est également passé dans la requête SQL pour indiquer à PostGres l'intervalle de recherche des mesures à afficher dans le rapport.

    Je ne peux pas faire le test de chez moi, je le ferai lundi, mais en théorie, le fuseau horaire est bien connu.

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2009
    Messages
    529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2009
    Messages : 529
    Points : 836
    Points
    836
    Par défaut
    ça dépend comment le fuseau horaire est transmis au rapport, car tu précises dans le premier post que c'est un paramètre d'entrée: Si il est juste transmis comme paramètre, birt ne peut pas l'utiliser de lui même.

    Il faut que l'appli java le transmette via la tache de génération du rapport:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IRunTask runTask;
    .....
    runTask.setTimeZone( tz );
    Par ailleurs si tu n'as pas besoin de l'heure, essaie de juste déclarer la colonne du dataset BIRT comme un type "Date" plutôt que "Datetime", le moteur tronque lui même ce qu'il y a après le jour, peut être qu'il utilise dans ce cas correctement le fuseau horaire.

    Sinon au pire il y a une solution en créant une colonne calculée, mais je ne pense pas qu'il soit nécessaire d'en arriver là

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Alors en fait, j'ai fait ton ton test, et Birt m'affiche effectivement un fuseau horaire en GMT.
    Pourtant dans notre instance Java, quand on crée la tâche, on passe bien le fuseau horaire.
    myTask.setTimeZone( com.ibm.icu.util.TimeZone.getTimeZone( idTimeZone ) );

    Donc je vais me pencher là-dessus. Peut-être que le groupe est fait avant de prendre en compte le fuseau horaire.
    Merci en tout cas pour la piste, je faisais naïvement confiance à Birt...

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bon, j'ai trouvé une solution, mais c'est laborieux.

    Alors déjà, je me suis aperçu que la tâche qu'on instancie avec un fuseau horaire chez nous est une IRenderTask et non pas une IRunTask : ça explique que le formatage de date par application de style fonctionnait bien, mais qu'au moment où je construisais mes groupes de données, on ne le connaissait pas.
    J'ai donc traqué l'endroit où on créait la IRuntask et je lui ai ajouté le fuseau horaire : depuis, ça va beaucoup mieux.

    Sinon pour le formatage des dates, je passe par une fonction javascript :

    function formaterDateGmtDansFuseauHoraire(date) {
    var myTimeZone = java.util.TimeZone.getTimeZone(reportContext.getTimeZone().getID());
    var mySdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
    mySdf.setTimeZone(myTimeZone);
    return mySdf.format(date.getTime());
    }

    Ça marche, c'est ce que je lui demande. Y'a sûrement plus élégant ou plus simple en passant par les fonctions natives de Birt. Si quelqu'un a une meilleure suggestion, je prends.

    Merci quoiqu'il en soit pour tes réponses, donino, ça m'a été bien utile.

    Edit : je mettrais volontiers mon sujet comme "Résolu", mais je n'ai pas accès au bouton "éditer" sur mon premier message
    Edit 2 : trouvé.

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

Discussions similaires

  1. [MySQL] Grouper les resultats par date
    Par isitien dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 30/09/2009, 11h12
  2. intervalle de date jour mois année
    Par mia_fr5 dans le forum SAS Base
    Réponses: 20
    Dernier message: 15/06/2009, 23h16
  3. Trier les données par date au format jour mois année...
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/08/2007, 11h41
  4. Réponses: 1
    Dernier message: 09/01/2007, 15h33
  5. [Dates] Jour Mois anné, heure minute et seconde...
    Par SangKou dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2005, 08h34

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