Kopieren von Berichtsbänder in einen anderen mit allen Inhalten

2021-03-31

Manchmal ist es notwendig, Teile eines Berichts in einem anderen zu verwenden. In einfachen Fällen können Sie dazu die Berichtsvererbung verwenden.

Zum Beispiel eine Situation, in der alle Berichte gemeinsame Elemente (Firmenlogo, Signatur usw.) enthalten. Diese Objekte können dann in den übergeordneten Bericht aufgenommen werden, und wenn Sie untergeordnete Berichte erstellen, werden sie automatisch kopiert. Dadurch entfällt die Notwendigkeit, jedes Mal manuell zu kopieren, was die Erstellung neuer Berichte erheblich vereinfacht und beschleunigt. Wenn Sie im übergeordneten Bericht etwas ändern, werden diese Änderungen auch in allen untergeordneten Berichten angezeigt.

Doch die Berichtsvererbung hat eine Reihe von Einschränkungen. Es gibt Situationen, in denen ein Bericht ein "Elternteil" hatte und es notwendig war, einen völlig anderen Bericht als Elternteil zu erstellen. Es scheint, dass es ausreicht, die Eigenschaft BaseReport zu ändern, aber leider wird es nicht funktionieren.

Diese Aufgabe kann jedoch auf ungewöhnliche Weise gelöst werden, indem die Bänder eines Berichts aus dem Code durch die Bänder eines anderen ersetzt werden.

Angenommen es gibt einen Basisbericht (base.frx), seine Bänder müssen in den untergeordneten Bericht (child.frx) kopieren werden. Ersetzen Sie die Bänder PageHeader, PageFooter und DataBand mit dem Namen "Data1". Im Folgenden Codebeispiel wird davon ausgegangen, dass sich beide Berichte im Stammordner von Laufwerk C befinden.

Zuerst müssen Sie beide Berichte herunterladen:

Report base = new Report();
base.Load(@"C:\base.frx");
Report child = new Report();
child.Load(@"C:\child.frx");

Der nächste Schritt besteht darin, die Seiten aus beiden Berichten abzurufen. Es ist wichtig, die Seitennamen zu kennen.  Im folgenden Beispiel wird davon ausgegangen, dass der Seitenname in beiden Berichten "Page1" ist:

ReportPage basePage = base.FindObject("Page1") as ReportPage;
ReportPage childPage = child.FindObject("Page1") as ReportPage;

Wenn die Seitennamen nicht bekannt sind, können Sie sie nach Index abrufen. Als nächstes erhalten Sie beispielsweise Zugriff auf die ersten Seiten beider Berichte:

ReportPage basePage = baseReport.Pages[0] as ReportPage;
ReportPage childPage = childReport.Pages[0] as ReportPage;

Beide Optionen sind angemessen und führen zu demselben Ergebnis.

Jetzt können Sie PageHeader und PageFooter ersetzen. Hier ist alles einfach:

childPage.PageHeader = basePage.PageHeader;
childPage.PageFooter = basePage.PageFooter;

Mit diesen Zeilen werden zwei Bänder mit allen Eigenschaften und Einstellungen kopiert. Außerdem werden alle darauf befindlichen Objekte dupliziert, und die Eigenschaften werden nicht verloren.

Als nächstes ersetzen wir DataBand mit dem Namen "Data1":

DataBand baseBand = basePage.FindObject("Data1") as DataBand;
DataBand childBand = childPage.FindObject("Data1") as DataBand;
// sie müssen den Data1-Index im untergeordneten Bericht abrufen
int childBandIndex = childPage.Bands.IndexOf(childBand);
// es kann jetzt gelöscht werden
childPage.Bands.Remove(childBand);
// und ein Band aus dem Basisbericht an seine Stelle einfügen
childPage.Bands.Insert(bandIndex, baseBand);

Am Ende wurde das Band mit allen Eigenschaften und untergeordneten Objekten kopiert. Außerdem wurde die Bindung an die Datenquelle verschoben, für die die Eigenschaft DataSource verantwortlich ist. Ohne diese Bindung funktioniert das Band nicht richtig und gibt die Daten aus der Datenbank aus.

Es bleibt nur, die Datenquellen zu kopieren. Dies geschieht durch das folgende Code-Snippet:

for (int i = 0; i < baseReport.Dictionary.DataSources.Count; i++)
{
 childReport.Dictionary.DataSources.Add(baseReport.Dictionary.DataSources[i]);
}

Auf diese Weise wurden alle Datenquellen kopiert. Wenn das nicht notwendig ist, können Sie nur die benötigten Datenquellen klonen.

Das ist alles. Ein paar Dutzend Codezeilen ermöglichten es, Bänder und Objekte von einem Bericht in einen anderen zu kopieren. Wenn es viele Objekte auf den Bändern gibt, ist es ziemlich lang und routine, sie mit Hilfe des Designers zu duplizieren, und es ist noch länger, sie neu zu erstellen.

Wenn der Basisbericht nur die in diesem Beispiel kopierten Bänder enthält, kann diese Aufgabe natürlich noch einfacher durchgeführt werden - mit einem banalen Kopierer der Berichtsdatei. Im Ernstfall können Sie auf diese Weise eine oder mehrere Bänder aus einer Menge kopieren, wenn sie alle in einem neuen Bericht nicht benötigt werden. Oder Sie können den Seitentitel aus einem Bericht, ein Band mit Daten aus einem anderen Bericht und einen Seitenfußboden aus einem dritten Bericht nehmen.

20. November 2024

Lokalisierung und Ändern von Sprachen in FastReport VCL

FastReport VCL unterstützt 40 Sprachen für die Schnittstellenlokalisierung und ermöglicht es Ihnen, die Sprache im laufenden Betrieb über Menüs oder Code ohne Neukompilierung zu ändern.
1. November 2024

Neue Funktionen des FastReport VCL Berichtseditors

Wir betrachten die neuen Funktionen des Berichtseditors: Hilfslinien, Hervorhebung von sich schneidenden Objekten, aktualisierte Berichts- und Datenbäume.
30. Oktober 2024

Verwendung von Stilen beim Erstellen von Berichten in FastReport VCL

Dieser Artikel beschreibt eine der neuen Funktionen von FastReport VCL - die Verwendung von Stilen und Stilseiten.
Fast Reports
  • 800-985-8986 (Englisch, die USA)
  • +4930568373928 (Deutsch)
  • +55 19 98147-8148 (Portugiesisch)
  • info@fast-report.com
  • 66 Canal Center Plaza, Ste 505, Alexandria, VA 22314

© 1998-2024 Fast Reports Inc.