PDF-Reporting mit PL/SQL Daniel Dymala DOAG Regionaltreffen Hamburg/Nord 16. September 2014 Einleitung Worum geht es • Einblick ins Reporting Management des Private Bankings • Das PDF-Reporting Tool PL/PDF • Spezielle Anforderungen und deren Umsetzung mit Hilfe von PL/SQL und PL/PDF Worum geht es NICHT • Evaluierung von PDF-Tools in Verwendung mit der Oracle Datenbank • Einführung in PL/PDF (“Hello World”-Beispiele auf plpdf.com vorhanden) 2 16.09.2014 PDF-Reporting mit PL/SQL Einblick ins Reporting Management des Private Bankings Allgemein 3 • Reporting Modul ist komplett integriert ins Portfolio Management Systems • Wird von Kundenberatern, von externen Vermögensverwaltern aber auch von Kunden für einmalige Reportanfragen verwendet • Stellt alle relevanten Kundenreportings (sogenannte Vermögensausweise) durch Reportpläne bereit • Einfache und schnelle Anwendung durch vordefinierte Standardreportings • Aufgrund hoher Kundenanforderungen sehr flexibel ausgerichtet durch Verwendung beliebig individueller Reportings 16.09.2014 PDF-Reporting mit PL/SQL 4 16.09.2014 PDF-Reporting mit PL/SQL – Beispiel Vermögensausweis 5 16.09.2014 PDF-Reporting mit PL/SQL – Beispiel Vermögensausweis 6 16.09.2014 PDF-Reporting mit PL/SQL – Beispiel Vermögensausweis 7 16.09.2014 PDF-Reporting mit PL/SQL – Beispiel Vermögensausweis 8 16.09.2014 PDF-Reporting mit PL/SQL 9 16.09.2014 PDF-Reporting mit PL/SQL – Beispiel Vermögensausweis Einblick ins Reporting Management des Private Bankings Konfiguration, Ausführung und Bereitstellung von Reportings 10 16.09.2014 PDF-Reporting mit PL/SQL Einblick ins Reporting Management des Private Bankings Beispiel für einen Reportplan 11 16.09.2014 PDF-Reporting mit PL/SQL Einblick ins Reporting Management des Private Bankings Reportliste (mit Reportauftrag aus Reportplan) 12 16.09.2014 PDF-Reporting mit PL/SQL Einblick ins Reporting Management des Private Bankings Reporting Engine • Verteilung von Reportaufträgen und Zuweisung genau eines Reportsets (=1 PDF) zu einem Prozess der Reporting Engine. • Die Reportsets werden zerlegt und die darin enthaltenden Reportbausteine (=1-N Seiten Daten und Layout innerhalb des gesamten PDFs vom Reportset) einzeln abgerufen. • Priorisierung von Reportaufträgen und Steuerung der Auslastung (interne/externe Reports, Reportpläne (Batch)) • Kontinuierliche Sammlung von Performance-Daten zur späteren Analyse 13 16.09.2014 PDF-Reporting mit PL/SQL Einblick ins Reporting Management des Private Bankings Reporting Statistik und Benchmark • Die ermittelten Performance-Daten zu jedem einzelnen Report innerhalb eines Reportauftrags werden aggregiert und vor der Löschung der Reportaufträge persistiert. • Regelmäßige Auswertung der Statistikdaten und Früherkennung von Veränderungen (Laufzeit) bezogen auf Datenaufbereiten (SQL) Erstellung PDF (verwendete Version der DB Methoden) Zeitspanne der enthaltenen Charts (Response-Request Time) • Implementierung eines sinnvollen (automatischen) Benchmarks zur regelmäßigen Überprüfung von Spitzenauslastungen (z.B. das Reporting vieler Kunden zu einem ULTIMO) • Bereitstellung von Referenz-Reportsets 14 16.09.2014 PDF-Reporting mit PL/SQL Das PDF-Reporting Tool PL/PDF PL/PDF (http://www.plpdf.com) Erstellung von PDF Dokumenten inkl. Verwendung von Software Development Kit (SDK) TrueType Schriften. Unterstützung von PDF/A (ISO), digitaler Signatur, Barcodes und Grafiken (PNG bzw. JPG). Erzeugung von einfachen Charts. Änderung von PDF Metadaten. Extrahierung von einzelnen PDF-Seiten. Toolkit Zusammenfügen von PDFs (Merge). Digitale Signatur und Wasserzeichen. Komprimierung von PDFs. Ermittlung der Anzahl von Seiten von PDFs. 15 16.09.2014 PDF-Reporting mit PL/SQL Das PDF-Reporting Tool PL/PDF Vorteile • Wird in der Oracle Datenbank installiert (kein weiterer Server) • Direkt via PL/SQL ansprechbar • • Einbindung von externen Grafiken möglich Überdurchschnittlich guter Support, teilweise sogar Umsetzung von Kundenwünschen bereits im nächsten Release • Gutes Preis-/Leistungsverhältnis Aber es gibt ggfs. auch Nachteile … • Keine Skalierung von Haus aus und wenn, dann nur durch weiteren Datenbankserver möglich • Ohne PL/SQL geht nichts (kein WYSIWYG-Editor) • Kann nur einfache Grafiken/Charts erstellen 16 16.09.2014 PDF-Reporting mit PL/SQL Das PDF-Reporting Tool PL/PDF Und so einfach geht es los … CREATE OR REPLACE FUNCTION GET_PDF(IN_TEXT IN VARCHAR2) RETURN BLOB IS l_pdf BLOB; BEGIN REPORT.PLPDF.Init; REPORT.PLPDF.NewPage; REPORT.PLPDF.SetPrintFont( p_family => 'Arial', p_style => NULL, p_size => 12); REPORT.PLPDF.PrintText(p_x => 10,p_y => 10, p_txt => IN_TEXT); REPORT.PLPDF.SendDoc(p_blob => l_pdf); RETURN l_pdf; END; / SELECT GET_PDF('Herzlich Willkommen bei Berenberg') PDF FROM DUAL; 17 16.09.2014 PDF-Reporting mit PL/SQL Zusammenführen einzelner PDFs (Merge) Variante 1 (optimal für 2 oder wenige PDFs) DECLARE l_pdf_1 BLOB; l_pdf_2 BLOB; l_pdf_merge BLOB; BEGIN l_pdf_1 := < pdf zuweisen >; l_pdf_2 := < pdf zuweisen >; l_pdf_merge := PLPDF_TOOLKIT.Merge( P_INPUTFILE1 => l_pdf_1, P_INPUTFILE2 => l_pdf_2); < l_pdf_merge z.B. INSERT INTO oder Return oder … > END; / 18 16.09.2014 PDF-Reporting mit PL/SQL Zusammenführen einzelner PDFs (Merge) Variante 2 (geeignet für viele PDFs) DECLARE l_pdf_merge BLOB; -- eindeutige transaktionsnr. fuer den merge-auftrag l_id NUMBER := SYS_CONTEXT('USERENV','SID'); BEGIN INSERT INTO PLPDF_TK_MERGE_INPUTS (TR_ID, ORDER_NUM,INPUTFILE) SELECT l_id, ROWNUM, PDF FROM MYREPORTS; l_pdf_merge := PLPDF_TOOLKIT.MergeX( P_TR_ID => l_id, -P_FONT => NULL, P_FONTSIZE => NULL); -- bereitgestellte daten wieder entfernen DELETE FROM PLPDF_TK_MERGE_INPUTS WHERE TR_ID = l_id; < l_pdf_merge z.B. INSERT INTO oder Return oder … > END; / 19 16.09.2014 PDF-Reporting mit PL/SQL Inhaltsverzeichnis mit variablen Seitenzahlen Numerierung starten und Inhaltsverzeichnis befüllen -- z.B. erst nach dem Deckblatt die Numerierung bei 1 beginnen lassen REPORT.PLPDF.SetPageNoStart; -- die aktuelle Seitenzahl merkt sich PL/PDF gleich mit REPORT.PLPDF.AddTOCItem(P_TXT => ‘<Reportüberschrift>‘); Inhaltsverzeichnis auslesen und an den Anfang schieben t_tocs PLPDF_TYPE.T_TOC; t_tocs := PLPDF.GetTOCItems; PLPDF.PrintCell( P_W => 120, P_H => 10, P_TXT => RPAD(t_tocs(r_tocs).TEXT, 200,'.'), P_LINK => t_tocs(r_tocs).LINK_ID); PLPDF.InsertMovePage( P_NEW_POS => 1, -- an den anfang, sofern ohne Deckblatt P_ORIG_POS => PLPDF.CurrentPagenumber); 20 16.09.2014 PDF-Reporting mit PL/SQL Parallelisierung der Reporting Engine Scheduler Jobs für die Reporting Engine • Temporärer Hintergrundprozess für jede einzelne Reportanfrage bzw. für N Reportaufträgen aus Reportplänen. • Beendet sich, wenn keine weiteren Reportaufträge mehr vorhanden sind. • Permanent laufender Hintergrundprozess als Sicherheit im Falle eines DB Reboots. Interval dabei nicht zu gering wählen, damit keine ständige CPU-Last entsteht. 21 16.09.2014 PDF-Reporting mit PL/SQL IHRE ANSPRECHPARTNER Andriy Terletskyy Daniel Dymala Abteilungsdirektor DB-Entwicklung Wertpapier IT/Organisation +49 40 350 60-219 [email protected] Oracle Consultant (extern) IT/Organisation +49 40 350 60-8057 [email protected] Joh. Berenberg, Gossler & Co. KG Neuer Jungfernstieg 20 20354 Hamburg 22 16.09.2014 PDF-Reporting mit PL/SQL