<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>A BI Publisher developer&apos;s diary...</title>
      <link>http://blogs.oracle.com/BIDeveloper/</link>
      <description></description>
      <language>en</language>
      <copyright>Copyright 2009</copyright>
      <lastBuildDate>Sun, 28 Jun 2009 00:43:47 -0800</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

      
      <item>
         <title><![CDATA[Bursting &amp; Translation]]></title>
         <description><![CDATA[<p>I see this question very often. Yes, bursting supports the translation and the implementation depends on the flavor.  Lets go through the different scenario through these examples  </p>

<p>Using bursting control file where layout templates and xlf files are on file system. In this<br />
scenario, set the translation attribute under template section to xlf file path.</p>

<table class="ex" width="100%" border="1" cellpadding="0" cellspacing="0">
<tr><td><pre>

<p>&lt;xapi:document key="${EMPNO}" <br />
  output="c:\burst\sample\${EMPNO}_${ENAME}.pdf"<br />
  output-type="pdf" delivery="123"&gt;<br />
  &lt;xapi:template type="rtf" locale="de-DE"<br />
  location="d:\burst_test\deptSummary.rtf" <br />
  filter=".//EMPLOYEE [locale='de-DE']" <br />
   translation="d:\burst_test\translation\deptSummary_de_DE.xlf" /&gt; <br />
&lt;xapi:template type="rtf" locale="en-US" <br />
  location="d:\burst_test\deptSummary.rtf" <br />
  filter=".//EMPLOYEE [locale='en-US']" <br />
   translation="d:\burst_test\translation\deptSummary_en_US.xlf" /&gt; </p>

<p>  &lt;xapi:template type="rtf" locale="ja-JP" <br />
  location="d:\burst_test\deptSummary.rtf"<br />
   filter=".//EMPLOYEE [locale='ja-JP']"<br />
   translation="d:\burst_test\translation\deptSummary_ja_JP.xlf" /&gt; <br />
&lt;/xapi:document&gt;<br />
 </pre><br />
</td></tr></table>  <br />
 <br />
Bursting-EBS integration where layout template and xlf stored in Template Manager repository. Use the<br />
XDO protocol to define the template location. </p>

<table class="ex" width="100%" border="1" cellpadding="0" cellspacing="0">
<tr><td><pre>

<p>&lt;xapi:document key="${TRX_NUMBER}" output="${TRX_NUMBER}"<br />
 output-type="pdf" delivery="file1"&gt;  &lt;xapi:template type="rtf" locale=""<br />
  location="xdo://AR.RAXINV.${language}.${territory}/?getSource=true"<br />
   translation="" filter="" /&gt; <br />
&lt;/xapi:document&gt;<br />
 </pre><br />
</td></tr></table>  </p>

<p>Based on Template code, Application Code, Language and Territory, process extracts the<br />
translated layout from Template Manager repository.</p>

<p>In Enterprise release, Bursting is based on SQL query that we define in Bursting criteria page<br />
of the Report.  The Translation is based on the Locale value in SQL Query. <br />
	<br />
                SELECT<br />
	CUSTOMER_ID KEY,<br />
	CST_TEMPLATE TEMPLATE,<br />
	TMPL_TYPE TEMPLATE_FORMAT,<br />
	<strong>CST_LOCALE LOCALE</strong>,<br />
	CST_FORMAT OUTPUT_FORMAT,<br />
	CST_DEL_CHAN DEL_CHANNEL,<br />
	CST_EMAIL PARAMETER1,<br />
	'accounts.receivable@oracle.com' PARAMETER2,<br />
	'bip-collections@oracle.com'PARAMETER3,<br />
	'Your Invoices' PARAMETER4,<br />
	'Hi'||CUST_FIRST_NAME||chr(13)|| 'Please find attached your<br />
	invoices.' PARAMETER5,<br />
	'true' PARAMETER6,<br />
	'donotreply@nowhere.com' PARAMETER7<br />
	FROM CUSTOMERS</p>

<p>Sample Control files are available <a href="http://blogs.oracle.com/BIDeveloper/translation_control_files.zip">here</a><br />
</p>]]></description>
         <link>http://blogs.oracle.com/BIDeveloper/2009/06/bursting_translation.html</link>
         <guid>http://blogs.oracle.com/BIDeveloper/2009/06/bursting_translation.html</guid>
        
        
         <pubDate>Sun, 28 Jun 2009 00:43:47 -0800</pubDate>
      </item>
      
      <item>
         <title>Bursting: Conditional delivery</title>
         <description><![CDATA[<p>This is in response to arvind’s question on how we can set the conditional delivery based on the user preference available in xml data file. Here is an example.</p>

<table class="ex" width="100%" border="1" cellpadding="0" cellspacing="0">
<tr><td><pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xapi:requestset xmlns:xapi="http://xmlns.oracle.com/oxp/xapi"&gt;
 &lt;xapi:globalData location="stream"&gt;
 &lt;/xapi:globalData &gt;
    &lt;xapi:request select="/DATA/LIST_DEPT/DEPT/LIST_EMPLOYEE/EMPLOYEE"&gt;
 &lt;xapi:delivery&gt;
  &lt;xapi:email server="${EMAIL_SERVER}" port="${EMAIL_PORT}"
 from="${FROM_EMAIL_ADDRESS}" 
   reply-to ="${REPL_TO_ADDRESS}"&gt;
   &lt;xapi:message id="email1"  to="${TO_EMAIL_ADDRESS}"  cc="${CC_EMAIL_ADDRESS}"   
 attachment="true" content-type="html/text" 
subject="Employee Report for Empno ${EMPNO}"&gt;
   Dear ${ENAME}, Please review the attached document.&lt;/xapi:message&gt;
  &lt;/xapi:email&gt;
  &lt;xapi:filesystem id="file1"
  output="C:\burst\sample\${EMPNO}_${ENAME}_${MGR}_PRINT.pdf"/&gt;
  &lt;xapi:print id="print1"  printer="${PRINT_URL}" copies="2"
   orientation-requested="3" /&gt;
 &lt;/xapi:delivery&gt;
 &lt;xapi:document key="${EMPNO}" 
  output-type="pdf" delivery="email1"&gt;
    &lt;xapi:template type="rtf" location="${TEMPLATE_LOC}"
    filter=".//EMPLOYEE[DEL_CHANNEL='EMAIL']" &gt;
    &lt;/xapi:template&gt;
  &lt;/xapi:document&gt;
  &lt;xapi:document key="${EMPNO}"   output-type="pdf" delivery="print1"&gt;
    &lt;xapi:template type="rtf" location="${TEMPLATE_LOC}"
    filter=".//EMPLOYEE[DEL_CHANNEL='PRINT']" &gt;
    &lt;/xapi:template&gt;
  &lt;/xapi:document&gt;
 &lt;xapi:document key="${EMPNO}"   output-type="pdf" delivery="file1"&gt;
    &lt;xapi:template type="rtf" location="${TEMPLATE_LOC}"
    filter=".//EMPLOYEE[DEL_CHANNEL='FILE_SYSTEM']" &gt;
    &lt;/xapi:template&gt;
  &lt;/xapi:document&gt;
 &lt;/xapi:request&gt;
&lt;/xapi:requestset&gt;  
</pre>
</td></tr></table>  

<p>We need to define multiple document sections corresponding to each delivery channel and the filter condition to deliver the output based on user preference. Here DEL_CHANNEL is the element in xml data file, which define the user delivery preference.<br />
</p>]]></description>
         <link>http://blogs.oracle.com/BIDeveloper/2009/04/bursting_conditional_delivery.html</link>
         <guid>http://blogs.oracle.com/BIDeveloper/2009/04/bursting_conditional_delivery.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Bursting</category>
        
        
          <category domain="http://www.sixapart.com/ns/types#tag">BI Publisher</category>
        
          <category domain="http://www.sixapart.com/ns/types#tag">Bursting</category>
        
          <category domain="http://www.sixapart.com/ns/types#tag">XML Publisher</category>
        
         <pubDate>Wed, 08 Apr 2009 09:41:35 -0800</pubDate>
      </item>
      
      <item>
         <title>Bursting...</title>
         <description><![CDATA[<p>During these years with Publisher, I worked with many clients directly/indirectly to resolve there reporting issues and one of the very common requirment is about  generate mutilple outputs against the single process/report. Here I am sharing one such requirment...</p>

<p>The company’s billing system generates around 30 thousands invoices/bills for each billing cycle. Each billing cycle correspond to a single process and generate a huge set of data for all the invoices.</p>

<p>The process, further consume this huge data and generate the individual Invoices. i.e. one report and multiple output.  </p>

<p>The individual Invoice layout depends upon the recipient’s country and local preference, So it could be multiple templates and multiple local. .</p>

<p>The process should take care of document delivery as well. Delivery type and the destination depend on individual client’s preference. Beside it, a copy of each invoice should be save to specific file location or transferred to content management system.  To achieve this, the process should allow to hook custom APIs/Logic before and after individual documents generation.</p>

<p>Beside the individual output, there should be another single consolidated output against the same set of data. i.e. a summary report.<br />
 <br />
So what do you think, Can we satisfy this requirement against the single process?</p>

<p>Yes, The Bursting take care of such type of requirements where single dataset, multiple conditional layouts/templates, multiple layout, multiple delivery and the listener to hook the custom logic at each stage of process.</p>

<p>There are two type of bursting implementation within BI Publisher. The Control File based bursting, which is well integrated with EBS and JDE and available through Public APIs as well. The other one is Delivery SQL based bursting, which is part of Enterprise Release. We will discuss the first one on this post.</p>

<p>The Bursting Control file holds the Meta Data or the bursting rules in XML format.Lets have a look on following control file and see, how far it satisfies the above requirement.</p>

<table class="ex" width="100%" border="1" cellpadding="0" cellspacing="0">
<tr><td><pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xapi:requestset xmlns:xapi="http://xmlns.oracle.com/oxp/xapi"&gt;
 &lt;xapi:globalData location="stream"&gt;
 &lt;/xapi:globalData &gt;
    &lt;xapi:request select="/DATA/LIST_DEPT/DEPT/LIST_EMPLOYEE/EMPLOYEE"&gt;
 &lt;xapi:delivery&gt;
  &lt;xapi:email server="${EMAIL_SERVER}" port="${EMAIL_PORT}" from="${FROM_EMAIL_ADDRESS}"
    reply-to ="${REPL_TO_ADDRESS}"&gt;
 &lt;xapi:message id="123"  to="${TO_EMAIL_ADDRESS}" cc="${CC_EMAIL_ADDRESS}" 
 attachment="true"  content-type="html/text" 
 subject="Employee Report for Empno ${EMPNO}"&gt;  Dear ${ENAME}, 
    Please review the attached document.&lt;/xapi:message&gt;
  &lt;/xapi:email&gt;
  &lt;xapi:print id="printer1"  printer="${PRINT_URL}" copies="2"
   orientation-requested="3" /&gt;
 &lt;/xapi:delivery&gt;
 &lt;xapi:document key="${EMPNO}"  output="c:\burst\sample\${EMPNO}_${ENAME}.pdf" 
  output-type="pdf" delivery="123"&gt;
    &lt;xapi:template type="rtf" location="${EMP_TEMPLATE}"&gt;
    &lt;/xapi:template&gt;
  &lt;/xapi:document&gt;
 &lt;/xapi:request&gt;
&lt;/xapi:requestset&gt;</pre>
</td></tr></table>  
A sample control file available <a href="http://blogs.oracle.com/BIDeveloper//SampleControlFile.xml">here</a>. 

<p>This will not exactly satisfy the above requirement but it gives an idea, how we can proceed to achieve the above requirement.</p>

<p>Here is the sample usage of Bursting Engine.  We can call bursting engine either directly or through DocumentPrecoessor. Calling directly gives more control over some of the internal methods. API accept the Control file, Data File and Temporary directory path.</p>

<p> Using BurstingProcessorEngine directly..</p>

<p>     try {<br />
          BurstingProcessorEngine dp = new BurstingProcessorEngine();<br />
          dp.deleteTempOutputFile(false);<br />
          dp.setTempDirectory("c:\\burst\\sample");//Set the temp file<br />
          dp.setXMLAPI("C:\\burst\\sample\\SampleControlFile.xml"); //Set Bursting Control file.<br />
          dp.setData("c:\\burst\\sample\\employee.xml"); //Data File<br />
          dp.registerListener(this); //Set the listener<br />
          Properties prop = new Properties(); //add properties and variables//<br />
          prop.put("user-variable:EMAIL_SERVER", "myemailserver.com");<br />
          prop.put("user-variable:EMAIL_PORT", "25");<br />
          prop.put("user-variable:FROM_EMAIL_ADDRESS", “admin@xyz.com");<br />
          prop.put("user-variable:CC_EMAIL_ADDRESS", "cc@xyz.com");<br />
          prop.put("user-variable:PRINTER_URL", "ipp://myprintserver:631/printers/printer1");<br />
          prop.put("user-variable:EMP_TEMPLATE", "c:\\burst\\sample\\employee.rtf");<br />
          dp.setConfig(prop);<br />
          dp.process();   <br />
          dp.deletTemporaryOutputFiles();<br />
         } catch (Exception e) {<br />
          Logger.log(e);<br />
      }</p>

<p>  Using DocumentProcessor:</p>

<p>     try {<br />
   DocumentProcessor dp = new DocumentProcessor("C:\\burst\\sample\\SampleControlFile.xml","c:\\burst\\sample\\employee.xml", "c:\\burst\\sample");<br />
          dp.setTempDirectory("c:\\burst\\sample");//Set the temp file<br />
          dp.setXMLAPI("C:\\burst\\sample\\SampleControlFile.xml"); //Set Bursting Control file.<br />
          dp.setData("c:\\burst\\sample\\employee.xml"); //Data File<br />
          dp.registerListener(this); //Set the listener<br />
          Properties prop = new Properties(); //add properties and variables//<br />
          prop.put("user-variable:EMAIL_SERVER", "myemailserver.com");<br />
          prop.put("user-variable:EMAIL_PORT", "25");<br />
          prop.put("user-variable:FROM_EMAIL_ADDRESS", “admin@xyz.com");<br />
          prop.put("user-variable:CC_EMAIL_ADDRESS", "cc@xyz.com");<br />
          prop.put("user-variable:PRINTER_URL", "ipp://myprintserver:631/printers/printer1");<br />
          prop.put("user-variable:EMP_TEMPLATE", "c:\\burst\\sample\\employee.rtf");<br />
          dp.setConfig(prop);<br />
          dp.process();   <br />
         } catch (Exception e) {<br />
          Logger.log(e);<br />
      }</p>

<p><br />
A sample test case including sample java application, control file, data file, rtf template is available <a href="http://blogs.oracle.com/BIDeveloper/sampleBursting.zip">here</a>. Please make sure you have following libraries in class path<br />
Collection.jar, xdo.jar, Xmlparserv2.jar, mail.jar, Activaton.jar, aolj.jar, i18n, xdoparser.jar,Versioninfo.jar and use 10.1.3.4+ release.</p>

<p>Try it out and let me know your experience. We will see some more interesting example during coming post, so stay tune…<br />
</p>]]></description>
         <link>http://blogs.oracle.com/BIDeveloper/2009/03/bursting_1.html</link>
         <guid>http://blogs.oracle.com/BIDeveloper/2009/03/bursting_1.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Bursting</category>
        
          <category domain="http://www.sixapart.com/ns/types#category">Introduction</category>
        
        
          <category domain="http://www.sixapart.com/ns/types#tag">BI Publisher</category>
        
          <category domain="http://www.sixapart.com/ns/types#tag">Bursting</category>
        
          <category domain="http://www.sixapart.com/ns/types#tag">XML Publisher</category>
        
         <pubDate>Wed, 11 Mar 2009 08:24:09 -0800</pubDate>
      </item>
      
      <item>
         <title>My journey with BI Publisher...</title>
         <description><![CDATA[<p>It was just last week when I moved out from BI Publisher development and join the Fusion Financial Application development group. All these years working for a great product and with a great team, it was a wonderful experience.</p>

<p>My association with BI Publisher is more then six years old. It was the time, when I was working as a part of Oracle Financial Globalization team on EBS Reporting Strategy project with Tim Dexter. We were trying to create Java applet based Layout Editor to modify the Oracle Report Layout without changing the underlying Data Model.  This was the requirement from most of EBS customers for simple customization of report layout.  Oracle Report Designer was/is available but it was hard for PMs to use it. During the same period, ATG Internationalization team came up with some exciting prototypes on RTF templates. I still remember about very first POC from Internationalization team on RTF template with one single Form field and the PDF output.  That was so exciting that after the demo we dumped the Report Layout Editor project. It was decided to work together to explore further on the same line. Later the product called XML Publisher.  First Tim Dexter moved to XML Publisher and subsequently I joined the team as well.</p>

<p>After joining, I start working on XML Publisher integration with EBS.  The first integration between Publisher and EBS was through 2 steps Java Concurrent Program to submit a XML Publisher report through EBS. XDO Common Region was another integration with EBS, where XML Publisher report can be embedded within OAF pages.</p>

<p>During up-taking the Publisher within EBS, one of the critical questions was, what we are going to do with 3000 existing EBS reports. Are we going to re-write all these reports? The answer was RDF to RTF migration utility to migrate the RDF Layout.<br />
 <br />
Data Template (Data Engine) was another exciting contribution to the product.  After migrating RDF layout section to RTF Templates, the existing Oracle Reports was still in use to generate the XML Data. It was like two reporting solution for a single report.   we came up with the Data Template concept. The very first Data Engine was written in PLSQL and later we migrate it to Java. The Data Template functionality helped us to come up with a complete RDF to XML publisher migration utility. EBS teams has successfully migrated around 2000 Oracle Reports to BI Publisher report with the help of these utilities.</p>

<p>Bursting is one of my most lovable babies. Bursting Engine is very dynamic and supports a wide range of bursting requirement. It has two flavors. Control file based bursting, which is well integrated with EBS and JDE, is much more powerful compare to Delivery SQL based bursting supported through Enterprise Release. </p>

<p>Moving forward, I look after Scheduling functionality of Enterprise Release. I did contribute to enhance this area, but frankly speaking, I don’t see any major contribution over that area. </p>

<p>Here it comes Fusion, It was time again to work closely with Oracle Application Teams.  I always feel pleasure while working with developers, customers.</p>

<p>While I moved out last week from the BI Publisher development, I still can’t leave the product. It is too close to my heart and the best way to be in touch with the product, I decided to share my knowledge with the community though this media. </p>

<p>Most of my post will be specific to developer’s point of view. I will start with one of my favorite features Bursting. I feel its is under-documented and the feature is most widely used by the developers community. So stay tune and wait for next post.<br />
</p>]]></description>
         <link>http://blogs.oracle.com/BIDeveloper/2009/03/my_journey_with_bi_publisher_1.html</link>
         <guid>http://blogs.oracle.com/BIDeveloper/2009/03/my_journey_with_bi_publisher_1.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Introduction</category>
        
        
          <category domain="http://www.sixapart.com/ns/types#tag">BI Publisher</category>
        
          <category domain="http://www.sixapart.com/ns/types#tag">XML Publisher</category>
        
         <pubDate>Mon, 02 Mar 2009 08:49:35 -0800</pubDate>
      </item>
      
   </channel>
</rss>
