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