An ADF Special Report

49
A SPECIAL REPORT Reporting solutions for ADF Applications Luc Bors Oracle Certified ADF Implementation Specialist AMIS Services, The Netherlands Oracle ADF Specialized Partner Monday, June 25, 2012 ODTUG KScope 12 San Antonio, Texas, USA

description

Oracle ADF is a very powerful framework for building enterprise applications. The framework, however, has no built-in solutions for reporting. In this session, you will learn how to fill this gap by using open source reporting solutions and solutions provided by Oracle.

Transcript of An ADF Special Report

A SPECIAL REPORTReporting solutions for ADF Applications

Luc BorsOracle Certified ADF Implementation Specialist

AMIS Services, The NetherlandsOracle ADF Specialized Partner

Monday, June 25, 2012 ODTUG KScope 12San Antonio, Texas, USA

REPORTING

Information

Insight

Paperwork

I USE ADF, WHAT ABOUT REPORTS ?

I’ve used Reports in Forms

Where to Start ADF Reporting ?

ORACLE REPORTS DEVELOPER

CREATING ORACLE REPORTS

• Example:

– Employees per Department Report

– Parameter P_DEPARTMENT_ID

HOW TO CALL THE REPORT ?

Report name Report server

Destination type and Format

User IdOther

USING ORACLE REPORTS

• Use Case : Invoke the report for the currently selected Department in an ADF table

PREPARING THE CALL

• Create a bean and method to invoke the report

• Provide report parameters

String oraReportServerUrl = "http://192.168.2.8:8889/reports/rwservlet?"; String reportNameParam ="report="; String reportDestypeParam = "destype="; String reportPDesformatParam = "desformat="; String reportUseridParam = "userid=“;

<managed-bean id="__13"> <managed-bean-name id="__14">oracleReportBean</managed-bean-name> <managed-bean-class id="__15"> com.blogspot.lucbors.reporting.view.orarep.OracleReportBean </managed-bean-class> <managed-bean-scope id="__16">request</managed-bean-scope> </managed-bean>

CONSTRUCTING THE CALL

• Construct Report Server URL; Including the parameters public void runOracleReport(ActionEvent actionEvent) {

String departmentParam = "p_department_id="; StringBuffer totalCallUrl = new StringBuffer(); totalCallUrl.append(getOraReportServerUrl()); totalCallUrl.append(getReportNameParam().concat("employees.rdf")+"&"); totalCallUrl.append(getReportDestypeParam().concat("cache")+"&"); totalCallUrl.append(getReportPDesformatParam().concat("html")+"&"); totalCallUrl.append(getReportUseridParam().concat("hr/hr@xe")+"&"); totalCallUrl.append(departmentParam.concat(getDepartmentId())); setOraReportUrl(totalCallUrl.toString());}

public String getDepartmentId() { DCIteratorBinding it = ADFUtils.findIterator("SalaryOverview1Iterator"); oracle.jbo.domain.Number deptId = (oracle.jbo.domain.Number)it.getCurrentRow().getAttribute("DepartmentId"); return deptId.toString(); }

CALL AND SHOW THE REPORT

• Call ………

• ……. And Show the report

<af:popup id="showOraRpt" animate="default"> <af:panelWindow id="pw3" modal="true" title="External Internet Info in a Modal Popup" contentHeight="625" contentWidth="700" resize="on"> <af:inlineFrame id="if3" shortDesc="This is an inline frame" source="#{oracleReportBean.oraReportUrl}" styleClass="AFStretchWidth" inlineStyle="height:600px;"> </af:inlineFrame></af:panelWindow>

<af:commandToolbarButton text="Run Oracle Report" id="cb3“ actionListener="#{oracleReportBean.runOracleReport}"> <af:showPopupBehavior popupId=":::showOraRpt" triggerType="click"/></af:commandToolbarButton>

SHOWING THE ORACLE REPORT

• ….. and the result…..

CAN I USE FMW REPORTING TOOLS ?

I don’t want to use Reports

Now w

hat ?

FMW Reports ?

ORACLE BI PUBLISHER

ORACLE BI PUBLISHER

ORACLE BI PUBLISHER

ORACLE BI PUBLISHER

PREPARING THE CALL

• Create a bean and method to invoke the report

