Showing posts with label Declarative component (Generate PDF Report). Show all posts
Showing posts with label Declarative component (Generate PDF Report). Show all posts

Wednesday, August 15, 2012

Declarative Component in Oracle ADF (To Generate the PDF/CSV/XML type of report)


Declarative Component in Oracle ADF (To Generate the PDF/CSV/XML type of report) :

Since adf faces does not have any component which help us to download the report (s) in to following format .

1)PDF
2)HTML
3)XML
4)CSV
or might be other different format .(In  case if you know any other format please let me know )

In one of my application where we need to generate the reports in to pdf format therefore  we thought  to create the declarative components which will support us to generate the reports into pdf format and in this post i am going to explain the same .

Here i am not going to share how to create the declarative component. Although i would like to share the following link which is might be use full .

1-http://docs.oracle.com/cd/E18941_01/tutorials/jdtut_11r2_40/jdtut_11r2_40.html
2-http://docs.oracle.com/cd/E17904_01/web.1111/b31973/af_reuse.htm#CHDDECDG

Above two link  will be give some grip on the jsf /adf  declarative  component  creation .

Please download following two jar to use the component which i has been created
First jar contains source of the component and second jar is itext pdf generation jar (which is open source)

First :
You can download the jar file using following link (declarative component jar location)

Second :
For download itext  jar :
http://www.4shared.com/file/a8rSo6rk/itextpdf-510.html

Step to add the jar in project after that you can able to use in your project . 

1- download and put into local location .
2-Go to the Resource Palette  

3-Here we need to create the file system to access the jar file into the project.
4-Please follow the following pictorial step to create the file  system connection 











* exclude jar file name .For example if folder A contains jar then path should be A:\ 

Select the file system option and fill the above details .
5-Add the jar into the project .

Your jdeveloper is  ready to consume the declarative component .

Go to the component palette and in the drop down select the complib (i know here tag lib  name is not meaning full but in the next release(version) i will change the name with the appropriate name  )
image is following 



Till here it is common practice to consuming the declarative  component .see the following link if still you  have any confusion to how to use the declarative components


Declarative Component Specification(ReportDeclarative ) : 

Tag-Lib Name :compLib
Tag-Lib-URL: /componentLib
Tag-Lib-Prefix :report
Component Name :ReportDeclarative 

Attribute of the ReportDeclarative  component  are following  :

S.No. Attribute Name Required Explanation
1 Button Name Yes It will display as button name of download button
2 Report Name Yes Name of the report.it does not require any extension 
3 Report Type Yes This version will support only pdf .So put PDF .if you  will give
other than this it will not work and also it not going to give any
error message (this feature will come in next version or release )
4 Table Id Yes af:table id which you want to export into pdf 


This version will support only the PDF report but in  the next version i will try to support the CSV and XML type of report.

Consideration point( Limitation ) :

1-Each column width will same .
2-Pdf width percentage is set to 100 %
3-Table Columns header will come as the pdf table columns.
4-Render false column will not going to shown on the pdf report
   same as af:exportCollectionActionListener components behavior
