Question

Je fais un peu de planification d'une application qui utilise le moteur OLAP Mondrian avec OLAP4J et devrait présenter / afficher des données à l'utilisateur. Je comprends tous les trucs arrière, mais je ne sais pas comment dois-je afficher les données dans la couche de vue.

Par exemple, OLAP4J a un formateur qui imprime bien la console.

Comment les données que j'obtiens de OLAP4J sont affichées dans la couche Affichage? Je viens de passer par l'API OLAP4J, et il ne semble pas y avoir rien pour obtenir le résultat dans une forme qui peut être en quelque sorte traitée et affichée. Ce processus fait-il partie de la solution de Pentaho? Donc, sinon, il n'est vraiment pas facile de présenter des données uniquement à partir du moteur Mondrian OLAP et de l'OLAP4J?

EDIT: J'ai l'habitude d'obtenir traditionnellement des données d'une base de données dans mon DTO et de les afficher en vue de vue. Mais comment créer des DTO pour un ensemble de résultats aussi compliqué?

Était-ce utile?

La solution

Vous pouvez créer votre propre calque de vue, c'est juste un peu délicat.

Olapstatement.ExecuteolapQuery () Renvoie un Plate-forme, vous devrez travailler avec ça. Lisez également le Caractéristiques, c'est une bonne source d'informations.

Voici un exemple, qui crée List<List<MyCell>> (Ce n'est pas la meilleure représentation mais il est facile de défaut comment cela fonctionne). Cela crée un tableau similaire à http://www.olap4j.org/api/index.html?org/olap4j/position.html (sans les étiquettes "genre" et "produit").

private final static int COLUMNS = 0; //see Cellset javadoc
private final static int ROWS= 1; //see Cellset javadoc
/**
* Outer list: rows, inner list: elements in a row
*/
private List<List<MyCell>> getListFromCellSet(CellSet cellSet) {
    List<List<MyCell>> toReturn= new ArrayList<List<MyCell>>();
    //Column header
    //See http://www.olap4j.org/api/index.html?org/olap4j/Position.html on how Position works, it helps a lot
    //Every position will be a column in the header
    for (Position pos : cellSet.getAxes().get(COLUMNS).getPositions()) {
        for (int i = 0; i < pos.getMembers().size(); i++) {
            if (toReturn.size() <= i) {
                toReturn.add(i, new ArrayList<MyCell>());
            }
            Member m = pos.getMembers().get(i);
            MyCell myCell = new MyCell(m); //use m.getCaption() for display
            toReturn.get(i).add(myCell );
        }
    }
    //Put empty elements to the beginning of the list, so there will be place for the rows header
    if (cellSet.getAxes().get(ROWS).getPositions().size() > 0) {
        for (int count=0; count < cellSet.getAxes().get(1).getPositions().get(0).getMembers().size(); count++) {
            for (int i = 0; i < toReturn.size(); i++) {
                toReturn.get(i).add(0, new MyCell());
            }
        }
    }
    //Content + row header
    for(int i = 0; i < cellSet.getAxes().get(ROWS).getPositionCount(); i++) {
        List<MyCell> row = new ArrayList<MyCell>();
        //Header
        for (org.olap4j.metadata.Member m : cellSet.getAxes().get(ROWS).getPositions().get(i).getMembers()) {
            row.add(new MyCell(m));
        }
        //Content
        for (int j = 0; j < cellSet.getAxes().get(COLUMNS).getPositionCount(); j++) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            list.add(j); //coordinte
            list.add(i); //coordinte
            row.add(new MyCell(cellSet.getCell(list))); //use cell.getFormattedValue() for display
        }
        toReturn.add(row);
    }
    return toReturn;
}

Créez la classe MyCell avec ces constructeurs:

public class MyCell {   
    ...
    public MyCell(){...}
    public MyCell(Member m){...}
    public MyCell(Cell c){...}  
}

N'oubliez pas d'afficher les filtres, utilisez CellSet.getFilteraxis () pour cela.

Vous pouvez également vérifier le Rectangulaire Formateur sur sourceforge, mais c'est un peu plus long.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top