Tworzenie raportów XML Publisher przy użyciu Data Templates Wykorzystanie Szablonów Danych (ang. Data templates) jest to jedna z metod tworzenia raportów w technologii XML Publisher bez użycia narzędzia Oracle Reports (.rdf) w aplikacji OeBS. Z przeprowadzonych przeze mnie testów funkcjonalności mogę stwierdzić że technika ta jest elastyczna i daje duże możliwości techniczne tworzenia raportów. W wielu przypadkach bezproblemowo może zastąpić tworzenie raportów przy użyciu Oracle Reports a w przyszłości prawdopodobnie całkowicie zastąpić to narzędzie. Poniżej opisałem prawie wszystkie możliwości tego narzędzia. Oraz rozwiązanie typowych problemów programistycznych. 1. Co to jest Szablon danych (Data template / XML template)? Szablon Danych jest to plik XML składający się z odpowiednich sekcji przy pomocy którego możemy wygenerować pełną strukturę drzewa XML-owego. Zastępuje on nam plik *.rdf (Oracle Reports). Poniżej Przykład Kompletnego Szablonu danych / DATA_TEMPLATE: Jaki utworzyłem na potrzeby testów. Do pracy na plikach XML użyłem darmowego narzędzia Notepad++
Możemy wyspecyfikować 5 głównych sekcji w szablonie danych: 1. Definicja parametrów <parameters> </parameters> 2. Lexicals (Funkcjonalność podobna do user exit w Oracle Reports) <lexicals></lexicals> 3. Definicja wyzwalaczy <datatrigger></datatrigger> 4. Definicja zapytań SQL <dataquery><sqlstatement></sqlstatement></dataquery> 5. Definicja struktury danych. <datastructure><group> </group> </datastructure> Do każdego Szablonu danych możemy opcjonalnie podpiąć Pakiet PL/SQL w którym możemy zrobić obsługę wyzwalaczy oraz napisać dodatkowe funkcje / procedury, wykorzystywane w szablonie danych. Opis poszczególnych sekcji: 1. Definicja Szablonu danych: XXPT_XMLXDO <datatemplate name="xxpt_xmlxdo" description="xx: XMLP wykorzystanie użycia XDODTEXE" version="1.0" defaultpackage="xxpt_xmlxdo"> Atrybut defaultpackage jest opcjonalny defaultpackage="xxpt_xmlxdo". Szablon danych może korzystać tylko z zapytań SQL. Dodanie pakietu znacznie zwiększa elestyczność narzędzia. Do szablonu danych jest podpięty pakiet bazodanowy XXPT_XMLXDO. Nazwa pakietu bazodanowego może być dowolna. 2. Wyzwalacze <datatrigger name="beforepform" source="xxpt_xmlxdo.beforepform"/> <datatrigger name="beforereport" source="xxpt_xmlxdo.beforereport(:p_data_od, :p_data_do)"/> <datatrigger name="beforereport_2" source="xxpt_xmlxdo.beforereport_2"/> <datatrigger name="afterreport" source="xxpt_xmlxdo.afterreport"/> <datatrigger name="afterreport_2" source="xxpt_xmlxdo.afterreport_2"/> Sekcje wyzwalaczy są opcjonalne. Aby zdefiniować wyzwalacze należy zdefiniować atrybut defaultpackage w sekcji <datatemplate>. Wyzwalacze są mapowane na funkcje w pakiecie bazodanowym. Funkcje mapowane na wyzwalacze muszą być typu Boolean zwracać true/false. Nazwy funkcji w pakiecie bazodanowym mogą być dowolne ale najlepiej zachować logiczne znaczenie. Możemy logicznie zdefiniować wyzwalacza o typie: przed formularzem parametrów, przed raportem, po raporcie. /*Przed formularzem parametrów*/ function BeforePForm return boolean; /*BeforeReport*/ function BeforeReport ( p_data_od varchar2,p_data_do date ) return boolean; function BeforeReport_2 return boolean;
/*AfterReport*/ function AfterReport return boolean; function AfterReport_2 return boolean; Sekcje z definicją wyzwalaczy możemy umieścić tylko między głównymi sekcjami. 1. Sekcją definicji parametrów lub lexicals <parameters> </parameters><lexicals></lexicals> 2. Sekcją definicji zapytań <dataquery> 3. Sekcją definicji struktur danych <datastructure> Przy pomocy wyzwalaczy możemy np: 1. Zasilać tabele tymczasowe 2. Tworzyć zapytania dynamiczne: &sql_statement, &where_statement 3. Uruchamiać kolejne zlecenia współbieżne. 3. Parametry <!--Parametry raportu --> <parameters> <parameter name="p_data_od" datatype="character"/> <parameter name="p_data_do" datatype="date"/> <parameter name="p_test" datatype="character"/> </parameters> Parametry zdefiniowane w szablonie danych muszą zachować 100% zgodność z parametrami z programem współbieżnego. Chodzi tutaj głównie nie tylko o nazwę i typ danych ale również wielkość liter. Jeśli korzystamy z pakietu bazodanowego. Parametry muszą być zdefiniowane w nagłówku pakietu jako zmienne z zachowaniem zgodności nazw/typów. create or replace package XXPT_XMLXDO as p_data_od p_data_do p_test varchar2(32); date; varchar2(255); Dla przykładu Datę o typie FND_STANDARD_DATE raz mapuję na character a raz na date, w celu pokazania mechanizmów jej przetwarzania w szablonie RTF.
4. Zapytania SQL (Statyczne i Dynamiczne) Pierwsze zapytanie stworzone do obsługi parametrów. Należy zwrócić uwagę na obsługę daty. Parametry p_data_od, p_data_do. Raz przetwarzane jako character a raz jako date. Zapytanie Q_SQL_1 korzysta z tabeli tymczasowej zasilonej w wyzwalaczu. function BeforeReport( p_data_od varchar2,p_data_do date ) return boolean is begin /*Test komunikatu */ fnd_file.put_line(fnd_file.log, 'start XXPT_XMLXDO.BeforeReport: Wyzwalacz przed raportem. '); fnd_file.put_line(fnd_file.log, 'Parametry:'); fnd_file.put_line(fnd_file.log, 'p_data_od: ' p_data_od); fnd_file.put_line(fnd_file.log, 'p_data_do: ' p_data_do); /*Logika - insert to global temporary table XXPT_XMLXDO_SQL2 on commit delete rows; */ fnd_file.put_line(fnd_file.log, 'start XXPT_XMLXDO.BeforeReport: Ładowanie tabeli tymczasowej. '); insert into XXPT_XMLXDO_SQL1 Select rownum,round(dbms_random.value, 4) * 100,round(dbms_random.value(1000, 5000),2),dbms_random.string('A', 10),'Zapytanie SQL1' as HEADER_ID_SQL1 as amount1 as amount2 as text1 as text2
,'Test polskiej czcionki: ąęćśółżź' as text3,sysdate as date1,to_date(trunc(dbms_random.value(2452641,2452641+364)),'j') as date2 From dual connect by level <= 2; insert into XXPT_XMLXDO_SQL2 Select rownum as id_sql_2,decode(rownum, 1,1,2,1,2) as link_to_sql_1,round(dbms_random.value, 4) * 100 as amount1,round(dbms_random.value(10, 100),2) as amount2,'zapytanie SQL2' as text1,sysdate as date1,to_date(trunc(dbms_random.value(2452641,2452641+364)),'j') as date2 From dual connect by level <= 3; return true; end BeforeReport; Możemy generować dynamicznie SQLa oraz zagnieżdżać dane między sobą, tworzyć linki między zapytaniami Należy zwrócić uwagę na dynamicznie generowaną część SQL a: &g_dynamic_sql_select as text1, &g_dynamic_sql_where <![CDATA[ &g_whole_sql_statement ]]> Budowanie zależności poprzez odwoływanie się do kolumn z innych zapytań SQL: xsql2.text1 ': header_id_sql1 => ' :HEADER_ID_SQL1 as text1 From XXPT_XMLXDO_SQL2 xsql2 Where xsql2.link_to_sql_1 = :HEADER_ID_SQL1
Obsługa w wyzwalaczu: create or replace package XXPT_XMLXDO as g_lp number:=0; g_dynamic_sql_where varchar2(1200); g_dynamic_sql_select varchar2(1200); g_whole_sql_statement varchar2(1200);... create or replace package body XXPT_XMLXDO as function BeforeReport_2 return boolean is Begin /*Test komunikatu*/ fnd_file.put_line(fnd_file.log, 'start XXPT_XMLXDO.BeforeReport_2: Drugi Wyzwalacz przed raportem.'); /*Logika*/ g_dynamic_sql_where := ' and xsql2.id_sql_2 in(1,3)'; g_dynamic_sql_select := '''Test parametru dynamicznego'''; fnd_file.put_line(fnd_file.log, 'start XXPT_XMLXDO.BeforeReport_2: ' g_dynamic_sql_where); fnd_file.put_line(fnd_file.log, 'start XXPT_XMLXDO.BeforeReport_2: ' g_dynamic_sql_select); g_whole_sql_statement := 'Select ''TEST'' as XTEST from dual'; fnd_file.put_line(fnd_file.log, 'start XXPT_XMLXDO.BeforeReport_2: ' g_whole_sql_statement); return true; End BeforeReport_2; Podgląd w logu zlecenia:
5. Struktura Danych Strukturę danych w pliku XML, modelujemy w następujący sposób. Uwagi: 1. Jedno zapytanie SQL możemy wykorzystać w wielu grupach. 2. Możemy dowolnie zagnieżdżać grupy. 3. Możemy tworzyć wolne elementy / formuły oparte o funkcje PL/SQL <element name="cf_lp" datatype="number" value="xxpt_xmlxdo.cf_get_lp()"/> <element name="cf_name" datatype="varchar2" value="xxpt_xmlxdo.cf_nameformula()"/> /*Pozostałe funkcje*/ function cf_get_lp return number is Begin g_lp := nvl(g_lp,0) + 1; fnd_file.put_line(fnd_file.log, ' GET_LP: ' g_lp); return g_lp; End cf_get_lp;
function cf_nameformula return varchar2 is Begin return 'do it in pl/sql'; end cf_nameformula; Wygenerowany plik XML
2. Jak zarejestrować raport w aplikacji OeBS Aplikacja Oracle: 12.1.3 Każdy program współbieżny rejestrujemy z plikiem wykonywalnym: XDODTEXE (Program współbieżny Java). Format wyjścia zawsze XML. Parametry raportu:
XML Publisher Ponieważ logika formatowania liczb i dat przenosi się na plik RTF umieszczam instrukcję jak przetwarzać liczby i daty, nakładać maski oraz sumować. Plik: XXPT_XMLXDO.rtf XXPT_XMLXDO.rtf Wygenerowany plik PDF Plik: XXPT_XMLXDO.pdf XXPT_XMLXDO.pdf Koniec.