Oracle BI Publisher Tipp

Von Nullen, Nulls und Nichts

Autor

Rainer Willems

Version

10.1.3.3.3


Null, 0 oder Nichts

Die Dokumentation des BI Publishers gibt Aufschluß darüber, wie mit Nulls und nicht vorhandenen Werten in der XML-Datenquelle umgegangen wird. Ein Element kann:

Im Template kann man auf die verschiedenen Möglichkeiten reagieren

Ein Beispiel

Das ist relativ einfach, was passiert aber bei der Summierung von Werten? Hierfür werden wir im folgenden alle Möglichkeiten durchspielen. Als Datenquelle wählen wir die XML-Datei data.xml, welche folgende Struktur hat:



Als "Tabelle" dargestellt



erkennt man die verschiedenen Kombinationen
  • Attribut 1: Alle Elemente vorhanden und nicht Null
  • Attribut 2: Alle Elemente vorhanden; teilweise Null
  • Attribut 3: Alle Elemente vorhanden; nur 0 und Null
  • Attribut 4: Alle Elemente vorhanden; alle Werte Null
  • Attribut 5: nicht alle Elemente vorhanden; keine Nullen
  • Attribut 6: nicht alle Elemente vorhanden; teilweise Null
  • Attribut 7: nie vorhanden

Summen

Wenden wir nun auf alle Attribute die Summenfunktion <?sum(att x )?> an, erhalten wir folgende Ergebnisse:

Das Ergebnis stellt nicht zufrieden. Für Attribute, die Null-Werte enthalten, kann die Summe nicht errechnet werden (nach dem Motto: 1000 + Null = Null). Nicht vorhandene Elemente stören die Summenbildung hingegen nicht. Allerdings kann man dem Ergebnis 0 als Summe nicht vorhandener Werte (Attribut 7) kritisch gegenüberstehen. 0 ist ja ein Wert, der kleiner 1 ist. Das trifft für Null nicht zu. Sauberer wäre kein Ergebnis für diese Summe. Dies werden wir mit der folgenden Variante noch nicht in den Griff bekommen, aber zumindest die NaN-Werte eliminieren.
Wir ändern die Summenfunktion derart ab, dass die Null-Werte hierbei ignoriert werden: <?sum(attx[.!=''])?>


Jetzt bekommt man auch für die Attribute 2,3 und 6 die richtigen Summe. Für Attribut 4 trifft nun das gleiche wie für Attribut 7 zu.
Die Summenfunktion aus Xdoxslt ignoriert ebenfalls die Nullwerte, so dass mit <?xdoxslt:sum(attx)?> das gleiche Ergebnis erzielt worden wäre. Mit einer Ausnahme: auf Attribut 7 angewandt erzeugt diese Funktion einen Laufzeitfehler aufgrund der mangelnden Basis der Berechnung.

Versuchen wir der fragwürdigen Ergebnisse für die Attribute 4 und 7 mittels dem Zählen der Elemente Herr zu werden. Gibt es kein Element mit einem reellen Wert, soll es ja auch kein Ergebnis (bzw. Null als Ergebnis) geben. Erreichen können wir dies durch <?xdoxslt:ifelse(count(attx[.!=''])=0,'', sum(attx[.!='']))?>. Sollte die Anzahl der reellen Werte 0 sein, wird Null zurückgegeben, ansonsten die Summe aller Nicht-Nulls.


Jetzt haben wir das gewünschte Ergebnis für alle Attribute. Dies hätte man auch durch folgenden Ausdruck erreicht:  
<?if:count(attx[.!=''])>0?><?sum(attx[.!=''])?><?end if?> 

Beispieltemplate

Ein passendes Beispiel-Template für die XML-Datei mit den oben beschriebenen Varianten kann hier geladen werden.