• Provide report parameters

private static final String RAPPORT_SERVER_HOST_PARAM = "http://192.168.56.101:7001/xmlpserver/~weblogic/"; private static final String RAPPORT_GENERAL_USER_PARAM = "<UN>";private static final String RAPPORT_GENERAL_PASSWORD_PARAM = "<PW>";

<managed-bean id="__13"> <managed-bean-name id="__14">biPublisherBean</managed-bean-name> <managed-bean-class id="__15"> com.blogspot.lucbors.reporting.view.orarep.BiPublisherBean </managed-bean-class> <managed-bean-scope id="__16">request</managed-bean-scope> </managed-bean>

CONSTRUCTING THE CALL

• Construct Report Server URL; Including the parameters

public void startBiReport(ActionEvent event) { StringBuffer reportUrl = new StringBuffer(); reportUrl.append(getRapportServerHost()); reportUrl.append("/"+"EmployeesPerDepartment"+".xdo"); // add standard params addStandardParams(rapport,reportUrl); // add report-specific params addReportParams(rapport, reportUrl); sLog.fine("Rapport start URL: "+reportUrl); setReportUrl(reportUrl.toString());……..

CALL AND SHOW THE REPORT

• Call ………

• ……. And Show the report

<af:popup id="showBiRpt" animate="default"> <af:panelWindow id="pw3" modal="true" title="External Internet Info in a Modal Popup" contentHeight="625" contentWidth="700" resize="on"> <af:inlineFrame id="if3" shortDesc="This is an inline frame" source="#{<…BI report source>}" styleClass="AFStretchWidth" inlineStyle="height:600px;"> </af:inlineFrame></af:panelWindow>

<af:commandToolbarButton text="Run BI Publisher Report" id="cb3“ actionListener="#{oracleReportBean.startBiReport}"> <af:showPopupBehavior popupId=":::showBiRpt" triggerType="click"/></af:commandToolbarButton>

SHOWING THE BI PUBLISHER REPORT

ARE THERE OPEN SOURCE TOOLS ?

Hmm… pretty complex ….

Expe

nsiv

e ?

Hard to manage ?

JASPER REPORTS

JASPER REPORTS - IREPORT

JASPER REPORT QUERY

CREATING JASPER REPORTS

• Jasper iReport as design tool– Select a report template– Create a new report based on a query

– Add parameters– Test report in iReport

PREPARING JDEVELOPER AND ADF

• Make sure to add Jasper libraries to ADF project

PREPARING THE CALL

• Create a bean and method to invoke the report

<managed-bean id="__13"> <managed-bean-name id="__14">jasperReportBean</managed-bean-name> <managed-bean-class id="__15"> com.blogspot.lucbors.reporting.view.orarep.JasperReportBean </managed-bean-class> <managed-bean-scope id="__16">request</managed-bean-scope> </managed-bean>

CALLING THE JASPER REPORT

• How to invoke the Jasper report ?– Get a handle to your template

– Define the file that will hold the generated report

– Optionally fill parameters

InputStream is = new FileInputStream ( new File("C:/ReportingTools/myReports/MyFirstReport.jrxml"));

OutputStream os=new FileOutputStream( new File(this.filepath+this.reportname));

Map parameters = new HashMap(); parameters.put("P_DEPARTMENT_ID", getDepartmentId());

CALL AND SHOW THE REPORT

• Call ………

<af:commandToolbarButton text="Run Oracle Report" id="cb3“ actionListener="#{oracleReportBean.runOracleReport}"> <af:showPopupBehavior popupId=":::showOraRpt" triggerType="click"/></af:commandToolbarButton>

JASPER REPORTING

• Invoke the report ………

• ……. And Show the result

JasperDesign jasperDesign = JRXmlLoader.load(is);JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);

JasperExportManager.exportReportToPdfStream(jasperPrint, os);

JasperViewer.viewReport(jasperPrint, false);

JASPER REPORTING

• ….. And the result….

I DONT WANT MY OWN REPORTSERVER

REPORTING FROM THE CLOUD

DOCMOSIS REPORTING

Web standards

SOAP and RESTXML and JSON

Powered by AWS

CREATING TEMPLATES

UPLOAD TO THE CLOUD

