Im FastReport erlaubt uns das Matrix-Objekt, Daten zu filtern. Das ist eine der am häufigsten nachgefragten Funktionen und viele Anwender sind damit sehr zufrieden. Es gibt jedoch Fälle, in denen die Filterung der Ausgangsdaten nicht geeignet ist.
Betrachten wir unten Matrix.
Wie Sie im obigen Beispiel sehen können, handelt es sich um eine Umsatzstatistik in der nach Mitarbeitern für 5 Jahre sortiert wird. Für den Mitarbeiter Steven Buchanan liegen keine Statistiken für 2011, 2012 und 2015 vor. Das bedeutet, dass, wenn wir die Matrix nach Jahr filtern und 2013 und 2014 ausschließen, Steven in der Matrix fehlt.
Um das Bild vollständig zu halten, müssen Sie alle Mitarbeiter berücksichtigen, auch wenn er in der Berichtsperiode keinen Umsatz hatte. In diesem Fall müssten Sie eine der Optionen verwenden:
1) die Rohdaten künstlich mit Nullwerten für jedes Jahr anreichern, in dem der Mitarbeiter keinen Umsatz hatte;
2) die bereits erstellte Matrix filtern, indem Sie unnötige Spalten entfernen.
In der Berichtvorlage:
Für die Zelle Year fügen wir das Ereignis "BeforePrint" hinzu:
Mit dem folgenden Code:
Hier haben wir Indizes von Spalten geschrieben, die wir löschen wollen. Erstellen wir nun einen ModifyResult- Ereignishandler für Matrix, um das bereits erstellte "Matrix"-Objekt zu bearbeiten:
private void Matrix1_ModifyResult(object sender, EventArgs e) { removeColumns.Reverse(); foreach (int del in removeColumns) { Matrix1.ResultTable.Columns.RemoveAt(del); } }
Da beim Löschen von Spalten oder Zeilen der Index aller folgenden verschoben wird, ist es notwendig, vom Ende her zu löschen - vom größten Index. Deshalb haben wir die Liste der zu löschenden Indizes in umgekehrter Reihenfolge mit der Methode Reverse() aufgebaut. Dann haben wir einfach die Spalten über die entsprechenden Indizes gelöscht. Schauen wir mal, was das Ergebnis ist:
Die Spalten für 2013 und 2014 fehlen in der Matrix, aber der Mitarbeiter Steven Buchanan bleibt erhalten. Der gewünschte Effekt wird erreicht! Außerdem können Sie überflüssige Zeilen mit einer anderen Sammlung - Matrix1.ResultTable.Rows - entfernen. Jetzt wissen Sie, wie Sie die Matrix filtern können, wenn die Datenfilterung nicht geeignet ist.