Die Aggregatfunktionen können nach der Datenquelle, ein Band, einer Gruppe oder einer Seite berechnet werden. Bei der Berechnung einer Aggregatfunktion nach der Seite kann das Ergebnis in bestimmten Fällen jedoch fehlerhaft sein. In diesem Artikel erläutern wir die Ursachen solcher Fehler und zeigen Lösungsansätze auf. Zur Vereinfachung beziehen wir uns in den folgenden Erklärungen ausschließlich auf die Funktion Summe (Sum) – die zugrundeliegende Logik gilt jedoch für alle Aggregatfunktionen.

Der Prozess der Summenbildung nach der Seite

Die Summierung von Werten pro Berichtseite erfolgt erst, nachdem der Bericht vollständig generiert wurde, sodass das Ergebnis in der Regel korrekt ist. Allerdings summiert die Bericht-Engine die Werte nicht aus den Textkomponenten, da diese üblicherweise bereits gerundeten Zahlen enthalten. Stattdessen durchsucht die Engine auf der Seite nach allen gerenderten Datenbändern. Jedes Datenband speichert die Position der Datenquelle zum Zeitpunkt seinem Rendern, und die Engine summiert exakt die Originalwerte aus der Datenquelle.

Warum Berechnungsfehler auftreten

Wenn die Eigenschaft CanBreak=false für ein Datenband gesetzt ist, wird jede Zeile des Datenbands als ein vollständiger Container gerendert, der nicht über mehrere Seiten umbrochen werden kann. Passt eine Zeile nicht auf die aktuelle Seite, wird sie vollständig auf die nächste Seite verschoben. In diesem Fall existiert jede Zeile des Datenbands nur einmal, und alle Berechnungen sind korrekt.

Wird hingegen die Eigenschaft CanBreak=true gesetzt, kann eine Zeile des Datenbands, die nicht vollständig auf die aktuelle Seite passt, in Teile aufgeteilt werden. Ein Teil des Bands bleibt auf der aktuellen Seite, während der andere auf die nächste Seite verschoben wird. Die Komponenten dieses Bands können – je nach Größe und Position – ebenfalls zwischen den Teilen aufgeteilt werden. Darüber hinaus können diese Komponenten selbst geteilt werden, sofern auch für sie die Eigenschaft CanBreak=true gesetzt ist.

Dies wirft die Frage auf: wenn ein Textfeld in mehrere Teile aufgeteilt wird, auf welcher Seite soll dessen Wert berücksichtigt werden?

Unser Team hat versucht, einen intelligenten Algorithmus zu entwickeln, um solche Fälle zu behandeln. Da unser Produkt jedoch die Erstellung von Berichten mit äußerst komplexen Strukturen ermöglicht, ist es schlichtweg unmöglich, alle Szenarien abzudecken. Daher wurde bereits vor längerer Zeit die Entscheidung getroffen, sich an folgende Regeln zu halten:

  • Wenn nach dem Aufteilen eines Bands mindestens eine Komponente im ersten Teil verbleibt (d. h. am unteren Rand der Seite), dann wird deren Wert nur auf dieser Seite berücksichtigt;
  • Wenn alle Komponenten des Bands an den Anfang der nächsten Seite verschoben werden, wird der Wert nur auf dieser nächsten Seite berücksichtigt.

In den meisten Fällen funktioniert dieser Ansatz korrekt.

Beispiel für ein Problem

Betrachten wir einen konkreten Fall, wie Werte aus Textkomponenten bei der Summierung nach der Seite gezählt werden.

Ausgangsbedingungen: die Datenbänder haben die Eigenschaft CanBreak=true was bedeutet, dass deren Inhalt aufgeteilt werden kann. Alle Textkomponenten im Band haben die Eigenschaft CanShrink=true. Das bedeutet, dass Textkomponenten ohne Daten ausblenden und eine Höhe von null haben.

Wenn das Band aufgeteilt wird, verbleiben diese leeren Textkomponenten auf der vorherigen Seite, während alle Komponenten mit Daten auf die nächste Seite verschoben werden. Dadurch ist der erste Teil des Bands nicht leer, und folglich wird der Wert dieses Bands nur auf der vorherigen Seite berücksichtigt.

Mögliche Lösungen

Der einfachste Weg ist CanBreak=falsе für Datenband setzen. Es kann das Problem mit dem Summierung-Fehler lösen und das Rendern vom Bericht beschleunigen.

Wenn es unmöglich ist, CanBreak zu verwenden, kann man für die Textkomponenten die Eigenschaft GrowToHeight=true setzen.

Im Allgemeinen wird empfohlen, beide Lösungen anzuwenden, da das Aktivieren von GrowToHeight ebenfalls dabei hilft, bestimmte Probleme bei späteren Exportvorgängen zu vermeiden.
By using this website, you agree to the use of cookies for analytics and personalized content. Cookies store useful information on your computer to help us improve efficiency and usability. For more information, please read the privacy policy and cookie policy.