Anstelle Template zu verwenden die manuell erstellt sind, könnte man versuchen das gesamte Layout dynamisch zu erzeugen. Das geht bei einigen mir bekannten Reportgeneratoren entweder indem man die Reportdefinitionsdatei per Code erzeugt, oder über ein Layout-
API.
Dann würde man nur noch ein Programm benötigen, das über diese
API die gewünschten Variationen der Reportlayouts erzeugt.
Mit diesem Programm würde man den Report dann aus Bausteinen zusammensetzen, die speziell dem geschäftlichen Feld angepasst sind.
Das Zusammenbauen kann hart kodiert im Code ablaufen:
Code:
Quartalsabrechnung := TQAbrechnung.Create;
Quartalsabrechnung.AddInfoBlock(...);
Quartalsabrechnung.AddWerbungsBlock(...);
QuartalsabrechnungLayout := Quartalsabrechnung.ErstelleLayout;
LayoutRepository.AddLayout(REPORT_QA, QuartalsabrechnungLayout);
An das generierte Layout werden dann alle Datensätze übergeben.
Code:
ReportGenerator := TRG.Create;
ReportGenerator.Layout := LayoutRepository.LoadLayout(REPORT_QA);
ReportGenerator.LoadDataSet(...);
ReportGenerator.CreateReport;
...
Manuelle Nachbearbeitung der generierten Layouts sollte dann nicht mehr stattfinden.
p.s. Auf jeden Fall würde ich vermeiden, zur Laufzeit des Reportgenerators noch Code mit Datenbankzugriff auszuführen. Eine Funktion, die innerhalb des Ausdrucks noch Lookupfelder in der Datenbank nachschlägt wäre ein No-Go. Für die saubere Trennung wäre es zum Beispiel möglich, die Daten als
XML Dokument bereitzustellen.