Jasper Reports Kreuztabelle Sortieren mit comparatorExpression
Ich versuche, mich zu Sortieren, meine dynamische Spalten in einer Kreuztabelle nach einigen benutzerdefinierten Schema.
In der Dokumentation fand ich die Erwähnung von comparatorExpression: Kreuztabelle Gruppe Eimer Komparator Ausdruck. Das Ergebnis dieses Ausdrucks ist
für die Sortierung der buckets in aufsteigender oder absteigender Reihenfolge. Wenn kein Komparator
Ausdruck angegeben ist, wird die Natürliche Ordnung verwendet werden.
aber ich verstehe nicht, was der Ausdruck Aussehen sollte. Kann ich irgendwie mit einem regulären java-Komparator? Kann jemand teilen ein Beispiel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe das gleiche Problem und fand keine Beispiele oder Erklärung, aber ich fand, wie es zu tun. Ich werde erklären, so dass hoffentlich andere Leute können diese Lösung verwenden.
Ich habe den code unten jasperreports 3.1.0 und iReport 3.1.4, aber ich denke, es funktioniert für so ziemlich alle Versionen.
Zuerst müssen Sie sicherstellen, dass Sie wissen, welche Klasse Sie haben in den Eimer Ausdruck für das Zeile/Spalte-Gruppe. Standardmäßig ist dies java.lang.String, aber ich habe eine eigene Klasse gibt. Für diese Arbeit brauchte ich, um das xml Bearbeiten, wie dies für meine Spalte Gruppe:
zu
Offensichtlich customObj Wert ist ein Feld mit der zugehörigen Klasse definiert, die im Bericht selbst.
Dann müssen Sie einen Comparator als parameter, beispielsweise:
Fügen Sie nun eine solche OVERRIDE_Comparator parameter in den jasperreport mit der java.util.Komparator-Parameter-Klasse.
Letzte Schritt: Setzen Sie $P{OVERRIDE_Comparator} als Komparator Ausdruck in der Zeile/Spalte Gruppe, die Sie benötigt.
Beim kompilieren einen Bericht, der wahrscheinlich kompilieren Fehler wäre casting-Probleme. Jasperreports standardmäßig auf java.lang.Zeichenfolge, die Sie möglicherweise Bearbeiten müssen, müssen Sie die xml der report manuell, um die richtige Klasse bei jedem Schritt.
(Ich fand heraus, diese Methode von einigen asiatischen Seite, zum Glück der code selbst lesbar! 🙂 )
Kann es viel einfacher und unkomplizierte Lösungen:
Ich bin mit Jasper Reports Studio (Eclipse-Plugin).
letztlich nicht für mich arbeiten 🙁 ... (siehe 1. Kommentar unter meiner Antwort - möglicherweise ein Fehler) kann man einfach prüfen [x] Daten Pre Sortiert in der Kreuztabelle Eigenschaften.
Natürlich funktioniert dies nur, wenn Sie nicht brauchen eine andere Bestellung woanders im Bericht, basierend auf die vor-sortierten Resultsets.
mit einem unsichtbar Kreuztabelle Gruppe header, das ist ziemlich tricky:
Row Group1
oder ähnliches ist für jetztTotal Position
zuNone
(wir wollen nicht zu haben, eine total-Spalte pro Zeile/Spalte generiert)name="invisible sort column ..."
wenn Sie mit Gruppensummen auf Ihre Gruppe (
Total Position
!=None
), dann müssen Sie im Grunde bewegen sich diese insgesamt Elemente/Einstellungen, um das erste dummy Art Gruppe, weil sonst die Summen, kein Summen mehr (= per 2. Gruppe Summen) angezeigt, nachdem jede Gruppe Zeile/Spalte, z.B. (hier nur gezeigt mit der group-Spalte, sondern Zeile Gruppe folgt dem gleichen Prinzip)einfachsten kann dies in der XML-ähnliche Veränderung (vergessen Sie nicht, bewegen Sie den
totalPosition=...
undcolumnTotalGroup=...
Parametern und zum ändern der Summe, wenn Sie für Ihre Szenario$V{SomeSum_..._ALL}
):=>
(kann übersprungen werden:) entfernen, die unnötig erzeugten
<crosstabCell ... column/rowTotalGroup="...">
Zellen$F{ORDER_FOR_X}
Value Class Name
zujava.lang.Integer
oder was auch immer passend für Ihre Werte hier (haben Sie einen Blick auf das dataset, welcher Typ ist dort zugewiesen, wenn Ihr es über einige Spalte)hinzufügen einige Variablen Ausdruck der
Order By Expression
von der ursprünglichen Gruppe, z.B.$V{ORDER_FOR_X}
$V{...}
ist der trick, verwenden Sie nicht$F{...}
!Bedeutung, wenn Sie einen gewissen Bereich, der definiert, die Art und beziehen sich auf das um-sich-sortiert-Spalte-Wert, z.B. (Oracle-SQL)
ansonsten kann man natürlich auch etwas anderes verwenden, auch hier
wenn Sie sollten Sie einige
können Sie einfach ändern Sie den Ausdruck
$V{ORDER_FOR_X} == null ? 0 : $V{ORDER_FOR_X}
sollte den trick tunset alle hohe/Breite Felder der dummy-Gruppe zu
0
und die text-FelderPrint When Expression
zufalse
mit einem , um von Basis auf Maß Summen (siehe unten link)
mit einem benutzerdefinierte Java-Comparator-Klasse (wie beschrieben in der Antwort von Pieter VN 2011-11-16)
weitere vielleicht hilfreiche links, die ich gefunden habe:
orderByExpression
Den Weg, um der Kreuztabelle die Spalten in der Regel ist durch die Verwendung der
orderByExpression
Integer
)orderByExpression
imbucket
comparatorExpression
Legen Sie eine Komparator (erstellen einer Klasse in java es.
MyCustomComparator
implementiertComparator
)Vergleichbar
Wenn Sie die Anzeige mit dem Wert aus dem eigenen Objekt (
$F{MyField}
ist ein Benutzer definiertes Objekt) können Sie einfach implementieren Vergleichbar zur Anzeige der Reihenfolge, wie Sie möchten.