2009-08-19 6 views
1

Je crée un rapport qui doit inclure une colonne 'estimation', basée sur des données qui ne sont pas disponibles dans l'ensemble de données.Affichage de données calculées avec des dépendances externes

Idéalement, je voudrais être en mesure de définir une interface Java

public int getEstimate(int foo_id, int bar_id, int quantity); 

foo_id, bar_id et quantity sont disponibles dans la ligne que je veux l'estimation présentée.

Il y aura plusieurs stratégies pour produire l'estimation, donc il serait bon d'utiliser une interface pour permettre leur échange en cas de besoin. En regardant les documents BIRT, je pense qu'il est possible que je devrais utiliser les mécanismes du gestionnaire d'événements, mais cela semble seulement permettre de définir une classe à utiliser et je voudrais d'une manière ou d'une autre injecter un estimateur configuré. Un exemple non obfusqué pourrait être de dire que j'ai un ensemble de données qui inclut une colonne d'adresse IP, et j'aimerais pouvoir utiliser un service GeoIP pour résoudre le pays à partir de l'adresse IP. Dans ce cas, j'ai une interface public String getCountryName(String address) et les implémentations réelles peuvent utiliser MaxMind, un cache local ou un autre système.

Comment ferais-je cela?

Ou ... serais-je mieux d'écrire une source de données scriptée qui peut intégrer les données calculées avant de les livrer à BIRT?

Ou ... une sorte de source de données scriptée qui est ensuite utilisée pour créer un ensemble de données de jointure?

Répondre

0

Je pense qu'une source de données par script fonctionnerait correctement, mais un gestionnaire d'événements Java serait plus simple. Vous pouvez l'implémenter comme un simple POJO et accéder à tous les objets et outils complexes qui vous permettront de calculer votre estimation. La solution la plus simple de toutes peut simplement ajouter un champ calculé à l'ensemble de données. Lors de la création du champ calculé, la logique de script peut être assez complexe pour générer la valeur résultante. La chose la plus intéressante à propos de cette route est que toutes les autres valeurs de colonne de la ligne (que je suppose que vous devez calculer l'estimation) sont disponibles via l'éditeur d'expression. Vous pouvez insérer des objets complexes (POJO) pour faciliter vos calculs ici en utilisant l'objet "Packages" (par exemple,)

Si vous voulez créer la classe Event Handler, voici ce que je ferais. Je voudrais créer un objet texte et lier l'onCreate même à votre POJO (en étendant le TextItemEventAdapter) et remplacer la méthode "onCreate". Là vous pouvez faire n'importe quel travail que vous voulez et à la fin appelez simplement 'text.setText(theEstimateResult);' pour rendre l'estimation elle-même visible. En ce qui concerne l'accès aux valeurs de données pour faire vos calculs, vous pouvez aussi accéder à ceux dans le POJO. Je suppose que l'estimation fera partie d'une plus grande table de valeurs. Vous pouvez accéder à n'importe quelle valeur de ligne spécifique via le reportContext.

Ce sont les deux idées que je voudrais essayer d'abord. La colonne calculée est la plus rapide à implémenter et la moins susceptible de vous jeter une courbe lors du déploiement. Faites-moi savoir de quelle manière vous choisissez et nous pourrons en faire un peu plus si nécessaire.

+0

J'essaie de voir comment, dans votre exemple, l'instance de redwood.HelloWord pourrait avoir des propriétés préconfigurées ne provenant pas du script BIRT. Par exemple, mon contexte Spring, dans lequel j'essaie d'exécuter BIRT, peut avoir une implémentation d'interface de service que mon estimateur doit utiliser.L'instanciation de HelloWorld signifie directement qu'elle doit être configurée. Peut-être que j'ai besoin de regarder Spring AOP pour injecter dynamiquement, mais je soupçonne que le bit BIRT OSGI pourrait gêner. Les gestionnaires d'événements ont l'air sympa mais je ne sais pas comment obtenir une référence à une instance préexistante, externe à birt. – ptomli

+0

Dans l'exemple de gestionnaire d'événements, si vous devez récupérer une instance préexistante de quelque chose (et que vous exécutez dans la même machine virtuelle), vous avez probablement besoin de ce "quelque chose" pour implémenter le modèle Singleton. Un constructeur privé et une méthode publique "getInstance()". Cela vous permettra de l'attraper facilement au POJO. – MystikSpiral

+0

OK, je vais essayer quelques variantes et voir ce qui tombe. Je pense qu'une source de données fournirait de meilleurs mécanismes de contrôle au sein de Spring (je peux injecter une instance, en évitant Singleton) bien que le gestionnaire d'événements ait une bonne «sensation» (classes spécifiques à des fins spécifiques). Merci – ptomli

Questions connexes