OSBI.FR - Open Source Business Intelligence

Pentaho Reporting : paramétrer dynamiquement un chart

Dans Pentaho Report Designer, les Chart ne sont que peu paramétrables (enfin de façon simple j’entends…) : seul l’attribut « chart-title-field »  permet de définir le titre du graphique depuis une colonne du Data Set !

Voici 2 exemples pour illustrer :

  • comment paramétrer dynamiquement la couleur de fond d’un graphique (bgcolor) à partir d’un paramètre de rapport
  • comment ajuster dynamiquement les valeurs y-min et y-max du chart en fonction des données reçues

(Comme habituellement, je m’appuierai sur la base SampleData de Pentaho)

Tout d’abord je crée un Data Set de type « Table » qui permettra de sélectionner la couleur de fond choisie à partir du paramètre associé « param_color » :

chart-dyn-param_01

Ensuite je crée la requête SQL nécessaire au graphique, en ajoutant les colonnes PARAM_MAX et PARAM_MIN de manière à pouvoir les utiliser dans la configuration du graphique :

SELECT
     ORDERFACT.YEAR_ID,
     SUM(ORDERFACT.TOTALPRICE) AS TOTAL,
     PRODUCTS.PRODUCTLINE,    
     (SELECT MAX(total) FROM
            (SELECT    
                 SUM(ORDERFACT.TOTALPRICE) AS TOTAL
            FROM
                 PRODUCTS INNER JOIN ORDERFACT ON PRODUCTS.PRODUCTCODE = ORDERFACT.PRODUCTCODE
                 WHERE PRODUCTLINE=${param_productline}
            GROUP BY
                 ORDERFACT.YEAR_ID) rs_max) AS PARAM_MAX ,
     (SELECT MIN(total) FROM
            (SELECT    
                 SUM(ORDERFACT.TOTALPRICE) AS TOTAL
            FROM
                 PRODUCTS INNER JOIN ORDERFACT ON PRODUCTS.PRODUCTCODE = ORDERFACT.PRODUCTCODE
                 WHERE PRODUCTLINE=${param_productline}
            GROUP BY
                 ORDERFACT.YEAR_ID) rs_min) AS PARAM_MIN               
 
FROM
     PRODUCTS INNER JOIN ORDERFACT ON PRODUCTS.PRODUCTCODE = ORDERFACT.PRODUCTCODE
     WHERE PRODUCTLINE=${param_productline}
GROUP BY
     ORDERFACT.YEAR_ID,
     PRODUCTS.PRODUCTLINE

Ensuite, tout se passe dans un « Chart Post-Processing Script » de type « beanshell » (ça se configure dans le chart)

Il « suffit » de récupérer les champs nécessaires avec la méthode dataRow.get(<nom_du_champ>) puis de passer ceux-ci aux objets java de la librairie JFreeChart et le tour est joué !

// début du script
import org.jfree.chart.plot.CategoryPlot;
import java.awt.Color;
import org.jfree.chart.axis.ValueAxis;
 
CategoryPlot plot = chart.getCategoryPlot();
 
// Définition de la couleur de fond du chart
String couleur = dataRow.get("param_color");
 
    switch (couleur) {
    case "green":
    plot.setBackgroundPaint(Color.green);
    break;
 
    case "yellow":
    plot.setBackgroundPaint(Color.yellow);
    break;
 
    case "blue":
    plot.setBackgroundPaint(Color.blue);
    break;
 
    default:
    plot.setBackgroundPaint(Color.white);
}
 
plot.setDomainGridlinePaint(Color.gray);
plot.setRangeGridlinePaint(Color.gray);
 
// Ajustement dynamique y-max et y-min en fonction des données
 
  ValueAxis valueaxis = plot.getRangeAxis();
  valueaxis.setAutoRange(false);
 
  Double y_max = dataRow.get("PARAM_MAX");
  Double y_min = dataRow.get("PARAM_MIN");
  Double y_max_adjust = y_max + 0.1 * y_max;
  Double y_min_adjust = y_min - 0.2 * y_min;
 
  valueaxis.setRange(y_min_adjust, y_max_adjust);
 
// fin du script

Au final, on obtient un graphique dont la couleur de fond est paramétrable, ainsi que les valeurs y-max et y-min :

chart-dyn-param_02

Vous pouvez télécharger le rapport ici :

chart-dyn-param.prpt

Nota : si vous souhaitez passer directement les codes couleur en Hexadécimal, remplacer l’expression « switch » par le code java ci-dessous (attention : ne pas placer le # dans vos codes couleurs dans param_color)

int R =  (Integer.valueOf(couleur.substring(0, 2), 16)).intValue();
int G = (Integer.valueOf(couleur.substring(2,4), 16)).intValue();
int B = (Integer.valueOf(couleur.substring(4), 16)).intValue();
 
Color color = new Color(R, G, B);
plot.setBackgroundPaint(color);

1 Comment

Les commentaires sont fermés.