CALLING THE CLOUD FROM ADF

• Setup a connection

• Build the request

• Write request to outputstream

PREPARING THE CALL

• Create a bean and method to invoke the report

• Provide report parameters

private static final String DWS_RENDER_URL = "https://dws.docmosis.com/services/rs/render";private static final String ACCESS_KEY = “<your acces key>";private static final String OUTPUT_FORMAT = "pdf";private static final String OUTPUT_FILE = "myWelcome." + OUTPUT_FORMAT;

<managed-bean id="__13"> <managed-bean-name id="__14">docmosisReportBean</managed-bean-name> <managed-bean-class id="__15"> com.blogspot.lucbors.reporting.view.docmosis.DocmosisReportBean </managed-bean-class> <managed-bean-scope id="__16">request</managed-bean-scope> </managed-bean>

CONSTRUCTING THE CALL

• Construct Report Server URL; Including the parameters

private static String buildRequestForEmployee() { // the name of the template in our cloud account we want to use String templateName = "/KScopeDemoTemplate.doc";

StringBuilder sb = new StringBuilder();

// Start building the instruction sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); sb.append("<render \n"); sb.append("accessKey=\"").append(ACCESS_KEY).append("\" "); sb.append("templateName=\"").append(templateName).append("\" "); sb.append("outputName=\"").append(OUTPUT_FILE).append("\">\n");

CONSTRUCTING THE CALL

• Adding the Data

// now add the data specifically for this template sb.append("<data\n"); sb.append(" date=\"").append(new Date()).append("\"\n"); sb.append(" title=\"Creating documents with Docmosis from ADF \">\n"); String[] messages = { "Reporting from ADF Applications - What are the Options? John Flack", "ADF Data Visualization Tips & Techniques. Chris Muir", "How to Bring Common UI Patterns to ADF. Luc Bors", "and many many more......"}; for (int i = 0; i < messages.length; i++) { sb.append("<suggestions msg=\"").append(messages[i]).append("\"/>\n"); } sb.append("</data>\n"); sb.append("</render>\n");

CALL AND SHOW THE REPORT

• Call ………

• ……. And Show the report

<af:popup id="showDocmosisReport" animate="default"> <af:panelWindow id="pw2" modal="true" title="The report" contentHeight="625" contentWidth="700" resize="on"> <af:inlineFrame id="if2" shortDesc="This is an inline frame“ source="/showpdfservlet?name=#{docmosisReportBean.docmosisreportname}" styleClass="AFStretchWidth" inlineStyle="height:600px;"></af:inlineFrame> </af:panelWindow></af:popup>

<af:commandToolbarButton text="Run docmosis Report" id="cb5" actionListener="#{docmosisReportBean.runDocmosisReport}"> <af:showPopupBehavior popupId=":::showDocmosisReport" triggerType="action"/></af:commandToolbarButton>

SHOWING THE RESULT

REPORTING; YOUR OPTIONS

COMMON FEATURES

Server URLReport Name

UN/PWParameters

TemplateDatasource

PRO’S AND CON’S ?

Price

Features Complexity

ARE THERE OTHER ALTERNATIVES?

JCCKit

JFreeChart

JCharts

JChart2d

DocumentBuster

JOpenChart

JChart

JFreeReport

Open Report

Pentaho BIcharts

4JJGraphTADF solutions

BIRT

BI Composer

MORE REPORTING IN THE FMW TRACK

RESOURCES

• OTN – Reports : http://www.oracle.com/technetwork/middleware/reports/overview/index.html

• OTN – BI Publisher : http://www.oracle.com/technetwork/middleware/bi-publisher/overview/index.html

• Jasper : http://jasperforge.org/projects/jasperreports

• Docmosis : https://www.docmosis.com/

• OS Reporting overview : http://java-source.net/open-source/charting-and-reporting

• AMIS tech blog : http://technology.amis.nl

• ADF-EMG site : http://groups.google.com/group/adf-methodology/web/adf-reporting?pli=1

A SPECIAL REPORTReporting solutions for ADF Applications

Luc BorsOracle Certified ADF Implementation Specialist

AMIS Services, The NetherlandsOracle ADF Specialized Partner

Monday, June 25, 2012 ODTUG KScope 12San Antonio, Texas, USA