5-It is internally using the itextpdf-5.1.0.jar.it means here  i am using itext 5.1 version to generate the pdf .
6-Before going to use the component please download the same version of jar file of the itext and add into the project.
7-No exception handler implemented yet .It means if you are providing wrong table id or wrong report type it not going to give any type of message into the UI regardless you will able to download the file which will  corrupt.
8-Column width same regardless if one column contains less length of value to other column.
9-Need to test if you are using table inside  region or any other parent container.Because at run time client id changed based on parent id.
i.e.I tested  it using af:table with direct child with the af:form
sample code is following :--

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
          xmlns:report="/componentLib">
  <jsp:directive.page contentType="text/html;charset=UTF-8"/>
  <f:view>
    <af:document id="d1">
      <af:messages id="m1"/>
      <report:reportDeclarative buttonName="Employee" reportType="PDF"
                                tableId="t1" id="rd1" reportName="sample"/>
      <af:form id="f1">
        <af:table value="#{bindings.ViewObj1.collectionModel}" var="row"
                  rows="#{bindings.ViewObj1.rangeSize}"
                  emptyText="#{bindings.ViewObj1.viewable ? 'No data to display.' : 'Access Denied.'}"
                  fetchSize="#{bindings.ViewObj1.rangeSize}"
                  rowBandingInterval="0"
                  selectedRowKeys="#{bindings.ViewObj1.collectionModel.selectedRow}"
                  selectionListener="#{bindings.ViewObj1.collectionModel.makeCurrent}"
                  rowSelection="single" id="t1">
          <af:column sortProperty="EmployeeId" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.EmployeeId.label}"
                     id="c7" width="210">
            <af:outputText value="#{row.EmployeeId}" id="ot6">
              <af:convertNumber groupingUsed="false"
                                pattern="#{bindings.ViewObj1.hints.EmployeeId.format}"/>
            </af:outputText>
          </af:column>
          <af:column sortProperty="FirstName" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.FirstName.label}"
                     id="c4" width="0">
            <af:outputText value="#{row.FirstName}" id="ot4"/>
          </af:column>
          <af:column sortProperty="LastName" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.LastName.label}"
                     id="c2" width="105">
            <af:outputText value="#{row.LastName}" id="ot5"/>
          </af:column>
          <af:column sortProperty="Email" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.Email.label}" id="c5"
                     width="105">
            <af:outputText value="#{row.Email}" id="ot9"/>
          </af:column>
          <af:column sortProperty="PhoneNumber" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.PhoneNumber.label}"
                     id="c10" width="105">
            <af:outputText value="#{row.PhoneNumber}" id="ot7"/>
          </af:column>
          <af:column sortProperty="HireDate" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.HireDate.label}"
                     id="c3" width="105">
            <af:outputText value="#{row.HireDate}" id="ot11">
              <af:convertDateTime pattern="#{bindings.ViewObj1.hints.HireDate.format}"/>
            </af:outputText>
          </af:column>
          <af:column sortProperty="JobId" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.JobId.label}" id="c9"
                     width="105">
            <af:outputText value="#{row.JobId}" id="ot3"/>
          </af:column>
          <af:column sortProperty="Salary" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.Salary.label}"
                     id="c1" width="105">
            <af:outputText value="#{row.Salary}" id="ot10">
              <af:convertNumber groupingUsed="false"
                                pattern="#{bindings.ViewObj1.hints.Salary.format}"/>
            </af:outputText>
          </af:column>
          <af:column sortProperty="CommissionPct" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.CommissionPct.label}"
                     id="c11" width="105">
            <af:outputText value="#{row.CommissionPct}" id="ot8">
              <af:convertNumber groupingUsed="false"
                                pattern="#{bindings.ViewObj1.hints.CommissionPct.format}"/>
            </af:outputText>
          </af:column>
          <af:column sortProperty="ManagerId" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.ManagerId.label}"
                     id="c8" width="105">
            <af:outputText value="#{row.ManagerId}" id="ot1">
              <af:convertNumber groupingUsed="false"
                                pattern="#{bindings.ViewObj1.hints.ManagerId.format}"/>
            </af:outputText>
          </af:column>
          <af:column sortProperty="DepartmentId" sortable="false"
                     headerText="#{bindings.ViewObj1.hints.DepartmentId.label}"
                     id="c6" width="105">
            <af:outputText value="#{row.DepartmentId}" id="ot2">
              <af:convertNumber groupingUsed="false"
                                pattern="#{bindings.ViewObj1.hints.DepartmentId.format}"/>
            </af:outputText>
          </af:column>
        </af:table>
      </af:form>
    </af:document>
  </f:view>
</jsp:root>


10-try to achieve same as  af:exportCollectionActionListener
11-Serial number need to add into the report.

New Feature(which will come into later release) :

1-XML report support.
2-CSV report support.
3-Exception handling (first we check whether report got successfully created or not.If not we will show the message into the pop up).
4-Source code
5-column width (column with come as same whatever is there in UI)
6-Need to change the tag lib name
7-Generate the report regardless the table structure .(no need to bother about where table will present )


At last i know here i did not explain internal functionality of the class which i have created but in next release sure i will share the source code as well.


Any suggestion would be appreciated.Any enhancement or any other feature which you want please share with me.
 
Please see this link for new declarative component 
http://adfwithejb.blogspot.in/2012/08/declarative-component-in-oracle-adf-to_28.html

Thanks
Prateek