Drukowanie raportów Jasper z Oracle Apex - część 2
Z tego tutoriala dowiesz się jak zintegrować Oracle Apex z serwerem raportów Jasper. Jeśli nie wiesz jak zainstalować i skonfigurować środowisko Jasper Reports, przeczytaj nasz wcześniejszy poradnik. Dowiesz się z niego które komponenty potrzebujesz i jak przygotować i udostępnić swój pierwszy raport.
Tworzenie strony w Oracle Apex
Najczęściej potrzeba jest następująca. W Apex przechodzimy do strony gdzie mamy przycisk "drukuj" lub "pobierz" po którego wciśnięciu możemy pobrać lub wyświetlić dokument. Przycisk powowoduje połączenie się danym adresem URL do którego wysyłamy dane logowania i dodatkowe parametry jak np numer faktury czy zakres czasowy raportu.
Nasz przycisk nazywać się będzie "generate_document". Po jego utworzeniu przejdź do zakładki "Processing" i utwórz nowy proces - "create process". Nadaj mu nazwę "call_jasper". Typ procesu to "PL/SQL Code". W sekcji "Server-side conditions" wybierz "When button pressed" i przycisk "generate_document".
Ważne: pamiętaj by we właściwościach strony, w sekcji "Advanced => Reload on Submit" ustawić "Always". Inaczej po wciśnięcku przycisku otrzymasz komunikat:
Error: SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
Tworzenie procedury PL SQL
Jasper Server udostępnia REST API, zbudować wiec musimy procedurę która połączy się z tym API - wyśle dane logowania, dodatkowe parametry i pobierze dokument. Proces autoryzacji jest oddzielony od pobierania dokumentu w Jasper Server REST API. Musimy wiec wykonać dwa zapytania. W pierwszym autoryzujemy się. W drugim pobieramy dokument.
Nasza procedura, która pobierze raport z kolekcji przykładowych raportów po zainstalowaniu Jasper Server wygląda następująco:
DECLARE
v_blob BLOB;
v_file_name VARCHAR2 (25) := 'Employees.pdf';
v_vcContentDisposition VARCHAR2 (25) := 'inline';
v_offer_id VARCHAR2(10) := :OFFER_ID; -- your offer ID
v_hostname VARCHAR2(30) := 'localhost'; -- your hostname, eg: localhost
v_port NUMBER := '8080'; -- port of JasperReports Server, eg: 8080
v_username VARCHAR2(50) := 'jasperadmin'; -- jasper server username
v_password VARCHAR2(50) := 'jasperadmin' -- jasper server password
v_jasper_string VARCHAR2(30) := v_username || ';' || v_password;
v_login_url VARCHAR2(100):=
'http://' || v_hostname || ':' || v_port || '/jasperserver/rest_v2/login';
-- modify URL to your needs
v_report_url VARCHAR2(100):=
'http://' || v_hostname || ':' || v_port || '/jasperserver/rest_v2/reports/analysis/reports/' || v_file_name;
BEGIN
-- log into jasper server
-- you can also use POST method and send j_username & j_password as headers
v_blob := apex_web_service.make_rest_request_b(
p_url => v_login_url,
p_http_method => 'GET',
p_parm_name => apex_util.string_to_table('j_username;j_password',';'),
p_parm_value => apex_util.string_to_table(v_jasper_string,';')
);
-- download file
v_blob := apex_web_service.make_rest_request_b(
p_url => v_report_url,
p_http_method => 'GET',
p_parm_name => apex_util.string_to_table('offer_id',';'),
p_parm_value => apex_util.string_to_table(v_offer_id,';')
);
--OWA_UTIL.mime_header ('application/pdf', FALSE); -- view your pdf file
OWA_UTIL.MIME_HEADER( 'application/octet', FALSE ); -- download your pdf file
HTP.p('Content-Length: ' || DBMS_LOB.GETLENGTH(v_blob));
HTP.p('Content-Disposition: ' || v_vcContentDisposition ||'; filename="' || v_file_name || '"');
OWA_UTIL.http_header_close;
WPG_DOCLOAD.DOWNLOAD_FILE(v_blob);
APEX_APPLICATION.STOP_APEX_ENGINE;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
Jeśli wprowadzisz tę procedurę (login i hasło oraz scieżka do testowego raportu zadziała z domyślnymi ustawieniami serwera po instalacji, zmień URL do właściwego) po zapisaniu zmian i kliknięciu na przycisk generujący dokument powinno wyskoczyć okno z pobieranym dokumentem.
Zauważ że procedura zawiera parametry dokumentu - "p_param_name". By pobrać raport "Employees.pdf" nie potrzebujesz tych parametrów. Użyj ich do własnych raportów.
Pobieranie dokumentu z servera Jasper w innym formacie
O formacie dokumentu który otrzymasz z serwera decyduje rozszerzenie raportu. Jeśli zmienisz nazwę z "Employees.pdf" na "Employees.xlsx", otrzymasz dokument Excela.