Jasper Rapports de tableau croisé tri avec comparatorExpression
Je suis en train de trier mes colonnes dynamiques dans un recoupement selon certains modèle personnalisé.
Dans les docs que j'ai trouvé la mention de comparatorExpression: tableau Croisé groupe seau comparateur expression. Le résultat de cette expression est
utilisé pour trier les seaux, dans l'ordre croissant ou décroissant. Si pas de comparateur
l'expression est spécifié, l'ordre naturel sera utilisé.
mais je ne comprends pas ce que l'expression devrait ressembler. Je peux en quelque sorte d'utiliser un java comparateur? Quelqu'un peut-il donner un exemple?
OriginalL'auteur JayL | 2010-02-22
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et n'a trouvé aucun exemple ou une explication, mais j'ai trouvé comment le faire. Je vais vous expliquer, donc j'espère que d'autres personnes peuvent utiliser cette solution.
J'ai utilisé le code ci-dessous pour jasperreports 3.1.0 et iReport 3.1.4, mais je suppose que cela fonctionne pour à peu près toutes les versions.
D'abord, vous aurez à vous assurer que vous savez qui est la classe dans le seau d'expression pour votre ligne/colonne groupe. Par défaut, cette valeur est de java.lang.La chaîne, mais j'ai une classe personnalisée. Pour que cela fonctionne, j'ai besoin de modifier le xml comme ceci pour mon groupe de colonnes:
à
Évidemment, ce customObj valeur est un champ de la classe correspondante, définies dans le rapport lui-même.
Alors vous aurez besoin d'ajouter un Comparateur comme un paramètre, par exemple:
Maintenant ajouter un OVERRIDE_Comparator paramètre dans la jasperreport, à l'aide de java.util.Comparateur De Paramètre De La Classe.
Dernière étape: Mettre $P{OVERRIDE_Comparator} comme le Comparateur Expression dans la ligne/colonne groupe dont vous avez besoin.
Lors de la compilation d'un tel rapport, le plus probable erreur de compilation serait casting questions. Jasperreports est par défaut de java.lang.Chaîne de caractères, vous pouvez avoir besoin de modifier le xml du rapport à la main pour obtenir la bonne classe à chaque étape.
(J'ai découvert cette méthode à partir de certains sites d'asie, heureusement, le code lui-même était lisible! 🙂 )
Au lieu de faire ma suggestion initiale à l'aide d'un paramètre, vous pouvez également créer une nouvelle classe qui implémente le Comparateur de méthodes et de les récupérer en utilisant un public static méthode getInstance (). C'est beaucoup plus facile que le paramètre de la méthode.
OriginalL'auteur Pieter VN
Il peut être beaucoup plus facile et simple des solutions:
Je suis à l'aide de Jasper Reports Studio (Plugin Eclipse).
n'a finalement pas fonctionné pour moi 🙁 ... (voir 1. commentaire ci-dessous ma réponse - peut-être un bug) vous ne pouvez vérifier [x] de Données Pré Triée dans le tableau Croisé Propriétés.
Bien sûr, cela ne fonctionne que si vous n'avez pas besoin d'une autre commande quelque part d'autre dans le rapport sur la base du pré-triés jeu de résultats.
à l'aide d'un invisible tableau croisé en-tête de groupe, ce qui est assez délicat:
Row Group1
ou similaires, comme l'est pour l'instantTotal Position
àNone
(nous ne voulons pas avoir une colonne total par ligne/colonne générée)name="invisible sort column ..."
si vous êtes en utilisant les totaux du groupe sur votre groupe (
Total Position
!=None
) ensuite, vous avez à en fait, ces totalisant éléments/paramètres de la première mannequin de tri groupe, parce que sinon, les totaux seront pas les totaux de plus (= par le 2e groupe de totaux) s'affiche après chaque groupe de colonnes ou de lignes, par exemple (ici affichés avec un groupe de colonnes, mais de groupe de lignes suit le même principe)plus facile peut-être de le faire dans le XML similaire à cette transformation (ne pas oublier de déplacer le
totalPosition=...
etcolumnTotalGroup=...
attributs et de modifier la somme applicable pour votre scénario$V{SomeSum_..._ALL}
):=>
(peut être ignorée:) supprimer inutilement généré
<crosstabCell ... column/rowTotalGroup="...">
cellules$F{ORDER_FOR_X}
Value Class Name
àjava.lang.Integer
ou ce que correspond à vos valeurs (avoir un coup d'oeil à votre jeu de données dont le type est attribué si vous êtes en utilisant, par l'intermédiaire de la colonne)ajouter certaines variables expression de la
Order By Expression
du groupe d'origine, par exemple$V{ORDER_FOR_X}
$V{...}
est le truc, ne pas utiliser de$F{...}
!de sens que si vous pouvez fournir un domaine qui définit le genre et se rapporte à votre être triés à la valeur de la colonne, par exemple (Oracle, SQL)
sinon, vous pouvez bien sûr utiliser quelque chose d'autre ici ainsi
si vous devriez obtenir certains
vous pouvez simplement modifier l'expression de
$V{ORDER_FOR_X} == null ? 0 : $V{ORDER_FOR_X}
qui devrait faire l'affaireensemble de toutes les hautes/largeur des champs du groupe factice à
0
et la champs de textePrint When Expression
àfalse
à l'aide d'un par ordre basé sur la mesure des totaux (comme décrit dans le lien en bas)
à l'aide d'un Java personnalisé Comparateur de classe (comme indiqué dans la réponse de Pieter VN 2011-11-16)
plus peut-être que des liens utiles que j'ai trouvé:
plus de détails pour solution 2. ce qui est plutôt bon bien que délicate
La Solution 2. fonctionne pour moi. Merci beaucoup!
Je me suis levé à point 8 - "l'éditeur dit que c'est nul, mais il va travailler." Le raport n'est pas compilling pour moi.
Solution 3 fonctionne pour moi. Je vous remercie.
OriginalL'auteur Andreas Dietrich
orderByExpression
La façon de commander des colonnes du tableau croisé est normalement à l'aide de la
orderByExpression
Integer
)orderByExpression
dans lebucket
comparatorExpression
Définir un Comparateur (créer une classe en java es.
MyCustomComparator
qui implémenteComparator
)Comparable
Si vous êtes l'affichage de la valeur de son propre objet (
$F{MyField}
est un objet défini par l'utilisateur), vous pouvez simplement mettre en œuvre Comparable pour afficher l'ordre que vous le souhaitez.OriginalL'auteur Petter Friberg