You are not logged in.
Hallo,
wie kann ein Report erstellt werden, der sich aus mehreren Datenbanken bedient?
Ideal wäre ein SQL-Statement, welches auf verschiedene Datenbanken wirkt.
Mir würde aber schon ein Beispiel/Best practice weiterhelfen, wie ich eine Datenquelle scripten kann, die per JDBC und SQL Daten aus den diversen Datenbanken abholt und in eine Tabelle überführt, welche ich dann als Datenquelle in Reports verwenden kann. Namendlich auch gern in dynamische Listen und Jasper-Reports.
Möglicherweise sind das ja auch Script-Datenquellen? ...ich stehe da etwas auf dem Schlauch.
Viele Grüße
Olaf
P.S.: ReportServer ist ein wirklich, wirklich sehr gutes Produkt. Ich bin beeindruckt. Good Job!
Offline
Hallo Olaf,
willkommen im ReportServer Forum.
Zunächst einmal würde ich bei einem solchen Problem immer versuchen, ob es nicht möglich ist, dieses eine Ebene tiefer, also auf der Datawarehouse Seite zu lösen. Wenn dem allerdings nicht so ist, bietet ReportServer einige Möglichkeiten, um einen solchen "Multiplattform Join" abzubilden. Im Grunde fallen die Möglichkeiten in drei Kategorien.
Jasper und Birt
Sowohl Jasper als auch Birt erlauben die Verwendung mehrerer Queries in einem Bericht. In Jasper muss hier pro Query ein Subreport angelegt werden. Eine Einschränkung hierbei ist, dass alle Queries auf der gleichen Datenbankverbindung ausgeführt werden müssen. Bei Birt kann direkt im Berichtsdesigner die Datenbankverbindung konfiguriert werden. Wenn in ReportServer für den Bericht keine Datenquelle ausgewählt wird, so werden die im Bericht definierten verwendet und so können dann auch Daten aus unterschiedlichen Datenbanken in einem Bericht genutzt werden.
Skript Berichte
Skript Berichte sind erlauben die Definition vom Berichten in Groovy und hier stehen somit jegliche Möglichkeiten offen Daten aus unterschiedlichen Datenquellen zusammenzuführen. Das folgende ist ein nicht wirklich cleveres Beispiel, dass Daten aus einer Datenbank mit Daten aus einer Webabfrage kombiniert. Da ich auf die schnelle keine vernünftige offene API gefunden habe, generiere ich hier vor allem kaputtes HTML, aber ich hoffe die Idee kommt herüber. Natürlich kann man so auch mehrere Connections öffnen etc.
import groovy.sql.Sql
import net.datenwerke.rs.core.service.datasourcemanager.DatasourceService
import net.datenwerke.dbpool.DbPoolService
/* pool service to obtain connection */
poolService = GLOBALS.getInstance(DbPoolService.class)
/* get datasource */
dsService = GLOBALS.getInstance(DatasourceService.class)
ds = dsService.getDatasourceByName("Demodaten")
/* get connection */
config = ds.getConnectionConfig()
connection = poolService.getConnection(config).get()
/* report buffer */
report = "";
try{
new Sql(connection).eachRow("SELECT CUS_CUSTOMERNAME FROM T_AGG_CUSTOMER LIMIT 5") { row ->
report += row.CUS_CUSTOMERNAME + "<br/>";
twitter = 'https://twitter.com/search?q=' + row.CUS_CUSTOMERNAME.toURL().text;
report += "<b>Twitter:</b> " + twitter;
report += '<hr/>';
}
} finally {
connection.close();
}
return report
Skript Datenquelle
Eine Skriptdatenquelle liefert immer eine Tabelle (ein Objekt vom Typ RSTableModel zurück). Eine Skriptdatenquelle kann dann wie eine relationale Datenquelle benutzt werden und kann z.B. von einer dynamischen Liste verarbeitet werden kann. Im folgenden ein ähnliches Beispiel, wie zuvor. Diesmal wird jedem Namen eine zufällige Zahl mitgegeben.
import groovy.sql.Sql
import net.datenwerke.rs.core.service.datasourcemanager.DatasourceService
import net.datenwerke.dbpool.DbPoolService
import net.datenwerke.rs.base.service.reportengines.table.output.object.*
td = new TableDefinition(['NAME', 'Zahl'], [String.class, Integer.class])
table = new RSTableModel(td)
/* pool service to obtain connection */
poolService = GLOBALS.getInstance(DbPoolService.class)
/* get datasource */
dsService = GLOBALS.getInstance(DatasourceService.class)
ds = dsService.getDatasourceByName("Demodaten")
/* get connection */
config = ds.getConnectionConfig()
connection = poolService.getConnection(config).get()
/* to obtain random numbers */
random = new Random()
try{
new Sql(connection).eachRow("SELECT CUS_CUSTOMERNAME FROM T_AGG_CUSTOMER") { row ->
table.addDataRow(row.CUS_CUSTOMERNAME, random.nextInt(1000))
}
} finally {
connection.close();
}
return table
Ich hoffe das hilft ein wenig weiter. Weitere Infos findest Du auch in den Guides.
Grüße
Arno
Offline
Hallo Arno,
beide Script-Varianten passen perfekt.
Die Script-Datenquelle scheint dabei genau das zu sein, was ich im Sinn hatte.
Vielen Dank,
Grüße
Olaf
Offline