Oracle BI Publisher Tipp

Zusammenführen verschiedener Datenquellen im RTF-Template
unter Verwendung einer Variablen

Autor

Rainer Willems

Version

10.1.3.3.1


Einrichten mehrerer Datenquellen

In diesem Beispiel werden 2 Datenquellen in einen Bericht eingebunden, um diese später im Template zu verknüpfen.
Wir verwenden hier als erste Datenquelle ein File mit Abteilungsinformationen (siehe dept.xml).


Die Detailinformationen werden aus der Datenbanktabelle emp gezogen

Damit die Ergebnisse aus beiden Datenquellen für die Erzeugung der XML-Daten verwendet werden, muss das Main Data Set auf Concatenated SQL Data Source gesetzt werden.


Hierdurch entsteht eine XML-Struktur, die nacheinander die Daten aus den beiden Quellen aufführt (ohne dass zwischen diesen bereits eine Verbindung besteht. 


Zum Testen des Beispieles kann hier eine XML-Datei gezogen werden. Damit kann mit Hilfe des Template Builders in Winword getestet werden, ohne das auf dem Server die gezeigten Data Sets eingerichtet werden müssen.

Verknüpfung (Master-Detail) im RTF-Template

Die Verknüpfung der beiden unabhängigen Strukturen im XML-File kann nun im RTF-Template erfolgen. Hierbei werden wir eine 2 verschachtelte Schleifen aufbauen, um die beiden Strukuren als Master-detail zu verknüpfen. Folgendes RTF verwenden wir hierbei (Sie können das RTF hier ziehen). Einen guten Überblick über die verwendeten Befehle gibt der Field Browser, in welchem man auch direkt die verwendeten Hilfe-Texte der Form-Felder editieren kann


Der verwendete Code sieht wie folgt aus

//-- Durchlaufen die Struktur der Abteilungen
<?for-each:ROW?>
   //-- Merken des aktuellen Wertes des Feldes DEPTNO in der Variablen v_DEPTNO
   <?xdoxslt:set_variable($_XDOCTX,'v_DEPTNO',DEPTNO)?>
   //-- Ausgabe der Master-Information aus der ersten Datenquelle
   <?DEPTNO?>
   <?DNAME?>
   <?LOC?>
   //-- Durchlaufen die Struktur der Mitarbeiter aus der zweiten Datenquelle (Details)
   <?for-each://EMP_ROW?>
      //-- Vergleich der Abteilungsnummer des Mitarbeiters mit der gemerkten Nummer aus der "Abteilungsschleife"
      <?if:DEPTNO=xdoxslt:get_variable($_XDOCTX,'v_DEPTNO')?>
         //-- Ausgabe der Mitarbeiterinformationen, falls die Abteilungsnummer übereinstimmt
         <?ENAME?>
         <?JOB?>
         <?HIREDATE?>
      <?end if?>
   <?end for-each?>
<?end for-each?>
Das Ergebniss dieses Templates ist im folgenden zu sehen. Ein Master-Detail-Bericht über unterschiedliche Datenquellen!



Alternativ zu der Variante der Verwendung eines IF-Statements kann diese Bedingung auch direkt in die innere Schleife integriert werden. In dieser etwas eleganteren Variante sieht die Schleife dann wie folgt aus:

<?for-each://EMP_ROW[xdoxslt:get_variable($_XDOCTX, 'v_DEPTNO')=DEPTNO]?>

Als komplette Struktur (siehe Beispiel-RTF hier) ergibt sich dann:
//-- Durchlaufen die Struktur der Abteilungen
<?for-each:ROW?>
   //-- Merken des aktuellen Wertes des Feldes DEPTNO in der Variablen v_DEPTNO
   <?xdoxslt:set_variable($_XDOCTX,'v_DEPTNO',DEPTNO)?>
   //-- Ausgabe der Master-Information aus der ersten Datenquelle
   <?DEPTNO?>
   <?DNAME?>
   <?LOC?>
   //-- Durchlaufen die Struktur der Mitarbeiter aus der zweiten Datenquelle (Details) mit Bedingung
   <?for-each://EMP_ROW[xdoxslt:get_variable($_XDOCTX, 'v_DEPTNO')=DEPTNO]?>
      <?ENAME?>
      <?JOB?>
      <?HIREDATE?>
   <?end for-each?>
<?end for-each?>

Folgende Dateien zu diesem Beispiel stehen zum Download zur Verfügung: