pondělí 25. ledna 2010

Formát numerických položek v BI Publisheru, nezávislých od nastavení Report Locale pro daného uživatele

Při návrhu sestav v BI Publisheru u našeho zákazníka jsme dostali požadavek na formátování numerických položek v sestavách – a to konkrétně na fixní použití oddělovačů řádů a desetinného místa (oddělovač řádů "mezera" a oddělovač desetinných míst "čárka") a to bez ohledu na nastavení uživatelských preferencí (Report Locale).

Samozřejmě BI Publisher umožňuje formátovat numerické položky, dokonce 2 způsoby - tak jak uvádí standardní BI Publisher dokumentace:
  • Microsoft Word's Native number format mask
  • Oracle's format-number function
V obou případech se pro oddělovače řádů/desetinných míst používá obecný „symbol“, který je pak při generování sestavy nahrazen skutečným znakem podle nastavení Report Locale (např. maska #,##0.00 v prvním případě nebo maska 999G999D99 v případě druhém).

Jak ale zajistit, aby byl použit vždy fixní znak pro oddělovače, nezávisle od nastavení locales?
Samozřejmě první metodou, která mě napadla je, provést konverzi numerických položek na řetězec již v rámci definice SQL dotazu pro datový zdroj sestavy v BI Publisheru za použití Oracle konverzní funkce TO_CHAR, kde mám „pod kontrolou“ i použití znaků oddělovačů u konvertovaného řetezce z čísla (TO_CHAR(SLOUPEC,'999G999D99', 'NLS_NUMERIC_CHARACTERS = '', ''') – kde první znak v parametru NLS_NUMERIC_CHARACTERS představuje oddělovač desetinného místa, druhý znak oddělovač řádů). Nevýhodou tohoto řešení je, že pokud takto již na úrovni SQL dotazu změníte datový typ sloupce z NUMBER na znakový, nemůžete v rámci definice templatu sestavy s touto položkou operovat jako s číslem a tím pádem provádět s touto položkou agregační operace (součty, subsoučty za skupiny), což je přesně to, co by nám při definici sestav chybělo.

Zapátral jsem tedy na všemocném Internetu a v rámci diskusního fóra pro BI Publisher na Oracle Technology Network jsem našel příspěvek, který se zdál, že náš problém řeší (http://forums.oracle.com/forums/thread.jspa?threadID=603514&tstart=0).

Po pár vyzkoušení metodou pokus-omyl jsme nakonec (použitím této metody) dospěli ke kýženému výsledku – jelikož má toto řešení určité aspekty, na které je potřeba si dát pozor, stručně toto řešení (i s upozorněním, co je potřeba si pohlídat) popíšu.

1. Nejprve je nutné v rámci templatu sestavy (např. hned na začátku templatu) následující xsl tag:

Definujete ho jako pole BI Publisheru , kde v kódu použijete definici xsl tagu :


2. Pro numerickou položku, na kterou chcete aplikovat formátování s použitím oddělovačů, definovaném v xsl tagu pak použijete následující kód :

Důležité při sestavování formátové masky je to, aby jste pro znaky oddělovačů řádů/desetinných míst uvedly stejné znaky, jaké jste definovali v rámci xsl tagu (a samozřejmě i název – CZK)

Výsledkem je pak kýžené použití oddělovačů, nezávislé od nastavení prostředí:



Michal Zima (BI&DWH Architekt, Teura s.r.o.)



Žádné komentáře: