<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-29925072</id><updated>2012-01-30T11:43:13.128Z</updated><category term='Fusion Applications'/><title type='text'>The Oracle EBS Developer</title><subtitle type='html'>Blogging my experiences as an Oracle e-Business Suite developer. Plus news, views, tips &amp;amp; tricks on Oracle e-Business Suite customization and extension.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29925072.post-8376479827148393992</id><published>2011-10-19T19:29:00.002+01:00</published><updated>2011-10-19T19:29:00.312+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fusion Applications'/><title type='text'>Oracle Fusion Applications 101: Bye, Bye PL/SQL</title><content type='html'>&lt;div class="MsoNormal"&gt;Starting to get hands on with Oracle Fusion Applications (OFA), one of the first clear indications that OFA is a completely different beast compared to Oracle EBS is by looking at the amount of PL/SQL packages used in EBS 12.1.3 compared to OFA 11.1.1.5.1:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;-- Oracle EBS 12.1.3 --&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;SELECT COUNT(*)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;FROM DBA_OBJECTS&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;WHERE OBJECT_TYPE = 'PACKAGE BODY'&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;and owner not in ('SYS','SYSTEM');&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;COUNT(*)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;---------------------- &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;47929&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;-- Oracle Fusion 11.1.1.5.1 --&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;SELECT COUNT(*)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;FROM DBA_OBJECTS&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;WHERE OBJECT_TYPE = 'PACKAGE BODY'&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;AND OWNER NOT IN ('SYS','SYSTEM');&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;COUNT(*)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;---------------------- &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;3677&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;In EBS 12.1.3 the majority of Business Logic was developed in PL/SQL, either in server side Packages or contained in Forms and Reports native PL/SQL. Since 11.5.10 and the introduction of OAF, allot of new Business Logic has been developed in JAVA, contained in BC4J Entity, View and Application Module objects. With Fusion Applications, the entire product is developed as a Java Enterprise Application. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;As we can see from the amount of PL/SQL packages, only a small amount of business logic runs outside of JAVA, predominantly in PL/SQL for more data-intensive tasks.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;#OracleFusionApplicationLesson 1 for Oracle EBS Developers: Get your JAVA on!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-8376479827148393992?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/8376479827148393992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=8376479827148393992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/8376479827148393992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/8376479827148393992'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2011/10/oracle-fusion-applications-101-bye-bye.html' title='Oracle Fusion Applications 101: Bye, Bye PL/SQL'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-6242727163896662688</id><published>2011-05-20T12:04:00.002+01:00</published><updated>2011-05-23T08:59:17.183+01:00</updated><title type='text'>Oracle EBS Customization and Extension - OAF vs ADF vs APEX vs Forms</title><content type='html'>The E-Business Suite Technology Group recently released a whitepaper: &lt;a href="http://blogs.oracle.com/stevenChan/entry/new_whitepaper_extending_e_business"&gt;Extending E-Business Suite 12.1.3 using Oracle Application Express&lt;/a&gt;.&amp;nbsp;In summary, "This new whitepaper outlines how to extend Oracle&amp;nbsp;E-Business Suite 12.1.3 (and higher) functionality using Oracle Application Express.&amp;nbsp;Recommended architecture and security considerations are discussed in detail." For some time now EBS customers have used APEX to extend EBS, with&amp;nbsp;the release of this whitepaper the EBS Tech group has acknowledged it's growing use and have provide recommendations and&amp;nbsp;guidelines for standardised integration.&lt;br /&gt;&lt;br /&gt;What's this all about some might ask, is Oracle moving to incorporate APEX as part of the default EBS tech stack? What about OAF? Isn’t Fusion Applications&amp;nbsp;build on ADF, so what's up? Well when it comes to Oracle EBS extension and customization, OAF is still top dog, the E-Business Suite Technology Group continues to recommend OAF for EBS extensions.&lt;br /&gt;&lt;br /&gt;Without a&amp;nbsp;doubt, &lt;a href="http://blogs.oracle.com/stevenChan/entry/new_whitepaper_ebusiness_suite"&gt;ADF&lt;/a&gt; is the future, it’s a very powerful alternative to OAF, it provides an array of new functionality and is used to develop Oracle Fusion Applications. If you are planning a stand alone&amp;nbsp;application, not requiring the tight integration provided with OAF, ADF would be an excellent choice. But where Oracle EBS R11.X and R12.X is concerned, it’s always recommendable to use a tool set that is&amp;nbsp;part of the current tech stack and provides tight integration i.e. security, flexfields, personalization etc.&lt;br /&gt;&lt;br /&gt;I have to come clean here, I have never been a supporter of using APEX to extend EBS, but I am glad to see the E-Business Suite Technology Group laying down some standards and guidelines. Whatever the motivation for choosing APEX, and in my experience it’s usually a OAF skills shortage problem, it’s good to know that Oracle is bringing some order to the current free for all approach to APEX extensions.&lt;br /&gt;&lt;br /&gt;Forms? Dead, move on.&lt;br /&gt;&lt;br /&gt;Although ADF is the future and APEX is now "supported", the Oracle EBS UI is and will continue to be developed using OAF, it’s powerful personalization and extension framework, plus transparent upgrades and&amp;nbsp;seamless integration makes OAF the number one choice in EBS extension and customization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-6242727163896662688?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/6242727163896662688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=6242727163896662688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/6242727163896662688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/6242727163896662688'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2011/05/oracle-ebs-customization-and-extension.html' title='Oracle EBS Customization and Extension - OAF vs ADF vs APEX vs Forms'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-2902140982424753921</id><published>2010-09-23T11:41:00.002+01:00</published><updated>2010-09-23T13:33:34.345+01:00</updated><title type='text'>Finding the Cost of an Index</title><content type='html'>&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Building and maintaining an index structure can be expensive, and it can consume &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;resources such as disk space, CPU, and I/O capacity.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;According to the Oracle Database Performance Tuning Guide 10g Release 2 (10.2): &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;"...each index maintained by an INSERT, DELETE, or UPDATE of the indexed keys requires about &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;three times as much resource as the actual DML operation on the table. What this &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;means is that if you INSERT into a table with three indexes, then it will be &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;approximately 10 times slower than an INSERT into a table with no indexes".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;So let’s attempt to demonstrate this estimate. Let’s start out with one of the largest tables &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;in the Oracle E-Business Suite; ONT.OE_ORDER_LINES_ALL the table stores sales order lines for the &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Order Management module. I have recreated the table and associated indexes from a 11.5.10.2 installation on a &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Oracle 10.2 XE database.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Some facts on my testing:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;The ONT.OE_ORDER_LINES_ALL table contains 340 columns.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Standard indexes consists of 1 unique reverse key index and 17 non unique indexes, together they index 26 columns.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;There&amp;nbsp;are 14 custom non unique indexes covering 35 columns (9 function based).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Test 1: Insert 20000 rows using Insert with select sub query.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;With no indexes: Avg 2.5 Seconds.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;With standard indexes: Avg 6 Seconds.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;With standard and custom indexes: Avg 18 Seconds.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Test 2: Insert 20000 rows using Bulk Collect Cursor and For Loop with Insert:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;With standard indexes: Avg 8 Seconds.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;With standard and custom indexes: Avg 22 Seconds.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;I did not experience the 10 times slower estimate made by the Oracle Performance Tuning guide&amp;nbsp;but the custom indexes significantly &lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;degraded insert performance.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;So what is custom indexing doing to your Oracle EBS performance?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-2902140982424753921?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/2902140982424753921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=2902140982424753921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/2902140982424753921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/2902140982424753921'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2010/09/finding-cost-of-index.html' title='Finding the Cost of an Index'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-2731169269625672943</id><published>2008-02-13T13:46:00.003Z</published><updated>2008-02-13T13:57:58.877Z</updated><title type='text'>I'm Dumping TOAD, Helloooo Oracle SQL Developer!</title><content type='html'>It's already come around, out of nowhere the price of flowers and greeting cards increases ten fold and that special one starts leaving hints all around the house. Yes, Valentines day, loves is in the air although with a very fake and commercial smell to it. In keeping with the love theme I have decided to announce my separation from TOAD, I have found somebody new, a young new model, little ruff around the edges but with loads of possibilities and the best of all she's much cheaper (Not that kind of cheap...).&lt;br /&gt;&lt;br /&gt;I have been looking to move over from TOAD to &lt;a title="Oracle's SQL Developer" target="_blank" href="http://www.oracle.com/technology/products/database/sql_developer/index.html" id="z_wv"&gt;Oracle's SQL Developer&lt;/a&gt; (OSD) since it's initial incarnation as Raptor, but have always found some key feature missing from the product. Recently I have decided to attempt the crossover again, removing TOAD from easy desktop access and focusing on doing all work previously handled by TOAD through OSD. At the start I had to make frequent trips back to TOAD, unable to find certain functions and tools or just getting frustrated with the unfamiliar interface. But as I started using OSD more and more I discovered those familiar TOAD tools in there OSD disguise, and began to appreciate the added functionality provided by OSD. It's not been easy and at first getting the preferences right for your preferred setup may be a little tricky, but once familiar with the new interface and the location of those favourite tools and functions you'll forget about that first love pretty soon.&lt;br /&gt;&lt;br /&gt;My Top tips for migrating from TOAD to Oracle SQL Developer&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Intentionally or not, Oracle has placed allot of the functions and tools used in TOAD in the same navigation path in OSD, so if your stuck just remember how you accessed it in TOAD and 9 out of 10 you should have the same functionality available.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Save code for later use, highlight the code and right click, select Save Snippet. They can later be retrieved by using menu option View-&amp;gt; Snippets&lt;/li&gt;&lt;li&gt;Search database objects using menu option View -&amp;gt; Find DB Objects&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Please feel free to contribute any tips you might have for making the transition a little easier, happy Valentines day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-2731169269625672943?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/2731169269625672943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=2731169269625672943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/2731169269625672943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/2731169269625672943'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2008/02/im-dumping-toad-helloooo-oracle-sql.html' title='I&apos;m Dumping TOAD, Helloooo Oracle SQL Developer!'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-5476188593225594156</id><published>2007-07-03T20:10:00.000+01:00</published><updated>2007-07-03T20:25:57.293+01:00</updated><title type='text'>OAF Key Do's and Don'ts (Part 2) - Performance Tuning: "Top 10" OA Framework Development Rules</title><content type='html'>&lt;span style="font-weight: bold;"&gt;1) ALWAYS&lt;/span&gt; use design time view objects (VOs) rather than dynamic VOs. Dynamic VOs have to be described by BC4J through an additional execute call for the VO prepared statement, and they potentially result in non shareable SQL due to different combinations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) ALWAYS&lt;/span&gt; set precision for all columns in the VO. This reduces the VO memory footprint. Without a set precision, for example, all String columns default to 4KB in size each.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) AVOID&lt;/span&gt; calling VO.getRowCount to check for existence. getRowCount causes the entire VO row set to be fetched back to middle tier.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) NEVER&lt;/span&gt; call VO.getEstimatedRowCount. getEstimatedRowCount executes select count(*) on the VO. This count is not guaranteed to stay the same, thus the method name.&lt;br /&gt;&lt;br /&gt;&lt;script&gt;&lt;!-- D(["mb","32KB.\u003cbr /\&gt;\u003cbr /\&gt;ALWAYS use Oracle-style binding (:1, :2) in your SQL and DO NOT use\u003cbr /\&gt;JDBC style binding (?). This avoids parsing SQL at runtime to do String\u003cbr /\&gt;replacement.\u003cbr /\&gt;\u003cbr /\&gt;AVOID coding generic VOs just to try to reuse them. The &amp;quot;one VO fits\u003cbr /\&gt;all&amp;quot;approach adds complexity to your SQL, increases number of attributes\u003cbr /\&gt;and VO memory footprint.\u003cbr /\&gt;\u003cbr /\&gt;DO NOT execute searches by default nor allow blind queries.\u003cbr /\&gt;\u003cbr /\&gt;Use PNG format not JPEG for BI graph beans.\u003cbr /\&gt;\u003cbr /\&gt;Use JDeveloper to profile your code. JDeveloper 9i has memory, CPU and\u003cbr /\&gt;event profilers.\u003cbr /\&gt;\u003cbr /\&gt;\u003cbr /\&gt;******************************\u003cwbr /\&gt;******************************\u003cwbr /\&gt;***********************\u003cbr /\&gt;Disclaimer\u003cbr /\&gt;\u003cbr /\&gt;This email (and any attachment(s)) is private and intended solely for the use of the individual or entity to whom they are addressed.  Its unauthorised use, disclosure, storage or copying is not permitted.  If you are not the intended recipient please destroy all copies and inform the sender by return e-mail.\u003cbr /\&gt;\u003cbr /\&gt;Internet e-mail is not a secure medium, as messages can be intercepted and read by someone else.  Please bear this in mind when deciding whether to send information by e-mail.  Postal addresses for the Legal Services Commission are available from \u003ca onclick\u003d\"return top.js.OpenExtLink(window,event,this)\" href\u003d\"http://www.legalservices.gov.uk/aboutus/regions/regions.asp\" target\u003d_blank\&gt;http://www.legalservices.gov\u003cwbr /\&gt;.uk/aboutus/regions/regions\u003cwbr /\&gt;.asp\u003c/a\&gt;\u003cbr /\&gt;\u003cbr /\&gt;The Legal Services Commission reserves the right to monitor, record and retain any incoming and outgoing emails for security reasons and for monitoring internal compliance with the Legal Services Commission policy on staff use.  Email monitoring and/or blocking software may be used and email content may be read.  You have a responsibility to ensure laws are not broken when writing or forwarding emails and their contents. No contracts can be entered into on our behalf by email.\u003cbr /\&gt;\u003cbr /\&gt;Any views or opinions expressed are solely those of the author and do not necessarily represent those of the Legal Services Commission.\u003cbr /\&gt;\u003cbr /\&gt;The Legal Services Commission checks all mails and attachments for known viruses; however, you are advised that you open any attachments at your own risk.\u003cbr /\&gt;******************************\u003cwbr /\&gt;******************************\u003cwbr /\&gt;***********************\u003cbr /\&gt;\u003c/div\&gt;",0] );  //--&gt;&lt;/script&gt;&lt;span style="font-weight: bold;"&gt;5) ALWAYS&lt;/span&gt; call registerOutParameters with proper precision for callable statements. This reduces the callable statement memory footprint. Without a set precision, for example, all varchar columns default to 32KB.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6) ALWAYS&lt;/span&gt; use Oracle-style binding (:1, :2) in your SQL and DO NOT use JDBC style binding (?). This avoids parsing SQL at runtime to do String replacement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7) AVOID&lt;/span&gt; coding generic VOs just to try to reuse them. The "one VO fits all"approach adds complexity to your SQL, increases number of attributes and VO memory footprint.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8) DO NOT&lt;/span&gt; execute searches by default nor allow blind queries.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9) Use&lt;/span&gt; PNG format not JPEG for BI graph beans.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10) Use&lt;/span&gt; JDeveloper to profile your code. JDeveloper 9i has memory, CPU and&lt;br /&gt;event profilers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-5476188593225594156?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/5476188593225594156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=5476188593225594156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/5476188593225594156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/5476188593225594156'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2007/07/af-key-dos-and-donts-part-2-performance.html' title='OAF Key Do&apos;s and Don&apos;ts (Part 2) - Performance Tuning: &quot;Top 10&quot; OA Framework Development Rules'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-2873050421889622642</id><published>2007-06-30T08:00:00.000+01:00</published><updated>2007-06-30T08:04:20.185+01:00</updated><title type='text'>OA Framework or ADF?</title><content type='html'>Check out Sara Woodhull's article on &lt;a href="http://blogs.oracle.com/schan/2007/06/28#a1721"&gt;OA Framework and ADF&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-2873050421889622642?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/2873050421889622642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=2873050421889622642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/2873050421889622642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/2873050421889622642'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2007/06/oa-framework-or-adf.html' title='OA Framework or ADF?'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-6661136391256720984</id><published>2007-06-20T18:36:00.000+01:00</published><updated>2007-06-20T18:42:13.913+01:00</updated><title type='text'>OAF Key Do's and Don'ts (Part 1) - "Top 10" Golden Rules</title><content type='html'>I don't know how many of you have come across this in the OAF Devguide, it was only by change that I found it, thought I'd share:&lt;br /&gt;&lt;br /&gt;There's a lot to learn when getting started with the OA Framework, but the following list of rules are so universal -- and so fundamental -- they should be familiar to anyone who's doing Framework development.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) ALWAYS&lt;/span&gt; try to declaratively define your UI. Resort to a programmatic layout only if the UI cannot be implemented declaratively. Programmatic layouts are difficult to customize (they don't leverage the Personalization Framework) and may diverge from the UI Guidelines over&lt;br /&gt;time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) NEVER&lt;/span&gt; change your UI layout properties in processFormRequest(). ALWAYS make changes in processRequest(), even if that means handling an event in processFormRequest() and then redirecting back to the same page. This ensures that the web bean hierarchy is in a stable state when the page renders.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) NEVER&lt;/span&gt; use index numbers to find beans when you want to change their properties. ALWAYS search by name. Index numbers can change during processing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) NEVER&lt;/span&gt; change the properties of a parent bean from a child bean. This is a poor design practice that hampers reuse while introducing fragile code (particularly if the child code executes too late in the page rendering cycle to properly affect the parent).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5) NEVER&lt;/span&gt; instantiate Beans using "new OA*Bean()". ALWAYS use the createWebBean() factory methods available on the OAControllerImpl class. Not all Bean properties are initialized correctly when you use "new."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6) NEVER&lt;/span&gt; create Form Beans in code (this means NEVER add nested Form beans to a page; your Page Layout region should be the only form region). Multiple form Beans on a page are not supported and can result in strange runtime behaviors.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7) NEVER&lt;/span&gt; count on your Application Module using the same database connection in subsequent requests. For example, NEVER post and commit in separate requests. For performance reasons, the Framework will start pooling and reusing connections in 5.7 instead of holding onto a single connection throughout the life of an Application Module.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8) NEVER&lt;/span&gt; use JDBC directly unless you're calling a PL/SQL routine (you should use a view object instead, and if possible, the view object should be defined declaratively and not programmatically).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9) NEVER&lt;/span&gt; add member variables UNLESS THEY ARE TRANSIENT OR FINAL to view objects, Controllers, entity object, view rows and Application Modules.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10) ALWAYS&lt;/span&gt; adhere to the Self-Service Performance Guidelines&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-6661136391256720984?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/6661136391256720984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=6661136391256720984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/6661136391256720984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/6661136391256720984'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2007/06/oaf-key-dos-and-donts-part-1-top-10.html' title='OAF Key Do&apos;s and Don&apos;ts (Part 1) - &quot;Top 10&quot; Golden Rules'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-7596349567201671272</id><published>2007-03-26T10:33:00.000+01:00</published><updated>2007-03-28T07:41:40.420+01:00</updated><title type='text'>Call PL/SQL from OAF</title><content type='html'>In many situations developers need to execute PL/SQL code from there OAF application, be it legacy code or complex database manipulation better suited for PL/SQL.&lt;br /&gt;&lt;br /&gt;The following example calls a PL/SQL procedure, passing in and receiving back parameter values. To ensure we athere to the MVC architecture, you must execute this code from your Application Module (AM). The method returns a HashMap object containing the two return values from the procedure, the HashMap can be returned to your controller, and used to raise a message for the user.&lt;br /&gt;&lt;br /&gt;The following code is placed in your region or page controller, to call the method from your AM:&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;&lt;span style="color:#ffffff;"&gt;// Invoke the method&lt;br /&gt;HashMap returnValues = (HashMap) am.invokeMethod(&lt;br /&gt;"executePlsql");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#ffffff;"&gt;// Get the returned values from the method&lt;br /&gt;String status = (String) returnValues.get("Status");&lt;br /&gt;String message = (String) returnValues.get("Message");&lt;br /&gt;&lt;br /&gt;if (!status.equals("SUCCESS"))&lt;br /&gt;{&lt;br /&gt;am.invokeMethod("rollback");&lt;br /&gt;&lt;br /&gt;// ERRORS from executePlsql&lt;br /&gt;MessageToken[] tokens =&lt;br /&gt;{&lt;br /&gt;new MessageToken("STATUS", status),&lt;br /&gt;new MessageToken("MESSAGE", message),&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;OAException errorMessage = new OAException("XX",&lt;br /&gt;"XX_PLSQL_ERR", tokens,&lt;br /&gt;OAException.ERROR, null);&lt;br /&gt;&lt;br /&gt;pageContext.putDialogMessage(errorMessage);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;The method to call your PL/SQL code, created in your page or regions AM:&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#ffffff;"&gt;&lt;span style="font-family:courier new;"&gt;import com.sun.java.util.collections.HashMap;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.sql.CallableStatement;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.sql.SQLException;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.sql.Types;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#ffffff;"&gt;&lt;span style="font-family:courier new;"&gt;public HashMap executePlsql(String objectId, String objectSubType)&lt;br /&gt;{&lt;br /&gt;CallableStatement st = null;&lt;br /&gt;HashMap returnValues = new HashMap(2);&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;String stmt = "BEGIN xx_pkg.xx_procedure( " +&lt;br /&gt;"p_object_id =&gt; :1, " + &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#ffffff;"&gt;&lt;span style="font-family:courier new;"&gt;"p_object_sub_type =&gt; :2, " +&lt;br /&gt;"p_status =&gt; :3, " + &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#ffffff;"&gt;&lt;span style="font-family:courier new;"&gt;"p_message =&gt; :4); END;";&lt;br /&gt;&lt;br /&gt;OADBTransaction tr = getOADBTransaction();&lt;br /&gt;&lt;br /&gt;st = tr.createCallableStatement(stmt, 1); &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#ffffff;"&gt;// Bind the input parameters&lt;br /&gt;st.setInt(1, Integer.parseInt(objectId));&lt;br /&gt;st.setString(2, objectSubType); &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#ffffff;"&gt;// Register return variables&lt;br /&gt;st.registerOutParameter(3, Types.VARCHAR);&lt;br /&gt;st.registerOutParameter(4, Types.VARCHAR);&lt;br /&gt;&lt;br /&gt;st.execute();&lt;br /&gt;&lt;br /&gt;// Assign returned values to variables&lt;br /&gt;String status = st.getString(3);&lt;br /&gt;String message = st.getString(4);&lt;br /&gt;&lt;br /&gt;st.close();&lt;br /&gt;&lt;br /&gt;// Populate HashMap with return variables&lt;br /&gt;returnValues.put("Status", status);&lt;br /&gt;returnValues.put("Message", message);&lt;br /&gt;&lt;br /&gt;OAExceptionUtils.checkErrors(tr);&lt;br /&gt;}&lt;br /&gt;catch (SQLException sqle)&lt;br /&gt;{&lt;br /&gt;throw OAException.wrapperException(sqle);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return returnValues;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ffffff;"&gt;}&lt;/span&gt;&lt;span style="font-size:85%;color:#ffffff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-7596349567201671272?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/7596349567201671272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=7596349567201671272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/7596349567201671272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/7596349567201671272'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2007/03/call-plsql-from-oaf.html' title='Call PL/SQL from OAF'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-4814231742497124738</id><published>2007-03-26T09:58:00.001+01:00</published><updated>2009-05-22T07:14:53.000+01:00</updated><title type='text'>OAF White Paper</title><content type='html'>&lt;p class="MsoNormal"&gt;I recently presented a white paper at the 2006 &lt;a href="http://www.saoug.co.za/conference.html"&gt;South African Oracle User Group&lt;/a&gt;, an introduction to OAF development called: Oracle Applications Development Framework - The New Frontier&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;I hope this will help new comer's to get a good introduction to OAF development, extension and personalization. If there are any questions related to the white paper, please drop me a comment and I will reply a.s.a.p.&lt;/p&gt;Please leave me a comment with your e-mail address and will get the document to you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-4814231742497124738?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/4814231742497124738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=4814231742497124738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/4814231742497124738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/4814231742497124738'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2007/03/oaf-white-paper.html' title='OAF White Paper'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-399006412100102383</id><published>2007-03-15T05:45:00.000Z</published><updated>2007-03-15T06:06:57.549Z</updated><title type='text'>UK hear I come</title><content type='html'>First and foremost I would like to apologise for not updating the blog for the past couple of month's, come to think of it, it's my first blog for 2007.&lt;br /&gt;&lt;br /&gt;Apart from being extremely busy building a custom bolt-on OAF application for a large multinational, I have been applying to work in the United Kingdom under the government's &lt;a href="http://www.workingintheuk.gov.uk/working_in_the_uk/en/homepage/schemes_and_programmes/hsmp.html?"&gt;Highly Skilled Migrant Program&lt;/a&gt; (HSMP).&lt;br /&gt;&lt;br /&gt;Well I have been accepted and am currently looking for some work before I arrive in the UK on the 1st of May, so any help would be highly appreciated ;-). I am also in the process of creating a new blog to detail my experiences living, working and playing in the UK, so check back soon for a link.&lt;br /&gt;&lt;br /&gt;If there are any particular areas of the OAF you would like me to explore more, please drop me a comment and I will consider doing a post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-399006412100102383?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/399006412100102383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=399006412100102383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/399006412100102383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/399006412100102383'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2007/03/uk-hear-i-come.html' title='UK hear I come'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-4277367929853260242</id><published>2006-11-28T07:58:00.000Z</published><updated>2006-11-28T08:16:12.735Z</updated><title type='text'>Raise a Business Event from your OAF Page</title><content type='html'>&lt;p class="MsoNormal"&gt;After quite a while of inactivity, due partly to a frantic schedule and the addition of a new obsession in the form of my new mountain bike, I am back on the horse and very excited to start blogging again. A Big thanks to &lt;a href="http://blogs.oracle.com/schan/2006/11/27#a983"&gt;Steven Chan for profiling the Oracle EBD Developer on his blog&lt;/a&gt;, just the kick I needed to get going again.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;I recently had the opportunity to present the 11i/2.6 Implement Oracle Workflow course at Oracle South &lt;st1:place st="on"&gt;Africa&lt;/st1:place&gt;, which turned me onto business events in a big way. Now I have previously blogged about launching an &lt;a href="http://andrieshanekom.blogspot.com/2006/07/oaf-and-oracle-workflow.html"&gt;Oracle Workflow process from an OAF page&lt;/a&gt; using the oracle.apps.fnd.framework.webui.OANavigation class. In this post I would like to demonstrate how we can raise a business event through the Oracle Business Event System (OBES), which enables you to utilize the extensive functionality of the OBES to launch workflow processes and perform a number of diverse actions.&lt;/p&gt;                      &lt;p  class="MsoNormal" style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;import oracle.apps.fnd.wf.bes.BusinessEvent;&lt;br /&gt;import oracle.apps.fnd.wf.bes.BusinessEventException;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;....&lt;br /&gt;...&lt;br /&gt;..&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;{&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;super.processFormRequest(pageContext, webBean);&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;              &lt;p  class="MsoNormal" style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style=""&gt;        &lt;/span&gt;if (pageContext.getParameter("Submit") != null)&lt;br /&gt;&lt;span style=""&gt;         &lt;/span&gt;{&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;// Get Transaction&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;OAApplicationModule am = pageContext.getApplicationModule(webBean);&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;OADBTransactionImpl oadbTrx = (OADBTransactionImpl) am.getOADBTransaction();&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;        &lt;p  class="MsoNormal" style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style=""&gt;            &lt;/span&gt;// Create BE Object&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;String eventName = "companyabc.oracle.apps.xx.event.createrequest";&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;String eventKey = "1001-1";&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p  class="MsoNormal" style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style=""&gt;          &lt;/span&gt;&lt;span style=""&gt;  &lt;/span&gt;BusinessEvent busEvent = new BusinessEvent(eventName, eventKey);&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;          &lt;p  class="MsoNormal" style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style=""&gt;            &lt;/span&gt;try&lt;br /&gt;&lt;span style=""&gt;             &lt;/span&gt;{&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;// Set Event Property&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;busEvent.setStringProperty("XX_TRX_TYPE", "NEW_REQUEST");&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p  class="MsoNormal" style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style=""&gt;                &lt;/span&gt;// Raise Event&lt;br /&gt;&lt;span style=""&gt;             &lt;/span&gt;&lt;span style=""&gt;   &lt;/span&gt;busEvent.raise(oadbTrx.getAppsContext().getJDBCConnection());&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;}&lt;br /&gt;&lt;span style=""&gt;             &lt;/span&gt;catch (BusinessEventException exception)&lt;br /&gt;&lt;span style=""&gt;             &lt;/span&gt;{&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;// Set Message Tokens&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;MessageToken[] tokens =&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;{&lt;span style=""&gt;&lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;new MessageToken("EVENT_EXCEPTION",&lt;br /&gt;&lt;span style=""&gt;                        &lt;/span&gt;exception.toString())&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;};&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p  class="MsoNormal" style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style=""&gt;                &lt;/span&gt;OAException eventErrorMessage = new OAException("XX",&lt;br /&gt;&lt;span style=""&gt;                        &lt;/span&gt;"XX_RAISE_EVENT_ERROR", tokens);&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;            &lt;p  class="MsoNormal" style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style=""&gt;               &lt;/span&gt;oadbTrx.rollback();&lt;br /&gt;&lt;span style=""&gt;               &lt;/span&gt;....&lt;br /&gt;&lt;span style=""&gt;               &lt;/span&gt;...&lt;br /&gt;&lt;span style=""&gt;               &lt;/span&gt;..&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;            &lt;p class="MsoNormal"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style=""&gt;    &lt;/span&gt;oadbTrx.commit();&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style=""&gt;    &lt;/span&gt;....&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style=""&gt;    &lt;/span&gt;...&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style=""&gt;    &lt;/span&gt;..&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-4277367929853260242?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/4277367929853260242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=4277367929853260242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/4277367929853260242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/4277367929853260242'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/11/raise-business-event-from-your-oaf-page.html' title='Raise a Business Event from your OAF Page'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115632419637819558</id><published>2006-08-23T10:04:00.000+01:00</published><updated>2006-09-26T17:06:05.946+01:00</updated><title type='text'>Personalization and the MDS Database Repository</title><content type='html'>All declarative User Interface components are stored either in XML files, in a format defined by MDS (Meta Data Services) Schemas, or in the MDS repository tables. When a personalization is created through the OA Personalization Framework it is added on top of the base product meta data. The personalization does not overwrite the existing base product UI and are therefore preserved during upgrades and patches. The MDS repository is supported by the JDR_UTILS PL/SQL package, used to query and maintain the repository:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;SQL&gt; set serveroutput on&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;SQL&gt;&lt;br /&gt;begin&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;jdr_utils.listcustomizations&lt;br /&gt;    ('/oracle/apps/icx/por/req/webui/ShoppingCartPG');&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;end;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;/&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;/oracle/apps/icx/por/req/webui/customizations/site/0/ShoppingCartPG&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;/oracle/apps/icx/por/req/webui/customizations/org/44/ShoppingCartPG&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;SQL&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The MDS database repository consists out of four tables:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JDR_PATHS: Stores documents, packages and there parent child relationship.&lt;/li&gt;&lt;li&gt;JDR_COMPONENTS – Stores document components.&lt;/li&gt;&lt;li&gt;JDR_ATTRIBUTES – Stores attributes of document components.&lt;/li&gt;&lt;li&gt;JDR_ATTRIBUTES_TRANS – Stores translated attribute values of document components.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115632419637819558?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115632419637819558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115632419637819558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115632419637819558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115632419637819558'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/08/personalization-and-mds-database.html' title='Personalization and the MDS Database Repository'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115519504055161249</id><published>2006-08-10T08:15:00.001+01:00</published><updated>2006-08-10T08:32:47.276+01:00</updated><title type='text'>SAOUG Conference 2006</title><content type='html'>&lt;p class="MsoNormal"&gt;Just got some good news, I have been accepted as a speaker at the South African Oracle User Group Conference 2006. I will be presenting my paper - "Oracle Applications Framework Development - The New Frontier", which is an introduction to the world of OAF development, personalization and extension. My presentation will be a 45 minute session scheduled for &lt;st1:time minute="55" hour="9"&gt;9:55 AM&lt;/st1:time&gt; Wednesday 27 September, so don’t miss it.&lt;br /&gt;&lt;br /&gt;The conference is held at &lt;a href="http://www.suninternational.com/resorts/suncity/"&gt;&lt;st1:place&gt;Sun City&lt;/st1:place&gt;&lt;/a&gt; and runs from the 25&lt;sup&gt;th&lt;/sup&gt; to the 27&lt;sup&gt;th&lt;/sup&gt; of September, if you are interested in attending visit the SAOUG website at: &lt;a href="http://www.saoug.co.za/"&gt;http://www.saoug.co.za&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115519504055161249?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115519504055161249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115519504055161249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115519504055161249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115519504055161249'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/08/saoug-conference-2006.html' title='SAOUG Conference 2006'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115390332544857717</id><published>2006-07-26T09:39:00.000+01:00</published><updated>2006-07-26T11:16:20.916+01:00</updated><title type='text'>Oracle Workflow Notifications &amp; OAF</title><content type='html'>&lt;p class="MsoNormal"&gt;If you wanted to display HTML formatted content in an Oracle Workflow Notifications before the release of FWK.H you had to use one of the following options:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;PLSQL      Documents - 32K size limit&lt;/li&gt;&lt;li&gt;PLSQLCLOB      Documents – CLOB&lt;/li&gt;&lt;/ul&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;PL/SQL development of HTML notifications that contains tables and complex layouts can be difficult and very time consuming. It requires the developer to have a very good knowledge of HTML and makes the implementation of a standard “look and feel” very difficult.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;With the implementation of FWK.H we are able to leverage the power of the OAF to create multifaceted Workflow notifications. Also called JRAD notifications, FWK embedded regions is nothing more then a normal OAF region displayed in the body of a Oracle Workflow notification.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Incorporating an embedded FWK region in a Workflow notification consists of the following steps:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;ol style="margin-top: 0cm;" start="1" type="1"&gt;&lt;li class="MsoNormal" style=""&gt;Create      an OA Component Region containing the Headers, items and tables you want      to display in the body of you notification. Developing and implementing this      region is done in the exact same way you would when creating a region for      an OAF custom page. Remember to create a dedicated Application Module (AM)      for your region that will contain all the View Object (VO) required for      your layout.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;In      core applications, create a SSWA jsp function where the WEB HTML call is: &lt;span style="font-family:courier new;"&gt;OA.jsp?page=/companyabc/oracle/apps/xx/module /webui/XxRegionNameRN&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Create a new Workflow attribute:&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://photos1.blogger.com/blogger/5482/1266/1600/WorkFlowAttribute.7.jpg" title="Photo Sharing"&gt;&lt;img src="http://photos1.blogger.com/blogger/5482/1266/400/WorkFlowAttribute.jpg" alt="WorkFlowAttribute" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Value: &lt;span style="font-family:courier new;"&gt;JSP:/OA_HTML/OA.jsp?OAFunc=XX_PO_DOCUMENT_RN_NTFN  &amp;poHeaderId=&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;-&amp;amp;PO_HEADER_ID-&lt;/span&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;  &lt;p class="MsoNormal"&gt;XX_PO_DOCUMENT_RN_NTFN is the custom function created in core apps and &amp;PO_HEADER_ID is a workflow attribute I am passing back as a parameter to the region's controller to initialize my VO.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;    4. Add      the new attribute to your message:&lt;/p&gt;&lt;p style="text-align: center;" class="MsoNormal"&gt;&lt;a href="http://photos1.blogger.com/blogger/5482/1266/1600/WorkflowMessage.0.jpg" title="Photo Sharing"&gt;&lt;img src="http://photos1.blogger.com/blogger/5482/1266/400/WorkflowMessage.jpg" alt="WorkFlowAttribute" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;/p&gt;  Save your workflow and initialize a new instance, the notification body should now be populated by the OAF region. No messy HTML coding, quick, easy and you can reuse the region in your OAF custom pages.&lt;p class="MsoNormal"&gt;  &lt;/p&gt;  &lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115390332544857717?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115390332544857717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115390332544857717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115390332544857717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115390332544857717'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/07/oracle-workflow-notifications-oaf.html' title='Oracle Workflow Notifications &amp; OAF'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115320938728428954</id><published>2006-07-18T08:52:00.000+01:00</published><updated>2006-07-18T09:28:50.503+01:00</updated><title type='text'>OAF and Oracle Workflow</title><content type='html'>&lt;o:p&gt;&lt;/o:p&gt;Most of the custom development work I have done on OAF has required me to interact with Oracle Workflow, specifically to handle approvals and interfaces. The class oracle.apps.fnd.framework.webui.OANavigation provides Java wrappers for Oracle Workflow Engine's PL/SQL APIs.&lt;br /&gt;&lt;br /&gt;The class is actually intended for use when creating and managing OA Framework Page Flows that are defined by Oracle Workflow, but can also be used to interface with Oracle eBS Workflows.&lt;br /&gt;&lt;br /&gt;Example Code - Launching a custom Oracle eBS Workflow from a OAF page:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;import oracle.apps.fnd.framework.webui.OANavigation;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;import java.math.BigDecimal;&lt;/span&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;    &lt;p style="font-family: courier new;" class="MsoNormal"&gt;&lt;o:p style="font-family: courier new;"&gt;    public void launchCustomWorkFlow(OAPageContext pageContext)&lt;br /&gt;  {&lt;br /&gt;     String wfItemType = "CUSTOM";&lt;br /&gt;     String wfProcess = "CUSTOM_PROCESS";&lt;br /&gt;     String wfItemKey = "1001-1";&lt;br /&gt;&lt;br /&gt;     OANavigation wfClass = new OANavigation();&lt;br /&gt;&lt;br /&gt;     // Create Workflow Process&lt;br /&gt;     wfClass.createProcess(pageContext, wfItemType, wfProcess, wfItemKey);&lt;br /&gt;&lt;br /&gt;     // Set Number Attribute: ITEM_INTERFACE_ID&lt;br /&gt;     wfClass.setItemAttrNumber(&lt;br /&gt;         pageContext,&lt;br /&gt;         wfItemType,&lt;br /&gt;         wfItemKey,&lt;br /&gt;         "ITEM_INTERFACE_ID",&lt;br /&gt;         new BigDecimal(1));&lt;br /&gt;&lt;br /&gt;     // Set Text Attribute: &lt;/o:p&gt;&lt;span style="font-family: courier new;"&gt;ITEM_NAME&lt;/span&gt;&lt;br /&gt;&lt;o:p style="font-family: courier new;"&gt;        wfClass.setItemAttrText(pageContext, wfItemType, wfItemKey,&lt;br /&gt;         "ITEM_NAME", "ITEM1");&lt;br /&gt;&lt;br /&gt;     // Start Workflow Process&lt;br /&gt;     wfClass.startProcess(pageContext, wfItemType, wfProcess, wfItemKey);&lt;br /&gt; }&lt;/o:p&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115320938728428954?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115320938728428954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115320938728428954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115320938728428954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115320938728428954'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/07/oaf-and-oracle-workflow.html' title='OAF and Oracle Workflow'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115260427670884532</id><published>2006-07-11T08:45:00.000+01:00</published><updated>2006-08-12T01:55:23.340+01:00</updated><title type='text'>Getting started with OAF development</title><content type='html'>&lt;p class="MsoNormal"&gt;I have recently received a number of queries related to OAF development, particularly regarding the quickest way to get started. I will handle these questions in a two part post, in the first I will aim to provide you with the basic software and documentation requirements to get started. In the second post we will have a look at a couple of common OAF extension tasks.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;OAF development can be split into two major categories namely:&lt;/p&gt;&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt;&lt;ul&gt;&lt;li&gt;&lt;span dir="ltr"&gt;&lt;strong&gt;Personalization&lt;/strong&gt; refers to the ability to declaratively alter the UI to suit user or business needs.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;!--[endif]--&gt;&lt;ul&gt;&lt;li&gt;&lt;span dir="ltr"&gt;&lt;strong&gt;Extensibility&lt;/strong&gt; refers to the ability to programmatically extend an application's functionality.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Personalization is the quickest and easiest way of altering the OAF UI, changes are protected from future upgrades and most personalization tasks can be performed by functional consultants or even trained users. If you have any requirement to alter the OAF UI, personalization should be your first stop. The following document will be of great help in understanding and implementing OAF personalization:&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Metalink Doc ID: 236618.1 - OA Framework Personalization and Extensibility Guide: Version 5.7+&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Extensibility is used when you are required to implement changes to functionality not provided by personalization, or when you are required to develop add-on/new functionality to the OAF UI.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The following steps will get you up to speed with the correct software and documentation:&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Follow      post: &lt;a href="http://andrieshanekom.blogspot.com/2006/06/find-right-jdeveloper-patch-for-oaf.html"&gt;Find      the right JDeveloper Patch for OAF development&lt;/a&gt;, once you determine the      correct JDeveloper version for your development environment you can      proceed to download the JDev patch from Metalink.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Once      downloaded, follow the installation step set out in the OAEXT_README.txt      document, located in the root directory of the patch file.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Oracle      included excellent documentation with the JDeveloper patch, after      installation you can locate the documentation index here: JDEV_INSTALL_DIR/jdevdoc/index.htm&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Follow      “You are Customer, Consultant or Support Representative” in Chapter 1:      Setting Up your Development Environment of the OA Framework developers guide,      make sure you complete all setup steps successfully.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p class="MsoNormal"&gt;Congratulations you have successfully installed and configured your new development tool, now it’s time to get into the documentation. I suggest you complete Chapter 1, 2 and 3 of the OA Framework developers guide.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;You can then proceed with the Oracle Applications Framework ToolBox Tutorial, it is an excellent step by step introduction to OAF development and extension, and will introduce you to all the key concepts required for OAF customization.&lt;/p&gt;Keep tuned for part 2: Include a new column - Extending a standard LOV view object.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115260427670884532?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115260427670884532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115260427670884532' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115260427670884532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115260427670884532'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/07/getting-started-with-oaf-development.html' title='Getting started with OAF development'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115156466191076306</id><published>2006-06-29T08:00:00.000+01:00</published><updated>2006-10-06T20:03:40.596+01:00</updated><title type='text'>OAF - Tables and PPR</title><content type='html'>It has just taken me two days to implement PPR on a table, yes 2. I might be a little slow but the developers guide was of very little help and I was unable to find any worthwhile examples.&lt;br /&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;When planning to implement PPR in tables it is very important to decide early on what type of PPR you want to implement. Let’s take a step back, when implementing PPR on normal fields outside a table, there is only one instance of each field to modify. But when working in a table there might exist an infinite amount of rows each with an instance of the specific field.&lt;br /&gt;&lt;br /&gt;If functionality requires that all instances of the PPR field behaves in the same fashion, PPR using SPEL bindings will work perfectly, and is very quick and easy to implement. On the other hand if you require each instance of the PPR field to act independently based on another value in its table row, you will have to look at Bound Values or Content Switcher.&lt;br /&gt;&lt;br /&gt;In this post I will focus on Bound Values as this is the solution I implemented, the Dev guide specifies the following consideration when having to decide which solution to use:&lt;br /&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;“You should limit your use of Switchers to within tables, particularly when you want to switch between different kinds of web beans, such as a poplist or a checkbox. When you have only one type of web bean, but the value of an attribute on that web bean varies at runtime, then you should implement that attribute as a bound value rather than as a Switcher.”&lt;br /&gt;&lt;br /&gt;PPR using Bound Values:&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add      a transient attribute to your table view object; you will bind this      attribute to the value of the PPR column’s RENDERED attribute.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Modify      the transient attribute getter method to change the value depending on      your PPR requirement. In my case I needed to render the Supplier Name      field based on the value of the SupplierYn attribute in the table view      object:&lt;/li&gt;&lt;/ul&gt;            &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: left; font-family: courier new;"&gt; public Boolean getSupplierNameRendered()&lt;br /&gt;   {&lt;br /&gt;      String yn = getSupplierYn();&lt;br /&gt;      Boolean tf = Boolean.TRUE;&lt;br /&gt;&lt;br /&gt;      if ("Y".equals(yn))&lt;br /&gt;       {&lt;br /&gt;          tf = Boolean.TRUE;&lt;br /&gt;      }&lt;br /&gt;      else if ("N".equals(yn))&lt;br /&gt;       {&lt;br /&gt;          tf = Boolean.FALSE;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return (Boolean) tf;&lt;br /&gt;  }&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/div&gt;  &lt;ul&gt;&lt;li class="MsoNormal" style=""&gt;Now      bind the Supplier Name attribute to the transient attribute in the page      controller’s processRequest method:&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;OAMessageLovInputBean supplierNameBean = (OAMessageLovInputBean) webBean.findIndexedChildRecursive(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                "SupplierName");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;supplierNameBean&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.setAttributeValue(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            RENDERED_ATTR,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            new OADataBoundValueViewObject(&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;supplierNameBean&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                "&lt;/span&gt;SupplierNameRendered&lt;span style="font-family:courier new;"&gt;", "SupplierVO1",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                false));&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;o:p&gt;&lt;/o:p&gt;The      rendering of my attribute was based on the value of the attribute      “SupplierYn” in the view object; to enable the updating change “Action      Type” attribute to “fireAction”:&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;There it is four easy steps to enable PPR on a table.&lt;br /&gt;&lt;/p&gt;&lt;span style=""&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype id="_x0000_t75" coordsize="21600,21600" spt="75" preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"&gt;  &lt;v:stroke joinstyle="miter"&gt;  &lt;v:formulas&gt;   &lt;v:f eqn="if lineDrawn pixelLineWidth 0"&gt;   &lt;v:f eqn="sum @0 1 0"&gt;   &lt;v:f eqn="sum 0 0 @1"&gt;   &lt;v:f eqn="prod @2 1 2"&gt;   &lt;v:f eqn="prod @3 21600 pixelWidth"&gt;   &lt;v:f eqn="prod @3 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @0 0 1"&gt;   &lt;v:f eqn="prod @6 1 2"&gt;   &lt;v:f eqn="prod @7 21600 pixelWidth"&gt;   &lt;v:f eqn="sum @8 21600 0"&gt;   &lt;v:f eqn="prod @7 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @10 21600 0"&gt;  &lt;/v:formulas&gt;  &lt;v:path extrusionok="f" gradientshapeok="t" connecttype="rect"&gt;  &lt;o:lock ext="edit" aspectratio="t"&gt; &lt;/v:shapetype&gt;&lt;v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:332.85pt;"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\hanekoan\LOCALS~1\Temp\msohtml1\01\clip_image001.gif" title="BoundValuesVOAttribute"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115156466191076306?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115156466191076306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115156466191076306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115156466191076306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115156466191076306'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/06/oaf-tables-and-ppr.html' title='OAF - Tables and PPR'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115098495852580696</id><published>2006-06-22T15:00:00.000+01:00</published><updated>2006-06-23T06:57:37.583+01:00</updated><title type='text'>Viva le Resistance, Viva Mozilla!</title><content type='html'>Many of us are content to use IE for all our browser needs, but few know that there is an alternative. Mozilla Firefox is a open-source browser that some &lt;a href="http://m-net.net.nz/index.php?option=com_content&amp;task=view&amp;amp;amp;id=303&amp;amp;Itemid=253"&gt;ten percent&lt;/a&gt; of the web uses, and which has been certified for use with &lt;a href="http://blogs.oracle.com/schan/2006/06/07#a288"&gt;Oracle EBS 11i&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;u1:p&gt;&lt;/u1:p&gt;I have been using Firefox for just more then a year, it is a very stable and well tested product that can be installed and immediately used as your main browser. There is also a number of plugin’s and extensions, &lt;a href="http://awads.net/wp/2005/08/01/oracle-firefox-search-plugin/"&gt;Eddie Awad&lt;/a&gt; created a very useful plugin that allows you to search Metalink and Oracle Docs direct from your browser.&lt;u1:p&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/u1:p&gt;&lt;br /&gt;&lt;br /&gt;So, help stem the tide, go ahead, &lt;a href="http://www.mozilla.com/firefox/central/"&gt;check it out&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115098495852580696?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115098495852580696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115098495852580696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115098495852580696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115098495852580696'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/06/viva-le-resistance-viva-mozilla.html' title='Viva le Resistance, Viva Mozilla!'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115072538739306271</id><published>2006-06-19T14:54:00.001+01:00</published><updated>2008-03-04T07:58:46.558Z</updated><title type='text'>Find the right JDeveloper Patch for OAF development</title><content type='html'>&lt;p class="MsoNormal"&gt;I have read a number of questions regarding what JDeveloper version should be used for OAF development. After a recent upgrade of our development system from 11.5.9 to 11.5.10 CU2, I did some research on Metalink and found the following info regarding JDeveloper versions:&lt;/p&gt;  &lt;p&gt;Current JDeveloper patches:&lt;/p&gt;  &lt;ol start="1" type="1"&gt;&lt;li class="MsoNormal" style=""&gt;Patch 4045639 -      9IJDEVELOPER WITH OA EXTENSION ARU FOR FWK.H &lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Patch 4141787 -      9IJDEVELOPER WITH OA EXTENSION ARU FOR CU1 &lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Patch 4573517 - Oracle9i      JDeveloper with OA Extension for 11.5.10 CU2 &lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Patch 4725670 -      9IJDEVELOPER WITH OA EXTENSION ARU FOR 11i10 RUP3&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;To determine which patch to use, you can simply check the framework version in your instance by using http://host:port/OA_HTML/OAInfo.jsp, then choose the matched one. &lt;/p&gt;            &lt;p class="MsoNormal"&gt;11.5.10K = patch 4045639&lt;br /&gt;11.5.101CU = patch 4141787&lt;br /&gt;11.5.102CU = patch 4573517&lt;br /&gt;11.5.103CU = patch 4725670&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;It would be interesting to have a survey regarding what framework versions are being used for OAF development. Please post your current development version in a comment; I will publish the results at a later stage.&lt;/p&gt;Checkout &lt;a href="https://metalink.oracle.com"&gt;Metalink&lt;/a&gt; note 416708.1 for the up to date list of OAF releases.&lt;span style="font-family:helvetica;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115072538739306271?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115072538739306271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115072538739306271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115072538739306271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115072538739306271'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/06/find-right-jdeveloper-patch-for-oaf.html' title='Find the right JDeveloper Patch for OAF development'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29925072.post-115070957412557200</id><published>2006-06-19T10:05:00.000+01:00</published><updated>2006-11-27T23:38:22.060Z</updated><title type='text'>Blogging</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);"&gt;The main aim of this Blog is to share my experiences as an Oracle e-Business Suite (EBS) developer. I will also from time to time blog about any subject that made me laugh, cry, angry or I feel would be of interest.&lt;/span&gt;&lt;br /&gt;&lt;p style="color: rgb(0, 0, 0);" class="MsoNormal"&gt;Just to get everybody thinking here is a short list of EBS topics I will be covering: &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul style="color: rgb(0, 0, 0);" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Oracle Application      Framework Development, Extension and Personalization&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Database Performance      (Development Specific) &lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;SQL &amp; PL/SQL Concurrent      Development&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Open Interfaces and API's &lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Forms, Reports, CUSTOM      Library development and customization&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Workflow Development and      Customization&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Development Tools (JDev,      Forms, Reports, TOAD, etc.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p style="color: rgb(0, 0, 0);" class="MsoNormal"&gt;All comments, anonymous or otherwise, fully appreciated.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29925072-115070957412557200?l=andrieshanekom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrieshanekom.blogspot.com/feeds/115070957412557200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29925072&amp;postID=115070957412557200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115070957412557200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29925072/posts/default/115070957412557200'/><link rel='alternate' type='text/html' href='http://andrieshanekom.blogspot.com/2006/06/blogging.html' title='Blogging'/><author><name>Andries Hanekom</name><uri>http://www.blogger.com/profile/14293566205446799252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
