<?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-2132893136140848212</id><updated>2012-01-29T16:37:58.576-07:00</updated><category term='ORACLE'/><category term='VPD'/><category term='MOCKUPS'/><category term='SQL'/><category term='CSS'/><category term='JOBS'/><category term='PL/SQL'/><category term='APEX'/><category term='ORACLE APEX'/><category term='demo'/><category term='ODTUG'/><category term='console'/><category term='VIRTUALBOX'/><category term='WIREFRAME'/><category term='console wrapper'/><category term='ORACLE XE'/><category term='twitter'/><category term='KSCOPE'/><category term='APEX PLUGIN'/><category term='jQUERY UI'/><category term='JavaScript'/><category term='Kaleidoscope'/><category term='APEXPOSED'/><category term='apex.stackexchange.com'/><category term='demo.talkapex.com'/><title type='text'>Martin Giffy D'Souza on Oracle APEX</title><subtitle type='html'>Oracle APEX hints and tips</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.talkapex.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default?start-index=101&amp;max-results=100'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>126</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5643131833673752327</id><published>2011-12-13T07:00:00.000-07:00</published><updated>2011-12-13T07:00:02.206-07:00</updated><title type='text'>APEX Process Condition with Multiple Buttons</title><content type='html'>For new APEX developers, adding a page process condition can be a bit confusing at first when basing it on multiple buttons. This post will go through a scenario on how to easily use multiple buttons in a page condition.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;The Setup&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;A classic example of having multiple buttons on a page is when you want to save or update a record. The Save button should only appear for new records, whereas the Update button should only appear for existing records. The catch is that when saving and updating the page you may need to run the same process. &lt;br /&gt;&lt;br /&gt;The following setup highlights this classic example. Create a region in a page with two fields: P1_X and P1_Y. Then create three buttons: Save, Update, and Cancel. All three buttons should submit the page and an example of the page is shown below&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Th7GcS6UnvY/TtpJnsNnnqI/AAAAAAAAEFQ/yTphEesUKKo/s1600/process_condition_setup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Th7GcS6UnvY/TtpJnsNnnqI/AAAAAAAAEFQ/yTphEesUKKo/s1600/process_condition_setup.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Create the following page process:&lt;br /&gt;Name: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Update P1_Y&lt;/span&gt;&lt;br /&gt;Process Point: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;On Submit - After Computations and Validations&lt;/span&gt;&lt;br /&gt;Process: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;:P1_Y := :P1_X * 2;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Problem&lt;/b&gt;&lt;br /&gt;You'd like this process to run when both the Save and Update buttons are clicked. If you scroll down to the process's conditions area you'll notice that it has an option to restrict the process when a particular button is clicked (shown below). &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jnbkgSKISeE/TtpJnS7sy6I/AAAAAAAAEE8/UNvhZ31djzg/s1600/process_condition_condition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-jnbkgSKISeE/TtpJnS7sy6I/AAAAAAAAEE8/UNvhZ31djzg/s1600/process_condition_condition.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you can see you can only select one button from the list. At first glance the only option that you have to resolve the two button issue is to create a new process, which is a copy of the existing process, and set the condition to the other button. That doesn't necessarily make sense and can be an obvious maintenance nightmear.&lt;br /&gt;&lt;br /&gt;The good news is that there is a very simple way to get around this issue. When you click a button it actually sets the &lt;a href="http://docs.oracle.com/cd/E23903_01/doc/doc.41/e21674/concept_sub.htm#BEIFJJBC" target="_blank"&gt;REQUEST&lt;/a&gt; variable to the button name. The button name is defined in the button. For example the Save button's request is actually SAVE (shown below).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-NAhzVX9cpf0/TtpJn8-vFYI/AAAAAAAAEFM/kJn-_bwXs-Q/s1600/process_condition_button.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-NAhzVX9cpf0/TtpJn8-vFYI/AAAAAAAAEFM/kJn-_bwXs-Q/s1600/process_condition_button.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Going back to the original problem, and leveraging what we know about the REQUEST variable, you can modify the process's condition to have it run when either the Save or Update buttons are selected as shown below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-M_w6hjuT-EQ/TtpJngA96WI/AAAAAAAAEFA/PZTYRg5XwX4/s1600/process_condition_condition_good.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-M_w6hjuT-EQ/TtpJngA96WI/AAAAAAAAEFA/PZTYRg5XwX4/s1600/process_condition_condition_good.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;Note: They're other ways to use the REQUEST variable in the conditions section. This one highlights a very simple use.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5643131833673752327?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5643131833673752327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/12/apex-process-condition-with-multiple.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5643131833673752327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5643131833673752327'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/12/apex-process-condition-with-multiple.html' title='APEX Process Condition with Multiple Buttons'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Th7GcS6UnvY/TtpJnsNnnqI/AAAAAAAAEFQ/yTphEesUKKo/s72-c/process_condition_setup.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2250716494016820405</id><published>2011-12-08T07:00:00.000-07:00</published><updated>2011-12-08T07:00:00.945-07:00</updated><title type='text'>Moving the APEX Developer Toolbar</title><content type='html'>When you are developing an APEX application there may be certain situations (primarily depending on your page template) that require you to move the APEX toolbar from the bottom of the screen. The screen shot below shows such a case where there is content all the way to the end of the screen and the toolbar is preventing you from accessing/clicking on something at the bottom. If you try to click the last Edit button nothing happens since the toolbar is overlaying it. &lt;i&gt;Note: I modified the page template to highlight this issue.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0g2ayhW6PWU/Ttpjlmd51TI/AAAAAAAAEFw/9rO2p4y4UAk/s1600/toolbar_issue.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://1.bp.blogspot.com/-0g2ayhW6PWU/Ttpjlmd51TI/AAAAAAAAEFw/9rO2p4y4UAk/s400/toolbar_issue.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This doesn't occur very often but when it does there's a simple solution to move the toolbar from the bottom to the top of the screen. Run the following JavaScript code in your browser's console window and the toolbar will move to the top of the page.&lt;br /&gt;&lt;pre class="brush: js"&gt;//Note on older versions of APEX you'll need to check the toolbar's ID&lt;br /&gt;$('#apex-dev-toolbar').css({&lt;br /&gt;  top: 0,&lt;br /&gt;  height: '22px'&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;Once at the top it will look like the image below. Note that the logout link (top right corner) is no longer clickable.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fKt5RGq7A3s/TtphxW0ipVI/AAAAAAAAEFg/G1P671C5oqU/s1600/toolbar_top.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="140" src="http://3.bp.blogspot.com/-fKt5RGq7A3s/TtphxW0ipVI/AAAAAAAAEFg/G1P671C5oqU/s400/toolbar_top.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If this happens a lot in development you could create a special button for the JavaScript code and add it as a dynamic action.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2250716494016820405?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2250716494016820405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/12/moving-apex-developer-toolbar.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2250716494016820405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2250716494016820405'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/12/moving-apex-developer-toolbar.html' title='Moving the APEX Developer Toolbar'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-0g2ayhW6PWU/Ttpjlmd51TI/AAAAAAAAEFw/9rO2p4y4UAk/s72-c/toolbar_issue.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-9118556214060933737</id><published>2011-12-05T07:00:00.000-07:00</published><updated>2011-12-05T08:17:39.284-07:00</updated><title type='text'>apex_application.stop_apex_engine</title><content type='html'>Something that was upgraded in APEX 4.1 with little to no far fair was the addition of a new (supported) procedure called &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;apex_application.stop_apex_engine&lt;/span&gt;. The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;apex_application.stop_apex_engine&lt;/span&gt; essentially stops the APEX engine and, as a result, will stop processing the rest of the page. It is most commonly used when forcing URL redirects from a page.&lt;br /&gt;&lt;br /&gt;Before APEX 4.1 you could still use a similar feature however it was an unsupported variable in the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;apex_application&lt;/span&gt; package called &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;g_unrecoverable_error&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I've included an example below of the before vs. after 4.1 ways to stop the APEX engine.&lt;br /&gt;&lt;pre class="brush: sql; highlight: [4, 9]"&gt;-- Pre-APEX 4.1 (not supported)&lt;br /&gt;...&lt;br /&gt;owa_util.redirect_url('http://www.clarifit.com');&lt;br /&gt;apex_application.g_unrecoverable_error:= true; -- End APEX session&lt;br /&gt;&lt;br /&gt;-- APEX 4.1 and above (supported)&lt;br /&gt;...&lt;br /&gt;owa_util.redirect_url('http://www.clarifit.com');&lt;br /&gt;apex_application.stop_apex_engine; -- End APEX session&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;For those who have used the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;apex_application.g_unrecoverable_error&lt;/span&gt; variable in some of your applications you should go back and upgrade to the new procedure. For more information about the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;stop_apex_engine&lt;/span&gt; procedure please read the APEX &lt;a href="http://docs.oracle.com/cd/E23903_01/doc/doc.41/e21676/apex_app.htm#BABGIDII" target="_blank"&gt;documentation&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-9118556214060933737?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/9118556214060933737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/12/apexapplicationstopapexengine.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/9118556214060933737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/9118556214060933737'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/12/apexapplicationstopapexengine.html' title='apex_application.stop_apex_engine'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-4407715980347737675</id><published>2011-12-01T07:03:00.001-07:00</published><updated>2011-12-01T07:03:01.148-07:00</updated><title type='text'>ClariFit From/To Date Picker Plug-in</title><content type='html'>In my &lt;a href="http://www.talkapex.com/2011/11/min-and-max-dates-in-apex.html"&gt;previous post&lt;/a&gt; I discussed an issue about dynamic min and max dates using the APEX date picker. If you haven't read the article please take a few minutes before continuing.&lt;br /&gt;&lt;br /&gt;At the end of my &lt;a href="http://www.talkapex.com/2011/11/min-and-max-dates-in-apex.html"&gt;previous post&lt;/a&gt; I left off with the following question: How do you solve the dynamic min/max date issue? The answer is to use a new plugin that I created called &lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:700:0::NO:::" target="_blank"&gt;ClariFit From To Date Picker&lt;/a&gt;. This is a free and open source plugin created as part of the &lt;a href="http://www.clarifit.com/" target="_blank"&gt;ClariFit&lt;/a&gt; plugin set and is covered in detail in the book: &lt;a href="http://goo.gl/089zi" target="_blank"&gt;Expert Oracle Application Express Plugins&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The plugin is an item plugin. Its options (shown below) are similar to the APEX date picker. The main difference is that instead of having Minimum and Maximum date attributes you now have Date Type and Corresponding Date Item attributes. The Date Type can either be a From or To date (i.e. min/max date). The Corresponding Date Item is the item name for the date picker that will determine the date's restrictions.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-f8_DJfxd6CM/Ts6_686oU4I/AAAAAAAAEDs/nKfmswd-1vU/s1600/plugin_date_picker_settings.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-f8_DJfxd6CM/Ts6_686oU4I/AAAAAAAAEDs/nKfmswd-1vU/s1600/plugin_date_picker_settings.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I've created a demo on &lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:700:0::NO:::" target="_blank"&gt;plugins.clarifit.com&lt;/a&gt;. If you select a date in the From Date field (in this case 24-Nov-2011) then open the To Date date picker you'll notice that you can't select anything before 24-Nov-2011 as shown below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-RBnZdaHdxbg/Ts6_6p7r0XI/AAAAAAAAEDk/K0C2JsQstI4/s1600/plugin_date_picker.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-RBnZdaHdxbg/Ts6_6p7r0XI/AAAAAAAAEDk/K0C2JsQstI4/s1600/plugin_date_picker.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The plugin also comes bundled with some nifty features that may not be visible at first but are really useful:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Allows for different From/To date formats (i.e. they don't need to be the same).&amp;nbsp; &lt;/li&gt;&lt;li&gt;Built in validations:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Validates that the input is a valid date&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Validates that From Date is less than or equal to the To Date&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Javascript Console instrumentation (run the page in debug mode and look at the console)&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Note: The built in validations will run as part of the page's validations and are only executed if you enable validation as part of your submit button.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The plugin can be downloaded from &lt;a href="http://apex-plugin.com/oracle-apex-plugins/item-plugin/clarifit-from-to-date-picker_154.html" target="_blank"&gt;apex-plugin.com&lt;/a&gt;.&lt;i&gt; &lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-4407715980347737675?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/4407715980347737675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/12/clarifit-fromto-date-picker-plug-in.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4407715980347737675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4407715980347737675'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/12/clarifit-fromto-date-picker-plug-in.html' title='ClariFit From/To Date Picker Plug-in'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-f8_DJfxd6CM/Ts6_686oU4I/AAAAAAAAEDs/nKfmswd-1vU/s72-c/plugin_date_picker_settings.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3071994143254035222</id><published>2011-11-30T13:20:00.001-07:00</published><updated>2011-12-01T07:03:43.001-07:00</updated><title type='text'>Min and Max Dates in APEX</title><content type='html'>APEX 4.0 introduced native support for the &lt;a href="http://jqueryui.com/demos/datepicker/" target="_blank"&gt;jQuery UI Date Picker&lt;/a&gt;. When you create a date item in APEX you now have the option to set a Minimum and Maximum date as shown below. The catch is that those dates restrictions are defined when the page is rendered and aren't updated in real time. This is an issue if you want those constraints to dynamically change based on user input.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--ly8YwuJPOU/Ts62l3lym0I/AAAAAAAAEDU/0H3Yl9uyeXI/s1600/date_picker_settings.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="220" src="http://2.bp.blogspot.com/--ly8YwuJPOU/Ts62l3lym0I/AAAAAAAAEDU/0H3Yl9uyeXI/s320/date_picker_settings.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Date Picker Settings&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;In some cases you'll need the min and max dates to change dynamically. A classic example is when you book a plane ticket and set your departure and return dates. When you select a departure date then select a return date, the return date can't be before the departure date. Dates before the departure date are usually greyed out. Using APEX you could try to implement this example by doing the following:&lt;br /&gt;&lt;br /&gt;- Create a Date Item, P1_DEPT_DATE. Set the &lt;i&gt;Maxium Date&lt;/i&gt; to be &amp;amp;P1_RETURN_DATE.&lt;br /&gt;- Create a Date Item, P1_RETURN_DATE. Set the &lt;i&gt;Mininum Date&lt;/i&gt; to be &amp;amp;P1_DEPT_DATE.&lt;br /&gt;&lt;br /&gt;Run the page and select a date for the Departure Date (in this example 24-Nov-11). Next, select a Return Date. You'll notice that the calendar picker does not prevent you from selecting a return date before 24-Nov-2011.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-KQduHbQfqZo/Ts63sHZ2sNI/AAAAAAAAEDc/u_BtVED6DAA/s1600/date_picker_restrictions.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="238" src="http://4.bp.blogspot.com/-KQduHbQfqZo/Ts63sHZ2sNI/AAAAAAAAEDc/u_BtVED6DAA/s320/date_picker_restrictions.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;i&gt;Note: If you submit the page now it'll raise an exception since the Min and Max attributes requires the date to be in YYYYMMDDHH24MI format.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So how do you have the min and max date restrictions change based on the user input? Excellent question. My &lt;a href="http://www.talkapex.com/2011/12/clarifit-fromto-date-picker-plug-in.html"&gt;next post&lt;/a&gt; introduces a plugin that resolves this issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3071994143254035222?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3071994143254035222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/11/min-and-max-dates-in-apex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3071994143254035222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3071994143254035222'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/11/min-and-max-dates-in-apex.html' title='Min and Max Dates in APEX'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/--ly8YwuJPOU/Ts62l3lym0I/AAAAAAAAEDU/0H3Yl9uyeXI/s72-c/date_picker_settings.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7590420476541601556</id><published>2011-11-29T11:03:00.001-07:00</published><updated>2011-11-29T11:04:00.149-07:00</updated><title type='text'>ClariFit Dialog Plugin</title><content type='html'>Over a year ago I released the &lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:400:0" target="_blank"&gt;ClariFit Simple Modal&lt;/a&gt; plugin. Since it's inception it's been downloaded almost 5000 times and has been used in several production applications (that I know of).&lt;br /&gt;&lt;br /&gt;Today I'm please to release an "updated" version of plugin called &lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:800:0::NO:::" target="_blank"&gt;ClariFit Dialog&lt;/a&gt; plugin. Like the Simple Modal plugin, the Dialog plugin is a dynamic action and allows you to have a modal or dialog window. It also has a lot of new features (listed below). Going forward if you're going to use a modal/dialog window plug-in I recommend using the ClariFit Dialog plugin.&lt;br /&gt;&lt;br /&gt;A demo is available on &lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:800:0"&gt;plugins.clarifit.com&lt;/a&gt; and it can be downloaded from &lt;a href="http://apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/clarifit-dialog_152.html" target="_blank"&gt;apex-plugin.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-AuQ8Zqz0vB0/TtGsh5-MX9I/AAAAAAAAED0/rXO_-mv-A-A/s1600/dialog_plugin_settings.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-AuQ8Zqz0vB0/TtGsh5-MX9I/AAAAAAAAED0/rXO_-mv-A-A/s1600/dialog_plugin_settings.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;ClariFit Dialog Plugin Settings&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;List of features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Uses the jQuery UI dialog code and leverages the jQuery UI theme currently incorporated in your APEX application. &lt;/li&gt;&lt;li&gt;Support for open/close directly in same plugin.&lt;/li&gt;&lt;li&gt;Option to have either a modal or dialog window.&lt;/li&gt;&lt;li&gt;Hide affected elements on page load. If set, this option will hide the region after the page is loaded. This removes the need to have separate region templates.&lt;/li&gt;&lt;li&gt;Chose visible state of the modal window after it's closed.&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/2132893136140848212-7590420476541601556?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7590420476541601556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/11/clarifit-dialog-plugin.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7590420476541601556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7590420476541601556'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/11/clarifit-dialog-plugin.html' title='ClariFit Dialog Plugin'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-AuQ8Zqz0vB0/TtGsh5-MX9I/AAAAAAAAED0/rXO_-mv-A-A/s72-c/dialog_plugin_settings.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1116466295764487167</id><published>2011-11-29T09:41:00.001-07:00</published><updated>2011-11-29T09:41:53.537-07:00</updated><title type='text'>Remainder of 2011</title><content type='html'>Dear Readers,&lt;br /&gt;&lt;br /&gt;It's been a while (over 4 months) since I've posted a technical article on this blog. After presenting at &lt;a href="http://kscope12.com/" target="_blank"&gt;ODTUG KScope&lt;/a&gt; this summer I've been really busy working at &lt;a href="http://www.clarifit.com/" target="_blank"&gt;ClariFit&lt;/a&gt; and with other commitments. During the past four months there have been many times where I would have loved to roll up my sleeves and write a few articles but unfortunately other priorities took over.&lt;br /&gt;&lt;br /&gt;The rest of my 2011 calendar is filling up quickly and I hope to squeeze in a few more articles by the end of the year. Here's what you can expect for the remainder of 2011:&amp;nbsp; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Free Ask the &lt;a href="http://www.clarifit.com/1/post/2011/11/the-ask-the-clarifit-experts-webinar-has-been-rescheduled.html" target=""&gt;ClariFit Experts Webinar&lt;/a&gt; on Wednesday December 14th at 1:30 PM EST. &lt;i&gt;Note: it's still not to late to submit an APEX or PL/SQL question. Check the link for more info on how to submit questions and register.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Two free plug-ins to be launched this week (actually one will be today!)&lt;/li&gt;&lt;li&gt;Guest blog post on &lt;a href="http://www.allthingsoracle.com/" target="_blank"&gt;All Things Oracle&lt;/a&gt; about the &lt;a href="http://goo.gl/089zi" target="_blank"&gt;Expert Oracle Application Express Plugins&lt;/a&gt; book.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Last but not least, (time permitting of course) a few APEX related articles. I have a very large list to write about and really look forward to dig into them.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&amp;nbsp;- Martin&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1116466295764487167?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1116466295764487167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/11/remainder-of-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1116466295764487167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1116466295764487167'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/11/remainder-of-2011.html' title='Remainder of 2011'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-71997516905160140</id><published>2011-11-15T08:47:00.001-07:00</published><updated>2011-11-25T08:37:26.732-07:00</updated><title type='text'>Ask the ClariFit Experts Webinar</title><content type='html'>On December 14th at 1:30 PM EST Chris Hritzuk and I will be taking part in an “Ask the ClariFit Experts” webinar hosted by my company, &lt;a href="http://www.clarifit.com/"&gt;ClariFit Inc&lt;/a&gt;. Leading up to the webinar the development team at ClariFit will be accepting APEX, SQL, and PL/SQL questions by email at &lt;i&gt;AskTheExperts@clarifit.com&lt;/i&gt;. The plan is to choose a subset of questions from the list received and provide a live, step-by-step demonstration of the solution during the webinar. We’ll also be leaving some time at the end of the session to field any questions that come up during the webinar.&lt;br /&gt;&lt;br /&gt;To find out more about the webinar, including how to sign up, click here: &lt;a href="http://www.clarifit.com/1/post/2011/11/ask-the-clarifit-experts-webinar.html"&gt;http://www.clarifit.com/1/post/2011/11/ask-the-clarifit-experts-webinar.html&lt;/a&gt;&lt;a href="http://www.clarifit.com/1/post/2011/11/ask-the-clarifit-experts-webinar.html"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-71997516905160140?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/71997516905160140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/11/ask-clarifit-experts-webinar.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/71997516905160140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/71997516905160140'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/11/ask-clarifit-experts-webinar.html' title='Ask the ClariFit Experts Webinar'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3482329673942395493</id><published>2011-10-12T09:52:00.000-06:00</published><updated>2011-10-12T09:52:14.811-06:00</updated><title type='text'>Running for ODTUG Board of Directors</title><content type='html'>For nearly four years I’ve enjoyed giving back to the Oracle APEX community in various ways such as the Oracle Forums, this blog, talks at various conferences, authoring free plug-ins, and webinars to name a few. Now I want to continue to help out in a different fashion by running for the ODTUG Board of Directors. I believe I will be able to help promote and grow the APEX community through the Board, and I would relish the chance represent all APEX developers.&lt;br /&gt;&lt;br /&gt;I’m officially running for the ODTUG Board of Directors and would like your support. If you're a full (paid) ODTUG member please vote for the Board of Directors here: &lt;a href="http://goo.gl/8xqxs"&gt;http://goo.gl/8xqxs&lt;/a&gt;&amp;nbsp; Below is a copy of my official nomination:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Campaign Statement&lt;/b&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;I have attended ODTUG Kaleidoscope for several consecutive years and have been a presenter for the last three. The conference has allowed me to develop strong relationships with many others in the community, and the importance of these relationships has proven invaluable. I continually strive to give back to the community, using my personal time to answer questions through email, blogs, the Oracle forums, and by writing technical books. I would like to continue this spirit of giving back by joining the ODTUG Board of Directors.As a new board member I will bring a fresh perspective and out-of-the-box ideas to help promote ODTUG and deliver our message to the world. I am fortunate enough to have a successful blog with several thousand unique monthly visitors. It is through this platform, along with other opportunities such as my consulting firm blog, social networking, and the multiple annual conferences that I attend from which I intend to help share the ODTUG mission and values.The Board plays a pivotal leadership role as both a driving force and a face of the ODTUG community. I feel that my professional experience as a leader and mentor will help the Board guide and develop ODTUG for the future. The Board has responsibility to its most important group - the members. I will help ensure that the Board serves as both a voice and an ear for the entire ODTUG community; developers, DBAs, and technical experts of all things Oracle.Many thanks for your consideration.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Biographical Statement&lt;/b&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Martin Giffy D’Souza is an Oracle ACE and award winning presenter and speaker. Most recently Martin was honored with the ODTUG Kaleidoscope 2011 Presenter of the Year award. Martin also serves as a Co-founder &amp;amp; CTO at ClariFit Inc., a consulting firm specializing in Oracle solutions. Martin’s career has seen him hold a range of positions within award winning companies and his experience in the technology industry has been focused on developing database-centric web applications using the Oracle technology stack. Martin is the author of the highly recognized blog www.TalkApex.com, and he has co-authored several APEX books including Expert Oracle Application Express, a collaboration of some of the most renowned APEX developers in the industry. He has presented at numerous international conferences such as ODTUG, APEXposed, and COUG. Martin holds a Computer Engineering degree from Queen’s University in Ontario, Canada.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I appreciate all the support.&lt;br /&gt;&lt;br /&gt;- Martin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3482329673942395493?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3482329673942395493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/10/running-for-odtug-board-of-directors.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3482329673942395493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3482329673942395493'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/10/running-for-odtug-board-of-directors.html' title='Running for ODTUG Board of Directors'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-6321416760402781479</id><published>2011-07-13T07:00:00.000-06:00</published><updated>2011-07-13T07:00:04.592-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='KSCOPE'/><title type='text'>How My Family Solves Computer Problems</title><content type='html'>In my talk, &lt;a href="http://www.talkapex.com/2011/07/how-to-be-creative-ii-presentation.html" style="font-style:italic;"&gt;How to be Create II&lt;/a&gt;, at ODTUG Kscope 11 I discussed what sometimes happens when users try to fix problems themselves. This is a video clip from my presentation on how my family tries to resolve computer problems. &lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/H5mozAx-r6E" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;And yes it is a true story. I got those emails from my family...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="https://twitter.com/#!/Chris_Hritzuk" target="_blank"&gt;Chris Hritzuk&lt;/a&gt; for recording this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-6321416760402781479?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/6321416760402781479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/07/how-my-family-solves-computer-problems.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6321416760402781479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6321416760402781479'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/07/how-my-family-solves-computer-problems.html' title='How My Family Solves Computer Problems'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/H5mozAx-r6E/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-4460969046067528270</id><published>2011-07-12T07:00:00.000-06:00</published><updated>2011-07-12T07:00:02.552-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='KSCOPE'/><title type='text'>How to be Creative II - Presentation Slides</title><content type='html'>You can download the slides of the &lt;span style="font-style:italic;"&gt;How to be Creative II&lt;/span&gt; presentation that I gave at &lt;a href="http://www.kscope11.com" target="_blank"&gt;ODTUG Kscope 11&lt;/a&gt; from the following link: &lt;a href="http://goo.gl/2MP9l" target="_blank"&gt;http://goo.gl/2MP9l&lt;/a&gt; Please note that the slides have been modified for handout purposes (i.e. not the exact same that I showed in the presentation).&lt;br /&gt;&lt;br /&gt;The slides should also be updated soon on the ODTUG Kscope Scheduler: &lt;a href="http://caat.odtug.com/ODTUG_registration_menu.html" target="_blank"&gt;http://caat.odtug.com/ODTUG_registration_menu.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-RFV7LwrJSVQ/ThZOQjv8csI/AAAAAAAAD88/aS58r4R-k2g/s1600/How%2Bto%2Bbe%2BCreative%2BII_title.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/-RFV7LwrJSVQ/ThZOQjv8csI/AAAAAAAAD88/aS58r4R-k2g/s400/How%2Bto%2Bbe%2BCreative%2BII_title.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5626770830827221698" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-4460969046067528270?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/4460969046067528270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/07/how-to-be-creative-ii-presentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4460969046067528270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4460969046067528270'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/07/how-to-be-creative-ii-presentation.html' title='How to be Creative II - Presentation Slides'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-RFV7LwrJSVQ/ThZOQjv8csI/AAAAAAAAD88/aS58r4R-k2g/s72-c/How%2Bto%2Bbe%2BCreative%2BII_title.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-976841808984747146</id><published>2011-07-11T07:00:00.001-06:00</published><updated>2011-07-11T07:00:07.789-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Region Errors - Part 3</title><content type='html'>&lt;span style="color:red;"&gt;&lt;span style="font-weight:bold;"&gt;Disclaimer&lt;/span&gt;: This is an advanced post that discusses and modifies some of the inner workings of APEX.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://www.talkapex.com/2010/10/apex-region-errors-part-2.html"&gt;APEX Region Errors - Part 2&lt;/a&gt; I discussed how to add triggers on the APEX Activity Log tables to store information in custom error tables when a user encounters an APEX region error.&lt;br /&gt;&lt;br /&gt;Instead of storing the information in custom error tables you can leverage the APEX Feedback tool and trigger an automatic feedback entry. This may be a preferred option as you don't need to create custom tables and the feedback tool provides a lot of information. &lt;br /&gt;&lt;br /&gt;Before continuing it's important that you know how to use the new APEX Feedback tool. If you don't know about the APEX Feedback tool I suggest that you read about how to create the feedback link (&lt;a href="http://dgielis.blogspot.com/2010/03/apex-40-feedback-link.html" target="_blank"&gt;http://dgielis.blogspot.com/2010/03/apex-40-feedback-link.html&lt;/a&gt;) and how to access the feedback tool (&lt;a href="http://dgielis.blogspot.com/2010/03/apex-40-looking-at-feedback-through.html" target="_blank"&gt;http://dgielis.blogspot.com/2010/03/apex-40-looking-at-feedback-through.html&lt;/a&gt;). Try implementing it in a dummy application to see what you can do with it.&lt;br /&gt;&lt;br /&gt;The following triggers will enter a feedback entry each time a region error occurs:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; color:red;"&gt;&lt;span style="font-weight:bold;"&gt;Disclaimer (again)&lt;/span&gt;: Modifying anything in the APEX schema will put your APEX instance in an unsupported state. Please proceed with caution. I take no responsibility for any negative outcomes from this.&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- NOTE: Do this as the APEX_040000 user or a privlidged user such as SYSTEM&lt;br /&gt;CREATE OR REPLACE TRIGGER apex_040000.trg_apex_activity_log1_air&lt;br /&gt;  AFTER INSERT&lt;br /&gt;  ON apex_040000.wwv_flow_activity_log1$&lt;br /&gt;  FOR EACH ROW&lt;br /&gt;  WHEN (new.SQLERRM IS NOT NULL)&lt;br /&gt;DECLARE&lt;br /&gt;BEGIN &lt;br /&gt;  -- Log as feedback&lt;br /&gt;  apex_util.submit_feedback (&lt;br /&gt;    p_comment         =&gt; 'AUTO MSG: Region Error', -- Put a comment here that can be used to easily identify auto generated feedback messages&lt;br /&gt;    p_type            =&gt; 3, -- Bug. See API documentation for different values&lt;br /&gt;    p_application_id  =&gt; :new.flow_id,&lt;br /&gt;    p_page_id         =&gt; :new.step_id,&lt;br /&gt;    p_email           =&gt; null,&lt;br /&gt;    p_label_01        =&gt; 'Error Message', -- You can add up to 8 label/attributes. See API documentation for more information&lt;br /&gt;    p_attribute_01    =&gt; :new.sqlerrm,&lt;br /&gt;    p_label_02        =&gt; 'Component Type',&lt;br /&gt;    p_attribute_02    =&gt; :new.sqlerrm_component_type,&lt;br /&gt;    p_label_03        =&gt; 'Component Name',&lt;br /&gt;    p_attribute_03    =&gt; :new.sqlerrm_component_name&lt;br /&gt;    );&lt;br /&gt;   &lt;br /&gt;   -- Could use APEX_MAIL to send a notification to a list of developers to take a look at problem&lt;br /&gt;   -- This is entirely optional. Modify as required&lt;br /&gt;   apex_mail.send(&lt;br /&gt;    p_to =&gt; 'someone@yourorg.com', &lt;br /&gt;    p_from =&gt; 'someone@yourorg.com',&lt;br /&gt;    p_body =&gt; 'Region Error Occured. Please Check Feedback',&lt;br /&gt;    p_body_html =&gt; '',&lt;br /&gt;    p_subj =&gt; 'APEX Region Error');&lt;br /&gt;    &lt;br /&gt;END;&lt;br /&gt;/&lt;/pre&gt;And... (differences are highlighted)&lt;br /&gt;&lt;pre class="brush: sql; highlight: [2,4]"&gt;&lt;br /&gt;-- NOTE: Do this as the APEX_040000 user or a privlidged user such as SYSTEM&lt;br /&gt;CREATE OR REPLACE TRIGGER apex_040000.trg_apex_activity_log2_air&lt;br /&gt;  AFTER INSERT&lt;br /&gt;  ON apex_040000.wwv_flow_activity_log2$&lt;br /&gt;  FOR EACH ROW&lt;br /&gt;  WHEN (new.SQLERRM IS NOT NULL)&lt;br /&gt;DECLARE&lt;br /&gt;BEGIN &lt;br /&gt;  -- Log as feedback&lt;br /&gt;  apex_util.submit_feedback (&lt;br /&gt;    p_comment         =&gt; 'AUTO MSG: Region Error', -- Put a comment here that can be used to easily identify auto generated feedback messages&lt;br /&gt;    p_type            =&gt; 3, -- Bug. See API documentation for different values&lt;br /&gt;    p_application_id  =&gt; :new.flow_id,&lt;br /&gt;    p_page_id         =&gt; :new.step_id,&lt;br /&gt;    p_email           =&gt; null,&lt;br /&gt;    p_label_01        =&gt; 'Error Message', -- You can add up to 8 label/attributes. See API documentation for more information&lt;br /&gt;    p_attribute_01    =&gt; :new.sqlerrm,&lt;br /&gt;    p_label_02        =&gt; 'Component Type',&lt;br /&gt;    p_attribute_02    =&gt; :new.sqlerrm_component_type,&lt;br /&gt;    p_label_03        =&gt; 'Component Name',&lt;br /&gt;    p_attribute_03    =&gt; :new.sqlerrm_component_name&lt;br /&gt;    );&lt;br /&gt;   &lt;br /&gt;   -- Could use APEX_MAIL to send a notification to a list of developers to take a look at problem&lt;br /&gt;   -- This is entirely optional. Modify as required&lt;br /&gt;   apex_mail.send(&lt;br /&gt;    p_to =&gt; 'someone@yourorg.com', &lt;br /&gt;    p_from =&gt; 'someone@yourorg.com',&lt;br /&gt;    p_body =&gt; 'Region Error Occured. Please Check Feedback',&lt;br /&gt;    p_body_html =&gt; '',&lt;br /&gt;    p_subj =&gt; 'APEX Region Error');&lt;br /&gt;    &lt;br /&gt;END;&lt;br /&gt;/&lt;/pre&gt;When a region error occurs you can now view the information in Team Development &gt; Feedback.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-uNwLAxFt6PU/ThYGRbJX56I/AAAAAAAAD8s/1mRG91GGGrw/s1600/auto_err_msg_feedback.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 131px;" src="http://1.bp.blogspot.com/-uNwLAxFt6PU/ThYGRbJX56I/AAAAAAAAD8s/1mRG91GGGrw/s400/auto_err_msg_feedback.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5626691680860628898" /&gt;&lt;/a&gt;If you click the &lt;span style="font-style:italic;"&gt;Edit&lt;/span&gt; button you can get a lot of detailed information about was happening when the user encountered the error including all of the values in session state.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-TWL3FrTM1bY/ThYJTD6SEuI/AAAAAAAAD80/oGArcyUL1yE/s1600/auto_err_msg_feedback_dtl.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 378px;" src="http://3.bp.blogspot.com/-TWL3FrTM1bY/ThYJTD6SEuI/AAAAAAAAD80/oGArcyUL1yE/s400/auto_err_msg_feedback_dtl.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5626695007517938402" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-976841808984747146?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/976841808984747146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/07/apex-region-errors-part-3.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/976841808984747146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/976841808984747146'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/07/apex-region-errors-part-3.html' title='APEX Region Errors - Part 3'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-uNwLAxFt6PU/ThYGRbJX56I/AAAAAAAAD8s/1mRG91GGGrw/s72-c/auto_err_msg_feedback.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-6384752360174894239</id><published>2011-07-07T07:00:00.000-06:00</published><updated>2011-07-07T07:00:03.610-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='KSCOPE'/><title type='text'>APEX 4 + HTML 5 = Awesome: Presentation Slides</title><content type='html'>You can download the slides of the &lt;span style="font-style:italic;"&gt;APEX 4 + HTML 5 = Awesome&lt;/span&gt; presentation that I gave last week at &lt;a href="http://kscope11.com" target="_blank"&gt;ODTUG Kscope 11&lt;/a&gt; from the following link: &lt;a href="http://goo.gl/vWW3Z"&gt;http://goo.gl/vWW3Z&lt;/a&gt;  Please note that the slides have been modified for handout purposes (i.e. not the exact same that I showed in the presentation).&lt;br /&gt;&lt;br /&gt;The slides should also be updated soon on the ODTUG Kscope Scheduler: &lt;a href="http://caat.odtug.com/ODTUG_registration_menu.html" target="_blank"&gt;http://caat.odtug.com/ODTUG_registration_menu.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll post the &lt;span style="font-style:italic;"&gt;How to be Creative II&lt;/span&gt; slides in the next few days.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Cn_0hK2YmM0/ThSOIF3w42I/AAAAAAAAD8k/OcRX-3mqYXA/s1600/HTML5%2B%252B%2BAPEX%2B4_title_slide.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-Cn_0hK2YmM0/ThSOIF3w42I/AAAAAAAAD8k/OcRX-3mqYXA/s320/HTML5%2B%252B%2BAPEX%2B4_title_slide.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5625981965265961474" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-6384752360174894239?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/6384752360174894239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/07/apex-4-html-5-awesome-presentation.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6384752360174894239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6384752360174894239'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/07/apex-4-html-5-awesome-presentation.html' title='APEX 4 + HTML 5 = Awesome: Presentation Slides'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Cn_0hK2YmM0/ThSOIF3w42I/AAAAAAAAD8k/OcRX-3mqYXA/s72-c/HTML5%2B%252B%2BAPEX%2B4_title_slide.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3104168425841947709</id><published>2011-07-06T07:20:00.002-06:00</published><updated>2011-07-06T10:22:48.120-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='KSCOPE'/><title type='text'>ODTUG KScope 11 - Recap</title><content type='html'>I had an amazing time in Long Beach CA last week for ODTUG Kscope 11. This was my fourth time attending the Kscope conference and I must say that the ODTUG committee, along with &lt;a href="http://teamycc.com/" target="_blank"&gt;YCC&lt;/a&gt;, made it the best one yet!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Saturday&lt;/span&gt;&lt;br /&gt;It all started for me on Saturday. Once I arrived in Long Beach I went to register right away. Along with registration (which went flawlessly thanks to Lauren) I had my picture taken with Crystal in the new social media lounge. Lori, from &lt;a href="http://teamycc.com/" target="_blank"&gt;YCC&lt;/a&gt;, did an excellent job promoting social media at Kscope 11 and I think it was a huge success.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-ziUSyvV4mgU/ThOAyihuggI/AAAAAAAAD70/WQP6fADDc7k/s1600/269501_10150226718491943_58385296942_7450908_7869679_n.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-ziUSyvV4mgU/ThOAyihuggI/AAAAAAAAD70/WQP6fADDc7k/s320/269501_10150226718491943_58385296942_7450908_7869679_n.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5625981965265961474" /&gt;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;Sunday&lt;/span&gt;&lt;br /&gt;Sunday was the symposium day. Not surprisingly I attended the APEX track which were presentations given by the Oracle APEX team on the upcoming 4.1 features in APEX. &lt;a href="http://michaelhichwa.blogspot.com/" target="_blank"&gt;Mike Hichwa&lt;/a&gt; gave us a glimpse of some of the long term plans for APEX. There's some really cool things coming up that he discussed including an APEX App Store.&lt;br /&gt;&lt;br /&gt;After all the presentations were done we had the Welcome Reception in the Grand Ballroom. It was really nice to catch up with everyone and meet a lot of new people.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-L8MK5_VWm-Q/ThOB1lQGsPI/AAAAAAAAD78/GWHMDRCGLyU/s1600/IMG_0146.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 239px; height: 320px;" src="http://2.bp.blogspot.com/-L8MK5_VWm-Q/ThOB1lQGsPI/AAAAAAAAD78/GWHMDRCGLyU/s320/IMG_0146.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5625983117048590578" /&gt;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;Monday&lt;/span&gt;&lt;br /&gt;Following the Welcome Keynote, the individual sessions started on Monday. It was really tough to chose which talk to go to. So many times throughout the conference I wanted to be in two or three places at the same time. &lt;br /&gt;&lt;br /&gt;I really enjoyed &lt;a href="http://dgielis.blogspot.com/" target="_blank"&gt;Dimitri Gielis&lt;/a&gt;'s presentation on APEX charts. He also mentioned  that we may* (in the future) be able to have HTML 5 charts instead of flash charts. This would be very good for applications that run on iOS devices.&lt;br /&gt;&lt;br /&gt;On Monday there was the APEX Open Mic night. This is something I was really looking forward to because you get to see a lot of live demos of APEX being used in organizations. Wayne Linton, a fellow Calgarian, kicked things off with a demo of his APEX application for managing roles in the database. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-tmN3OYw4Lbk/ThODBXumuvI/AAAAAAAAD8E/6qiVik98kD0/s1600/IMG_0166.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://1.bp.blogspot.com/-tmN3OYw4Lbk/ThODBXumuvI/AAAAAAAAD8E/6qiVik98kD0/s320/IMG_0166.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5625984419088481010" /&gt;&lt;/a&gt;Following the Open Mic night James and Tom from &lt;a href="http://www.red-gate.com/" target="_blank"&gt;RedGate&lt;/a&gt; took some of us out to dinner at &lt;a href="http://www.parkerslighthouse.com/" target="_blank"&gt;Parker's Lighthouse&lt;/a&gt;. Great food and good times with those that were there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tuesday&lt;/span&gt;&lt;br /&gt;Tuesday morning I hid away in my hotel room as I was doing some last minute prep and practice for my presentation. I gave my first talk, &lt;span style="font-style:italic;"&gt;APEX 4 + HTML 5 = Awesome&lt;/span&gt;, right before lunch to a packed room. It went really well and was a lot of fun.&lt;br /&gt;&lt;br /&gt;In the afternoon I went to &lt;a href="http://roelhartman.blogspot.com/" target="_blank"&gt;Roel Hartman&lt;/a&gt;'s XFiles presentation. It is a cool application for storing and managing files in the database using XML DB. You can even download the application on SourceForge: &lt;a href="http://sourceforge.net/projects/xace/" target="_blank"&gt;http://sourceforge.net/projects/xace/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The final session of the night that I attended was  &lt;a href="http://dgielis.blogspot.com/" target="_blank"&gt;Dimitri&lt;/a&gt;'s &lt;span style="font-style:italic;"&gt;APEX in Big Projects with Many Developers&lt;/span&gt;. Dimitri showed how he, and the team at &lt;a href="http://apex-evangelists.com" target="_blank"&gt;APEX Evangelists&lt;/a&gt;, develop their applications. It was really interesting to see the list of tools they use and why they use them. It also encouraged me to start tracking time I spend on non-billable items such as writing blog posts, plugins, and answering questions.&lt;br /&gt;&lt;br /&gt;Following the presentation everyone went to the Grand Ballroom for Happy Hour where we had some drinks and appetizers. &lt;br /&gt;&lt;br /&gt;In the evening I attended the Oracle ACE dinner put on by Lillian Buziak. It was my first ACE dinner and I was very excited to be there and meet some of the other ACEs. After dinner I had a drink with some of the usual suspects (you know who you are) at the hotel bar and then headed off to bed. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-53GkZmKznx0/ThOE62FlWhI/AAAAAAAAD8M/tybE79dDcyI/s1600/IMG_0198.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 239px; height: 320px;" src="http://2.bp.blogspot.com/-53GkZmKznx0/ThOE62FlWhI/AAAAAAAAD8M/tybE79dDcyI/s320/IMG_0198.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5625986506002094610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Wednesday&lt;/span&gt;&lt;br /&gt;After Tuesday's long day and great dinner it was tough to get up on Wednesday morning, but I schleped through it. The first presentation that I attended was by &lt;a href="http://jes.blogs.shellprompt.net/" target="_blank"&gt;John Scott&lt;/a&gt; on APEX 4 plug-ins. The room was packed and, as usual, John did an excellent job highlighting how plugins work and showed off a few that he built. It was really cool to see that John integrated one of the HTML 5 items that I had demoed in Tuesday's presentation into one of his plug-ins. &lt;br /&gt;&lt;br /&gt;After the morning sessions I took the rest of the afternoon off to deal with a critical client request and catch up on some rest (I didn't get a lot of sleep over the past few days so it eventually caught up to me).&lt;br /&gt;&lt;br /&gt;Wednesday night was the big social event aboard the Queen Mary. The ODTUG committee went all out; it was SPECTACULAR. There was food everywhere, open bar (I was on best behavior since I had to present the next morning), jazz band, dueling piano, poker room, boat tours, and a cover band on the deck. The evening finished with some fireworks. I don't know how they're going to be able to top this event next year but I'm sure they'll find a way :-).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-C4WP1A1bXVQ/ThOGOkgXf9I/AAAAAAAAD8U/tMQURzgQDak/s1600/IMG_0192.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://3.bp.blogspot.com/-C4WP1A1bXVQ/ThOGOkgXf9I/AAAAAAAAD8U/tMQURzgQDak/s320/IMG_0192.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5625987944391606226" /&gt;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;Thursday&lt;/span&gt;&lt;br /&gt;Those that woke up on Thursday morning were pretty tired from the long week and the previous night's soiree. I gave my second presentation, called &lt;span style="font-style:italic;"&gt;How to be Creative II&lt;/span&gt;, at 8:30 AM. A lot of people shockingly showed up and things actually went really well given that everyone was a bit groggy. I threw in a few extra jokes to help keep the audience awake. &lt;a href="http://www.danielmcghan.us/" target="_blank"&gt;Dan McGhan&lt;/a&gt; was also giving a talk on Dynamic Actions at the same time. Unfortunately I wasn't able to attend (since I was presenting) but I heard it went really well.&lt;br /&gt;&lt;br /&gt;I attended part of Raj Mattamal's presentation on Collections. Raj is a very "dynamic" speaker and always puts on an interesting talk. I also caught part of &lt;a href="http://apex.shak.us/" target="_blank"&gt;Shakeeb Rahman&lt;/a&gt;'s talk where he converted an APEX application to mimic Apple's home page (he called it iToons). It was Shakeeb's first solo talk and he did an excellent job. &lt;br /&gt;&lt;br /&gt;I also had a bit of a surprise on Thursday. At the closing ceremony I won the Best Speaker award for the APEX track and the overall Best Speaker of the Year award! I'm very honored to win the awards. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-B5OJPSXrCFE/ThOHblzZkfI/AAAAAAAAD8c/GT8U7WNL7b0/s1600/DSC_5213.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://1.bp.blogspot.com/-B5OJPSXrCFE/ThOHblzZkfI/AAAAAAAAD8c/GT8U7WNL7b0/s320/DSC_5213.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5625989267589796338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;For those of you who didn't get to attend you really missed out on a stellar conference. The good news is that you can already register for Kscope 12 at &lt;a href="http://www.kscope12.com" target="_blank"&gt;www.kscope12.com&lt;/a&gt; which is going to be in San Antonio, Texas. Hope to see everyone there.&lt;br /&gt;&lt;br /&gt;- Martin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3104168425841947709?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3104168425841947709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/07/odtug-kscope-11-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3104168425841947709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3104168425841947709'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/07/odtug-kscope-11-recap.html' title='ODTUG KScope 11 - Recap'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ziUSyvV4mgU/ThOAyihuggI/AAAAAAAAD70/WQP6fADDc7k/s72-c/269501_10150226718491943_58385296942_7450908_7869679_n.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2816153254680979743</id><published>2011-06-23T09:04:00.001-06:00</published><updated>2011-06-23T09:04:59.190-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>ODTUG Kscope 11</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-sldYn5Mck0o/TgMKbgISSoI/AAAAAAAAD7s/OXoO9Z-vIZY/s1600/KscopeButton250.png"&gt;&lt;img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px; height: 136px;" src="http://2.bp.blogspot.com/-sldYn5Mck0o/TgMKbgISSoI/AAAAAAAAD7s/OXoO9Z-vIZY/s400/KscopeButton250.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5621348227485944450" /&gt;&lt;/a&gt;&lt;br /&gt;I'll be speaking at &lt;a href="http://www.kscope11.com" target="_blank"&gt;ODTUG Kscope 11&lt;/a&gt; next week in Long Beach, California. I've attended this conference for the past three years and it's always been an amazing time. Some of the world's best Oracle and APEX developers will be there. One of the best things I found is that everyone is extremely friendly and very approachable.&lt;br /&gt;&lt;br /&gt;Here are the talks that I'm giving this year:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kscope11.com/component/seminar/seminarslist#APEX 4 + HTML 5 = Awesome (Abstract ID:235779)" target="_blank"&gt;APEX 4 + HTML 5 = Awesome&lt;/a&gt;&lt;br /&gt;Tuesday June 28, 11:15 AM-12:15 PM, Room: 202C&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;HTML 5 consists of many new features which will make developers’ jobs a lot easier and improve end-user experience. HTML 5 is currently under development but many browsers already support some of its features. APEX developers should be aware of these enhancements. This presentation will highlight some of the HTML 5 features and how to integrate them with your APEX application to produce stunning results.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kscope11.com/component/seminar/seminarslist#How to Be Creative II (Abstract ID:235776)" target="_blank"&gt;How to Be Creative II&lt;/a&gt;&lt;br /&gt;Thursday June 30, 8:30 AM-9:30 AM, Room: 202B&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;This presentation will demonstrate how to leverage the APEX dictionary, along with existing plug-ins, to enhance your APEX applications. It will include how to automate monitoring of your application, improve testing capabilities, improve development time, and provide some tweaks to enhance end-user experience.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If things work out I'll be giving away copies of the two books I co-authored (&lt;a href="http://goo.gl/NxHoF" target="_blank"&gt;Beginning Oracle&lt;br /&gt;Application Express 4&lt;/a&gt; and &lt;a href="http://goo.gl/tXm3P" target="_blank"&gt;Expert Oracle Application Express&lt;/a&gt;) at each of my presentations (&lt;span style="font-style:italic;"&gt;if this sounds like a bribe it is, especially for the Thursday morning presentation following the Wednesday night party :-)&lt;/span&gt;. Hope to see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2816153254680979743?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2816153254680979743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/06/odtug-kscope-11.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2816153254680979743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2816153254680979743'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/06/odtug-kscope-11.html' title='ODTUG Kscope 11'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-sldYn5Mck0o/TgMKbgISSoI/AAAAAAAAD7s/OXoO9Z-vIZY/s72-c/KscopeButton250.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-4895342471900859372</id><published>2011-06-13T07:00:00.000-06:00</published><updated>2011-06-13T07:00:04.367-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Beginning Oracle Application Express 4 - Author Podcast</title><content type='html'>I recently recorded a &lt;a href="http://goo.gl/W3o9O" target="_blank"&gt;podcast&lt;/a&gt;, along with some of the other authors, about writing &lt;a href="http://goo.gl/NxHoF" target="_blank"&gt;Beginning Oracle Application Express 4&lt;/a&gt;. Here's some more information about the podcast:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;A conversation with Patrick Cimolini, &lt;a href="http://www.talkapex.com"&gt;Martin D'Souza&lt;/a&gt;, and &lt;a href="http://douggault.blogspot.com" target="_blank"&gt;Doug Gault&lt;/a&gt;; Authors of &lt;a href="http://goo.gl/NxHoF" target="_blank"&gt;Beginning Application Express 4&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dpeake.blogspot.com/" target="_blank"&gt;David Peake&lt;/a&gt;, Principal Product Manager for APEX, chats with some of the authors of Beginning Application Express 4. They will discuss various aspects about the book including the main reason for the book, who the book is focused towards, and some behind the scene information about writing the book.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-4895342471900859372?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/4895342471900859372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/06/beginning-oracle-application-express-4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4895342471900859372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4895342471900859372'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/06/beginning-oracle-application-express-4.html' title='Beginning Oracle Application Express 4 - Author Podcast'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-836544068423255494</id><published>2011-06-08T06:22:00.000-06:00</published><updated>2011-06-08T06:23:24.059-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Highlight Words in Standard Reports</title><content type='html'>After creating the &lt;a href="http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/clarifit-report-instant-search_98.html" target="_blank"&gt;ClariFit Report Instant Search&lt;/a&gt; plug-in (&lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:600:0"&gt;demo&lt;/a&gt;) I received a lot of questions about how to enable column highlighting as shown in the following screen shot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TRGYR8daaVI/AAAAAAAAD2U/FmqujzAQRT4/s1600/instant_search_demo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 183px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TRGYR8daaVI/AAAAAAAAD2U/FmqujzAQRT4/s400/instant_search_demo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5553387249579223378" /&gt;&lt;/a&gt;Column highlighting is not part of the plug-in. It is a built-in feature in APEX that has been around for a very long time. They're two ways to enable column highlighting in standard reports. The first is through the create report wizard. When you enable searching, as shown below, the columns that are selected to be searchable will automatically have column highlighting enabled on then.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-wuBQkBkYWiA/Te9mwLZuMpI/AAAAAAAAD7c/0w5RtMX_kak/s1600/enable_search.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 255px;" src="http://4.bp.blogspot.com/-wuBQkBkYWiA/Te9mwLZuMpI/AAAAAAAAD7c/0w5RtMX_kak/s400/enable_search.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5615820238234727058" /&gt;&lt;/a&gt;To manually highlight a column edit the column. Scroll down to the Column Formatting region shown below. In the Highlight Words field you can enter a comma delimited list of words to search for or reference APEX items using the &lt;span style="font-style:italic;"&gt;&amp;ITEM_NAME.&lt;/span&gt; syntax. &lt;span style="font-style:italic;"&gt;Note: for more on APEX variable syntax read &lt;a href="http://www.talkapex.com/2011/01/variables-in-apex.html"&gt;this post&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-vKSKi6Az-jM/Te9l8JT1W8I/AAAAAAAAD7U/lngFL8hD218/s1600/highlight_words.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 123px;" src="http://3.bp.blogspot.com/-vKSKi6Az-jM/Te9l8JT1W8I/AAAAAAAAD7U/lngFL8hD218/s400/highlight_words.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5615819344319962050" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-836544068423255494?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/836544068423255494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/06/highlight-words-in-standard-reports.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/836544068423255494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/836544068423255494'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/06/highlight-words-in-standard-reports.html' title='Highlight Words in Standard Reports'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/TRGYR8daaVI/AAAAAAAAD2U/FmqujzAQRT4/s72-c/instant_search_demo.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7985838362451170972</id><published>2011-06-07T11:12:00.003-06:00</published><updated>2011-06-07T12:38:22.048-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX PLUGIN'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>ClariFit Report Instant Search Plug-in - Update 1.1</title><content type='html'>After releasing the &lt;a href="http://www.talkapex.com/2011/03/apex-report-instant-search-plug-in.html"&gt;ClariFit Report Instant Search&lt;/a&gt; plug-in I received a lot of feedback about not being able to search for special characters such as colons (:). Certain special characters did not work since they conflicted with APEX's reserved characters. &lt;br /&gt;&lt;br /&gt;Amongst some other small changes the special character issue has been resolved in the most recent copy of the plug-in. When fixing this issue I made sure that no additional AJAX requests were made so you will not see any performance issues upgrading to the new version. I will write a blog post on how I did this soon (though it may be irrelevant with the upcoming 4.1 release).&lt;br /&gt;&lt;br /&gt;You can download the updated copy &lt;a href="http://apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/clarifit-report-instant-search_98.html" target="_blank"&gt;here&lt;/a&gt;. The  &lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:600:0" target="_blank"&gt;demo&lt;/a&gt; has also been updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-7985838362451170972?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7985838362451170972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/06/clarifit-report-instant-search-plug-in.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7985838362451170972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7985838362451170972'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/06/clarifit-report-instant-search-plug-in.html' title='ClariFit Report Instant Search Plug-in - Update 1.1'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8143409902289463567</id><published>2011-04-13T05:24:00.002-06:00</published><updated>2011-04-13T13:54:14.175-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX PLUGIN'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Malicious Code in APEX Plugins - Feedback</title><content type='html'>My &lt;a href="http://www.talkapex.com/2011/04/malicious-code-in-apex-plugins.html"&gt;previous post&lt;/a&gt; about &lt;a href="http://www.talkapex.com/2011/04/malicious-code-in-apex-plugins.html"&gt;Malicious Code in APEX Plugins&lt;/a&gt; identified the possibility of harmful code in plugins &lt;span style="font-style:italic;"&gt;(if you haven't read it please read the post before continuing)&lt;/span&gt;. Several people had some excellent feedback which they included in the &lt;a href="http://www.talkapex.com/2011/04/malicious-code-in-apex-plugins.html#comments"&gt;comments section&lt;/a&gt;. This post summarizes their comments and provides my thoughts on them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Oracle Maintaining Plugin Repository&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The idea is for Oracle to host something similar to Apple's App Store so that all code must pass a set of standards etc. I don't work for Oracle so I can't comment on this too much and I think it's a good idea. That being said the current community plugin repository, &lt;a href="http://www.apex-plugin.com/" target="_blank"&gt;apex-plugin.com&lt;/a&gt;, has an approval process before plugins are released. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Wrapped PL/SQL and Licensed Plugins&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some plugins have wrapped PL/SQL source code and obfuscated/minimized JavaScript (JS) code. Plugin developers may need to wrap their PL/SQL code since their plugins are licensed. They may also minimize their JS files for performance issues. When you use these plugins the company that developed it can help determine its legitimacy (more on this in the next section). Just because it's wrapped doesn't mean you should not install it. They're other ways to validate that it is safe to use.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Trusted Developers and Organizations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;They're some companies and developers within the APEX community that are well known and trusted. These companies specialize in APEX and would never write malicious code. For example I would never hesitate to install a plugin from organizations such as (but not limited to) &lt;a href="http://www.clarifit.com/" target="_blank"&gt;ClariFit&lt;/a&gt;, &lt;a href="http://www.apex-evangelists.com" target="_blank"&gt;Apex Evangelists&lt;/a&gt;, &lt;a href="http://www.theapexfreelancer.com" target="_blank"&gt;APEX Freelancer&lt;/a&gt;, &lt;a href="http://www.skillbuilders.com/" target="_blank"&gt;Skill Builders&lt;/a&gt;, and &lt;a href="http://www.sumneva.com" target="_blank"&gt;Sumneva&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scalability and Upgrades&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://spendolini.blogspot.com/" target="_blank"&gt;Scott Spendolini&lt;/a&gt; made a great comment about the scalability of plugins and upgrades. I think this has to be examined on a case by case basis. If you're using a plugin on a small application that doesn't get a lot of hits then it may be a moot point. If your application gets millions of hits a day and you use a poorly optimized plugin then maybe you need to modify it to fit your needs. When looking at the source code you may not only be looking for malicious code but also techniques to improve performance for your specific needs. If the plugin has wrapped PL/SQL you can try to contact the developer/company to address your specific needs.&lt;br /&gt;&lt;br /&gt;Like all software, plugins may need to be upgraded as APEX evolves (and it's 3rd party add-ons like &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt;). If the plugin is open source you can easily modify the code or email the developer with a change request. I've had several people email me about bugs and feature enhancements for plugins and was able to implement them in future versions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8143409902289463567?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8143409902289463567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/04/malicious-code-in-apex-plugins-feedback.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8143409902289463567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8143409902289463567'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/04/malicious-code-in-apex-plugins-feedback.html' title='Malicious Code in APEX Plugins - Feedback'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-4597715728430216241</id><published>2011-04-06T07:00:00.001-06:00</published><updated>2011-04-13T05:29:01.759-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><title type='text'>Malicious Code in APEX Plugins</title><content type='html'>&lt;span style="font-style:italic;color:red;"&gt;The following post could be taken in the wrong way which may discourage some people from using plugins developed by the APEX community. Please read the &lt;span style="font-weight:bold;"&gt;ENTIRE&lt;/span&gt; post before you make any conclusions.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;They're some good comments for this post. I've summarized them and included my thoughts in the following post: &lt;a href="http://www.talkapex.com/2011/04/malicious-code-in-apex-plugins-feedback.html"&gt;Malicious Code in APEX Plugins - Feedback&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the best features of APEX plugins is the ability to share them with the community. Some sites, such as &lt;a href="http://www.apex-plugin.com/" target="_blank"&gt;apex-plugin.com&lt;/a&gt;, host over 70 plugins. Most of these plugins are open source and free to use in production applications. These plugins have saved organizations lots of time developing redundant code.&lt;br /&gt;&lt;br /&gt;There is the possibility for someone to develop a malicious plugin which could compromise your entire database or access to your application. For example I could easily create a dynamic action plugin that could send me a list of all your tables each time the plug-in is run. That being said I would never do that, but someone with bad intentions could.&lt;br /&gt;&lt;br /&gt;What does this mean for you? Before integrating a plugin into your application (even in a development environment) you should look at both the PL/SQL and JavaScript code to see what they do. In most cases this extra step will take a few minutes but can save you a lot of headaches (and potentially your job). This is one of the main reasons why I don't compress JavaScript files in plugins that I post on &lt;a href="http://www.apex-plugin.com/my-plugins/user/clarifit.html" target="_blank"&gt;apex-plugin.com&lt;/a&gt;. I want to ensure that other developers can easily review my code. &lt;br /&gt;&lt;br /&gt;I am not trying to fear monger (there's enough of that going on in society as is) developers about the threat of using plugins. I just want to make sure that developers know the risks involved and what they should do to protect their database and business when integrating 3rd party plugins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-4597715728430216241?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/4597715728430216241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/04/malicious-code-in-apex-plugins.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4597715728430216241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4597715728430216241'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/04/malicious-code-in-apex-plugins.html' title='Malicious Code in APEX Plugins'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-528746375490830531</id><published>2011-03-31T08:00:00.001-06:00</published><updated>2011-04-01T05:53:58.094-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><title type='text'>My First Book: Beginning Oracle Application Express 4</title><content type='html'>I'm pleased to announce that &lt;a href="http://goo.gl/NxHoF" target="_blank"&gt;Beginning Oracle Application Express 4&lt;/a&gt; is finally published! I co-authored this book along with &lt;a href="http://douggault.blogspot.com/" target="_blank"&gt;Doug Gault&lt;/a&gt;, Karen Cannell, Patrick Cimolini, and Timothy St. Hilaire. Co-authoring this book was a very interesting experience which was well worth the time and effort.&lt;br /&gt;&lt;br /&gt;This book is aimed at beginner to intermediate APEX developers. It contains a lot of step by step instructions and detailed explanations to help you get a solid foundation for APEX development. You can purchase it from &lt;a href="http://goo.gl/NxHoF" target="_blank"&gt;Amazon.com&lt;/a&gt;. If you'd prefer a soft copy the publisher, &lt;a href="http://apress.com/book/view/1430231475" target="_blank"&gt;Apress&lt;/a&gt;, also offers the &lt;a href="http://apress.com/book/view/1430231475" target="_blank"&gt;eBook&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-2TfBa99KXjw/TY_8zoLtHLI/AAAAAAAAD5s/zQxl3fgT4v4/s1600/Begining_Application_Express_4.0_Cover.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 303px; height: 400px;" src="http://1.bp.blogspot.com/-2TfBa99KXjw/TY_8zoLtHLI/AAAAAAAAD5s/zQxl3fgT4v4/s400/Begining_Application_Express_4.0_Cover.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5588963626480114866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Table of contents&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Part I: Introducing APEX&lt;/span&gt;&lt;br /&gt;Chapter 1: An Introduction to APEX 4.0 &lt;br /&gt;Chapter 2 - APEX 4.0: A Developer's Overview&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Part II: Beginning APEX 4.0 Programming&lt;/span&gt;&lt;br /&gt;Chapter 3 - Identifying the Problem &amp; Designing the Solution&lt;br /&gt;Chapter 4 - SQL Workshop&lt;br /&gt;Chapter 5 -  Creating the Base Application &amp; Navigational Components&lt;br /&gt;Chapter 6 - Forms &amp; Reports&lt;br /&gt;Chapter 7 - Charts &amp; Maps&lt;br /&gt;Chapter 8- Programmatic Elements&lt;br /&gt;Chapter 9 - Security&lt;br /&gt;Chapter 10 - Deploying Applications&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Part III: Programming Websheets&lt;/span&gt;&lt;br /&gt;Chapter 11 - Understanding Websheets&lt;br /&gt;Chapter 12 - A WebSheets Example&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Part IV: Advanced Topics&lt;/span&gt;&lt;br /&gt;Chapter 13 - Extended Developer Tools &lt;br /&gt;Chapter 14 - Managing Workspaces&lt;br /&gt;Chapter 15 - Team Development&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-528746375490830531?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/528746375490830531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/03/my-first-book-beginning-oracle.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/528746375490830531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/528746375490830531'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/03/my-first-book-beginning-oracle.html' title='My First Book: Beginning Oracle Application Express 4'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-2TfBa99KXjw/TY_8zoLtHLI/AAAAAAAAD5s/zQxl3fgT4v4/s72-c/Begining_Application_Express_4.0_Cover.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5759949456484175450</id><published>2011-03-25T06:51:00.001-06:00</published><updated>2011-03-25T07:48:36.346-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX PLUGIN'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Report Instant Search Plug-in</title><content type='html'>Back in December I wrote a post about &lt;a href="http://www.talkapex.com/2010/12/instant-search-in-apex.html"&gt;Instant Search in APEX&lt;/a&gt;. One of the requests I received was to make a dynamic action plug-in for this feature. I've finally created the &lt;a href="http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/clarifit-report-instant-search_98.html" target="_blank"&gt;Report Instant Search&lt;/a&gt; dynamic action plug-in (&lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:600" target="_blank"&gt;demo&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Compared to the original concept this plugin:&lt;/span&gt;&lt;br /&gt;  - Reduces the number of AJAX requests (more on this below)&lt;br /&gt;  - Includes a modified version of the APEX refresh report logic so it will not interfere with other reports&lt;br /&gt;  - Escapes special characters&lt;br /&gt;  - Supports multiple instances on the same page&lt;br /&gt;        &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Steps to create report and use plugin&lt;/span&gt;&lt;br /&gt;- Create Report&lt;br /&gt;- Report Type: SQL Report (standard report)&lt;br /&gt;- Title: Instant Search&lt;br /&gt;- Query: select * from emp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-style:italic;"&gt;- Note it is imperative that your report have a quick response time. If you have a report that takes a long time to run the user experience won't be very good.&lt;/span&gt;&lt;br /&gt;- Report Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Enable Search: Yes&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Select Columns for Search: Select both ENAME and JOB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-style:italic;"&gt;- Note: this is what will highlight the selected text&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;Download and install the &lt;a href="http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/clarifit-report-instant-search_98.html" target="_blank"&gt;Report Instant Search&lt;/a&gt; plugin. Once installed create a dynamic action for the report with the following configuration:&lt;br /&gt;&lt;br /&gt;- Create Dynamic Action&lt;br /&gt;- Type: Advanced&lt;br /&gt;- Name: Instant Search&lt;br /&gt;- When&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Event: Key Release&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Selection Type: Item&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Item: P1_REPORT_SEARCH &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-style:italic;"&gt;- This is the search item that was automatically created as part of the standard report&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Condition: No Condition&lt;br /&gt;- True Action&lt;br /&gt;- Action: &lt;br /&gt;&amp;nbsp;&amp;nbsp;- ClariFit Report Instant Search&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Fire on Page Load: uncheck&lt;br /&gt;- Affected Elements&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Select Type: Region&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Region: Instant Search&lt;br /&gt;&lt;br /&gt;When you refresh your page you can start typing in the search field and the report should get updated. An online demo is available here: &lt;a href="http://apex.oracle.com/pls/apex/f?p=45587:600" target="_blank"&gt;http://apex.oracle.com/pls/apex/f?p=45587:600&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TRGYR8daaVI/AAAAAAAAD2U/FmqujzAQRT4/s1600/instant_search_demo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 183px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TRGYR8daaVI/AAAAAAAAD2U/FmqujzAQRT4/s400/instant_search_demo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5553387249579223378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Detailed Explanation&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;From the &lt;a href="http://www.talkapex.com/2010/12/instant-search-in-apex.html"&gt;original blog post&lt;/a&gt; each time a key is pressed an AJAX request is sent to the database to obtain a refreshed version of the report. For example if you are looking for "Smith" and start typing in "&lt;span style="font-style:italic;"&gt;smi&lt;/span&gt;" each letter sends a request to the database as shown in the following diagram:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-2MvG0HikiMo/TYv5IwEktrI/AAAAAAAAD5c/lJjguMvNpI4/s1600/instant_search_no_timer.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 353px; height: 347px;" src="http://1.bp.blogspot.com/-2MvG0HikiMo/TYv5IwEktrI/AAAAAAAAD5c/lJjguMvNpI4/s400/instant_search_no_timer.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5587833691421587122" /&gt;&lt;/a&gt;&lt;br /&gt;To improve performance a timer was added which will only submit requests a minimum of 200 ms (this is configurable) apart from each other. If you type "&lt;span style="font-style:italic;"&gt;smi&lt;/span&gt;" really quickly, only one ajax request will be made. This is shown in the following diagram:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-JnYG_o93G5E/TYv5JMU4WbI/AAAAAAAAD5k/sejgEThhnhA/s1600/instant_search_w_timer.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 520px; height: 444px;" src="http://2.bp.blogspot.com/-JnYG_o93G5E/TYv5JMU4WbI/AAAAAAAAD5k/sejgEThhnhA/s1600/instant_search_w_timer.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5587833699006175666" /&gt;&lt;/a&gt;&lt;br /&gt;Extra validations were added which ignore "non-change" key strokes. For instance if you clicked on the search field and use the arrow keys to move to the first character, each arrow key would trigger a report refresh. To prevent this from happening the value of the value of the search field is stored before the timer is invoked. Once the timer has expired it checks to see if the search value has changed. If no change was made then nothing happens. If a change is detected an ajax request is made.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5759949456484175450?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5759949456484175450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/03/apex-report-instant-search-plug-in.html#comment-form' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5759949456484175450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5759949456484175450'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/03/apex-report-instant-search-plug-in.html' title='APEX Report Instant Search Plug-in'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/TRGYR8daaVI/AAAAAAAAD2U/FmqujzAQRT4/s72-c/instant_search_demo.jpg' height='72' width='72'/><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-6783522252026503152</id><published>2011-03-21T08:00:00.000-06:00</published><updated>2011-03-21T08:00:11.934-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='VIRTUALBOX'/><title type='text'>VirtualBox - High CPU Problem</title><content type='html'>I've been using Oracle's &lt;a href="http://www.virtualbox.org/" target="_blank"&gt;VirtualBox&lt;/a&gt; for several months now. I'm really impressed with this product and it has helped me a lot to rapidly prototype some APEX concepts.&lt;br /&gt;&lt;br /&gt;One thing that bothered me when I started using it was that no matter what my virtual machine was doing, &lt;a href="http://www.virtualbox.org/" target="_blank"&gt;VirtualBox&lt;/a&gt; was using a lot of the CPU on my laptop. This didn't matter if the virtual machine was idle or doing any processing. After some digging around I found this very helpful post on the Oracle forums: &lt;a href="http://forums.oracle.com/forums/thread.jspa?messageID=9305831#9305831" target="_blank"&gt;http://forums.oracle.com/forums/thread.jspa?messageID=9305831&lt;/a&gt;. As weird as it may sound the suggestion is to create and start a second, dummy, virtual machine. I was pleasantly surprised to see that it worked. The configuration that I used was: &lt;span style="font-style:italic;"&gt;DOS as an OS. 4 MB of memory and a 4 MB hard drive. Disable all the extra stuff (network, audio, usb, etc)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Here are the screen shots of my CPU before and after I started the second, dummy, virtual machine:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic"&gt;Before:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-YEgldzE7Kks/TYRGDtmnfRI/AAAAAAAAD38/ceWRQ4ZSgZ0/s1600/virtual_box_cpu_before.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 354px; height: 400px;" src="http://4.bp.blogspot.com/-YEgldzE7Kks/TYRGDtmnfRI/AAAAAAAAD38/ceWRQ4ZSgZ0/s400/virtual_box_cpu_before.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5585666467441376530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic"&gt;After:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-TrSQwDmKRKw/TYRGDy-nUTI/AAAAAAAAD4E/9l-kydkrbEE/s1600/virtual_box_cpu_after.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 354px; height: 400px;" src="http://1.bp.blogspot.com/-TrSQwDmKRKw/TYRGDy-nUTI/AAAAAAAAD4E/9l-kydkrbEE/s400/virtual_box_cpu_after.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5585666468884205874" /&gt;&lt;/a&gt;&lt;br /&gt;After starting the second virtual machine the CPU spiked for a few seconds then dropped significantly. Hopefully this issue will be fixed in a future version of &lt;a href="http://www.virtualbox.org/" target="_blank"&gt;VirtualBox&lt;/a&gt; but until then this is a very simple work around.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-6783522252026503152?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/6783522252026503152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/03/virtualbox-high-cpu-problem.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6783522252026503152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6783522252026503152'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/03/virtualbox-high-cpu-problem.html' title='VirtualBox - High CPU Problem'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-YEgldzE7Kks/TYRGDtmnfRI/AAAAAAAAD38/ceWRQ4ZSgZ0/s72-c/virtual_box_cpu_before.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5991313073240152751</id><published>2011-02-01T07:00:00.000-07:00</published><updated>2011-02-01T07:00:08.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='demo.talkapex.com'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>demo.talkapex.com</title><content type='html'>As part of this blog I've posted a lot of demos on &lt;a href="http://apex.oracle.com" target="_blank"&gt;apex.oracle.com&lt;/a&gt;. One thing that's always bothered me is that the demos have never been linked together or searchable.&lt;br /&gt;&lt;br /&gt;I finally create a new demo site: &lt;a href="http://demo.talkapex.com" target="_blank"&gt;demo.talkapex.com&lt;/a&gt;. Going forward all demos will be hosted on this site. In some cases I may move the old demos to the new site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5991313073240152751?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5991313073240152751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/02/demotalkapexcom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5991313073240152751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5991313073240152751'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/02/demotalkapexcom.html' title='demo.talkapex.com'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-4349344608993318777</id><published>2011-01-30T17:52:00.001-07:00</published><updated>2011-01-30T17:52:44.108-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='console wrapper'/><category scheme='http://www.blogger.com/atom/ns#' term='console'/><title type='text'>Console Wrapper (previously JS Logger)</title><content type='html'>I've moved the &lt;a href="http://code.google.com/p/js-console-wrapper/" target="_blank"&gt;Console Wrapper&lt;/a&gt; (previous called &lt;a href="http://www.talkapex.com/2010/08/javascript-console-logger.html"&gt;JS Logger&lt;/a&gt;) code to be hosted as a Google project here: &lt;a href="http://code.google.com/p/js-console-wrapper/" target="_blank"&gt;http://code.google.com/p/js-console-wrapper/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I decided to create a Google project since maintaining code via a blog is not the best or easiest thing to do. I will continue to blog about any major updates but all examples, documentation, issues, and code will be maintained on the Google project page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Previous references to Console Wrapper&lt;br /&gt;- &lt;a href="http://www.talkapex.com/2010/08/javascript-console-logger.html"&gt;http://www.talkapex.com/2010/08/javascript-console-logger.html&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.talkapex.com/2011/01/js-logger-101-logparams.html"&gt;http://www.talkapex.com/2011/01/js-logger-101-logparams.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-4349344608993318777?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/4349344608993318777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/01/console-wrapper-previously-js-logger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4349344608993318777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4349344608993318777'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/01/console-wrapper-previously-js-logger.html' title='Console Wrapper (previously JS Logger)'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7182977482350930899</id><published>2011-01-17T08:00:00.002-07:00</published><updated>2011-01-30T17:55:41.789-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>JS Logger 1.0.1 - logParams</title><content type='html'>&lt;span style="font-style:italic;"&gt;Note: This now has a new name, Console Wrapper, and has been moved to a Google project. Please go to &lt;a href="http://www.talkapex.com/2011/01/console-wrapper-previously-js-logger.html"&gt;http://www.talkapex.com/2011/01/console-wrapper-previously-js-logger.html&lt;/a&gt; for more information.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've updated my &lt;a href="http://www.talkapex.com/2010/08/javascript-console-logger.html"&gt;JavaScript Console Logger&lt;/a&gt; package to include a new function called &lt;span style="font-style:italic;"&gt;logParams&lt;/span&gt;. logParams will automatically log all the parameters in your function. This can save a lot of time since you don't need to manually list all the parameters and it will detect any "extra" parameters. &lt;br /&gt;&lt;br /&gt;Here's an example of the code: &lt;pre class="brush: js;highlight:2"&gt;&lt;br /&gt;function myFn(px, py, pz){&lt;br /&gt;  $.console.logParams();&lt;br /&gt;  &lt;br /&gt;  //do something as part of this function&lt;br /&gt;  &lt;br /&gt;}//myFn;&lt;br /&gt;&lt;br /&gt;//Not required if using in APEX. &lt;br /&gt;//If called from APEX it will detect if you are in debug mode&lt;br /&gt;$.console.setLevel('log'); &lt;br /&gt;&lt;br /&gt;//Call myFn with the correct amount of parameters&lt;br /&gt;myFn(1,2,3);&lt;br /&gt;&lt;br /&gt;//Call myFn with more than "expected" number of parameters&lt;br /&gt;myFn(1,2,3,'hello', 'goodbye');&lt;/pre&gt;Which results in: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TTN9AtDxneI/AAAAAAAAD3c/R9SZhwhs6Ec/s1600/logger_1.0.1_logparams.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 360px; height: 184px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TTN9AtDxneI/AAAAAAAAD3c/R9SZhwhs6Ec/s400/logger_1.0.1_logparams.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5562927415781596642" /&gt;&lt;/a&gt;&lt;span style="font-style:italic;"&gt;Note: by default the parameters groups are collapsed by I've expanded them for this demo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Download &lt;a href="http://www.clarifit.com/files/blogs/talkapex/files/$logger_1.0.1.js" target="_blank"&gt;Javascript Console Logger $logger.1.0.1&lt;/a&gt;. For more information about this javascript library please read my original post: &lt;a href="http://www.talkapex.com/2010/08/javascript-console-logger.html"&gt;http://www.talkapex.com/2010/08/javascript-console-logger.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://www.danielmcghan.us/" target="_blank"&gt;Dan McGhan&lt;/a&gt; for helping come up with this idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-7182977482350930899?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7182977482350930899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/01/js-logger-101-logparams.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7182977482350930899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7182977482350930899'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/01/js-logger-101-logparams.html' title='JS Logger 1.0.1 - logParams'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/TTN9AtDxneI/AAAAAAAAD3c/R9SZhwhs6Ec/s72-c/logger_1.0.1_logparams.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3448280532168859846</id><published>2011-01-17T07:00:00.000-07:00</published><updated>2011-01-17T07:00:12.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>100th Post</title><content type='html'>Two and a half years after starting this blog I'm excited to be writing my 100&lt;sup&gt;th&lt;/sup&gt; post! Through this blog I've had the opportunity to meet a lot of people, learn a lot of new things, and given opportunities I may not have otherwise had.&lt;br /&gt;&lt;br /&gt;I thought it would be interesting to post some stats about this blog for those that were curious. I wrote my &lt;a href="http://www.talkapex.com/2008/07/manually-creating-tabular-form.html"&gt;first post&lt;/a&gt; on July 31st, 2008 but only started to capture analytics starting in March 2009.&lt;br /&gt;&lt;span style="font-style:italic"&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- March 2009&lt;/span&gt;&lt;br /&gt;  - ~1500 visits / month&lt;br /&gt;  - ~2400 page views / month&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Current monthly avg (Dec 2010)&lt;/span&gt;&lt;br /&gt;  - ~3500 visits / month&lt;br /&gt;  - ~5300 page views / month&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Overall (since March 2009)&lt;/span&gt;&lt;br /&gt;  - ~53,000 visits&lt;br /&gt;  - ~85,000 page views&lt;br /&gt;  - ~150 countries&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Thanks for following along and providing feedback.&lt;br /&gt;&lt;br /&gt;- Martin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3448280532168859846?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3448280532168859846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/01/100th-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3448280532168859846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3448280532168859846'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/01/100th-post.html' title='100th Post'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-6519281659510676649</id><published>2011-01-05T08:00:00.000-07:00</published><updated>2011-01-05T08:00:09.234-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Variables in APEX</title><content type='html'>When I first started using APEX I was unsure about which method to use when referencing variables (values in session state). The purpose of this post is to outline the different ways to reference APEX variables and provide an examples for each case.&lt;br /&gt;&lt;br /&gt;They're four ways to reference variables in APEX:&lt;br /&gt;&lt;ul style="line-height:0.4"&gt;&lt;br /&gt;&lt;li&gt;:Bind_variables&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&amp;Substitution_strings.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;V / NV functions&lt;/li&gt;&lt;br /&gt;&lt;li&gt;#Hash#&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Bind Variables&lt;/span&gt;&lt;br /&gt;Bind variables can be used in any block of SQL or PL/SQL code inside APEX. For example if creating a report to display all the employees in a selected department the query would be:&lt;pre class="brush: sql;highlight:3"&gt;&lt;br /&gt;SELECT ename&lt;br /&gt;  FROM emp&lt;br /&gt; WHERE deptno = :p1_deptno&lt;/pre&gt;Where P1_DEPTNO is a page item that you created.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Substitution Strings&lt;/span&gt;&lt;br /&gt;Substitution strings use the &lt;span style="font-style:italic;"&gt;&amp;variable.&lt;/span&gt; notation. They can be used anywhere in your APEX application such as a HTML region or even a template. You can also use them in inline SQL and PL/SQL code but it is not recommended for security reasons. &lt;span style="font-style:italic;"&gt;For more information on this security risk read the following Oracle white paper on &lt;a href="http://www.oracle.com/technetwork/database/features/plsql/overview/how-to-write-injection-proof-plsql-1-129572.pdf" target="_blank"&gt;SQL Injection&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A simple example of using a substitution string is in a HTML region which displays a welcome message. The region source would be: &lt;pre class="brush: html;highlight:1"&gt;&lt;br /&gt;Hello &amp;APP_USER.&lt;br&gt;&lt;br /&gt;Welcome to the demo application.&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;V / NV Functions&lt;/span&gt;&lt;br /&gt;If you want to reference APEX variables in compiled code, such as views, packages, and procedures, you can't use bind variables. The easiest way to reference the variables is to use the V (for strings) and NV (for numbers) functions. For example:&lt;pre class="brush: sql;highlight:5"&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE log_apex_info&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;  INSERT INTO tapex_log ( username, apex_page_id, access_date)&lt;br /&gt;       VALUES (V ('APP_USER'), NV ('APP_PAGE_ID'), SYSDATE);&lt;br /&gt;END;&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;#Hash#&lt;/span&gt;&lt;br /&gt;The hash notation of &lt;span style="font-style:italic;"&gt;#variable#&lt;/span&gt; is used in multiple places. When creating column links in a report you can use the hash notation to represent column values. The following figure highlights how column values are referenced in a report link. &lt;span style="font-style:italic;"&gt;#EMPNO#&lt;/span&gt; is used to reference the EMPNO column and &lt;span style="font-style:italic;"&gt;#JOB#&lt;/span&gt; is used to pass the job as a parameter to Page 2.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TR6GfgyIN0I/AAAAAAAAD20/TqVsO0rXg7g/s1600/hash_column_link.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 130px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TR6GfgyIN0I/AAAAAAAAD20/TqVsO0rXg7g/s400/hash_column_link.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5557026866156025666" /&gt;&lt;/a&gt;&lt;br /&gt;The hash notation is also used in templates (Shared Components &gt; Templates). When modifying a template they're special variables available depending on the type of template. These variables can be found at the bottom of the screen in the Substitution Strings section.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For more information about referencing variables in APEX read the &lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/user.40/e15517/concept.htm#BEICHBBG" target="_blank"&gt;Referencing Session State&lt;/a&gt; section in the builder guide.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-6519281659510676649?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/6519281659510676649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/01/variables-in-apex.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6519281659510676649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6519281659510676649'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/01/variables-in-apex.html' title='Variables in APEX'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TR6GfgyIN0I/AAAAAAAAD20/TqVsO0rXg7g/s72-c/hash_column_link.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-626600960520322977</id><published>2011-01-04T08:00:00.001-07:00</published><updated>2011-01-04T08:00:02.961-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Missing ID in the No Template Region Template</title><content type='html'>When you create or edit a region in APEX you can select a template. Region templates define the location of buttons in a region, how the region looks, etc. There is a  region template called "No Template" which is the first option in the template list. When you select No Template as the region template APEX will only display the content of the region an nothing else (no header, buttons, etc). &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TR3z1SvC0sI/AAAAAAAAD2k/DRv93FxN2UA/s1600/no_template.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 93px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TR3z1SvC0sI/AAAAAAAAD2k/DRv93FxN2UA/s400/no_template.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5556865612132831938" /&gt;&lt;/a&gt;&lt;br /&gt;There is a problem with using No Template if you use Dynamic Actions or have any JavaScript code which references the region. The No Template region template does not contain an ID attribute which prevents dynamic actions from binding to the region.&lt;br /&gt;&lt;br /&gt;The following steps will create a region that simulates the "No Template" region and includes an ID so it will work with dynamic actions.&lt;br /&gt;&lt;br /&gt;- Go to Shared Components&lt;br /&gt;- Click on Templates&lt;br /&gt;- Click the Create button&lt;br /&gt;- Template Type: Region&lt;br /&gt;- Select From Scratch and click Next&lt;br /&gt;- Name: No Template w. ID&lt;br /&gt;&amp;nbsp;&amp;nbsp;Theme: Select your default theme (in most cases you'll only have one option)&lt;br /&gt;&amp;nbsp;&amp;nbsp;Template Class: Reports Region&lt;br /&gt;&amp;nbsp;&amp;nbsp;Click the Create button&lt;br /&gt;- You should be brought back to the Templates page. To filter the list of regions select Region as the Type and click the Go button&lt;br /&gt;- Click on No Template w. ID to modify it&lt;br /&gt;- Put the following HTML in the Definition section&lt;pre class="brush: html;"&gt;&lt;br /&gt;&lt;div id="#REGION_STATIC_ID#" #REGION_ATTRIBUTES#&gt;&lt;br /&gt;  #BODY#&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt; - It should look like&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TR34Feko17I/AAAAAAAAD2s/OKH7IxHYETI/s1600/no_template_id_template.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 124px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TR34Feko17I/AAAAAAAAD2s/OKH7IxHYETI/s400/no_template_id_template.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5556870288234829746" /&gt;&lt;/a&gt;- Click the Apply Changes button&lt;br /&gt;&lt;br /&gt;If you modify your region that used No Template and change it to the new template that you created, No Template w. ID, it will look the same for the end users with the big difference being that dynamic actions will work when applied against the region.&lt;br /&gt;&lt;br /&gt;The following query identifies regions that use the No Template region template which you may want to modify to use the custom No Template w. ID: &lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT page_id, page_name, region_name, template&lt;br /&gt;  FROM apex_application_page_regions&lt;br /&gt; WHERE application_id = :app_id&lt;br /&gt;   AND template = 'No Template'&lt;/pre&gt;&lt;span style="font-style:italic;"&gt;Note: I think &lt;a href="http://www.inside-oracle-apex.com/" target="_blank"&gt;Patrick Wolf&lt;/a&gt; mentioned that the No Template region template will include an ID in APEX 4.1.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-626600960520322977?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/626600960520322977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2011/01/missing-id-in-no-template-region.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/626600960520322977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/626600960520322977'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2011/01/missing-id-in-no-template-region.html' title='Missing ID in the No Template Region Template'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TR3z1SvC0sI/AAAAAAAAD2k/DRv93FxN2UA/s72-c/no_template.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-6315934654506284040</id><published>2010-12-21T23:38:00.004-07:00</published><updated>2011-03-25T06:54:21.883-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Instant Search in APEX</title><content type='html'>&lt;span style="color:red; font-style:italic;font-weight:bold;"&gt;Note: A plug-in was created for this. Please got to: &lt;a href="http://www.talkapex.com/2011/03/apex-report-instant-search-plug-in.html"&gt;http://www.talkapex.com/2011/03/apex-report-instant-search-plug-in.html&lt;/a&gt; for more information.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was asked if APEX supports instant searches like Google has. The goal was to have a search box and as the user started typing the report would filter based on the current search string. My first thought was to leverage Interactive Reports (IR) but after some research IRs were a bit too much for what was required. Instead I decided to start with a standard report and enable the search feature during the create wizard. To create the standard report page:&lt;br /&gt;&lt;br /&gt;- Create Page&lt;br /&gt;- Page Type: Report&lt;br /&gt;- Report Type: Classic Report&lt;br /&gt;- Page Name: Instant Search&lt;br /&gt;- Query: &lt;span style="font-style:italic;"&gt;select * from emp&lt;/span&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;font-style:italic;"&gt;Report Attributes&lt;/span&gt;&lt;br /&gt;- Enable Search: Yes&lt;br /&gt;- Select Columns for Search: Select both ENAME and JOB as shown in the the following figure:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/TRGV6cH5cQI/AAAAAAAAD2M/iJrOqbYPXcQ/s1600/instant_search_create_region.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/TRGV6cH5cQI/AAAAAAAAD2M/iJrOqbYPXcQ/s400/instant_search_create_region.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5553384646738800898" /&gt;&lt;/a&gt;&lt;br /&gt;If you run the page and enter a search string you'll need to click the Go button, which will submit the page, to filter the results in the report. To enable "Instant Search" create a Dynamic Action as follows:&lt;br /&gt;&lt;br /&gt;- Create Dynamic Action&lt;br /&gt;- Type: Advanced&lt;br /&gt;- Name: Instant Search&lt;br /&gt;- &lt;span style="font-weight:bold;font-style:italic;"&gt;When&lt;/span&gt;&lt;br /&gt;- Event: Key Release&lt;br /&gt;- Selection Type: Item&lt;br /&gt;- Item: P3400_REPORT_SEARCH &lt;span style="font-style:italic;"&gt;This is the search item that was automatically created as part of the report search.&lt;/span&gt;&lt;br /&gt;- Condition: No Condition&lt;br /&gt;- &lt;span style="font-weight:bold;font-style:italic;"&gt;True Action&lt;/span&gt;&lt;br /&gt;- Action: Refresh&lt;br /&gt;- Fire on Page Load: uncheck&lt;br /&gt;- &lt;span style="font-weight:bold;font-style:italic;"&gt;Affected Elements&lt;/span&gt;&lt;br /&gt;- Select Type: Region&lt;br /&gt;- Region: Instant Search&lt;br /&gt;- Click the Create button&lt;br /&gt;&lt;br /&gt;If you run the page and start typing in the search field nothing appears to happen. In fact it's actually refreshing the report each time you alter the value in the search field. The problem is that it's not submitting the search value back to the database so the results are always the same. To resolve this issue you could create another dynamic action to set the search value's session state. This approach significantly slows things down because it makes two requests: one for setting the search value's session state and the second to refresh the report.&lt;br /&gt;&lt;br /&gt;As a work around I've tweaked the region refresh javascript to set the search field session value as part of each region refresh as shown below. A demo of this is here: &lt;a href="http://apex.oracle.com/pls/apex/f?p=16406:1100:0" target="_blank"&gt;http://apex.oracle.com/pls/apex/f?p=16406:1100:0&lt;/a&gt; If you start typing in the search field the report will automatically be filtered as shown in the following figure:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TRGYR8daaVI/AAAAAAAAD2U/FmqujzAQRT4/s1600/instant_search_demo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 183px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TRGYR8daaVI/AAAAAAAAD2U/FmqujzAQRT4/s400/instant_search_demo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5553387249579223378" /&gt;&lt;/a&gt;&lt;br /&gt;I've included the altered JavaScript function below which you'll need to include in your page. I don't plan to create a dynamic action plugin to encapsulate this logic since I'm hoping this work around won't be necessary in APEX 4.1. If you do plan to use this in a production environment I suggest creating a plugin to make it more flexible and avoid any conflicts with APEX.&lt;br /&gt;&lt;pre class="brush: javascript; highlight: [32,33,34]"&gt;&lt;br /&gt;//This is a copy from the APEX JS function obtained from apex_4_0.js&lt;br /&gt;//from apex_4_0.js: Copyright © 2003, 2008, Oracle. All rights reserved.&lt;br /&gt;function $a_report(pId,pMin,pMax,pFetched,pSort,pRefreshMode){&lt;br /&gt; // Trigger the before refresh event, and pass the current report Id convenience.&lt;br /&gt; // Event is triggered on table element with the ID equal to 'report_' + pID + '_catch'.&lt;br /&gt; // This element is not exposed in any templates and output by our engine, so is safe to&lt;br /&gt; // use.&lt;br /&gt; // Event handlers can be bound to this element in conjunction with the jQuery 'live'&lt;br /&gt; // bind type, or can be bound to higher element (such as the main region ID) and use&lt;br /&gt; // the regular bind type. The latter works because the event bubbles and is how this&lt;br /&gt; // is handled within the dynamic action framework.&lt;br /&gt; //&lt;br /&gt;    apex.jQuery('#report_' + pId + '_catch').trigger('apexbeforerefresh', pId);&lt;br /&gt;&lt;br /&gt;  var l_URL = 'p='+$v('pFlowId')+':'+$v('pFlowStepId')+':'+$v('pInstance')+':FLOW_PPR_OUTPUT_R'+pId+'_';&lt;br /&gt;  &lt;br /&gt; // if refresh mode is passed, deal with that first&lt;br /&gt; if (pRefreshMode) {&lt;br /&gt;        if (pRefreshMode === 'current'){&lt;br /&gt;            // do nothing to url here&lt;br /&gt;        } else if (pRefreshMode === 'reset') {&lt;br /&gt;            l_URL += 'reset_R_' + pId;&lt;br /&gt;        }&lt;br /&gt; } else {&lt;br /&gt;     if (!!pSort) {&lt;br /&gt;         l_URL += pSort+'::RP&amp;fsp_region_id='+pId;&lt;br /&gt;     } else {&lt;br /&gt;         l_URL += 'pg_R_'+pId+':NO&amp;pg_max_rows='+pMax+'&amp;pg_min_row='+pMin+'&amp;pg_rows_fetched='+pFetched;&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  //This is the modified code&lt;br /&gt;  //Change P3400_REPORT_SEARCH with your item name&lt;br /&gt;  l_URL += ':NO::P3400_REPORT_SEARCH:' + $('#P3400_REPORT_SEARCH').val();&lt;br /&gt;  &lt;br /&gt; var lRequest = new apex.ajax.url(l_URL,&lt;br /&gt;   function(pResponse){&lt;br /&gt;    var l_s = pResponse.readyState;&lt;br /&gt;    var l_Id = lRequest.report_id;&lt;br /&gt;    if(l_s == 1){&lt;br /&gt;    }else if(l_s == 2||l_s == 3){&lt;br /&gt;    }else if(l_s == 4){&lt;br /&gt;                // This looks a little bit complicated and it is! To avoid screen flicker&lt;br /&gt;                // when the HTML code is inserted into the DOM and JavaScript code modifies the&lt;br /&gt;                // code afterwards (which takes some time), we are injecting the HTML code in&lt;br /&gt;                // a temporary hidden area and do all our modifications and after that we&lt;br /&gt;                // are replacing the existing report_xxx_catch with the new version.&lt;br /&gt;                var lTemp = $u_js_temp_drop();&lt;br /&gt;                apex.jQuery('#report_'+l_Id+'_catch').attr('id', 'report_'+l_Id+'_catch_old');&lt;br /&gt;                apex.jQuery(lTemp).html(pResponse.responseText);&lt;br /&gt;                apex.jQuery('#report_'+l_Id+'_catch_old').replaceWith(apex.jQuery('#report_'+l_Id+'_catch'));&lt;br /&gt;                apex.jQuery(lTemp).empty();&lt;br /&gt;&lt;br /&gt;             // Trigger the after refresh event, and pass the current report Id convenience.&lt;br /&gt;             // Event is triggered on table element with the ID equal to 'report_' + pID + '_catch'.&lt;br /&gt;             // This element is not exposed in any templates and output by our engine, so is safe to&lt;br /&gt;             // use.&lt;br /&gt;             // Event handlers can be bound to this element in conjunction with the jQuery 'live'&lt;br /&gt;             // bind type, or can be bound to higher element (such as the main region ID) and use&lt;br /&gt;             // the regular bind type. The latter works because the event bubbles and is how this&lt;br /&gt;             // is handled within the dynamic action framework.&lt;br /&gt;             //&lt;br /&gt;    apex.jQuery('#report_' + pId + '_catch').trigger('apexafterrefresh', pId);&lt;br /&gt;&lt;br /&gt;    }else{return false;}&lt;br /&gt;   }&lt;br /&gt; );&lt;br /&gt;   lRequest.report_id = pId;&lt;br /&gt;   lRequest._get();&lt;br /&gt;   return;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-6315934654506284040?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/6315934654506284040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/12/instant-search-in-apex.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6315934654506284040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6315934654506284040'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/12/instant-search-in-apex.html' title='Instant Search in APEX'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/TRGV6cH5cQI/AAAAAAAAD2M/iJrOqbYPXcQ/s72-c/instant_search_create_region.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-937192491154471832</id><published>2010-12-13T19:02:00.001-07:00</published><updated>2010-12-13T19:02:35.181-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Column Groups in APEX 4.0 Interactive Reports</title><content type='html'>A long time ago I wrote about adding Column Groups to Interactive Reports (IR) in APEX: &lt;a href="http://www.talkapex.com/2009/03/column-groups-in-apex-interactive.html"&gt;http://www.talkapex.com/2009/03/column-groups-in-apex-interactive.html&lt;/a&gt; I created a new dynamic action plugin to do column grouping in APEX which can be downloaded &lt;a href="http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/clarifit-ir-column-grouping_73.html" target="_blank" style="font-weight:bold"&gt;here&lt;/a&gt;. Please read the help text in the plugin for full instructions on how to use it. Once integrated it should look like:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TQbOy2c7rGI/AAAAAAAAD1U/CcFt_E75Ltw/s1600/ir_col_grp.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 162px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TQbOy2c7rGI/AAAAAAAAD1U/CcFt_E75Ltw/s400/ir_col_grp.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5550350963786361954" /&gt;&lt;/a&gt;&lt;br /&gt;I also added additional JS debugging information. If you run your application in debug mode and look at the console you'll notice the following log information:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/TQbOzKSdWNI/AAAAAAAAD1c/qOUzRlJuKYI/s1600/ir_col_grp_logs.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 195px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/TQbOzKSdWNI/AAAAAAAAD1c/qOUzRlJuKYI/s400/ir_col_grp_logs.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5550350969111140562" /&gt;&lt;/a&gt;&lt;br /&gt;The additional logging is using the console logger wrapper that wrote: &lt;a href="http://www.talkapex.com/2010/08/javascript-console-logger.html"&gt;http://www.talkapex.com/2010/08/javascript-console-logger.html&lt;/a&gt; If you're writing your own plugins I suggest using it to instrument your code. It helped me debug some of my JavaScript issues while developing this plugin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-937192491154471832?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/937192491154471832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/12/column-groups-in-apex-40-interactive.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/937192491154471832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/937192491154471832'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/12/column-groups-in-apex-40-interactive.html' title='Column Groups in APEX 4.0 Interactive Reports'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TQbOy2c7rGI/AAAAAAAAD1U/CcFt_E75Ltw/s72-c/ir_col_grp.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7256328168660897070</id><published>2010-12-08T08:00:00.001-07:00</published><updated>2010-12-08T08:00:06.150-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX 4.0: New Columns in APEX_WORKSPACE_ACTIVITY_LOG</title><content type='html'>Over a year ago I wrote about how to permanently store some of the log information from APEX: &lt;a href="http://www.talkapex.com/2009/05/apex-logs-storing-log-data.html"&gt;http://www.talkapex.com/2009/05/apex-logs-storing-log-data.html&lt;/a&gt; APEX 4.0 has some additional columns in APEX_WORKSPACE_ACTIVITY_LOG which you may want to store as well. The following query identifies the new columns:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note: This query assumes you still have an old instance of APEX 3.2 and a new instance of APEX 4.0 on your database&lt;/span&gt;&lt;pre class="brush: sql"&gt;SELECT column_name&lt;br /&gt;  FROM all_tab_columns&lt;br /&gt; WHERE owner = 'APEX_040000'&lt;br /&gt;   AND table_name = 'APEX_WORKSPACE_ACTIVITY_LOG'&lt;br /&gt;MINUS&lt;br /&gt;SELECT column_name&lt;br /&gt;  FROM all_tab_columns&lt;br /&gt; WHERE owner = 'APEX_030200'&lt;br /&gt;   AND table_name = 'APEX_WORKSPACE_ACTIVITY_LOG'&lt;br /&gt;ORDER BY column_name&lt;/pre&gt;In case you don't have an old 3.2 instance on your database the new columns are:&lt;br /&gt;&lt;br /&gt;CONTENT_LENGTH&lt;br /&gt;INTERACTIVE_REPORT_ID&lt;br /&gt;IR_SAVED_REPORT_ID&lt;br /&gt;IR_SEARCH&lt;br /&gt;WS_APPLICATION_ID&lt;br /&gt;WS_DATAGRID_ID&lt;br /&gt;WS_PAGE_ID&lt;br /&gt;&lt;br /&gt;If you permanently store the log information you may want to update your tables and scripts to store the new information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-7256328168660897070?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7256328168660897070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/12/apex-40-new-columns-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7256328168660897070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7256328168660897070'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/12/apex-40-new-columns-in.html' title='APEX 4.0: New Columns in APEX_WORKSPACE_ACTIVITY_LOG'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7415275878591789937</id><published>2010-12-07T20:32:00.000-07:00</published><updated>2010-12-07T20:33:25.700-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX: How to Trigger Dynamic Action From Button</title><content type='html'>Someone recently asked me how to trigger a dynamic action from a button. At first I thought this was trivial question until I tried to do it and found it's not as straight forward as I expected.&lt;br /&gt;&lt;br /&gt;The following steps cover how to create a dynamic action on a button:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modify Button Template:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You'll need to modify the button template to allow for the button attributes to be applied to the button. This will allow us to use an ID to identify a button. To apply the button attributes go to Shared Components &gt; Templates &gt; Select the default button template (for most instances called "Button"). Add #BUTTON_ATTRIBUTES# to the button tag in the Template section. For example from: &lt;br /&gt;&lt;br /&gt;&amp;lt;button value="#LABEL#" onclick="#LINK#" class="button-gray" type="button"&amp;gt;&lt;br /&gt;&lt;br /&gt;To:&lt;br /&gt;&lt;br /&gt;&amp;lt;button value="#LABEL#" onclick="#LINK#" class="button-gray" type="button" &lt;span style="font-weight:bold;"&gt;#BUTTON_ATTRIBUTES#&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Create Button&lt;/span&gt;&lt;br /&gt;On the page you're working on create a Region Button:&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style:italic;"&gt;Button Name&lt;/span&gt;: TEST BUTTON&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Label&lt;/span&gt;: Test Button&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Button Style&lt;/span&gt;: Template Based Button&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Button Template&lt;/span&gt;: Button (or what ever button template you modified)&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Button Attributes&lt;/span&gt;: id="test_button"&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Make sure the id is unique&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Action&lt;/span&gt;: Redirect to URL&lt;br /&gt;&lt;span style="font-style:italic;"&gt;URL Target&lt;/span&gt;: javascript:return;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Create Dynamic Action&lt;/span&gt;&lt;br /&gt;Create a Dynamic Action. When you get to the "When" section:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Event&lt;/span&gt;: Click&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Selection Type&lt;/span&gt;: DOM Object&lt;br /&gt;&lt;span style="font-style:italic;"&gt;DOM Object&lt;/span&gt;: test_button&lt;br /&gt;&lt;span style="font-style:italic;"&gt;The DOM object represents the ID that you defined while creating the button.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Condition&lt;/span&gt;: No Condition&lt;br /&gt;&lt;br /&gt;Create your True and/or False actions accordingly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now when you run the page and click the button it should execute your dynamic action.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-7415275878591789937?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7415275878591789937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/12/apex-how-to-trigger-dynamic-action-from.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7415275878591789937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7415275878591789937'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/12/apex-how-to-trigger-dynamic-action-from.html' title='APEX: How to Trigger Dynamic Action From Button'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8567619392125269960</id><published>2010-10-25T16:33:00.000-06:00</published><updated>2010-10-25T16:35:01.659-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>APEX Hash Tag on Twitter: #orclapex</title><content type='html'>The old Oracle APEX hash tag on twitter was &lt;span style="text-decoration: line-through;"&gt;#apex&lt;/span&gt;. If you search for &lt;span style="text-decoration: line-through;"&gt;#apex&lt;/span&gt; on Twitter you get a lot of non Oracle APEX related topics as apex is a common name.&lt;br /&gt;&lt;br /&gt;Today I proposed a new hash tag for Oracle APEX related content on Twitter. Thanks to &lt;a href="http://spendolini.blogspot.com/" target="_blank"&gt;Scott Spendolini&lt;/a&gt; for coming up with the final name and &lt;a href="http://www.danielmcghan.us/" target="_blank"&gt;Dan McGhan&lt;/a&gt; for providing feedback.&lt;br /&gt;&lt;br /&gt;When posting on Oracle APEX related content on Twitter please us &lt;span style="font-weight:bold;"&gt;#orclapex&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8567619392125269960?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8567619392125269960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/10/apex-hash-tag-on-twitter-orclapex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8567619392125269960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8567619392125269960'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/10/apex-hash-tag-on-twitter-orclapex.html' title='APEX Hash Tag on Twitter: #orclapex'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3879620672139157451</id><published>2010-10-21T09:00:00.000-06:00</published><updated>2010-10-21T09:00:02.077-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Reports: No Limit Downloads</title><content type='html'>When configuring a standard report in APEX you can define the maximum number of rows that the query will return. This setting is called Max Row Count and can be configured in the Report Attributes tab. If you leave it blank it will default to 500 rows.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/TMBHWaM0ypI/AAAAAAAAD1M/qQI-dhYYyuM/s1600/max_row_count.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 305px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/TMBHWaM0ypI/AAAAAAAAD1M/qQI-dhYYyuM/s400/max_row_count.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5530498792726776466" /&gt;&lt;/a&gt;&lt;br /&gt;It is recommended that you set the Max Row Count with a low value. Using a small number will help improve performance since it reduces the amount rows APEX must count in order to display the pagination information. On a business perspective, it may not make sense to return thousands of rows for a user to view online.&lt;br /&gt;&lt;br /&gt;What if the user wants to retrieve all the data when they download the report? From the end users perspective this makes sense since they may want to extract all the data to do some custom analysis.&lt;br /&gt;&lt;br /&gt;My first thought was to use a page item for the Maximum Row Count. I quickly discovered that it only takes a numeric value. As a work around you can control the rows returned directly from the SQL statement. Here's an example of this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create a large table:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;CREATE TABLE large_emp&lt;br /&gt;AS&lt;br /&gt;      SELECT *&lt;br /&gt;        FROM emp&lt;br /&gt;  CONNECT BY LEVEL &lt;= 5;&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;- Create standard report&lt;/span&gt;&lt;br /&gt;Create a standard report using the following query. Set the Max Row Count to 999999999 (i.e. some very large number)&lt;br /&gt;&lt;pre class="brush: sql; highlight: 6;"&gt;&lt;br /&gt;SELECT ename,&lt;br /&gt;       job,&lt;br /&gt;       sal,&lt;br /&gt;       comm&lt;br /&gt;  FROM large_emp&lt;br /&gt; WHERE ROWNUM &lt;= CASE WHEN :request LIKE ('FLOW_EXCEL_OUTPUT%') THEN ROWNUM ELSE 500 END;&lt;/pre&gt;You are manually defining the Max Row Count by adding in ROWNUM predicate.&lt;br /&gt;&lt;br /&gt;When users &lt;span style="font-weight:bold;"&gt;views&lt;/span&gt; the report in APEX it will only display a maximum of 500 rows. When they &lt;span style="font-weight:bold;"&gt;download&lt;/span&gt; the report the csv file will contain all the rows.&lt;br /&gt;&lt;br /&gt;A caveat with this approach is that if your report has more than 500 rows you won't see the "&lt;span style="font-style:italic;"&gt;... of more than 500&lt;/span&gt;" rows message as part of the pagination. Instead users will see "&lt;span style="font-style:italic;"&gt;rows ... of 500&lt;/span&gt;" in the pagination. Users may be misled to think that the report only has 500 rows of data.&lt;br /&gt;&lt;br /&gt;When I reviewed this technique I was concerned about performance issues when viewing the report in APEX. Here are the TKPROF outputs of the original query (with Max Row Count = 500) and the alternate query with the ROWNUM predicate (Max Row Count = 999999999):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql; highlight: 42;"&gt;&lt;br /&gt;-- Both outputs are for VIEWING the report (not downloading it)&lt;br /&gt;--&lt;br /&gt;-- Original Query&lt;br /&gt;-- Max Row Count = 500&lt;br /&gt;-- Run for displaying rows 1~15&lt;br /&gt;SELECT ename, job, sal, comm&lt;br /&gt;  FROM large_emp&lt;br /&gt; order by 3 -- Automatically added by APEX&lt;br /&gt;&lt;br /&gt;call     count       cpu    elapsed       disk      query    current        rows&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;Parse        1      0.00       0.00          0          1          0           0&lt;br /&gt;Execute      2      0.00       0.00          0          0          0           0&lt;br /&gt;Fetch      501      0.65       1.42         14       3417          3         501&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;total      504      0.65       1.42         14       3418          3         501&lt;br /&gt;&lt;br /&gt;Misses in library cache during parse: 1&lt;br /&gt;Optimizer mode: ALL_ROWS&lt;br /&gt;Parsing user id: 40     (recursive depth: 2)&lt;br /&gt;&lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;    501  SORT ORDER BY (cr=3417 pr=14 pw=2053 time=1417580 us)&lt;br /&gt; 579194   TABLE ACCESS FULL LARGE_EMP (cr=3417 pr=0 pw=0 time=1158549 us)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Elapsed times include waiting on following events:&lt;br /&gt;  Event waited on                             Times   Max. Wait  Total Waited&lt;br /&gt;  ----------------------------------------   Waited  ----------  ------------&lt;br /&gt;  direct path write temp                         70        0.00          0.00&lt;br /&gt;  direct path read temp                           2        0.00          0.00&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- *************************************&lt;br /&gt;  &lt;br /&gt;-- New Query&lt;br /&gt;-- Max Row Count = 9999999999&lt;br /&gt;-- Run for displaying rows 1~15&lt;br /&gt;SELECT ename, job, sal, comm&lt;br /&gt;  FROM large_emp&lt;br /&gt; WHERE ROWNUM &lt;= CASE WHEN :request LIKE ('FLOW_EXCEL_OUTPUT%') THEN ROWNUM ELSE 500 END&lt;br /&gt; order by 3 -- Automatically added by APEX&lt;br /&gt;&lt;br /&gt;call     count       cpu    elapsed       disk      query    current        rows&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;Parse        2      0.00       0.00          0          0          0           0&lt;br /&gt;Execute      2      0.00       0.00          0          0          1           0&lt;br /&gt;Fetch      501      0.38       0.53          0       3417          0         500&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;total      505      0.38       0.54          0       3417          1         500&lt;br /&gt;&lt;br /&gt;Misses in library cache during parse: 1&lt;br /&gt;Parsing user id: 40     (recursive depth: 2)&lt;br /&gt;  &lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;    500  SORT ORDER BY (cr=3417 pr=0 pw=0 time=535125 us)&lt;br /&gt;    500   COUNT  (cr=3417 pr=0 pw=0 time=3376 us)&lt;br /&gt;    500    FILTER  (cr=3417 pr=0 pw=0 time=2298 us)&lt;br /&gt; 579194     TABLE ACCESS FULL LARGE_EMP (cr=3417 pr=0 pw=0 time=5212959 us)&lt;/pre&gt;I'm not a performance guru and I can't comment too much on these outputs. If you think this will have negative effects on performance please add your feedback as a comment on this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3879620672139157451?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3879620672139157451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/10/apex-reports-no-limit-downloads.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3879620672139157451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3879620672139157451'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/10/apex-reports-no-limit-downloads.html' title='APEX Reports: No Limit Downloads'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_33EF80fk9sM/TMBHWaM0ypI/AAAAAAAAD1M/qQI-dhYYyuM/s72-c/max_row_count.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1530762048597969581</id><published>2010-10-20T09:00:00.001-06:00</published><updated>2010-10-20T09:00:03.044-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE XE'/><title type='text'>Oracle XE and APEX: Where is my Trace File?</title><content type='html'>In APEX you trace your session by adding &lt;span style="font-style:italic;"&gt;&amp;p_trace=YES&lt;/span&gt; at the end of your URL. For example: http://fcapex40:8080/apex/f?p=101:1:2603384364125271::NO&amp;p_trace=YES Please refer to the &lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/user.40/e15517/debug.htm#BABGDGEH" target="_blank"&gt;APEX documentation&lt;/a&gt; for more information regarding traces in APEX.&lt;br /&gt;&lt;br /&gt;The documentation states that the trace file is located in the following directory:&lt;br /&gt;&lt;pre class="brush: sql; highlight: 2"&gt;&lt;br /&gt;SQL&gt; -- Run as SYSTEM&lt;br /&gt;SQL&gt;  SHOW PARAMETERS user_dump_dest&lt;br /&gt;&lt;br /&gt;NAME                                 TYPE        VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;user_dump_dest                       string      /usr/lib/oracle/xe/app/oracle/&lt;br /&gt;                                                 admin/XE/udump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This isn't the case if you're using the Embedded PL/SQL Gateway, which is how APEX is run on Oracle XE. Thanks to Jari for answering my question on the APEX forum about this: &lt;a href="http://forums.oracle.com/forums/thread.jspa?forumID=137&amp;threadID=1771547" target="_blank"&gt;http://forums.oracle.com/forums/thread.jspa?forumID=137&amp;threadID=1771547&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For APEX installations that use the PL/SQL Embedded Gateway (i.e. Oracle XE) the trace file is located in the following directory:&lt;br /&gt;&lt;pre class="brush: sql: highlight: 1"&gt;&lt;br /&gt;SQL&gt; SHOW PARAMETER background_dump_dest&lt;br /&gt;&lt;br /&gt;NAME                                 TYPE        VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;background_dump_dest                 string      /usr/lib/oracle/xe/app/oracle/&lt;br /&gt;                                                 admin/XE/bdump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To find the trace file that was created for your session:&lt;br /&gt;&lt;pre class="brush: shell;"&gt;&lt;br /&gt;$ cd /usr/lib/oracle/xe/app/oracle/admin/XE/bdump&lt;br /&gt;$ grep -l "APP_SESSION" *.trc&lt;br /&gt;#example &lt;br /&gt;$ grep -l "2603384364125271" *.trc&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1530762048597969581?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1530762048597969581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/10/oracle-xe-and-apex-where-is-my-trace.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1530762048597969581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1530762048597969581'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/10/oracle-xe-and-apex-where-is-my-trace.html' title='Oracle XE and APEX: Where is my Trace File?'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-4959422865931343365</id><published>2010-10-19T07:50:00.001-06:00</published><updated>2011-07-11T17:59:14.196-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Region Errors - Part 2</title><content type='html'>&lt;span style="font-weight:bold;color:red;"&gt;Disclaimer: &lt;/span&gt;&lt;span style="color:red;"&gt;This is an advanced post that discusses and modifies some of the inner workings of APEX.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In my previous post on &lt;a href="http://www.talkapex.com/2010/10/apex-region-errors-part-1.html"&gt;APEX Region Errors&lt;/a&gt; I wrote about logging region errors in APEX. In this post I'll cover how to automatically be notified when a region error occurs and store some additional log information.&lt;br /&gt;&lt;br /&gt;It's important that you actually read my previous posts on &lt;a href="http://www.talkapex.com/2010/10/apex-region-errors-part-1.html"&gt;APEX Region Errors&lt;/a&gt; and  &lt;a href="http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html"&gt;Custom Error Messages in APEX&lt;/a&gt;. The rest of this post will assume that you've read both of these posts. &lt;br /&gt;&lt;br /&gt;Before we continue we need to review how the activity log works. APEX_WORKSPACE_ACTIVITY_LOG is a view which references APEX_040000. WWV_FLOW_ACTIVITY_LOG. WWV_FLOW_ACTIVITY_LOG is a view which joins APEX_040000.WWV_FLOW_ACTIVITY_LOG1$ and APEX_040000.WWV_FLOW_ACTIVITY_LOG2$. The first paragraph of &lt;a href="http://www.talkapex.com/2009/05/apex-logs-storing-log-data.html"&gt;APEX Logs: Storing Log Data&lt;/a&gt; provides a brief description of why the logs are stored in two tables.&lt;br /&gt;&lt;br /&gt;In order to have advanced log information and notify an administrator when a region error occurs we will apply a trigger on each of the log tables.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;color:red;"&gt;Disclaimer (again): &lt;/span&gt;&lt;span style="color:red;"&gt;Modifying anything in the APEX schema will put your APEX instance in an unsupported state. Please proceed with caution. I take no responsibility for any negative outcomes about this.&lt;/span&gt;&lt;span style="font-style:italic;"&gt; &lt;a href="http://joelkallman.blogspot.com" target="_blank"&gt;Joel Kallman&lt;/a&gt; wrote about &lt;a href="http://joelkallman.blogspot.com/2010/01/perils-of-modifying-application-express.html" target="_blank"&gt;The Perils of Modifying the Application Express Metadata&lt;/a&gt; in regards to Oracle support.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Install Logger and compile the sp_log_error_page procedure.&lt;/span&gt;&lt;br /&gt;Install logger and sp_log_error_page in the schema that your APEX application will run against.&lt;br /&gt;Logger: &lt;a href="http://logger.samplecode.oracle.com/" target="_blank"&gt;http://logger.samplecode.oracle.com&lt;/a&gt;&lt;br /&gt;sp_log_error_page: &lt;a href="http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html"&gt;http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Apply trigger to log tables&lt;/span&gt;&lt;br /&gt;Apply triggers to both of the activity log tables so that we can be notified right away when a page or region level error occurs.&lt;br /&gt;&lt;br /&gt;As SYSTEM compile the following triggers:&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;CREATE OR REPLACE TRIGGER giffy.trg_apex_activity_log1_air -- Where "giffy" is the schema that I am running my APEX app in. Change accordingly&lt;br /&gt;  AFTER INSERT&lt;br /&gt;  ON apex_040000.wwv_flow_activity_log1$&lt;br /&gt;  FOR EACH ROW&lt;br /&gt;  WHEN (new.SQLERRM IS NOT NULL)&lt;br /&gt;DECLARE&lt;br /&gt;  v_count                       PLS_INTEGER;&lt;br /&gt;BEGIN&lt;br /&gt;  -- Check if the application belongs to this schema&lt;br /&gt;  SELECT COUNT (application_id)&lt;br /&gt;    INTO v_count&lt;br /&gt;    FROM apex_applications&lt;br /&gt;   WHERE application_id = :new.flow_id&lt;br /&gt;     AND owner = 'GIFFY'; -- Schema that I am running in&lt;br /&gt;&lt;br /&gt;  IF v_count &gt; 0 THEN&lt;br /&gt;    sp_log_error_page (p_scope_prefix =&gt; 'apex.region_error',&lt;br /&gt;                       p_application_id =&gt; :new.flow_id,&lt;br /&gt;                       p_page_id   =&gt; :new.step_id,&lt;br /&gt;                       p_oracle_err_msg =&gt; :new.SQLERRM,&lt;br /&gt;                       p_apex_err_msg =&gt; '{component_type: ' || :new.sqlerrm_component_type || ', component_name: ' || :new.sqlerrm_component_name || '}',&lt;br /&gt;                       p_email     =&gt; NULL);&lt;br /&gt;  END IF;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And... (differences are highlighted)&lt;br /&gt;&lt;pre class="brush: sql; highlight: [1,3]"&gt;&lt;br /&gt;CREATE OR REPLACE TRIGGER giffy.trg_apex_activity_log2_air -- Where "giffy" is the schema that I am running my APEX app in. Change accordingly&lt;br /&gt;  AFTER INSERT&lt;br /&gt;  ON apex_040000.wwv_flow_activity_log2$&lt;br /&gt;  FOR EACH ROW&lt;br /&gt;  WHEN (new.SQLERRM IS NOT NULL)&lt;br /&gt;DECLARE&lt;br /&gt;  v_count                       PLS_INTEGER;&lt;br /&gt;BEGIN&lt;br /&gt;  -- Check if the application belongs to this schema&lt;br /&gt;  SELECT COUNT (application_id)&lt;br /&gt;    INTO v_count&lt;br /&gt;    FROM apex_applications&lt;br /&gt;   WHERE application_id = :new.flow_id&lt;br /&gt;     AND owner = 'GIFFY'; -- Schema that I am running in&lt;br /&gt;&lt;br /&gt;  IF v_count &gt; 0 THEN&lt;br /&gt;    sp_log_error_page (p_scope_prefix =&gt; 'apex.region_error',&lt;br /&gt;                       p_application_id =&gt; :new.flow_id,&lt;br /&gt;                       p_page_id   =&gt; :new.step_id,&lt;br /&gt;                       p_oracle_err_msg =&gt; :new.SQLERRM,&lt;br /&gt;                       p_apex_err_msg =&gt; '{component_type: ' || :new.sqlerrm_component_type || ', component_name: ' || :new.sqlerrm_component_name || '}',&lt;br /&gt;                       p_email     =&gt; NULL);&lt;br /&gt;  END IF;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now when an page or region level error occurs you will have advanced logging information and you have the option to be notified by email. The log information will be stored in your schema in the &lt;span style="font-style:italic;"&gt;LOGGER_LOGS&lt;/span&gt; table&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.talkapex.com/2011/07/apex-region-errors-part-3.html" style="font-weight:bold;"&gt;APEX Region Errors - Part 3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-4959422865931343365?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/4959422865931343365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/10/apex-region-errors-part-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4959422865931343365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4959422865931343365'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/10/apex-region-errors-part-2.html' title='APEX Region Errors - Part 2'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8657995088659156864</id><published>2010-10-18T09:00:00.002-06:00</published><updated>2011-07-11T17:58:28.780-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Region Errors - Part 1</title><content type='html'>A while ago I wrote about how to handle and customize the default unhandled exception error page in APEX: &lt;a href="http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html"&gt;http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html&lt;/a&gt; The method described in the post catches page level errors and can notify administrators immediately when an undhandled exception occurs. &lt;br /&gt;&lt;br /&gt;Region level errors are not caught using the method above. An example of a region error is when you have a query that has divisor is equal to zero error. To simulate this error create a standard report region with the following query:&lt;br /&gt;&lt;pre class="brush: sql; highlight: 3"&gt;&lt;br /&gt;SELECT *&lt;br /&gt;  FROM emp&lt;br /&gt; WHERE 1 / 0 = 0 -- Causes an ORA-01476: divisor is equal to zero&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This query will return a "&lt;span style="font-style:italic;"&gt;ORA-01476: divisor is equal to zero&lt;/span&gt;" error message in APEX.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TLuUB6biMtI/AAAAAAAAD0w/QPLuUQ-IlOE/s1600/region_error.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 284px; height: 96px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TLuUB6biMtI/AAAAAAAAD0w/QPLuUQ-IlOE/s400/region_error.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5529175728112939730" /&gt;&lt;/a&gt;&lt;br /&gt;Starting with APEX 4.0 region level errors are logged in the APEX Activity Log. The following query identifies both page and region level errors:&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT apex_user,&lt;br /&gt;       application_id,&lt;br /&gt;       application_name,&lt;br /&gt;       page_id,&lt;br /&gt;       page_name,&lt;br /&gt;       view_date,&lt;br /&gt;       apex_session_id,&lt;br /&gt;       error_message,&lt;br /&gt;       error_on_component_type,&lt;br /&gt;       error_on_component_name -- Region/Process that caused the issue&lt;br /&gt;  FROM apex_workspace_activity_log&lt;br /&gt; WHERE error_message IS NOT NULL&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I strongly recommend that you frequently scan the activity logs for errors. &lt;span style="font-style:italic;"&gt;Part 2 of will describe a way to be automatically notified of region level errors.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;They're a few caveats that you should be aware of:&lt;br /&gt;&lt;br /&gt;- As mentioned, the activity log identifies both region and page level errors. &lt;span style="font-style:italic;"&gt;APEX_WORKSPACE_ACTIVITY_LOG.ERROR_ON_COMPONENT_NAME&lt;/span&gt; identifies the region or process that the error occured in.&lt;br /&gt;&lt;br /&gt;- When multiple region level errors occur only the first error is logged in the activity log.&lt;br /&gt;&lt;br /&gt;- From my limited testing, errors in Interactive Reports are not logged. Their may be other types of regions that don't log errors as well. &lt;br /&gt;&lt;br /&gt;Given the caveats listed above querying the activity logs help identify some, but not all, errors that happen in your application.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.talkapex.com/2010/10/apex-region-errors-part-2.html" style="font-weight:bold;"&gt;APEX Region Errors - Part 2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8657995088659156864?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8657995088659156864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/10/apex-region-errors-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8657995088659156864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8657995088659156864'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/10/apex-region-errors-part-1.html' title='APEX Region Errors - Part 1'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TLuUB6biMtI/AAAAAAAAD0w/QPLuUQ-IlOE/s72-c/region_error.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1257253482158687445</id><published>2010-09-29T07:21:00.000-06:00</published><updated>2010-09-29T07:22:10.712-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Page Locks</title><content type='html'>When developing APEX applications in a team environment you usually don't want multiple developers working on the same page at the same time. This can cause a lot of confusion and unexpected effects with the application.&lt;br /&gt;&lt;br /&gt;APEX has a great feature called Page Locks which enables developers to lock a page so that they're the only one that can work on it at a given time. Other developers can view the page, but can not make any changes while the page is locked.&lt;br /&gt;&lt;br /&gt;To lock a page, click on the lock icon located in the top right corner of the page as displayed in the following picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TKM8h_AOwGI/AAAAAAAAD0o/h4QIeqGXmwA/s1600/Page+Locks.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 39px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TKM8h_AOwGI/AAAAAAAAD0o/h4QIeqGXmwA/s400/Page+Locks.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5522324122632110178" /&gt;&lt;/a&gt;&lt;br /&gt;You will need to enter a comment and then click the Lock Checked button. For the comment it is recommended that you enter what case/bug number you're working on and what impact it may have on the page. The history of these comments, both for locking and unlocking the page, is logged. Before you invest a lot of time with detailed comments it's important to note the following points that may be relevant within your environment. &lt;br /&gt;&lt;br /&gt;Page locks are not retained when an application is copied or exported. This makes sense as you don't want page locks to propagate in an export file.&lt;br /&gt;&lt;br /&gt;Like page locks, the lock history is not retained when an application is copied or exported. If you tend to move the development copy of your application between workspaces this may be an issue. This may effect the level of detail for lock comments that you require the developers on your team to use.&lt;br /&gt;&lt;br /&gt;If you want to backup the page lock comment history you can access them from the following table:&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;  SELECT *&lt;br /&gt;    FROM apex_040000.wwv_flow_lock_page_log&lt;br /&gt;   WHERE lock_flow = :app_id&lt;br /&gt;ORDER BY lock_page, action_date&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1257253482158687445?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1257253482158687445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/09/apex-page-locks.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1257253482158687445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1257253482158687445'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/09/apex-page-locks.html' title='APEX Page Locks'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TKM8h_AOwGI/AAAAAAAAD0o/h4QIeqGXmwA/s72-c/Page+Locks.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8358553811237578441</id><published>2010-09-16T08:00:00.000-06:00</published><updated>2010-09-16T08:03:03.984-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Demo APEX Right Out of the Box</title><content type='html'>If you want to quickly try out the new features after installing APEX 4.0 you don't need to do anything! APEX now comes with a built in demo. &lt;br /&gt;&lt;br /&gt;To access this demo, log into a workspace and click the "Learn more..." button. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TJGEV7qE4qI/AAAAAAAAD0Q/mBjE86WGL7c/s1600/learn_more.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 145px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TJGEV7qE4qI/AAAAAAAAD0Q/mBjE86WGL7c/s400/learn_more.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5517336530831860386" /&gt;&lt;/a&gt;&lt;br /&gt;On the right hand side you'll see a list of features to demo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/TJGEVeA3zuI/AAAAAAAAD0I/Q1S3Ev-8vkk/s1600/demo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 194px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/TJGEVeA3zuI/AAAAAAAAD0I/Q1S3Ev-8vkk/s400/demo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5517336522874408674" /&gt;&lt;/a&gt;&lt;br /&gt;If you're curious, the tables that the demo is using are: &lt;span style="font-style:italic;"&gt;APEX_040000.WWV_DEMO_DEPT&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;APEX_040000.WWV_DEMO_EMP&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8358553811237578441?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8358553811237578441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/09/demo-apex-right-out-of-box.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8358553811237578441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8358553811237578441'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/09/demo-apex-right-out-of-box.html' title='Demo APEX Right Out of the Box'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TJGEV7qE4qI/AAAAAAAAD0Q/mBjE86WGL7c/s72-c/learn_more.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7564339541995001785</id><published>2010-09-15T09:00:00.000-06:00</published><updated>2010-09-15T09:00:05.959-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX IR: Subscriptions with Bind Variables and VPD</title><content type='html'>Starting in APEX 4.0, Interactive Reports (IR) now have the ability for users to automatically get reports emailed to them. This is a great feature to allow end users to subscribe to data extracts rather than developers writing custom code.&lt;br /&gt;&lt;br /&gt;To enable subscriptions select the Subscription option in the IR Report Attributes page:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/TIzmL7f2yxI/AAAAAAAADzY/9eV46ilavIU/s1600/ir_enable_subscription.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 233px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/TIzmL7f2yxI/AAAAAAAADzY/9eV46ilavIU/s400/ir_enable_subscription.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5516036736246270738" /&gt;&lt;/a&gt;&lt;br /&gt;Users can subscribe to email notifications by selecting the Subscription option in the Actions menu&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/TIzmMSOEcnI/AAAAAAAADzg/btDT4G-g-9s/s1600/ir_subscription.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/TIzmMSOEcnI/AAAAAAAADzg/btDT4G-g-9s/s400/ir_subscription.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5516036742345683570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TIzmMl2wf8I/AAAAAAAADzo/V0LpqLxYxcg/s1600/ir_subscription_subscribe.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 160px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TIzmMl2wf8I/AAAAAAAADzo/V0LpqLxYxcg/s400/ir_subscription_subscribe.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5516036747616616386" /&gt;&lt;/a&gt;&lt;br /&gt;Before implementing subscriptions they're some things that you should be aware of.&lt;br /&gt;&lt;br /&gt;If your query uses bind variables, they will not be bound in the emailed reports. For example, supposed you had a select list of departments, &lt;span style="font-style:italic;"&gt;P1_DEPTNO&lt;/span&gt;. If you then had an IR that listed all the employees in the department it would look like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT *&lt;br /&gt;  FROM emp&lt;br /&gt; WHERE deptno = :p1_deptno&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When a user is viewing the report in the application they'll get some employees for each department. If they subscribe to this IR then they'll get no rows returned as no value is bound for :P1_DEPTNO.&lt;br /&gt;&lt;br /&gt;If you use the VPD feature in Oracle (Shared Components &gt; Security Attributes &gt; Virtual Private Database) it doesn't appear to be fired before the query is run as part of the subscription. I tested this by calling a log procedure in the VPD section. When the report is generated for an email subscription no log was registered in my log table.&lt;br /&gt;&lt;br /&gt;I wouldn't classify either of these cases as bugs, however it's important for you to know what subscriptions can and can't handle before leveraging the subscriptions feature in a production application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-7564339541995001785?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7564339541995001785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/09/apex-ir-subscriptions-with-bind.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7564339541995001785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7564339541995001785'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/09/apex-ir-subscriptions-with-bind.html' title='APEX IR: Subscriptions with Bind Variables and VPD'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_33EF80fk9sM/TIzmL7f2yxI/AAAAAAAADzY/9eV46ilavIU/s72-c/ir_enable_subscription.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3282991634860492331</id><published>2010-09-14T09:00:00.001-06:00</published><updated>2010-09-14T09:00:07.253-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEXPOSED'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEXposed 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TIzsTS_VT4I/AAAAAAAADzw/nqAy72jEz3Q/s1600/Dallas-Button.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 141px; height: 198px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TIzsTS_VT4I/AAAAAAAADzw/nqAy72jEz3Q/s400/Dallas-Button.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5516043459881160578" /&gt;&lt;/a&gt;&lt;br /&gt;I'll be giving a few presentations this year at &lt;a href="http://www.odtugapextraining.com/dallas.html" target="_blank"&gt;APEX&lt;span style="font-style:italic;"&gt;posed&lt;/span&gt; 2010&lt;/a&gt; in Dallas, Texas.&lt;br /&gt;&lt;br /&gt;This will be my first  &lt;a href="http://www.odtugapextraining.com/dallas.html" target="_blank"&gt;APEX&lt;span style="font-style:italic;"&gt;posed&lt;/span&gt; 2010&lt;/a&gt; event and I'm really excited to go since they're some excellent &lt;a href="http://www.odtugapextraining.com/instructors.htm" target="_blank"&gt;presenters&lt;/a&gt; this year. If you're new to APEX this will be an excellent opportunity to learn from some of the best in the APEX community.&lt;br /&gt;&lt;br /&gt;If you haven't already done so I encourage you to &lt;a href="http://www.odtugapextraining.com/register.htm" style="font-weight:bold" target="_blank"&gt;register&lt;/a&gt; soon to take advantage of the early bird rates.&lt;br /&gt;&lt;br /&gt;I'll be doing 2 presentations and participating in a workshop. I've included the abstracts for them below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.odtugapextraining.com/presentations.html#APEXPlug" style="font-weight:bold" target="_blank"&gt;APEX Plug-ins&lt;/a&gt;: One of the most anticipated new features in APEX 4.0 is Plug-Ins which allows developers to declaratively extend existing functionality in APEX. This presentation will go over the different types of Plug-Ins and how to create them. Primary focus will be on Item, Process, and Region type Plug-Ins.&lt;br /&gt; &lt;br /&gt;Creating your first Plug-In can be intimidating, especially for developers new APEX developers. Some tips to help with obstacles that developers may encounter will be discussed.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.odtugapextraining.com/presentations.html#TeamDevelopment" style="font-weight:bold" target="_blank"&gt;Team Development&lt;/a&gt;: Managing a development project can be a cumbersome activity without the right tools. Beginning with 4.0, APEX now includes a software development management tool that integrates with your APEX applications.&lt;br /&gt; &lt;br /&gt;This presentation will go over these tools and how they can help manage the development life cycle of your APEX application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Authentication Workshop&lt;/span&gt;: I'll be participating in this workshop. Here is the abstract&lt;br /&gt;&lt;br /&gt;Who are you, really?  This workshop will demonstrate many methods of answering that question, from built-in authentication schemes to custom single sign-on.  LDAP, RSA, home-grown.  We will provide methods to solve many common authentication requirements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3282991634860492331?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3282991634860492331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/09/apexposed-2010.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3282991634860492331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3282991634860492331'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/09/apexposed-2010.html' title='APEXposed 2010'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/TIzsTS_VT4I/AAAAAAAADzw/nqAy72jEz3Q/s72-c/Dallas-Button.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5770605652522635587</id><published>2010-09-12T23:43:00.001-06:00</published><updated>2011-06-05T17:27:26.131-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>ODTUG: How to be Creative</title><content type='html'>At &lt;a href="http://www.odtugkaleidoscope.com/" target="_blank"&gt;ODTUG  Kaleidoscope&lt;/a&gt; I promised that I would post my slides from my presentation. Here is a copy of the &lt;a href="http://files.clarifit.com/blogs/talkapex/odtug2010/how_to_be_creative_odtug_web.pdf" target="_blank"&gt;How to be Creative&lt;/a&gt; presentation.&lt;br /&gt;&lt;br /&gt;The demos can be found here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Apex Dictionary:&lt;/span&gt; &lt;a href="http://www.talkapex.com/2010/07/missing-views-from-apexdictionary.html"&gt;http://www.talkapex.com/2010/07/missing-views-from-apexdictionary.html&lt;br /&gt;&lt;/a&gt; and &lt;a href="http://www.talkapex.com/2008/11/how-to-list-apex-dictionary-views-using.html"&gt;http://www.talkapex.com/2008/11/how-to-list-apex-dictionary-views-using.html&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Tooltips:&lt;/span&gt; &lt;a href="http://www.talkapex.com/2009/09/tooltip-help-in-apex-alternative-to.html"&gt;http://www.talkapex.com/2009/09/tooltip-help-in-apex-alternative-to.html&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Standardized Help:&lt;/span&gt; &lt;a href="http://www.talkapex.com/2009/10/standardizing-help-text-in-apex.html"&gt;http://www.talkapex.com/2009/10/standardizing-help-text-in-apex.html&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;APEX Logs:&lt;/span&gt; &lt;a href="http://www.talkapex.com/2009/03/custom-authentication-status.html"&gt;http://www.talkapex.com/2009/03/custom-authentication-status.html&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Custom Error Messages:&lt;/span&gt; &lt;a href="http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html"&gt;http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5770605652522635587?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5770605652522635587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/09/odtug-how-to-be-creative.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5770605652522635587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5770605652522635587'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/09/odtug-how-to-be-creative.html' title='ODTUG: How to be Creative'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3071838491967134249</id><published>2010-09-12T23:32:00.003-06:00</published><updated>2011-07-04T10:10:51.872-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Custom Error Messages in APEX</title><content type='html'>As developers we try to prevent unhandled exceptions from occurring for end users. They can occur in any program or language, and APEX is no exception (pardon the pun).&lt;br /&gt;&lt;br /&gt;When an unhandled exception happens, users are presented with an error message which is similar to the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TI2y4xmOtWI/AAAAAAAADz4/FlxLvbSxVgg/s1600/error_msg_example.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 324px; height: 126px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TI2y4xmOtWI/AAAAAAAADz4/FlxLvbSxVgg/s400/error_msg_example.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5516261807054828898" /&gt;&lt;/a&gt;&lt;br /&gt;This error message isn't very user friendly and most users won't know what an "ORA-..." message means. The other issue with this screen is that it does not provide any feedback to developers. If the user does not report this issue developers won't know that it is happening.&lt;br /&gt;&lt;br /&gt;As part of my &lt;a href="http://www.talkapex.com/2010/09/odtug-how-to-be-creative.html"&gt;ODTUG presentation&lt;/a&gt; I demonstrated how to alter the default error page to provide a user friendly error message and provide an instant notification to developers that an error has occurred. This post will describe how to do implement a user friendly error handling method in APEX 4.0.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Special thanks to &lt;a href="http://roelhartman.blogspot.com/" target="_blank"&gt;Roel Hartman&lt;/a&gt; and &lt;a href="http://learco-brizzi.blogspot.com/" target="_blank"&gt;Learco  Brizzi&lt;/a&gt; for providing the ideas behind this.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Install Logger&lt;/span&gt;&lt;br /&gt;Logger is an open source package written by &lt;a href="http://tylermuth.wordpress.com" target="_blank"&gt;Tyler Muth&lt;/a&gt;. It's an excellent tool to quickly allow developers to instrument their code. Though it is not required, this demo references it. A copy of logger is available here: &lt;a href="https://logger.samplecode.oracle.com/" target="_blank"&gt;http://logger.samplecode.oracle.com/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Install Simple Modal Plug-in&lt;/span&gt;&lt;br /&gt;Install the Simple Modal plugin into your APEX application: &lt;a href="http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/simple-modal.html" target="_blank"&gt;http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/simple-modal.html&lt;/a&gt;. When you download this plugin, the zip file contains 2 plugins. One to show the modal window and one to close the modal window. It is recommended that you install both if you plan to use it in other applications. Only the "Simple Modal - Show" plug is required for this demo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create Error Procedure&lt;/span&gt;&lt;br /&gt;Compile this procedure in your schema. It will log all the page items, application items, and all other not-null page items.&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;/**&lt;br /&gt; * Logs unhandled error message to Database&lt;br /&gt; * Logs:&lt;br /&gt; * - APEX and Oracle error messages&lt;br /&gt; * - All application level items&lt;br /&gt; * - All page items for p_page_id&lt;br /&gt; * - Items on other pages that are not null&lt;br /&gt; * &lt;br /&gt; * Logs are stored in logger_logs&lt;br /&gt; * Requires: https://logger.samplecode.oracle.com/&lt;br /&gt; *&lt;br /&gt; * @param p_scope_prefix Scope prefix used in logger&lt;br /&gt; * @param p_application_id &lt;br /&gt; * @param p_page_id Page that error occured on&lt;br /&gt; * @param p_oracle_error_msg Oracle error message&lt;br /&gt; * @param p_apex_error_msg APEX error message&lt;br /&gt; * @param p_email Email to be notified of error. If null, then no notification email sent.&lt;br /&gt; * @author Martin Giffy D''Souza http://www.talkapex.com&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE sp_log_error_page (p_scope_prefix IN VARCHAR2,&lt;br /&gt;                                               p_application_id IN apex_applications.application_id%TYPE DEFAULT v ('APP_ID'),&lt;br /&gt;                                               p_page_id      IN apex_application_pages.page_id%TYPE,&lt;br /&gt;                                               p_oracle_err_msg IN VARCHAR2 DEFAULT NULL,&lt;br /&gt;                                               p_apex_err_msg IN VARCHAR2 DEFAULT NULL,&lt;br /&gt;                                               p_email        IN VARCHAR2 DEFAULT NULL)&lt;br /&gt;AS&lt;br /&gt;  v_db_name                     VARCHAR2 (30);&lt;br /&gt;  v_schema                      VARCHAR2 (30);&lt;br /&gt;  v_scope                       VARCHAR2 (255);&lt;br /&gt;BEGIN&lt;br /&gt;  -- Set scope for logger&lt;br /&gt;  v_scope := p_scope_prefix;&lt;br /&gt;&lt;br /&gt;  -- Add Uniqe Identifier to scope&lt;br /&gt;  v_scope := LOWER (v_scope || 'unhandeled_exception{session_id: ' || v ('APP_SESSION') || ', guid: ' || SYS_GUID () || '}');&lt;br /&gt;&lt;br /&gt;  -- Log the initial error to be kept permanently&lt;br /&gt;  logger.log_error ('Unhandeled Exception', v_scope, 'Oracle Error: ' || p_oracle_err_msg || CHR (10) || CHR (10) || 'APEX Error Page Message: ' || p_apex_err_msg);&lt;br /&gt;&lt;br /&gt;  -- Log the information to help Dev team in production&lt;br /&gt;  FOR x IN (SELECT 'APP_USER' item_name, v ('APP_USER') item_val FROM DUAL&lt;br /&gt;            UNION&lt;br /&gt;            SELECT 'APP_SESSION' item_name, v ('APP_SESSION') FROM DUAL&lt;br /&gt;            UNION&lt;br /&gt;            -- Include all the items from the current page&lt;br /&gt;            SELECT item_name, v (item_name) item_val&lt;br /&gt;              FROM apex_application_page_items&lt;br /&gt;             WHERE application_id = p_application_id&lt;br /&gt;               AND page_id = p_page_id&lt;br /&gt;            UNION&lt;br /&gt;            -- Include all the non-null page items&lt;br /&gt;            SELECT item_name, item_val&lt;br /&gt;              FROM (SELECT item_name, v (item_name) item_val&lt;br /&gt;                      FROM apex_application_page_items&lt;br /&gt;                     WHERE application_id = p_application_id&lt;br /&gt;                       AND page_id != p_page_id)&lt;br /&gt;             WHERE item_val IS NOT NULL&lt;br /&gt;            UNION&lt;br /&gt;            -- Include all Application Items&lt;br /&gt;            SELECT item_name, v (item_name)&lt;br /&gt;              FROM apex_application_items&lt;br /&gt;             WHERE application_id = p_application_id)&lt;br /&gt;  LOOP&lt;br /&gt;    logger.log_information (x.item_name || ': ' || x.item_val, v_scope);&lt;br /&gt;  END LOOP;&lt;br /&gt;&lt;br /&gt;  -- Email Notification&lt;br /&gt;  IF p_email IS NOT NULL THEN&lt;br /&gt;    -- Send Mail&lt;br /&gt;&lt;br /&gt;    apex_mail.send (p_to        =&gt; p_email,&lt;br /&gt;                    p_from      =&gt; 'martin@talkapex.com', -- CHANGE THIS!&lt;br /&gt;                    p_body      =&gt; 'An unhandled exception happend in an application. Please search logger logs for: ' || v_scope,&lt;br /&gt;                    p_subj      =&gt; 'Unhandled Exception in: ' || p_application_id);&lt;br /&gt;  END IF;&lt;br /&gt;END sp_log_error_page;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create Error Page&lt;/span&gt;&lt;br /&gt;This page will display a user friendly message to the user. For the purposes of this demo Page 200 will be created to handle error messages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Create Page&lt;/span&gt;&lt;br /&gt;Create Page 200&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Create a HTML region&lt;/span&gt;&lt;br /&gt;Region Name: Unknown Error&lt;br /&gt;Source: An unhandled error occurred. A notification has been sent to the system administrator.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Create a Region Button:&lt;/span&gt;&lt;br /&gt;Button Name: Back&lt;br /&gt;Action: Redirect to URL&lt;br /&gt;Execute Validations: No&lt;br /&gt;URL Target: javascript:window.history.go(-1);&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Add the following hidden items:&lt;/span&gt;&lt;br /&gt;P200_PAGE_ID&lt;br /&gt;P200_ESCAPE&lt;br /&gt;P200_ORA_MSG&lt;br /&gt;P200_APEX_MSG&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Create Computation:&lt;/span&gt;&lt;br /&gt;Item: P200_ORA_MSG&lt;br /&gt;Point: Before Header&lt;br /&gt;Type: PL/SQL Expression&lt;br /&gt;Computation: REPLACE(:p200_ora_msg,:p200_escape,':');&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Create Dynamic Action:&lt;/span&gt;&lt;br /&gt;(select Advanced)&lt;br /&gt;Name: Show Error Message Modal&lt;br /&gt;Event: Page Load&lt;br /&gt;Action: Simple Modal - Show&lt;br /&gt; - Esc Close: No&lt;br /&gt; - Change Opacity and Background Color as desired&lt;br /&gt;Select Type: Region&lt;br /&gt; - Region: Unknown Error&lt;br /&gt;&lt;br /&gt;Create Page Process:&lt;br /&gt;Type: PL/SQL&lt;br /&gt;Name: Log Error&lt;br /&gt;Point: On Load - Before Header&lt;br /&gt;Source: &lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;DECLARE&lt;br /&gt;BEGIN&lt;br /&gt;  sp_log_error_page (p_scope_prefix =&gt; 'apex.demo.', -- Enter what ever you want to help identify your apex errors in the log tables&lt;br /&gt;                     p_application_id =&gt; :app_id,&lt;br /&gt;                     p_page_id   =&gt; :p200_page_id,&lt;br /&gt;                     p_oracle_err_msg =&gt; :p200_ora_msg,&lt;br /&gt;                     p_apex_err_msg =&gt; :p200_apex_msg,&lt;br /&gt;                     p_email     =&gt; '' -- Enter your email address here&lt;br /&gt;                                      );&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Change Error Template&lt;/span&gt;&lt;br /&gt;Go to: Shared Components &gt; Templates&lt;br /&gt;Select the default Page Template &lt;span style="font-style:italic;"&gt;(for my demo mine was: One Level Tabs - Right Sidebar (optional / table-based)&lt;/span&gt;&lt;br /&gt;Error Page Template:&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;  $('body').hide();&lt;br /&gt;  var apexEscape = '*@*'; //Used to replace semi colons in the value so does not invalidate URL&lt;br /&gt;  var oraMsg = $('.ErrorPageMessage').html().replace(/:/g,apexEscape);&lt;br /&gt;  var apexMsg = '#MESSAGE#'.replace(/:/g,apexEscape);&lt;br /&gt;  window.location.href='f?p=&amp;APP_ID.:200:&amp;APP_SESSION.::&amp;DEBUG.:200:P200_PAGE_ID,P200_ESCAPE,P200_ORA_MSG,P200_APEX_MSG:&amp;APP_PAGE_ID.,' + apexEscape + ',\\' + oraMsg + '\\,\\' + apexMsg + '\\'; // Add backslashes to avoid comma issue&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- End Result&lt;/span&gt;&lt;br /&gt;When you have an unhandled exception the end users should see a message like: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TI201ohhIrI/AAAAAAAAD0A/gFQ-6Bcu7CI/s1600/error_msg_friendly.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 103px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TI201ohhIrI/AAAAAAAAD0A/gFQ-6Bcu7CI/s400/error_msg_friendly.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5516263952102793906" /&gt;&lt;/a&gt;&lt;br /&gt;You can view all the log information by running the following query:&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT *&lt;br /&gt;  FROM logger_logs&lt;br /&gt; WHERE scope = 'apex.demo.unhandeled_exception{session_id: 652754467566839, guid: 901e0663a0896b35e040007f0100049a}'; -- Replace this scope with the scope that is sent in the email&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3071838491967134249?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3071838491967134249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html#comment-form' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3071838491967134249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3071838491967134249'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/09/custom-error-messages-in-apex.html' title='Custom Error Messages in APEX'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/TI2y4xmOtWI/AAAAAAAADz4/FlxLvbSxVgg/s72-c/error_msg_example.jpg' height='72' width='72'/><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3109703121588254940</id><published>2010-09-09T08:00:00.000-06:00</published><updated>2010-09-09T08:01:14.526-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX IR: Column Help</title><content type='html'>I was working with an Interactive Report (IR) in APEX 4.0 and noticed that when the column header is clicked there's a Column Information button:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/TIg-HV9qUOI/AAAAAAAADzI/qyKKQa8j6Hc/s1600/ir_column_info_icon.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 196px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/TIg-HV9qUOI/AAAAAAAADzI/qyKKQa8j6Hc/s400/ir_column_info_icon.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5514726039590949090" /&gt;&lt;/a&gt;&lt;br /&gt;When clicked it displays the column help:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TIg-Hp9ooNI/AAAAAAAADzQ/Hi96X7SAiZ4/s1600/ir_column_info_text.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 171px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TIg-Hp9ooNI/AAAAAAAADzQ/Hi96X7SAiZ4/s400/ir_column_info_text.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5514726044959547602" /&gt;&lt;/a&gt;&lt;br /&gt;At first I thought this was a new APEX 4.0 feature and then I tested it on a 3.2 instance and noticed that the column information button was present as well. &lt;br /&gt;&lt;br /&gt;Either way, it's a really nice feature to have since you can provide column information to users. &lt;br /&gt;&lt;br /&gt;The following query helps to identify which IR columns have the default "No help available for this page item." message. &lt;span style="font-style:italic;"&gt;You may want to change this since it says "... page item." rather than "column"&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT ap.page_id,&lt;br /&gt;       ap.page_name,&lt;br /&gt;       irc.column_alias,&lt;br /&gt;       irc.help_text&lt;br /&gt;  FROM apex_application_page_ir_col irc, apex_application_pages ap&lt;br /&gt; WHERE irc.application_id = :app_id&lt;br /&gt;   AND irc.application_id = ap.application_id&lt;br /&gt;   AND irc.page_id = ap.page_id&lt;br /&gt;   AND irc.help_text = 'No help available for this page item.' -- Default help text message&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3109703121588254940?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3109703121588254940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/09/apex-ir-column-help.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3109703121588254940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3109703121588254940'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/09/apex-ir-column-help.html' title='APEX IR: Column Help'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/TIg-HV9qUOI/AAAAAAAADzI/qyKKQa8j6Hc/s72-c/ir_column_info_icon.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8751292300649952259</id><published>2010-08-31T08:55:00.000-06:00</published><updated>2010-08-31T08:55:00.176-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Spring Cleaning</title><content type='html'>Each time you do a major upgrade APEX creates a new schema. It does not remove the older schemas, which allows you to roll back to previous versions in case something happens.&lt;br /&gt;&lt;br /&gt;I was upgrading some older instances of APEX and realized that I still had some of these older schemas lying around and decide that it was time to do some spring cleaning &lt;span style="font-style:italic;"&gt;(I realize that isn't exactly spring time, unless you live in Australia)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;From the APEX installation guide (&lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/install.40/e15513/otn_install.htm#CBHBABCC" target="_blank"&gt;http://download.oracle.com/docs/cd/E17556_01/doc/install.40/e15513/otn_install.htm#CBHBABCC&lt;/a&gt;) here's how to identify and remove older versions of APEX. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;color:red;"&gt;Please read the documentation and understand what exactly you're doing before you do this!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Identify old APEX schemas&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT username&lt;br /&gt;   FROM dba_users &lt;br /&gt; WHERE (username LIKE 'FLOWS_%' OR USERNAME LIKE 'APEX_%') &lt;br /&gt;   AND USERNAME NOT IN (&lt;br /&gt;        SELECT 'FLOWS_FILES' &lt;br /&gt;          FROM DUAL &lt;br /&gt;         UNION &lt;br /&gt;        SELECT 'APEX_PUBLIC_USER' FROM DUAL &lt;br /&gt;         UNION&lt;br /&gt;        SELECT SCHEMA s &lt;br /&gt;           FROM dba_registry&lt;br /&gt;         WHERE comp_id = 'APEX')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Remove old schemas&lt;/span&gt;&lt;br /&gt;Connect as SYS using the SYSDBA role then run:&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;DROP USER FLOWS_030000 CASCADE; -- Where "FLOWS_030000" is the username from the previous query&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8751292300649952259?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8751292300649952259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/08/apex-spring-cleaning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8751292300649952259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8751292300649952259'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/08/apex-spring-cleaning.html' title='APEX Spring Cleaning'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-843343844056023924</id><published>2010-08-30T08:00:00.001-06:00</published><updated>2011-01-30T17:54:53.398-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>JavaScript Console Logger</title><content type='html'>&lt;span style="font-style:italic;"&gt;Note: This now has a new name, Console Wrapper, and has been moved to a Google project. Please go to &lt;a href="http://www.talkapex.com/2011/01/console-wrapper-previously-js-logger.html"&gt;http://www.talkapex.com/2011/01/console-wrapper-previously-js-logger.html&lt;/a&gt; for more information.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you've been developing APEX applications for while, or any web applications for that matter, you'll eventually leverage the browser &lt;span style="font-style: italic;"&gt;console&lt;/span&gt;. If you've used Firebug, then you've had the console accessible to you.&lt;br /&gt;&lt;br /&gt;In case you're not sure what console is, it allows you to display debug information in a nice console window within your browsers. Most (i.e. all browsers but IE) are console enabled. The most common use of console is the &lt;span style="font-style:italic;"&gt;console.log&lt;/span&gt; command:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;console.log('hello world');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Console has a lot of great features. One drawback with it is that you have to remove calls to console before putting your code into production since not all browsers support console.&lt;br /&gt;&lt;br /&gt;Removing instrumentation code before going into production can be annoying, especially if you need to debug it later on. To resolve this issue I've created a console wrapper. This allows you to leave your debugging calls in production code. Here are some features:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Works in all browsers. If run in IE nothing will happen, but no error message.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Allows you to set Levels. By default no messages will appear.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Support for jQuery chaining (see examples).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Will automatically set level to "log" if run in APEX and APEX is in Debug mode.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;A copy of the console wrapper is available here: &lt;a href="http://www.clarifit.com/files/blogs/talkapex/files/$logger_1.0.0.zip"&gt;Download $logger_1.0.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The only change that you'll need to make is call &lt;span style="font-style:italic;"&gt;$.console&lt;/span&gt; instead of &lt;span style="font-style:italic;"&gt;console&lt;/span&gt;. The download file includes a HTML file with demos. I'd recommend looking at the .js file as well for inline documentation. &lt;br /&gt;&lt;br /&gt;Here's an example along with its output:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$.console.setLevel('log');&lt;br /&gt;$.console.log('Current Level', $.console.getLevel());&lt;br /&gt;$.console.group('Available Levels');&lt;br /&gt;$.each($.console.levels, function(i, val){&lt;br /&gt;   $.console.log(i);&lt;br /&gt;});&lt;br /&gt;$.console.groupEnd();&lt;br /&gt;$.console.log(($.console.isApexDebug()) ? 'In APEX debug mode' : 'Not in APEX debug mode');&lt;br /&gt;$.console.group('Demo Chaining');&lt;br /&gt;//Notice how you can write this out all in 1 line!&lt;br /&gt;$('.red').log('Before Red').css({color:'red'}).log('After Red');&lt;br /&gt;$.console.groupEnd();&lt;br /&gt;$.console.info('Turning off console');&lt;br /&gt;$.console.setLevel('off');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/THsX53hIU6I/AAAAAAAADzA/TWxAfdmQ_ng/s1600/logger_demo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/THsX53hIU6I/AAAAAAAADzA/TWxAfdmQ_ng/s400/logger_demo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5511024851940823970" /&gt;&lt;/a&gt;&lt;br /&gt;For more information about console please read the following articles:&lt;br&gt;&lt;br /&gt;- Console APIs: &lt;a href="http://getfirebug.com/wiki/index.php/Console_API" target="_blank"&gt;http://getfirebug.com/wiki/index.php/Console_API&lt;/a&gt;&lt;br /&gt;- Firebug console example: &lt;a href="http://getfirebug.com/logging" target="_blank"&gt;http://getfirebug.com/logging&lt;/a&gt;&lt;br /&gt;- Console tutorial: &lt;a href="http://www.tuttoaster.com/learning-javascript-and-dom-with-console/" target="_blank"&gt;http://www.tuttoaster.com/learning-javascript-and-dom-with-console/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-843343844056023924?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/843343844056023924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/08/javascript-console-logger.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/843343844056023924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/843343844056023924'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/08/javascript-console-logger.html' title='JavaScript Console Logger'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/THsX53hIU6I/AAAAAAAADzA/TWxAfdmQ_ng/s72-c/logger_demo.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2948867119925454700</id><published>2010-08-20T09:00:00.000-06:00</published><updated>2010-08-20T09:00:02.965-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX PLUGIN'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Plugin: Simple Modal</title><content type='html'>I just published another plugin called Simple Modal: &lt;a href="http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/simple-modal.html" target="_blank"&gt;http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/simple-modal.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This plugin allows you to use any region(s) (or DOM object) in your APEX application as a modal window. &lt;br /&gt;&lt;br /&gt;When developing this plugin I learned a few more things that may be useful when developing plugins:&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Scope Creep:&lt;/span&gt; When developing a plugin you can make it do a lot of things. This may lead you to try and include extra unnecessary functionality. Try to remember the goal you're trying to achieve, or more importantly, what you're developers will try to achieve with the plugin. &lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Instrumentation&lt;/span&gt;: I'm a big fan of &lt;a href="http://tkyte.blogspot.com" target="_blank"&gt;Tom Kyte&lt;/a&gt; and really like the emphasis he puts on &lt;a href="http://tkyte.blogspot.com/2005/06/instrumentation.html" target="_blank"&gt;Code Instrumentation&lt;/a&gt;. You may want to add some debug information in your JavaScript code to help you understand what is going on. As part of this plugin I included a logger package which is essentially a wrapper for &lt;span style="font-style:italic;"&gt;console&lt;/span&gt; but will work in all browsers. I'll write about this in another post and include the final copy for general use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2948867119925454700?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2948867119925454700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/08/apex-plugin-simple-modal.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2948867119925454700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2948867119925454700'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/08/apex-plugin-simple-modal.html' title='APEX Plugin: Simple Modal'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-395193838656675353</id><published>2010-08-18T22:37:00.000-06:00</published><updated>2010-08-18T22:38:57.551-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX PLUGIN'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX 4.0 Interactive Reports - Customize Wait Display</title><content type='html'>Over a year ago I wrote about how to customize the APEX IR wait logo (&lt;a href="http://www.talkapex.com/2009/04/apex-interactive-reports-customize-wait_28.html"&gt;http://www.talkapex.com/2009/04/apex-interactive-reports-customize-wait_28.html&lt;/a&gt;). If you read that post you'll notice it's quite lengthy and can be intimidating if you're new to JavaScript.&lt;br /&gt;&lt;br /&gt;With APEX 4.0 this is a lot easier to do since they're plugins to declaratively add this functionality. This post will go over how to customize the APEX IR Wait logo in APEX 4.0. You can try a demo here: &lt;a href="http://apex.oracle.com/pls/apex/f?p=20195:3200" target="_blank"&gt;http://apex.oracle.com/pls/apex/f?p=20195:3200&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create an IR report region&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;    SELECT e.*, SUM (e.sal) OVER () test&lt;br /&gt;      FROM emp e&lt;br /&gt;CONNECT BY LEVEL &lt;= 5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Install Plugin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Download the Simple Modal plugin: &lt;a href="http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/simple-modal.html" target="_blank"&gt;http://www.apex-plugin.com/oracle-apex-plugins/dynamic-action-plugin/simple-modal.html&lt;/a&gt;&lt;br /&gt;- Shared Components / Plug-ins / Import&lt;br /&gt;- They're 2 plugins included in the zip file. Import both of them (Show and Close)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create Show Dynamic Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- RClick on the IR region and click "Create Dynamic Action:&lt;br /&gt;- Advanced&lt;br /&gt;- Name: Show IR Wait&lt;br /&gt;- Next&lt;br /&gt;- Event: Before Refresh&lt;br /&gt;- Selection Type: DOM Object&lt;br /&gt;- DOM Object: apexir_WORKSHEET_REGION&lt;br /&gt;- &lt;span style="font-style:italic;"&gt;Note: We're using the DOM object and not the region since we can port this example to Page 0 and it will apply to all your IRs&lt;/span&gt;&lt;br /&gt;- Next&lt;br /&gt;- Action: Select Simple Modal - Show&lt;br /&gt;- &lt;span style="font-style:italic;"&gt;You can modify some of the plugin attributes here if you'd like&lt;/span&gt;&lt;br /&gt;- Next&lt;br /&gt;- Selection Type: DOM Object&lt;br /&gt;- DOM Object: apexir_LOADER&lt;br /&gt;- Create&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create Close Dynamic Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- RClick on the IR region and click "Create Dynamic Action:&lt;br /&gt;- Advanced&lt;br /&gt;- Name: Close IR Wait&lt;br /&gt;- Event: After Refresh&lt;br /&gt;- Selection Type: DOM Object&lt;br /&gt;- DOM Object: apexir_WORKSHEET_REGION&lt;br /&gt;- Next&lt;br /&gt;- Action: Select Simple Modal - Close&lt;br /&gt;- Create&lt;br /&gt;&lt;br /&gt;Now when you run the IR it'll make the screen modal while it's reloading the data. If you want to run on all IRs then you can add this dynamic action to Page 0.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;If you run the &lt;a href="http://apex.oracle.com/pls/apex/f?p=20195:3200" target="_blank"&gt;demo&lt;/a&gt; in a console-enabled browser (Firefox, Chrome, Safari) you'll notice that the plugin includes some additional debug information. I'll be posting the logging JavaScript package that was used in the plugin soon.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-395193838656675353?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/395193838656675353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/08/apex-40-interactive-reports-customize.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/395193838656675353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/395193838656675353'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/08/apex-40-interactive-reports-customize.html' title='APEX 4.0 Interactive Reports - Customize Wait Display'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-4030596676467093572</id><published>2010-08-18T09:00:00.000-06:00</published><updated>2010-08-18T09:00:02.608-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Plugin: Debug Mode and Console</title><content type='html'>When running an APEX application in debug mode, it will provide debug information in the console regarding any plugins that get executed. &lt;span style="font-style:italic;"&gt;Note: Console is supported by most browsers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's an example of the output:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/TGtVD753RwI/AAAAAAAADyw/8kad5AZ7ZAE/s1600/apex_plugin_js_console.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 75px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/TGtVD753RwI/AAAAAAAADyw/8kad5AZ7ZAE/s400/apex_plugin_js_console.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5506588495498921730" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-4030596676467093572?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/4030596676467093572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/08/apex-plugin-debug-mode-and-console.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4030596676467093572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4030596676467093572'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/08/apex-plugin-debug-mode-and-console.html' title='APEX Plugin: Debug Mode and Console'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_33EF80fk9sM/TGtVD753RwI/AAAAAAAADyw/8kad5AZ7ZAE/s72-c/apex_plugin_js_console.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5905844825421305270</id><published>2010-08-17T21:04:00.000-06:00</published><updated>2010-08-17T21:05:08.578-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Plugin: Javascript Attributes</title><content type='html'>Recently I was developing an APEX dynamic action plugin and ran into a bit of an issue. One of the custom attributes that I defined was a yes/no attribute which returned "true" or "false" respectively.&lt;br /&gt;&lt;br /&gt;When I was testing my plugin it always behaved as though the user had selected &lt;span style="font-style:italic;"&gt;yes/true&lt;/span&gt; even though they selected &lt;span style="font-style:italic;"&gt;no/false&lt;/span&gt;. After some debugging I saw that the plugin values in Javascript were strings. Clearly strings are not booleans and they behave differently when evaluated.&lt;br /&gt;&lt;br /&gt;To resolve this problem I just changed my if statement:&lt;br /&gt;&lt;pre class="brush: js;"&gt;&lt;br /&gt;//From&lt;br /&gt;if (this.action.attribute01) &lt;br /&gt;  //do something&lt;br /&gt;  &lt;br /&gt;//To&lt;br /&gt;if (this.action.attribute01.toLowerCase() == 'true')&lt;br /&gt;  //do something&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;If you're new to JavaScript, here's how JavaScript handles strings when doing comparisons:&lt;br /&gt;&lt;pre class="brush: js;"&gt;&lt;br /&gt;x = null;&lt;br /&gt;console.log(x, x ? true : false);&lt;br /&gt;x = '';&lt;br /&gt;console.log(x, x ? true : false);&lt;br /&gt;x = 'false';&lt;br /&gt;console.log(x, x ? true : false);&lt;br /&gt;x = 'true';&lt;br /&gt;console.log(x, x ? true : false);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here are the results:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/TGtLkCDK8CI/AAAAAAAADyo/XOrvWLV0pBw/s1600/plugin_boolean.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 105px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/TGtLkCDK8CI/AAAAAAAADyo/XOrvWLV0pBw/s400/plugin_boolean.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5506578051788107810" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see a string returns &lt;span style="font-style:italic;"&gt;true&lt;/span&gt; if it contains some data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5905844825421305270?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5905844825421305270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/08/apex-plugin-javascript-attributes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5905844825421305270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5905844825421305270'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/08/apex-plugin-javascript-attributes.html' title='APEX Plugin: Javascript Attributes'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_33EF80fk9sM/TGtLkCDK8CI/AAAAAAAADyo/XOrvWLV0pBw/s72-c/plugin_boolean.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8805144797875136787</id><published>2010-07-28T23:15:00.003-06:00</published><updated>2010-07-28T23:17:24.593-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Validation Messages</title><content type='html'>When you have an apostrophe (') in your last name you soon realize that a lot of sites don't handle them properly when entering your information. Normally I get a simple error or my last name will be converted to "D" or "Souza". Today I tried to register for a demo for a fairly popular application and received the following error message:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TFEM9QKa-AI/AAAAAAAADyY/02_dHPMaZ24/s1600/validation_101.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 340px; height: 400px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TFEM9QKa-AI/AAAAAAAADyY/02_dHPMaZ24/s400/validation_101.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5499190866446317570" /&gt;&lt;/a&gt;&lt;br /&gt;The error message says "Last Name contains errors". Someone clearly didn't do their job when creating this registration form. Besides the fact that I couldn't register with my last name, stating that my last name "contains errors" doesn't really make sense.&lt;br /&gt;&lt;br /&gt;I know this post isn't specific to APEX but this is just a reminder when defining  validations to use meaningful error messages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8805144797875136787?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8805144797875136787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/07/validation-messages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8805144797875136787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8805144797875136787'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/07/validation-messages.html' title='Validation Messages'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TFEM9QKa-AI/AAAAAAAADyY/02_dHPMaZ24/s72-c/validation_101.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3722169861256790916</id><published>2010-07-26T23:18:00.001-06:00</published><updated>2011-06-05T17:30:37.396-06:00</updated><title type='text'>ODTUG: Enhanced APEX Security</title><content type='html'>At &lt;a href="http://www.odtugkaleidoscope.com/" target="_blank"&gt;ODTUG  Kaleidoscope&lt;/a&gt; I promised that I would post my slides from my presentation. Here is a copy of the &lt;a href="http://files.clarifit.com/blogs/talkapex/odtug2010/enhanced_apex_security_odtug_web.pdf" target="_blank"&gt;Enhanced APEX Security&lt;/a&gt; presentation.&lt;br /&gt;&lt;br /&gt;The two demo's can be found here:&lt;br /&gt;&lt;a href="http://www.talkapex.com/2009/05/enhancing-apex-security.html"&gt;http://www.talkapex.com/2009/05/enhancing-apex-security.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.talkapex.com/2010/07/poor-mans-vpd-in-apex-and-oracle-xe.html"&gt;http://www.talkapex.com/2010/07/poor-mans-vpd-in-apex-and-oracle-xe.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I hope to post the slides from the other presentation, How to be Creative, sometime next week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3722169861256790916?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3722169861256790916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/07/odtug-enhanced-apex-security.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3722169861256790916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3722169861256790916'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/07/odtug-enhanced-apex-security.html' title='ODTUG: Enhanced APEX Security'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1975843396473781028</id><published>2010-07-26T23:03:00.001-06:00</published><updated>2011-06-05T17:32:05.943-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='VPD'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE XE'/><title type='text'>Poor Man's VPD in APEX and Oracle XE</title><content type='html'>At this year's &lt;a href="http://www.odtugkaleidoscope.com/" target="_blank"&gt;ODTUG Kaleidoscope&lt;/a&gt; I gave a presentation called "Enhancing APEX Security". A copy of the presentation can be downloaded &lt;a href="http://files.clarifit.com/blogs/talkapex/odtug2010/enhanced_apex_security_odtug_web.pdf" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As part of the presentation I discussed how to create a "Poor Man's" VPD using Oracle XE. The main concept was to simulate basic VPD on a non Enterprise Edition (EE) (&lt;span style="font-style:italic;"&gt;VPD is only available on EE&lt;/span&gt;). This post will cover how to do this. Please note, since this is for demonstration purposes I have kept things very simple and it is by no means a complete solution.&lt;br /&gt;&lt;br /&gt;Before you can review the code, we need to discuss some of the basic architecture and technology that will be used. I strongly encourage you to do some additional research on these topics if you plan to use this method in production.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Schema Setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Assuming you don't have Oracle EE, you'll need a way to secure your existing schema. Lets say you had a schema called "DEMO". You'll need to create a new schema called "DEMO_PUB". The DEMO_PUB schema will not contain any objects. Instead, it will have synonyms which point to views and packages in the DEMO schema. Note, the DEMO_PUB schema will not have any access to the DEMO tables. All DML statements will be made via packages and procedures. The views from the DEMO schema will be "secure views" which will restrict access to the data. On the flip-side the DEMO schema will only grant SELECT and EXECUTE to views and packages respectively, to the DEMO_PUB schema.&lt;br /&gt;&lt;br /&gt;You APEX applications should use the DEMO_PUB so that security logic is stored in the database rather than the front-end. This should help prevent developers from displaying data that end users don't have access to.&lt;br /&gt;&lt;br /&gt;The following diagram, taken from my presentation, highlights the overall schema structure.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TE5lnvraZ_I/AAAAAAAADyA/ZtjTA6tLNrc/s1600/vpd_schema_design.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TE5lnvraZ_I/AAAAAAAADyA/ZtjTA6tLNrc/s320/vpd_schema_design.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5498443928553809906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Contexts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For people unfamiliar with Contexts, the easiest way to describe them is a globally accessible container of name/value pairs. The container is only accessible if you have the correct key. Oracle has some great reference material on this (search for VPD or FGAC) so I won't cover this any further Here's a diagram to illustrate Contexts.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TE5ln5GznFI/AAAAAAAADyI/N6FSHgK-PCg/s1600/vpd_context.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 217px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TE5ln5GznFI/AAAAAAAADyI/N6FSHgK-PCg/s320/vpd_context.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5498443931084627026" /&gt;&lt;/a&gt;&lt;br /&gt;The key to "Poor Man's" VPD is to leverage context values in your views to restrict the data. To demonstrate this in pseudo code, if you wanted to restrict access on the EMP table to only employees in your department you'd write a view like this:&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;CREATE OR REPLACE VIEW vemp AS&lt;br /&gt;SELECT * FROM emp&lt;br /&gt;WHERE deptno = some_value_from_a_context&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hopefully you understood the small bit of background information I wrote before. Here's how to implement a very simple "VPD" enabled application&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;-- Create Context&lt;br /&gt;-- ctx_vpd is our context name&lt;br /&gt;-- pkg_vpd is the only place where we can modify values in this context&lt;br /&gt;--  This provides a lot of security since single access point&lt;br /&gt;CREATE OR REPLACE CONTEXT ctx_vpd USING pkg_vpd ACCESSED GLOBALLY; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;font-weight:bold;"&gt;Create pkg_vpd spec&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;-- VPD Demo Package from www.talkapex.com&lt;br /&gt;-- @author Martin Giffy D'Souza - martin@talkapex.com&lt;br /&gt;CREATE OR REPLACE PACKAGE pkg_vpd&lt;br /&gt;AS&lt;br /&gt;   -- &lt;br /&gt;   -- Login function for APEX to login users&lt;br /&gt;   -- Spec must be as is, as required by APEX for custom authentication schemes&lt;br /&gt;   -- For demo purposes we'll use ENAME = ENAME from EMP&lt;br /&gt;   -- @param p_username username&lt;br /&gt;   -- @param p_password password&lt;br /&gt;   -- @return TRUE or FALSE&lt;br /&gt;   -- &lt;br /&gt;  FUNCTION f_login (p_username IN VARCHAR2, p_password IN VARCHAR2)&lt;br /&gt;    RETURN BOOLEAN;&lt;br /&gt;&lt;br /&gt;  -- &lt;br /&gt;  -- Set context identifier&lt;br /&gt;  -- This will register our "key" which will be required each time we want to access a Context (name/value) pair&lt;br /&gt;  -- @param p_session_key in APEX use :APP_USER || ':' || :APP_SESSION&lt;br /&gt;  -- &lt;br /&gt;  PROCEDURE sp_set_context_identifier (p_session_key IN VARCHAR2);&lt;br /&gt; &lt;br /&gt;  -- &lt;br /&gt;  -- Set context value&lt;br /&gt;  -- i.e. Sets a value for the name/value pair&lt;br /&gt;  -- &lt;br /&gt;  PROCEDURE sp_set_context_value (p_name IN VARCHAR2, p_value IN VARCHAR2);&lt;br /&gt;  &lt;br /&gt;  -- &lt;br /&gt;  -- Get Context Value&lt;br /&gt;  -- i.e. Get value for name/value pair&lt;br /&gt;  --&lt;br /&gt;  FUNCTION f_get_context_value (p_name IN VARCHAR2)&lt;br /&gt;    RETURN VARCHAR2;&lt;br /&gt;    &lt;br /&gt;    --&lt;br /&gt;  -- To be run in Post Authentication Process in APEX&lt;br /&gt;  -- Sets some of the name/value pairs required for VPD&lt;br /&gt;  --&lt;br /&gt;  PROCEDURE sp_apex_post_auth;  &lt;br /&gt;    &lt;br /&gt;END pkg_vpd;&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;font-weight:bold;"&gt;Create pkg_vpd body&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;-- VPD Demo Package from www.talkapex.com&lt;br /&gt;-- @author Martin Giffy D'Souza - martin@talkapex.com&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE PACKAGE BODY pkg_vpd&lt;br /&gt;AS&lt;br /&gt;  --&lt;br /&gt;  -- Login function for APEX to login users&lt;br /&gt;  -- Spec must be as is, as required by APEX for custom authentication schemes&lt;br /&gt;  -- For demo purposes we'll use ENAME = ENAME from EMP&lt;br /&gt;  -- @param p_username username&lt;br /&gt;  -- @param p_password password&lt;br /&gt;  -- @return TRUE or FALSE&lt;br /&gt;  --&lt;br /&gt;  FUNCTION f_login (p_username IN VARCHAR2, p_password IN VARCHAR2)&lt;br /&gt;    RETURN BOOLEAN&lt;br /&gt;  AS&lt;br /&gt;    v_count   PLS_INTEGER;&lt;br /&gt;  BEGIN&lt;br /&gt;    SELECT COUNT (e.ename)&lt;br /&gt;      INTO v_count&lt;br /&gt;      FROM emp e -- Notice how I'm not reference the view (vemp) it would return no rows at this point&lt;br /&gt;     WHERE LOWER (e.ename) = LOWER (p_username)&lt;br /&gt;       AND LOWER (p_username) = LOWER (p_password);&lt;br /&gt;&lt;br /&gt;    IF v_count = 1 THEN&lt;br /&gt;      RETURN TRUE;&lt;br /&gt;    END IF;&lt;br /&gt;&lt;br /&gt;    RETURN FALSE;&lt;br /&gt;  END f_login;&lt;br /&gt;&lt;br /&gt;  --&lt;br /&gt;  -- Set context identifier&lt;br /&gt;  -- This will register our "key" which will be required each time we want to access a Context (name/value) pair&lt;br /&gt;  -- @param p_session_key in APEX use :APP_USER || ':' || :APP_SESSION&lt;br /&gt;  --&lt;br /&gt;  PROCEDURE sp_set_context_identifier (p_session_key IN VARCHAR2)&lt;br /&gt;  AS&lt;br /&gt;  BEGIN&lt;br /&gt;    dbms_session.set_identifier (client_id =&gt; p_session_key);&lt;br /&gt;  END sp_set_context_identifier;&lt;br /&gt;&lt;br /&gt;  --&lt;br /&gt;  -- Set context value&lt;br /&gt;  -- i.e. Sets a value for the name/value pair&lt;br /&gt;  --&lt;br /&gt;  PROCEDURE sp_set_context_value (p_name IN VARCHAR2, p_value IN VARCHAR2)&lt;br /&gt;  AS&lt;br /&gt;  BEGIN&lt;br /&gt;    dbms_session.set_context ('CTX_VPD',&lt;br /&gt;                              p_name,&lt;br /&gt;                              p_value,&lt;br /&gt;                              USER,&lt;br /&gt;                              SYS_CONTEXT ('USERENV', 'CLIENT_IDENTIFIER'));&lt;br /&gt;  END;&lt;br /&gt;&lt;br /&gt;  --&lt;br /&gt;  -- Get Context Value&lt;br /&gt;  -- i.e. Get value for name/value pair&lt;br /&gt;  --&lt;br /&gt;  FUNCTION f_get_context_value (p_name IN VARCHAR2)&lt;br /&gt;    RETURN VARCHAR2&lt;br /&gt;  AS&lt;br /&gt;  BEGIN&lt;br /&gt;    RETURN SYS_CONTEXT ('CTX_VPD', p_name);&lt;br /&gt;  END f_get_context_value;&lt;br /&gt;&lt;br /&gt;  --&lt;br /&gt;  -- To be run in Post Authentication Process in APEX&lt;br /&gt;  -- Sets some of the name/value pairs required for VPD&lt;br /&gt;  --&lt;br /&gt;  PROCEDURE sp_apex_post_auth&lt;br /&gt;  AS&lt;br /&gt;    v_empno    emp.empno%TYPE;&lt;br /&gt;    v_deptno   emp.deptno%TYPE;&lt;br /&gt;  BEGIN&lt;br /&gt;    -- Get User Information&lt;br /&gt;    SELECT empno, deptno&lt;br /&gt;      INTO v_empno, v_deptno&lt;br /&gt;      FROM emp&lt;br /&gt;     WHERE LOWER (ename) = LOWER (v ('app_user'));&lt;br /&gt;&lt;br /&gt;    -- Set Context Identifier&lt;br /&gt;    pkg_vpd.sp_set_context_identifier (p_session_key =&gt; v ('app_user') || ':' || v ('app_session'));&lt;br /&gt;    -- Set Name/Value pairs&lt;br /&gt;    pkg_vpd.sp_set_context_value (p_name =&gt; 'EMPNO', p_value =&gt; v_empno);&lt;br /&gt;    pkg_vpd.sp_set_context_value (p_name =&gt; 'DEPTNO', p_value =&gt; v_deptno);&lt;br /&gt;    -- This demo won't highlight the Last Access date, but can be very useful to kill sessions in the back end that have not been access for a given period of time.&lt;br /&gt;    pkg_vpd.sp_set_context_value (p_name =&gt; 'LAST_ACCESS', p_value =&gt; TO_CHAR (SYSDATE, 'DD-MON-YYYY HH24:MI:SS'));&lt;br /&gt;  END sp_apex_post_auth;&lt;br /&gt;END pkg_vpd;&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;font-weight:bold;"&gt;Create view which leverages the context&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;CREATE OR REPLACE FORCE VIEW vemp&lt;br /&gt;AS&lt;br /&gt;  SELECT e.empno,&lt;br /&gt;         e.ename,&lt;br /&gt;         e.job,&lt;br /&gt;         e.mgr,&lt;br /&gt;         e.hiredate,&lt;br /&gt;         e.sal,&lt;br /&gt;         e.comm,&lt;br /&gt;         e.deptno&lt;br /&gt;    FROM emp e&lt;br /&gt;   WHERE e.deptno = pkg_vpd.f_get_context_value ('DEPTNO'); -- Can only view employees in same department&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-style:italic; font-weight:bold;"&gt;Create Custom Authentication Scheme&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Shared Components / Authentication Schemes &lt;br /&gt;Create&lt;br /&gt;From Scratch&lt;br /&gt;Name: VPD Demo&lt;br /&gt;Page Sentry Function:&lt;br /&gt;Session Verification Function:&lt;br /&gt;Invalid Session Target: Page in This Application - 101 Login&lt;br /&gt;Pre-Authentication Process:&lt;br /&gt;Credentials Verification Method: Use my custom function to authenticate: return pkg_vpd.f_login&lt;br /&gt;Post-Authentication Process: pkg_vpd.sp_apex_post_auth;  &lt;br /&gt;Cookies: &lt;br /&gt;Logout URL: wwv_flow_custom_auth_std.logout?p_this_flow=&amp;APP_ID.&amp;amp;p_next_flow_page_sess=&amp;APP_ID.:1&lt;br /&gt;&lt;br /&gt;Change current Authentication Scheme to "VPD Demo". This will vary between APEX 3.x and APEX 4.0&lt;br /&gt;&lt;br /&gt;Create a Region Report with:&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT *&lt;br /&gt;FROM vemp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now login to your application with "KING/KING". Notice how you only see 3 rows in the report? Now logout and login with "MARTIN/MARTIN". You should now see 6 rows returned. As you can see, none of security was handled in the front end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1975843396473781028?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1975843396473781028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/07/poor-mans-vpd-in-apex-and-oracle-xe.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1975843396473781028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1975843396473781028'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/07/poor-mans-vpd-in-apex-and-oracle-xe.html' title='Poor Man&apos;s VPD in APEX and Oracle XE'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/TE5lnvraZ_I/AAAAAAAADyA/ZtjTA6tLNrc/s72-c/vpd_schema_design.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7578776218161818515</id><published>2010-07-16T09:00:00.002-06:00</published><updated>2010-07-16T09:00:05.046-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX PLUGIN'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Plugin: Syntax Highlighter</title><content type='html'>I finally got around to developing my first APEX Plugin! &lt;br /&gt;&lt;br /&gt;To summarize this plugin is a code syntax highlighter based on &lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/" target="_blank"&gt;http://alexgorbatchev.com/SyntaxHighlighter/&lt;/a&gt;.&lt;br /&gt;. This is the same syntax highlighter for code samples on this site. You can download it here: &lt;a href="http://www.apex-plugin.com/oracle-apex-plugins/item-plugin/syntax-highlighter.html" target="_blank"&gt;http://www.apex-plugin.com/oracle-apex-plugins/item-plugin/syntax-highlighter.html&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/TD_pP31RMWI/AAAAAAAADxo/kWU0d3xwmzw/s1600/syntax_highlighter.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 153px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/TD_pP31RMWI/AAAAAAAADxo/kWU0d3xwmzw/s400/syntax_highlighter.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5494366529309978978" /&gt;&lt;/a&gt;&lt;br /&gt;Since this was my first APEX plugin that I created I thought I'd give some pointers to help others writing their first plugin:&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Decide on a feature you want to add&lt;/span&gt;. This can be harder said than done. If you're new to JavaScript etc, then you may want to create an example in a html file so that you can reference it later on.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Keep it simple&lt;/span&gt;. Chose a simple feature to add. If you decide to add something very complex you may just get lost.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Put your PL/SQL code in a package/function&lt;/span&gt; so that you can develop using a 3rd party tool such as Toad or SQL Developer. This will allow you to quickly debug your code. Once it's working you can extract it and put it inline with your plugin&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Look at other examples&lt;/span&gt;. View other plugins and see how they were built etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-7578776218161818515?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7578776218161818515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/07/apex-plugin-syntax-highlighter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7578776218161818515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7578776218161818515'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/07/apex-plugin-syntax-highlighter.html' title='APEX Plugin: Syntax Highlighter'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/TD_pP31RMWI/AAAAAAAADxo/kWU0d3xwmzw/s72-c/syntax_highlighter.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1931958946810763166</id><published>2010-07-14T09:00:00.000-06:00</published><updated>2010-07-14T09:00:00.083-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>How do they do it?</title><content type='html'>Have you ever seen something in the APEX Developer application and wonder how the APEX team built it? Since APEX is built in APEX you can actually see the code for the development environment. The way to do this is to install APEX in APEX. When you download APEX you also get all the development/builder application files:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TDL4v2Q_g_I/AAAAAAAADxY/EHnSikbHj8k/s1600/apex_builder.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 257px; height: 172px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TDL4v2Q_g_I/AAAAAAAADxY/EHnSikbHj8k/s400/apex_builder.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5490724396622382066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Simply install each of the applications into a workspace:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/TDL44-rkrgI/AAAAAAAADxg/qU8_bBkfgDA/s1600/apex_builder_files.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 130px; height: 300px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/TDL44-rkrgI/AAAAAAAADxg/qU8_bBkfgDA/s400/apex_builder_files.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5490724553500175874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note: Since some of the builder files are extremely large it does take a while to install and you may get a timeout error.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1931958946810763166?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1931958946810763166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/07/how-do-they-do-it.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1931958946810763166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1931958946810763166'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/07/how-do-they-do-it.html' title='How do they do it?'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TDL4v2Q_g_I/AAAAAAAADxY/EHnSikbHj8k/s72-c/apex_builder.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8499167324146690047</id><published>2010-07-13T09:00:00.001-06:00</published><updated>2010-07-31T23:08:36.436-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Missing Views from the APEX_DICTIONARY</title><content type='html'>A long time ago I wrote about &lt;a href="http://www.talkapex.com/2008/11/how-to-list-apex-dictionary-views-using.html"&gt;how you can list all the apex views&lt;/a&gt; by querying APEX_DICTIONARY. They're some views that are still public but are not listed in the Apex Dictionary. The following query lists these views&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT SYN.SYNONYM_NAME apex_view_name&lt;br /&gt;  FROM all_synonyms syn, all_views av, apex_dictionary ad&lt;br /&gt; WHERE syn.synonym_name LIKE 'APEX\_%' ESCAPE '\'&lt;br /&gt;   AND syn.owner = 'PUBLIC'&lt;br /&gt;   AND SYN.TABLE_NAME = AV.VIEW_NAME&lt;br /&gt;   AND SYN.SYNONYM_NAME = AD.APEX_VIEW_NAME(+)&lt;br /&gt;   AND ad.column_id IS NULL&lt;br /&gt;ORDER BY syn.synonym_name&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8499167324146690047?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8499167324146690047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/07/missing-views-from-apexdictionary.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8499167324146690047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8499167324146690047'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/07/missing-views-from-apexdictionary.html' title='Missing Views from the APEX_DICTIONARY'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-444431676540316966</id><published>2010-07-06T09:00:00.001-06:00</published><updated>2010-07-06T09:00:05.015-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Report Download Logger</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/TDJYewihZFI/AAAAAAAADxQ/J6hgRy4E1wI/s1600/1119379849_14860651001_History-Ax-Men-Logger-Advice-SF.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 160px; height: 120px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/TDJYewihZFI/AAAAAAAADxQ/J6hgRy4E1wI/s320/1119379849_14860651001_History-Ax-Men-Logger-Advice-SF.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5490548181167072338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;This solution was demoed at the  &lt;a href="http://www.odtugkaleidoscope.com/" target="_blank"&gt;ODTUG&lt;/a&gt; APEX Open Mic night&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I developed a reporting application in APEX. The goal of the application is to help turn "data into information". Users should be able to make business decisions based on the reports and charts rather than exporting the report data and using spreadsheets to analyze it.&lt;br /&gt;&lt;br /&gt;I've been a bit concerned that the application isn't achieving it's initial goal and that the reports are just used as data dumps. To validate this hypothesis I needed a way to track how many times a report was downloaded and compare it to the number of times it was viewed.&lt;br /&gt;&lt;br /&gt;I can find out how many times a report/page was displayed by looking at the APEX logs: &lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT *&lt;br /&gt;  FROM apex_workspace_activity_log&lt;br /&gt; WHERE application_id = :app_id&lt;br /&gt;   AND page_id = :app_page_id&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note: this approach is not 100% accurate since it only logs the page and not the individual regions, however for this purpose it should do. I have tinkered with "Region Logging" and may write about it soon.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I still needed a way to track report downloads. Here's how I did it. A working demo can be found here: &lt;a href="http://apex.oracle.com/pls/apex/f?p=20195:3120" target="_blank"&gt;http://apex.oracle.com/pls/apex/f?p=20195:3120&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Create Download Log table:&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;CREATE TABLE TAPEX_WORKSPLACE_REPORT_DL_LOG&lt;br /&gt;(&lt;br /&gt;  WORKSPACE                  VARCHAR2 (255 BYTE) NOT NULL,&lt;br /&gt;  WORKSPACE_ID               NUMBER NOT NULL,&lt;br /&gt;  APPLICATION_ID             NUMBER NOT NULL,&lt;br /&gt;  APPLICATION_NAME           VARCHAR2 (255 BYTE) NOT NULL,&lt;br /&gt;  APPLICATION_SCHEMA_OWNER   VARCHAR2 (30 BYTE) NOT NULL,&lt;br /&gt;  PAGE_ID                    NUMBER NOT NULL,&lt;br /&gt;  PAGE_NAME                  VARCHAR2 (255 BYTE) NOT NULL,&lt;br /&gt;  REGION_ID                  NUMBER NOT NULL,&lt;br /&gt;  REGION_NAME                VARCHAR2 (255 BYTE) NOT NULL,&lt;br /&gt;  VIEW_DATE                  DATE NOT NULL,&lt;br /&gt;  APEX_USER                  VARCHAR2 (255 BYTE) NOT NULL,&lt;br /&gt;  APEX_SESSION_ID            NUMBER NOT NULL&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Create procedure to store APEX download record&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;/**&lt;br /&gt; * Insert Download Report Record&lt;br /&gt; * @param p_region_id Report Region ID&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE sp_log_apex_dl_report (&lt;br /&gt;  p_region_id IN apex_application_page_regions.region_id%TYPE)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;  -- Insert into report download log table&lt;br /&gt;  INSERT INTO tapex_worksplace_report_dl_log (WORKSPACE,&lt;br /&gt;                                              WORKSPACE_ID,&lt;br /&gt;                                              APPLICATION_ID,&lt;br /&gt;                                              APPLICATION_NAME,&lt;br /&gt;                                              APPLICATION_SCHEMA_OWNER,&lt;br /&gt;                                              PAGE_ID,&lt;br /&gt;                                              PAGE_NAME,&lt;br /&gt;                                              REGION_ID,&lt;br /&gt;                                              REGION_NAME,&lt;br /&gt;                                              VIEW_DATE,&lt;br /&gt;                                              APEX_USER,&lt;br /&gt;                                              APEX_SESSION_ID)&lt;br /&gt;    SELECT aapr.workspace,&lt;br /&gt;           AA.WORKSPACE_ID,&lt;br /&gt;           aapr.application_id,&lt;br /&gt;           aapr.application_name,&lt;br /&gt;           aa.owner,&lt;br /&gt;           aapr.page_id,&lt;br /&gt;           AAPr.PAGE_NAME,&lt;br /&gt;           aapr.region_id,&lt;br /&gt;           aapr.region_name,&lt;br /&gt;           SYSDATE,&lt;br /&gt;           v ('APP_USER'),&lt;br /&gt;           v ('APP_SESSION')&lt;br /&gt;      FROM APEX_APPLICATION_PAGE_regionS aapr, APEX_APPLICATIONS aa&lt;br /&gt;     WHERE aapr.application_id = v ('APP_ID')&lt;br /&gt;       AND AAPr.PAGE_ID = v ('APP_PAGE_ID')&lt;br /&gt;       AND aapr.region_id = p_region_id&lt;br /&gt;       AND aapr.application_id = aa.application_id;&lt;br /&gt;END sp_log_apex_dl_report;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Trigger the above procedure every time a report is downloaded:&lt;br /&gt;&lt;br /&gt;Since Standard Reports (STD) and Interactive Reports (IR) download functionalities are handled differently I can't use an Applicatiobn Process to trigger the logging function. Instead, I'm going to leverage the VPD section in APEX. For those of you new to APEX, the Virtual Private Database (VPD) section in APEX is a section in APEX where you can put a block of PL/SQL code. This code gets run right at the beginning of the page, after the APP_USER is defined. The label of VPD is a bit misleading since the code doesn't have to do any VPD tasks. &lt;span style="font-style:italic;"&gt;Initially I had planned to handle IRs and STD Reports using a different method but thanks to the guys at Purdue Pharma for reminding me that I can leverage the VPD section in APEX.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;- Shared Components&lt;br /&gt;  - Security Attributes&lt;br /&gt;    - Virtual Private Database&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;DECLARE&lt;br /&gt;  v_region_id   APEX_APPLICATION_PAGE_REGIONS.REGION_ID%TYPE;&lt;br /&gt;BEGIN&lt;br /&gt;  -- If CSV/HTMLD is for IR (does not factor in email IRs). FLOW_EXCEL_OUTPUT is for Standard Report&lt;br /&gt;  IF :request IN ('CSV', 'HTMLD')&lt;br /&gt;  OR  :request LIKE ('FLOW_EXCEL_OUTPUT%') THEN&lt;br /&gt;    -- Check for Standard Report&lt;br /&gt;    IF :request LIKE ('FLOW_EXCEL_OUTPUT%') THEN&lt;br /&gt;      v_region_id := REGEXP_SUBSTR (:request, '[[:digit:]]+');&lt;br /&gt;    ELSE&lt;br /&gt;      -- Interactive Report&lt;br /&gt;      SELECT region_id&lt;br /&gt;        INTO v_region_id&lt;br /&gt;        FROM APEX_APPLICATION_PAGE_ir&lt;br /&gt;       WHERE application_id = :app_id&lt;br /&gt;         AND page_id = :app_page_id;&lt;br /&gt;    END IF;&lt;br /&gt;&lt;br /&gt;    sp_log_apex_dl_report (p_region_id =&gt; v_region_id);&lt;br /&gt;  END IF;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Comparison report:&lt;br /&gt;&lt;br /&gt;Here's the query that I used to compare the downloads to the report views&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT AR.APPLICATION_ID,&lt;br /&gt;       ar.application_name,&lt;br /&gt;       ar.page_id,&lt;br /&gt;       ar.page_name,&lt;br /&gt;       ar.region_id,&lt;br /&gt;       ar.region_name,&lt;br /&gt;       tdl.downloads,&lt;br /&gt;       al.page_views&lt;br /&gt;  FROM APEX_APPLICATION_PAGE_REGIONS ar,&lt;br /&gt;       (SELECT tdl.application_id,&lt;br /&gt;               tdl.page_id,&lt;br /&gt;               tdl.region_id,&lt;br /&gt;               COUNT (tdl.application_id) downloads&lt;br /&gt;          FROM TAPEX_WORKSPLACE_REPORT_DL_LOG tdl&lt;br /&gt;        GROUP BY tdl.application_id, tdl.page_id, tdl.region_id) tdl,&lt;br /&gt;       (SELECT al.application_id, al.page_id, COUNT (al.application_id) page_views&lt;br /&gt;          FROM apex_workspace_activity_log al&lt;br /&gt;        GROUP BY al.application_id, al.page_id) al&lt;br /&gt; WHERE AR.APPLICATION_ID = :app_id&lt;br /&gt;   AND ar.source_type_code IN ('SQL_QUERY', 'DYNAMIC_QUERY')&lt;br /&gt;   -- Downloads&lt;br /&gt;   AND ar.region_id = tdl.region_id(+)&lt;br /&gt;   -- Page Views&lt;br /&gt;   AND ar.application_id = al.application_id(+)&lt;br /&gt;   AND ar.page_id = al.page_id(+)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-444431676540316966?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/444431676540316966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/07/apex-report-download-logger.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/444431676540316966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/444431676540316966'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/07/apex-report-download-logger.html' title='APEX Report Download Logger'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/TDJYewihZFI/AAAAAAAADxQ/J6hgRy4E1wI/s72-c/1119379849_14860651001_History-Ax-Men-Logger-Advice-SF.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2289006102609473026</id><published>2010-06-18T09:00:00.000-06:00</published><updated>2010-06-18T09:00:04.640-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>How to Find Current APEX Version</title><content type='html'>Last week my DBA asked me what version of APEX we were running. Instinctively I loaded up the APEX development page and looked in the bottom right hand corner:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/TBbeBbiAPWI/AAAAAAAADxI/IL9fU9eZADA/s1600/apex_version.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 283px; height: 72px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/TBbeBbiAPWI/AAAAAAAADxI/IL9fU9eZADA/s400/apex_version.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5482813712521772386" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This worked, however he needed to dynamically obtain the current version for a script that he was writing. After some digging around he sent me the following query:&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT * &lt;br /&gt;FROM apex_release&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note: this isn't earth shattering but more for my reference&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2289006102609473026?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2289006102609473026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/06/how-to-find-current-apex-version.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2289006102609473026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2289006102609473026'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/06/how-to-find-current-apex-version.html' title='How to Find Current APEX Version'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/TBbeBbiAPWI/AAAAAAAADxI/IL9fU9eZADA/s72-c/apex_version.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5984946093886351544</id><published>2010-06-17T09:00:00.000-06:00</published><updated>2010-06-17T09:00:05.814-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Conditional Validations in APEX</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/TBbbcfsk2gI/AAAAAAAADxA/NuLp-l-YU1I/s1600/blue-check-mark1.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 98px; height: 108px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/TBbbcfsk2gI/AAAAAAAADxA/NuLp-l-YU1I/s400/blue-check-mark1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5482810878961441282" /&gt;&lt;/a&gt;&lt;br /&gt;There may be some instances when you have validations on your APEX page that you only want to run if all the other validations have passed. A good example of this is if you have 2 fields, FROM_DATE and TO_DATE and have the following validations:&lt;br /&gt;- V1: Ensure FROM_DATE is not null and is a valid date&lt;br /&gt;- V2: Ensure TO_DATE is not null and is a valid date&lt;br /&gt;- V3: Ensure FROM_DATE &lt; TO_DATE&lt;br /&gt;&lt;br /&gt;In this example you only want the last validation to run if the first 2 pass (i.e. both FROM_DATE and TO_DATE are valid dates). Currently there's no declarative way of doing this. i.e. validations don't support declarative dependencies.&lt;br /&gt;&lt;br /&gt;A simple trick to get around this issue is to put a condition in some validations to only run if all the other validations pass. This may not work in all situations, however it should help you in some.&lt;br /&gt;&lt;br /&gt;In the example about, modify the 3rd validation (V3) and set the condition to the following:&lt;br /&gt;Condition Type: PL/SQL Expression&lt;br /&gt;Expression 1: apex_application.g_inline_validation_error_cnt = 0&lt;br /&gt;&lt;br /&gt;Now V3 will only run if all previous validations pass.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5984946093886351544?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5984946093886351544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/06/conditional-validations-in-apex.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5984946093886351544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5984946093886351544'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/06/conditional-validations-in-apex.html' title='Conditional Validations in APEX'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/TBbbcfsk2gI/AAAAAAAADxA/NuLp-l-YU1I/s72-c/blue-check-mark1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8020797551873938957</id><published>2010-06-16T09:00:00.001-06:00</published><updated>2010-06-16T09:00:05.051-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Special columns for APEX Standard Reports</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TBW23Sp6qAI/AAAAAAAADw4/kQUdxW8a5Kw/s1600/std_col_tasks.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 203px; height: 132px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TBW23Sp6qAI/AAAAAAAADw4/kQUdxW8a5Kw/s400/std_col_tasks.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5482489182410156034" /&gt;&lt;/a&gt;&lt;br /&gt;I was testing APEX 4.0 on &lt;a href="http://apex.oracle.com" target="_blank"&gt;http://apex.oracle.com&lt;/a&gt; and I noticed that on Standard Reports you can add 2 types of "special" columns: Derived Column and Column Link. At first I thought this was a new APEX 4.0 feature, but then tested on a copy of 3.x noticed it was there as well! &lt;span style="font-style:italic;"&gt;I apologize if this is old news to people but I found it to be a pretty neat feature.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The interesting thing about these columns is that you can add Derived Column and Column Link columns and it does not modify your existing SQL. &lt;br /&gt;&lt;br /&gt;The only difference I can tell about these 2 column types is that Derived Columns don't contain the following attributes: List of Values, Tabular Form Attributes, and Column Link&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8020797551873938957?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8020797551873938957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/06/special-columns-for-apex-standard.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8020797551873938957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8020797551873938957'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/06/special-columns-for-apex-standard.html' title='Special columns for APEX Standard Reports'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TBW23Sp6qAI/AAAAAAAADw4/kQUdxW8a5Kw/s72-c/std_col_tasks.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5215269000097653105</id><published>2010-06-15T09:00:00.003-06:00</published><updated>2010-06-15T09:00:04.289-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>How to only Display Column when Downloading</title><content type='html'>Sometimes you may have a column that contains inline HTML. A simple example of this is if you have a column called "color" and you want to display the color in the report. Your query would look like this:&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT '&lt;span style="color:' || color || '"&gt;"' || color || '&lt;/span&gt;' color&lt;br /&gt;FROM my_colors&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-style:italic;"&gt;Note: That they're ways to get around this simple example using Report Templates and Column Formatting. I'm just using it for demo purposes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you were to download this report the "color" column would contain all the html (i.e. span tags etc). This may confuse users since they expected to see "red, green, blue, etc..." in their download file, but instead see the colors wrapped in a lot of html.&lt;br /&gt;&lt;br /&gt;A workaround that I've used is to create 2 columns: color_html and color&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT '&lt;span style="color:' || color || '"&gt;"' || color || '&lt;/span&gt;' color_html, &lt;br /&gt;            color color&lt;br /&gt;  FROM my_colors&lt;br /&gt;&lt;/pre&gt;And modify each report column's attributes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight:bold"&gt;Standard Reports&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;color_html&lt;/span&gt;&lt;br /&gt;Column Definition:&lt;br /&gt;Include In Export: No&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;color&lt;/span&gt;&lt;br /&gt;Conditional Display:&lt;br /&gt;PL/SQL Function Body Returning a Boolean: return apex_application.g_excel_format&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight:bold"&gt;Interactive Reports&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;color_html&lt;/span&gt;&lt;br /&gt;Conditional Display:&lt;br /&gt;Request is NOT Contained within Expression 1: CSV,HTMLD&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;color&lt;/span&gt;&lt;br /&gt;Conditional Display:&lt;br /&gt;Request is Contained within Expression 1: CSV,HTMLD&lt;br /&gt;&lt;br /&gt;Now when a user downloads the report they'll get the non-html version of the column. This solution works in APEX 4.0 and APEX 3.x&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5215269000097653105?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5215269000097653105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/06/how-to-only-display-column-when.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5215269000097653105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5215269000097653105'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/06/how-to-only-display-column-when.html' title='How to only Display Column when Downloading'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-164904431952483235</id><published>2010-06-14T09:00:00.000-06:00</published><updated>2010-06-14T09:00:00.800-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Interactive Reports with over 100 Columns</title><content type='html'>I ran into an issue last week where I had an Interactive Report (IR) with over 100 columns. All 100 plus columns displayed for end users, however I was only able to modify the first 100 columns. For example, the 101st column did not display in the report attributes screen (see screen shot below)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/TBWayGifFFI/AAAAAAAADww/PSLxmo75XJM/s1600/ir_too_many_cols.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 87px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/TBWayGifFFI/AAAAAAAADww/PSLxmo75XJM/s400/ir_too_many_cols.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5482458306932839506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After some digging around I figured out how to modify columns that weren't displayed on the Report Attributes screen. This demo requires Firefox and Firebug. You should also be able to do this in Google Chrome. This demo works for APEX 3.x and APEX 4.0.&lt;br /&gt;&lt;span style="font-weight:bold; font-style:italic"&gt;&lt;br /&gt;Build Large IR:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT LEVEL c001, LEVEL c002, LEVEL c003, LEVEL c004, LEVEL c005, LEVEL c006, LEVEL c007,&lt;br /&gt;       LEVEL c008, LEVEL c009, LEVEL c010, LEVEL c011, LEVEL c012, LEVEL c013, LEVEL c014, &lt;br /&gt;       LEVEL c015, LEVEL c016, LEVEL c017, LEVEL c018, LEVEL c019, LEVEL c020, LEVEL c021, &lt;br /&gt;       LEVEL c022, LEVEL c023, LEVEL c024, LEVEL c025, LEVEL c026, LEVEL c027, LEVEL c028, &lt;br /&gt;       LEVEL c029, LEVEL c030, LEVEL c031, LEVEL c032, LEVEL c033, LEVEL c034, LEVEL c035, &lt;br /&gt;       LEVEL c036, LEVEL c037, LEVEL c038, LEVEL c039, LEVEL c040, LEVEL c041, LEVEL c042, &lt;br /&gt;       LEVEL c043, LEVEL c044, LEVEL c045, LEVEL c046, LEVEL c047, LEVEL c048, LEVEL c049, &lt;br /&gt;       LEVEL c050, LEVEL c051, LEVEL c052, LEVEL c053, LEVEL c054, LEVEL c055, LEVEL c056, &lt;br /&gt;       LEVEL c057, LEVEL c058, LEVEL c059, LEVEL c060, LEVEL c061, LEVEL c062, LEVEL c063,&lt;br /&gt;       LEVEL c064, LEVEL c065, LEVEL c066, LEVEL c067, LEVEL c068, LEVEL c069, LEVEL c070,&lt;br /&gt;       LEVEL c071, LEVEL c072, LEVEL c073, LEVEL c074, LEVEL c075, LEVEL c076, LEVEL c077, &lt;br /&gt;       LEVEL c078, LEVEL c079, LEVEL c080, LEVEL c081, LEVEL c082, LEVEL c083, LEVEL c084, &lt;br /&gt;       LEVEL c085, LEVEL c086, LEVEL c087, LEVEL c088, LEVEL c089, LEVEL c090, LEVEL c091, &lt;br /&gt;       LEVEL c092, LEVEL c093, LEVEL c094, LEVEL c095, LEVEL c096, LEVEL c097, LEVEL c098, &lt;br /&gt;       LEVEL c099, LEVEL c100, LEVEL c101, LEVEL c102, LEVEL c103, LEVEL c104, LEVEL c105, &lt;br /&gt;       LEVEL c106, LEVEL c107, LEVEL c108&lt;br /&gt;  FROM DUAL&lt;br /&gt;CONNECT BY LEVEL &lt;= 10&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-style:italic"&gt;&lt;br /&gt;Get the COLUMN_ID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is the column that you want to modify that isn't currently displayed on the Reports Attributes page&lt;br /&gt;&lt;pre class="brush: sql;"&gt;&lt;br /&gt;SELECT column_id,&lt;br /&gt;       column_alias,&lt;br /&gt;       display_order,&lt;br /&gt;       report_label&lt;br /&gt;  FROM APEX_APPLICATION_PAGE_IR_COL&lt;br /&gt; WHERE application_id = :app_id&lt;br /&gt;   AND page_id = :page_id&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight:bold; font-style:italic"&gt;&lt;br /&gt;Run&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Go to the Reports Attributes screen (the screen that lists all the IR columns)&lt;br /&gt;&lt;br /&gt;Open Firebug and go to the Console Window. Enter the following:&lt;br /&gt;&lt;pre class="brush: js;"&gt;&lt;br /&gt;apex_p601_setColumnIDandSubmit('311507131164520006'); // Enter your column ID here&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-164904431952483235?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/164904431952483235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/06/interactive-reports-with-over-100.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/164904431952483235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/164904431952483235'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/06/interactive-reports-with-over-100.html' title='Interactive Reports with over 100 Columns'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/TBWayGifFFI/AAAAAAAADww/PSLxmo75XJM/s72-c/ir_too_many_cols.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1877195627232652031</id><published>2010-06-10T09:00:00.000-06:00</published><updated>2010-06-10T09:00:02.574-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><title type='text'>New URL: http://TalkApex.com</title><content type='html'>Well it's been a while since I've had any new posts on this blog. I've been extremely busy with "after school" activities &lt;span style="font-style:italic;"&gt;(soccer, speed skating, biking, etc...)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't have an APEX specific post today but I do have a few items to discuss. The first, in case you haven't noticed yet, is that I've changed the URL of this blog from &lt;a href="http://apex-smb.blogspot.com"&gt;http://apex-smb.blogspot.com&lt;/a&gt; to &lt;a href="http://talkapex.com" style="font-weight:bold;"&gt;http://TalkApex.com&lt;/a&gt;, The old URL, &lt;a href="http://apex-smb.blogspot.com"&gt;http://apex-smb.blogspot.com&lt;/a&gt; will still work so you don't need to update any old links.&lt;br /&gt;&lt;br /&gt;Just because I haven't had time to write about APEX, doesn't mean I've forgotten about this blog. I've been compiling a fairly large list of new things to write about over the past few months. I hope to spend a some time soon to write about these items.&lt;br /&gt;&lt;br /&gt;Last, but not least, I'll be giving 2 presentations at &lt;a href="http://www.odtugkaleidoscope.com/" target="_blank"&gt;ODTUG Kaleidoscope&lt;/a&gt;. I submitted my presentation for the CD, however I think that they'll change significantly by the time I present. As such I will post the final slides used for my presentation here after the conference. The presentations I'll be giving are&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Enhancing APEX Security&lt;/span&gt;: Monday 2:30~3:30&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;span style="font-weight:bold;"&gt;How to be Creative: Using the APEX Dictionary to Create Solutions&lt;/span&gt;: Tuesday 4:45~5:45&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Hope to see most of you at ODTUG!&lt;br /&gt;&lt;br /&gt;- Martin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1877195627232652031?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1877195627232652031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/06/new-url-httptalkapexcom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1877195627232652031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1877195627232652031'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/06/new-url-httptalkapexcom.html' title='New URL: http://TalkApex.com'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1332684761149307929</id><published>2010-04-13T09:00:00.000-06:00</published><updated>2010-04-13T09:00:06.318-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Logs: Storing Mail Log Data</title><content type='html'>A while ago (almost a year ago) I wrote about how to permanently store APEX logs into your own tables (&lt;a href="http://apex-smb.blogspot.com/2009/05/apex-logs-storing-log-data.html"&gt;http://apex-smb.blogspot.com/2009/05/apex-logs-storing-log-data.html&lt;/a&gt;). I covered the APEX_WORKSPACE_ACCESS_LOG and APEX_WORKSPACE_ACTIVITY_LOG logs. I forgot to include how to permanently store the APEX_MAIL_LOG. You'll only need to do this if you use APEX_MAIL to send email.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1- Create the APEX Mail Log table&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- Mail Log&lt;br /&gt;CREATE TABLE tapex_mail_log&lt;br /&gt;AS  SELECT * FROM apex_mail_log;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;2- Update the APEX Mail Log table&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note: You may want to store this in a procedure and run as a nightly scheduled job so you don't forget to update the tables&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  -- apex_mail_log is linked to the workspace.&lt;br /&gt;  -- Need to access all the mail sent for each workspace that is linked to this schema&lt;br /&gt;&lt;br /&gt;  FOR x IN (SELECT workspace_id FROM apex_workspaces) LOOP&lt;br /&gt;    -- Set the workspace ID&lt;br /&gt;    wwv_flow_api.set_security_group_id (x.workspace_id);&lt;br /&gt;&lt;br /&gt;    INSERT INTO tapex_mail_log (mail_to,&lt;br /&gt;                                mail_from,&lt;br /&gt;                                mail_replyto,&lt;br /&gt;                                mail_subj,&lt;br /&gt;                                mail_cc,&lt;br /&gt;                                mail_bcc,&lt;br /&gt;                                mail_send_error,&lt;br /&gt;                                last_updated_on)&lt;br /&gt;      SELECT aml.mail_to,&lt;br /&gt;             aml.mail_from,&lt;br /&gt;             aml.mail_replyto,&lt;br /&gt;             aml.mail_subj,&lt;br /&gt;             aml.mail_cc,&lt;br /&gt;             aml.mail_bcc,&lt;br /&gt;             aml.mail_send_error,&lt;br /&gt;             aml.last_updated_on&lt;br /&gt;        FROM tapex_mail_log x, apex_mail_log aml&lt;br /&gt;       WHERE     NVL (aml.mail_to, -1) = NVL (x.mail_to(+), -1)&lt;br /&gt;             AND NVL (aml.mail_from, -1) = NVL (x.mail_from(+), -1)&lt;br /&gt;             AND NVL (aml.mail_replyto, -1) = NVL (x.mail_replyto(+), -1)&lt;br /&gt;             AND NVL (aml.mail_subj, -1) = NVL (x.mail_subj(+), -1)&lt;br /&gt;             AND NVL (aml.mail_cc, -1) = NVL (x.mail_cc(+), -1)&lt;br /&gt;             AND NVL (aml.mail_bcc, -1) = NVL (x.mail_bcc(+), -1)&lt;br /&gt;             AND NVL (aml.mail_send_error, -1) = NVL (x.mail_send_error(+), -1)&lt;br /&gt;             AND aml.last_updated_on = x.last_updated_on(+)&lt;br /&gt;             AND x.ROWID IS NULL;&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1332684761149307929?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1332684761149307929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/04/apex-logs-storing-mail-log-data.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1332684761149307929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1332684761149307929'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/04/apex-logs-storing-mail-log-data.html' title='APEX Logs: Storing Mail Log Data'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2384553351547703995</id><published>2010-03-25T09:00:00.002-06:00</published><updated>2010-03-25T09:00:05.595-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='jQUERY UI'/><title type='text'>Restoring jQuery UI Theme from ThemeRoller</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/S6mfnc13b-I/AAAAAAAADwY/jKWUIeU-UEg/s1600/theme-roller.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 142px; height: 320px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/S6mfnc13b-I/AAAAAAAADwY/jKWUIeU-UEg/s320/theme-roller.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5452064324014534626" /&gt;&lt;/a&gt;&lt;br /&gt;If you ever use &lt;a href="http://jqueryui.com/themeroller/" target="_blank"&gt;jQuery's Theme Roller&lt;/a&gt;, you may find it frustrating to alter a custom theme. For example, if you created a theme, downloaded it, then decided to change your colors you may not know how to restore your changes.&lt;br /&gt;&lt;br /&gt;Believe it or not there's a pretty easy way to restore a Theme Roller theme. Before you download a theme copy, or bookmark, the URL at the top of the browser. All the changes you have made are stored in the URL! If you forget to copy the URL before downloading, the URL is stored in ..\css\custom-theme\jquery-ui-1.8.custom.css (where 1.8 is the version number).&lt;br /&gt;&lt;br /&gt;Here's an example of a theme modification where I changed the header background to red: &lt;a href="http://jqueryui.com/themeroller/#ffDefault=Verdana%2CArial%2Csans-serif&amp;fwDefault=normal&amp;fsDefault=1.1em&amp;cornerRadius=4px&amp;bgColorHeader=e10505&amp;bgTextureHeader=03_highlight_soft.png&amp;bgImgOpacityHeader=75&amp;borderColorHeader=aaaaaa&amp;fcHeader=222222&amp;iconColorHeader=222222&amp;bgColorContent=ffffff&amp;bgTextureContent=01_flat.png&amp;bgImgOpacityContent=75&amp;borderColorContent=aaaaaa&amp;fcContent=222222&amp;iconColorContent=222222&amp;bgColorDefault=e6e6e6&amp;bgTextureDefault=02_glass.png&amp;bgImgOpacityDefault=75&amp;borderColorDefault=d3d3d3&amp;fcDefault=555555&amp;iconColorDefault=888888&amp;bgColorHover=dadada&amp;bgTextureHover=02_glass.png&amp;bgImgOpacityHover=75&amp;borderColorHover=999999&amp;fcHover=212121&amp;iconColorHover=454545&amp;bgColorActive=ffffff&amp;bgTextureActive=02_glass.png&amp;bgImgOpacityActive=65&amp;borderColorActive=aaaaaa&amp;fcActive=212121&amp;iconColorActive=454545&amp;bgColorHighlight=fbf9ee&amp;bgTextureHighlight=02_glass.png&amp;bgImgOpacityHighlight=55&amp;borderColorHighlight=fcefa1&amp;fcHighlight=363636&amp;iconColorHighlight=2e83ff&amp;bgColorError=fef1ec&amp;bgTextureError=05_inset_soft.png&amp;bgImgOpacityError=95&amp;borderColorError=cd0a0a&amp;fcError=cd0a0a&amp;iconColorError=cd0a0a&amp;bgColorOverlay=aaaaaa&amp;bgTextureOverlay=01_flat.png&amp;bgImgOpacityOverlay=0&amp;opacityOverlay=30&amp;bgColorShadow=aaaaaa&amp;bgTextureShadow=01_flat.png&amp;bgImgOpacityShadow=0&amp;opacityShadow=30&amp;thicknessShadow=8px&amp;offsetTopShadow=-8px&amp;offsetLeftShadow=-8px&amp;cornerRadiusShadow=8px" target="_blank"&gt;Red Header&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;APEX 4.0 will be using jQuery and some jQuery UI components, so I hope this helps when customizing the look and feel of your applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2384553351547703995?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2384553351547703995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/03/restoring-jquery-ui-theme-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2384553351547703995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2384553351547703995'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/03/restoring-jquery-ui-theme-from.html' title='Restoring jQuery UI Theme from ThemeRoller'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_33EF80fk9sM/S6mfnc13b-I/AAAAAAAADwY/jKWUIeU-UEg/s72-c/theme-roller.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1414923098381956755</id><published>2010-03-24T09:00:00.000-06:00</published><updated>2010-03-24T09:00:03.656-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><title type='text'>How To Reference Package Variables Outside of PL/SQL</title><content type='html'>When developing with PL/SQL you may store public variables in the package specification. This has many uses, none of which I will get into for this post. The only catch in Oracle is that you can not easily reference these values in SQL statements outside of PL/SQL. The following example demonstrates this:&lt;br /&gt;&lt;br /&gt;- Create Package Spec with Variable&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;CREATE OR REPLACE PACKAGE pkg_var&lt;br /&gt;AS&lt;br /&gt;  c_my_var   CONSTANT VARCHAR2 (5) := 'hello';&lt;br /&gt;END pkg_var;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Reference the variable in a SQL statement in SQL*Plus&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SQL&gt; SELECT pkg_var.c_my_var x&lt;br /&gt;  2    FROM DUAL;&lt;br /&gt;SELECT pkg_var.c_my_var x&lt;br /&gt;       *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-06553: PLS-221: 'C_MY_VAR' is not a procedure or is undefined&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;This results in an Oracle error.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Try the same code, but in an block of PL/SQL&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SQL&gt; DECLARE&lt;br /&gt;  2    v_x   VARCHAR2 (5);&lt;br /&gt;  3  BEGIN&lt;br /&gt;  4    SELECT pkg_var.c_my_var x&lt;br /&gt;  5      INTO v_x&lt;br /&gt;  6      FROM DUAL;&lt;br /&gt;  7&lt;br /&gt;  8    DBMS_OUTPUT.put_line (v_x);&lt;br /&gt;  9  END;&lt;br /&gt; 10  /&lt;br /&gt;hello&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;As you can see this worked.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So how can we refernce package variables in a non-PL/SQL setting? I created the following function to do so. It will handle values that are of type VARCHAR2. I've also removed any spaces from the parameter (pkg_name.var_name) to ensure that no SQL injection will occur.&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- **&lt;br /&gt;-- * Returns Package Variable value&lt;br /&gt;-- * Note: for demo purposes I broke this function into various steps&lt;br /&gt;-- * &lt;br /&gt;-- * @param p_pkg_var_name fully qualified variable reference. Ex: pkg_x.var_y&lt;br /&gt;-- * @return Varchar2 value&lt;br /&gt;-- * @author Martin Giffy D'Souza: http://apex-smb.blogspot.com&lt;br /&gt;-- **&lt;br /&gt;CREATE OR REPLACE FUNCTION f_get_pkg_val_vc2 (p_pkg_var_name in varchar2)&lt;br /&gt;  RETURN VARCHAR2&lt;br /&gt;AS&lt;br /&gt;  v_string          VARCHAR2 (4000);&lt;br /&gt;  -- Full Variable Name (i.e. pkg.var)&lt;br /&gt;  v_var_full_name   VARCHAR2 (61);                             -- Max of 61 chars since 30 + . + 30&lt;br /&gt;BEGIN&lt;br /&gt;  v_var_full_name := p_pkg_var_name;&lt;br /&gt;  -- Remove any spaces to avoid SQL injections&lt;br /&gt;  v_var_full_name := REGEXP_REPLACE (v_var_full_name, '[[:space:]]', '');&lt;br /&gt;&lt;br /&gt;  EXECUTE IMMEDIATE 'begin :v_string := ' || v_var_full_name || '; end;'&lt;br /&gt;              USING OUT v_string;&lt;br /&gt;&lt;br /&gt;  RETURN v_string;&lt;br /&gt;END f_get_pkg_val_vc2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now when you run in SQL*Plus you get the following:&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SQL&gt; SELECT f_get_pkg_val_vc2 ('pkg_var.c_my_var') x&lt;br /&gt;  2    FROM DUAL;&lt;br /&gt;&lt;br /&gt;X&lt;br /&gt;-----------------------------------------------------&lt;br /&gt;&lt;br /&gt;hello&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1414923098381956755?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1414923098381956755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/03/how-to-reference-package-variables.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1414923098381956755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1414923098381956755'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/03/how-to-reference-package-variables.html' title='How To Reference Package Variables Outside of PL/SQL'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-925851248455079458</id><published>2010-02-11T09:00:00.005-07:00</published><updated>2010-02-11T09:00:04.714-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>How to Avoid Bot Spammers in APEX</title><content type='html'>If you've ever developed a public web application with a form on it you may notice that you may get bot spammers trying to enter information into your application.&lt;br /&gt;&lt;br /&gt;There's a simple trick that a friend of mine, Sean Rabey, at &lt;a href="http://www.pumpinteractive.ca/" target="_blank"&gt;Pump Interactive&lt;/a&gt; showed me which will help you reject submissions from bots. &lt;br /&gt;&lt;br /&gt;Sean suggested that I use an input field and then hide it with CSS. Humans entering data into the form won't see the field and therefore won't enter anything into it. Bots on the other hand may try to fill out this field and can't detect whether or not it's visible in the browser. If your "special" field has data in it you can reject the submission since you know it's not a human entering the data.&lt;br /&gt;&lt;br /&gt;Here's an example of how you can do this in APEX. You can view an example here: &lt;a href="http://apex.oracle.com/pls/apex/f?p=20195:2900" target="_blank"&gt;http://apex.oracle.com/pls/apex/f?p=20195:2900&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create a "Dummy" item &lt;/span&gt;&lt;br /&gt;Set "HTML Form Element Attributes" to class="hideMe"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/S3OkFBpPIZI/AAAAAAAADwQ/ltVMMS3JCD0/s1600-h/step1.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 134px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/S3OkFBpPIZI/AAAAAAAADwQ/ltVMMS3JCD0/s320/step1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436869581414015378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Configure "hideMe" style&lt;/span&gt;&lt;br /&gt;Add the following in your application somewhere (or to a CSS file)&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;br /&gt;&lt;style&gt;&lt;br /&gt;  .hideMe {display:none}&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Add validation to catch bot entries&lt;/span&gt;&lt;br /&gt;Type: Exists&lt;br /&gt;Validation Expression 1:&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT 1&lt;br /&gt;  FROM DUAL&lt;br /&gt; WHERE :p2900_dummy IS NULL&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-925851248455079458?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/925851248455079458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/02/how-to-avoid-bot-spammers-in-apex.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/925851248455079458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/925851248455079458'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/02/how-to-avoid-bot-spammers-in-apex.html' title='How to Avoid Bot Spammers in APEX'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/S3OkFBpPIZI/AAAAAAAADwQ/ltVMMS3JCD0/s72-c/step1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2993726276064634204</id><published>2010-02-01T09:00:00.000-07:00</published><updated>2010-02-01T09:00:02.402-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Presenting at ODTUG Kaleidoscope 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/S2Sn0g9sRII/AAAAAAAADwI/QtpvIEXJK3I/s1600-h/od_05.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 146px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/S2Sn0g9sRII/AAAAAAAADwI/QtpvIEXJK3I/s320/od_05.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5432651571159385218" /&gt;&lt;/a&gt;&lt;br /&gt;I'll be presenting at &lt;a href="http://www.odtugkaleidoscope.com" target="_blank"&gt;ODTUG Kaleidoscope&lt;/a&gt; in Washington DC this year. If you haven't already signed up I suggest you do so before March 24th as they have an early bird special.&lt;br /&gt;&lt;br /&gt;I've been to the past 2 Kaleidoscope conferences where I've learned a great deal about APEX and met some great people. It doesn't matter if you're a seasoned APEX developer or new to APEX, there's always something to learn and a lot of excellent presentations for all levels.&lt;br /&gt;&lt;br /&gt;This year I'll be giving 2 presentations on APEX (&lt;a href="http://www.odtugkaleidoscope.com/apex.html#dsouza" target="_blank"&gt;http://www.odtugkaleidoscope.com/apex.html#dsouza&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Enhancing APEX Security&lt;/span&gt;: APEX has some excellent built-in configurable security features. This presentation will go over some extra functionality you can add to your APEX applications that will make it more secure both in the front-end and back-end. Primary focus will be on "enhanced session state protection" and "poor man's" VPD for Oracle XE.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to be Creative: Using the APEX Dictionary to Create Solutions&lt;/span&gt;: The APEX dictionary is a very useful tool which can help enhance existing features in APEX. This presentation will cover how you can use the dictionary to resolve your problems. It will include some real-life issues and how the APEX dictionary was used to resolve them&lt;br /&gt;&lt;br /&gt;Of course these presentations may be slightly altered based on the new features and functionality of APEX 4.0. &lt;br /&gt;&lt;br /&gt;I look forward to seeing everyone in Washington.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2993726276064634204?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2993726276064634204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/02/presenting-at-odtug-kaleidoscope-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2993726276064634204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2993726276064634204'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/02/presenting-at-odtug-kaleidoscope-2010.html' title='Presenting at ODTUG Kaleidoscope 2010'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/S2Sn0g9sRII/AAAAAAAADwI/QtpvIEXJK3I/s72-c/od_05.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-156780559864350269</id><published>2010-01-03T23:25:00.000-07:00</published><updated>2010-01-03T23:25:13.344-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>How to Automatically Remove Items and Values in APEX URLs</title><content type='html'>A while ago I wrote about how to pass multi-select lists through the URL: &lt;a href="http://apex-smb.blogspot.com/2009/07/apex-how-to-pass-multiselect-list.html" target="_blank"&gt;http://apex-smb.blogspot.com/2009/07/apex-how-to-pass-multiselect-list.html&lt;/a&gt;. This method works, however it will only support up to 4000 characters as a result of the functions it uses.&lt;br /&gt;&lt;br /&gt;What happens when a user selects more than 4000 characters? You could update the processes to handle clobs etc. I took a different approach when faced with this problem. Instead of trying to update the process to handle clobs I asked: &lt;span style="font-style: italic"&gt;Why am I passing the values through the URL?&lt;/span&gt; Wouldn't it be easier if I didn't pass values through the URL?&lt;br /&gt;&lt;br /&gt;When I first thought about this, I thought I could run a process on each page that would set the appropriate variables to the calling page. But then developers would have to look in the page branch and page processes to see what items were being passed to which pages. This sounded confusing and goes against the APEX framework. I really don't like having developers do extra work when they don't need to or go against standards already put in place.&lt;br /&gt;&lt;br /&gt;I took a different approach to this problem. Instead of having a special page process to pass values from one page to another I was able to "intercept" the page branch and modify it before it was executed. I did this by taking the page branch and manually setting the item/value pairs, then removing them from the page branch. Here's an example of the final solution: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2800" target="_blank"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2800&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are some screen shots from the demo application:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;Page Branch configuration:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/S0F9YM_k10I/AAAAAAAADv8/rNCZa9Wi7AM/s1600-h/url_pass_param_03.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 207px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/S0F9YM_k10I/AAAAAAAADv8/rNCZa9Wi7AM/s400/url_pass_param_03.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5422753281089001282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;Passing in values via the URL (note that I'd like "X" to be "abc:def", however it's just abc)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/S0F9X4aiEII/AAAAAAAADv0/2_FTajRMH-4/s1600-h/url_pass_param_02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 101px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/S0F9X4aiEII/AAAAAAAADv0/2_FTajRMH-4/s400/url_pass_param_02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5422753275564920962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Running the page process to manually remove the item/value pairs from the URL:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/S0F9XXhr8JI/AAAAAAAADvs/Wq2Vmvuc1wA/s1600-h/url_pass_param_01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 126px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/S0F9XXhr8JI/AAAAAAAADvs/Wq2Vmvuc1wA/s400/url_pass_param_01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5422753266736558226" /&gt;&lt;/a&gt;&lt;br /&gt;Before reviewing the code, it's important to note the following assumptions. I made these assumptions to make the code demo easier to read.&lt;br/&gt;&lt;span style="font-style: italic"&gt;&lt;br /&gt;-   Only 1 branch is defined on the page with no conditions etc.&lt;br /&gt;-   The branch only contains at most 1 clear cache&lt;br /&gt;-   The branch passes as most 1 item/value pair to the other page&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;- Create page process: Remove URL Params&lt;/span&gt;&lt;br /&gt;- Branch Point: On Submit After Processing&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic"&gt;Note: You could easily turn this into an application process to be run throughout your application&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- NOTE: For the purpose of this example I'm assuming the following:&lt;br /&gt;--   Only 1 branch is defined with no conditions etc.&lt;br /&gt;--   The branch only contains at most 1 clear cache&lt;br /&gt;--   The branch passes as most 1 item/value pair to the other page&lt;br /&gt;&lt;br /&gt;DECLARE&lt;br /&gt;   v_branch_action   apex_application_page_branches.branch_action%TYPE;&lt;br /&gt;   p_app_id          apex_application_page_branches.application_id%TYPE := :app_id;&lt;br /&gt;   p_page_id         apex_application_page_branches.page_id%TYPE := :app_page_id;&lt;br /&gt;   v_clear_cache     NUMBER;&lt;br /&gt;   v_item_names      VARCHAR2 (4000);&lt;br /&gt;   v_item_values     VARCHAR2 (4000);&lt;br /&gt;BEGIN&lt;br /&gt;   -- Get branch action&lt;br /&gt;   -- The branch action is the URL before it is parsed by APEX&lt;br /&gt;   SELECT branch_action&lt;br /&gt;     INTO v_branch_action&lt;br /&gt;     FROM apex_application_page_branches&lt;br /&gt;    WHERE application_id = p_app_id AND page_id = p_page_id;&lt;br /&gt;&lt;br /&gt;   -- Get the clear cache options&lt;br /&gt;   v_clear_cache :=&lt;br /&gt;      SUBSTR (v_branch_action,&lt;br /&gt;              INSTR (v_branch_action, ':', 1, 5) + 1,&lt;br /&gt;                INSTR (v_branch_action, ':', 1, 6)&lt;br /&gt;              - INSTR (v_branch_action, ':', 1, 5)&lt;br /&gt;              - 1&lt;br /&gt;             );&lt;br /&gt;&lt;br /&gt;   -- Manually clear the cache if required&lt;br /&gt;   IF v_clear_cache IS NOT NULL&lt;br /&gt;   THEN&lt;br /&gt;      apex_util.clear_page_cache (p_page_id =&gt; v_clear_cache);&lt;br /&gt;   END IF;&lt;br /&gt;&lt;br /&gt;   -- Get Page Param values&lt;br /&gt;   v_item_names :=&lt;br /&gt;      SUBSTR (v_branch_action,&lt;br /&gt;              INSTR (v_branch_action, ':', 1, 6) + 1,&lt;br /&gt;                INSTR (v_branch_action, ':', 1, 7)&lt;br /&gt;              - INSTR (v_branch_action, ':', 1, 6)&lt;br /&gt;              - 1&lt;br /&gt;             );&lt;br /&gt;   v_item_values :=&lt;br /&gt;      SUBSTR (v_branch_action,&lt;br /&gt;              INSTR (v_branch_action, ':', 1, 7) + 1,&lt;br /&gt;                INSTR (v_branch_action, '&amp;success_msg=', 1, 1)&lt;br /&gt;              - INSTR (v_branch_action, ':', 1, 7)&lt;br /&gt;              - 1&lt;br /&gt;             );&lt;br /&gt;&lt;br /&gt;   -- If item/value pairs exist, manually set the values&lt;br /&gt;   IF v_item_names IS NOT NULL&lt;br /&gt;   THEN&lt;br /&gt;      -- See: http://apex-smb.blogspot.com/2009/07/apexapplicationdosubstitutions.html for more info on apex_application.do_substitutions&lt;br /&gt;      apex_util.set_session_state&lt;br /&gt;           (p_name       =&gt; v_item_names,&lt;br /&gt;            p_value      =&gt; apex_application.do_substitutions (TRIM (v_item_values))&lt;br /&gt;           );&lt;br /&gt;   END IF;&lt;br /&gt;&lt;br /&gt;   -- Modify the branch action&lt;br /&gt;   -- Remove the clear cache option if applicable&lt;br /&gt;   IF v_clear_cache IS NOT NULL&lt;br /&gt;   THEN&lt;br /&gt;      v_branch_action :=&lt;br /&gt;            SUBSTR (v_branch_action, 1, INSTR (v_branch_action, ':', 1, 5))&lt;br /&gt;         || SUBSTR (v_branch_action, INSTR (v_branch_action, ':', 1, 6));&lt;br /&gt;   END IF;&lt;br /&gt;&lt;br /&gt;   -- Remove the item name/value pairs if applicable&lt;br /&gt;   IF v_item_names IS NOT NULL&lt;br /&gt;   THEN&lt;br /&gt;      -- Remove item Names&lt;br /&gt;      v_branch_action :=&lt;br /&gt;            SUBSTR (v_branch_action, 1, INSTR (v_branch_action, ':', 1, 6))&lt;br /&gt;         || SUBSTR (v_branch_action, INSTR (v_branch_action, ':', 1, 7));&lt;br /&gt;      -- Remove item values&lt;br /&gt;      v_branch_action :=&lt;br /&gt;            SUBSTR (v_branch_action, 1, INSTR (v_branch_action, ':', 1, 7))&lt;br /&gt;         || SUBSTR (v_branch_action,&lt;br /&gt;                    INSTR (v_branch_action, '&amp;success_msg=', 1, 1)&lt;br /&gt;                   );&lt;br /&gt;   END IF;&lt;br /&gt;&lt;br /&gt;   -- Set the new branch action&lt;br /&gt;   apex_application.g_branch_action (1) := v_branch_action;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-156780559864350269?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/156780559864350269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2010/01/how-to-automatically-remove-items-and.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/156780559864350269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/156780559864350269'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2010/01/how-to-automatically-remove-items-and.html' title='How to Automatically Remove Items and Values in APEX URLs'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_33EF80fk9sM/S0F9YM_k10I/AAAAAAAADv8/rNCZa9Wi7AM/s72-c/url_pass_param_03.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1039639988941482349</id><published>2009-12-01T09:00:00.000-07:00</published><updated>2009-12-01T09:00:01.753-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Orphaned Application Files</title><content type='html'>If you allow end users to upload files to your APEX application you may have a lot of "orphaned" files in apex_application_files and not even realize it.&lt;br /&gt;&lt;br /&gt;Orphaned files are files that exist in &lt;span style="font-style:italic;"&gt;APEX_APPLICATION_FILES&lt;/span&gt; that are not associated with an application. This can happen for several reasons, the most common are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Files uploaded in Shared Components that aren't associated to an application&lt;/li&gt;&lt;br /&gt;&lt;li&gt;End users uploading files then purposely keep them in &lt;span style="font-style:italic;"&gt;APEX_APPLICATION_FILES&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;End users uploading files and an error occurs&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;You can easily identify orphaned files using the &lt;span style="font-style:italic;"&gt;APEX_APPLICATION_FILES&lt;/span&gt; view:&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT *&lt;br /&gt;  FROM apex_application_files&lt;br /&gt; WHERE flow_id = 0 -- flow_id is the same as application_id&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;All 3 situations listed above will result in the file uploaded with &lt;span style="font-style:italic;"&gt;flow_id = 0&lt;/span&gt;. The last 2 points, files uploaded from end users, can result in files that you may no longer need. I don't recommend that you keep uploaded files in the &lt;span style="font-style:italic;"&gt;APEX_APPLICATION_FILES&lt;/span&gt; view. Instead you should move them immediately to a custom table.&lt;br /&gt;&lt;br /&gt;The main problem comes from the third point. When a user uploads a file and a validation fails. In this situation the file is uploaded to &lt;span style="font-style:italic;"&gt;APEX_APPLICATION_FILES&lt;/span&gt; and then the validation fails. Even though the validation failed, the file still resides in &lt;span style="font-style:italic;"&gt;APEX_APPLICATION_FILES&lt;/span&gt;. The following screen shot demonstrates this issue.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/SwNsxYj7t_I/AAAAAAAADto/ALhY8Bl_mrU/s1600/validation_fail.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 329px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/SwNsxYj7t_I/AAAAAAAADto/ALhY8Bl_mrU/s400/validation_fail.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5405283573437282290" /&gt;&lt;/a&gt;&lt;br /&gt;To resolve this issue, I run the following application process which automatically "tags" uploaded files with a flow_id of -1. By doing so you can run a nightly process to delete any files that have a flow_id of -1.&lt;br /&gt;&lt;br /&gt;Application Process: AP_TAG_APEX_FILES&lt;br /&gt;Sequence: -100&lt;br /&gt;Point: On Submit: After Page Submission - Before Computations and Validations&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- AP_TAG_APEX_FILES&lt;br /&gt;BEGIN&lt;br /&gt;   FOR x IN (SELECT v (item_name) item_name_value&lt;br /&gt;               FROM apex_application_page_items&lt;br /&gt;              WHERE application_id = :app_id&lt;br /&gt;                AND page_id = :app_page_id&lt;br /&gt;                AND display_as = 'File Browse...')&lt;br /&gt;   LOOP&lt;br /&gt;      UPDATE apex_application_files aaf&lt;br /&gt;         SET aaf.flow_id = -1&lt;br /&gt;       WHERE aaf.NAME = x.item_name_value;&lt;br /&gt;   END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1039639988941482349?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1039639988941482349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/12/apex-orphaned-application-files.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1039639988941482349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1039639988941482349'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/12/apex-orphaned-application-files.html' title='APEX Orphaned Application Files'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/SwNsxYj7t_I/AAAAAAAADto/ALhY8Bl_mrU/s72-c/validation_fail.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8066992588416163113</id><published>2009-11-16T09:30:00.000-07:00</published><updated>2009-11-16T09:36:53.047-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Using Decimals in APEX Page Numbers</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/SwCbWN630kI/AAAAAAAADtg/G-w443rjVeQ/s1600/800px-999_Perspective.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 360px; height: 55.8px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/SwCbWN630kI/AAAAAAAADtg/G-w443rjVeQ/s200/800px-999_Perspective.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5404490358840611394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When creating an APEX page you can use decimals in the page number. If you logically group your pages by page numbers and run out of page numbers this may be useful. For example if you create pages 1 through 10 then realize you'd like a page right beside page 5, you could create Page 5.1.&lt;br /&gt;&lt;br /&gt;I don't personally recommend using decimals in page numbers as you can't use decimals in item names, so &lt;span style="font-style:italic;"&gt;P5.1_X&lt;/span&gt; won't work. Of course you may find some other use for creating pages with decimals.&lt;br /&gt;&lt;br /&gt;If you're concerned about logically grouping pages for your development try initially separating pages by increments of 100 or by using Page Groups. To configure Page Groups go to the main application development page and click on "Page Groups" on the right hand side. Once you've setup the group and assigned pages, go back to the main development page and under the "View" drop down select "Groups".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8066992588416163113?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8066992588416163113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/11/using-decimals-in-apex-page-numbers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8066992588416163113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8066992588416163113'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/11/using-decimals-in-apex-page-numbers.html' title='Using Decimals in APEX Page Numbers'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/SwCbWN630kI/AAAAAAAADtg/G-w443rjVeQ/s72-c/800px-999_Perspective.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-9223082708554952130</id><published>2009-10-27T09:00:00.003-06:00</published><updated>2009-10-27T09:00:00.264-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Standardizing Help Text in APEX</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/SuaEhEG5sJI/AAAAAAAADtY/62XBUIfwlE0/s1600-h/help_key.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 161px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/SuaEhEG5sJI/AAAAAAAADtY/62XBUIfwlE0/s200/help_key.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5397146907023356050" /&gt;&lt;/a&gt;&lt;br /&gt;I had a requirement where the same item name was used in various areas of the application. To maintain consistancy, and to minimize development time, I decided to create a "help framework" to standardize on the help text for these items.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;Note: I know APEX comes with a great tool to maintain consistancy for your page items called User Interface Defaults, however it would not work in this case.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The goal was for developers not to have to enter any help text for commonly named page items. Instead, when applicable, the help text would automatically be retreived from a common area so we'd only need to maintain it in one place. The design also had to handle custom help text (i.e. if we needed to override the default help text).&lt;br /&gt;&lt;br /&gt;To do this I used Tool Tip Help (&lt;span style="font-style:italic;"&gt;see: &lt;a href="http://apex-smb.blogspot.com/2009/09/tooltip-help-in-apex-alternative-to.html"&gt;http://apex-smb.blogspot.com/2009/09/tooltip-help-in-apex-alternative-to.html&lt;/a&gt;&lt;/span&gt;) and made the following modifications:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create a Default Help Page&lt;/span&gt;&lt;br /&gt;Page Name: Default Help Page&lt;br /&gt;&lt;br /&gt;Create a region called "Default Help Items" and add all the items you want default help text for. For example, I created P10 and added the following items: P10_EMPNO, P10_ENAME. In each of these items I added the default help text for similarly named items.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Modify the Application Process AP_GET_HELP_TEXT &lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN (SELECT    '&lt;span class="itemToolTip" foritem="'&lt;br /&gt;                   || item_name&lt;br /&gt;                   || '"&gt;'&lt;br /&gt;                   || item_help_text&lt;br /&gt;                   || '&lt;/span&gt;' help_html&lt;br /&gt;              FROM (SELECT a.item_name,&lt;br /&gt;                           NVL (a.item_help_text, dflt_help_text.item_help_text)&lt;br /&gt;                                                                           item_help_text&lt;br /&gt;                      FROM apex_application_page_items a,&lt;br /&gt;                           (SELECT 'P' || :app_page_id || '_' || LTRIM (item_name, 'P10_')&lt;br /&gt;                                                                                item_name,&lt;br /&gt;                                   item_help_text&lt;br /&gt;                              FROM apex_application_page_items&lt;br /&gt;                             WHERE application_id = :app_id&lt;br /&gt;                               AND page_id = 10 -- Enter Default Help Page number here (and modify select statement above)&lt;br /&gt;                               AND item_help_text IS NOT NULL) dflt_help_text&lt;br /&gt;                     WHERE a.application_id = :app_id&lt;br /&gt;                       AND a.page_id = :app_page_id&lt;br /&gt;                       AND a.item_name = dflt_help_text.item_name(+)&lt;br /&gt;                       AND NVL (a.item_help_text, 'null') != '@NO_HELP@')&lt;br /&gt;             WHERE item_help_text IS NOT NULL)&lt;br /&gt;  LOOP&lt;br /&gt;    HTP.p (x.help_html);&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now when I run the application, any item that is called PXX_EMPNO or PXX_ENAME will try to use the help text from P10 for the corresponding items. Developers can easily override the default help text by filling in specific help text for an item or by entering in "@NO_HELP@"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-9223082708554952130?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/9223082708554952130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/10/standardizing-help-text-in-apex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/9223082708554952130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/9223082708554952130'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/10/standardizing-help-text-in-apex.html' title='Standardizing Help Text in APEX'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/SuaEhEG5sJI/AAAAAAAADtY/62XBUIfwlE0/s72-c/help_key.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1543162703278712436</id><published>2009-10-26T08:25:00.002-06:00</published><updated>2011-03-06T22:27:20.794-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Saving Saved Interactive Reports when Updating Application</title><content type='html'>&lt;span style="font-style:italic;color:red;"&gt;Their is now a supported method to preserve saved interactive reports. Please read the following post which explains how to do this in APEX 4.0: &lt;a href="http://joelkallman.blogspot.com/2010/07/where-did-my-saved-interactive-reports.html" target="_blank"&gt;http://joelkallman.blogspot.com/2010/07/where-did-my-saved-interactive-reports.html&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/SuU1P0nNQOI/AAAAAAAADtQ/ElNfSXkuM04/s1600-h/save_key_small.jpg"&gt;&lt;img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 160px; height: 160px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/SuU1P0nNQOI/AAAAAAAADtQ/ElNfSXkuM04/s320/save_key_small.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5396778274410807522" /&gt;&lt;/a&gt;&lt;br /&gt;When updating existing APEX applications that contain Interactive Reports (IR) you may, not knowningly, delete users saved IRs. The only supported way to prevent this from happening is to ensure that your Application ID is the same when you move it from Dev, to Test, to Production. &lt;a href="http://dpeake.blogspot.com" target="_blank"&gt;David Peake&lt;/a&gt; wrote a full explanation of this issue here: &lt;a href="http://dpeake.blogspot.com/2009/01/preserving-user-saved-interactive.html" target="_blank"&gt;http://dpeake.blogspot.com/2009/01/preserving-user-saved-interactive.html&lt;/a&gt;. I suggest you read his post before continuing.&lt;br /&gt;&lt;br /&gt;What if you develop a single application that needed to be deployed to multiple clients/instances? I.e. you develop your application in DEV (100) and deploy to PROD (200), PROD (300), and PROD (400). Currently there's no supported way of doing this while maintaining your saved interactive reports.&lt;br /&gt;&lt;br /&gt;The following script can be  run after updating your production applications to ensure that your saved IRs don't get lost. &lt;span style="color:red;font-weight:bold;"&gt;Please note that this is not supported by Oracle and can put your application in an unsupported state.&lt;/span&gt; &lt;span style="font-style:italic;color:red;"&gt;If you are not an advanced APEX developer I do not suggest using this as it may result in unexpected results.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Besides preserving saved IRs, users who are currently on the system will retain their current IR configurations, otherwise they will be lost. For example a user is working on an IR and applys some filters to it, you then update the application which will cause the interactive_report_id to change. The next time the user refreshes the page they won't see their filters any more (i.e. they'll have the default IR again). Running this script will prevent this from happening.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note: this must be run as SYSTEM or a user with SYSTEM level access&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN (SELECT a.ID, a.name, a.session_id,&lt;br /&gt;                   b.interactive_report_id&lt;br /&gt;              FROM apex_030200.wwv_flow_worksheet_rpts a,  -- This could also be flows...&lt;br /&gt;                   apex_application_page_ir b&lt;br /&gt;             WHERE a.flow_id = :app_id&lt;br /&gt;               AND a.page_id = b.page_id -- Linking is done via the page so please be aware of any IR page changes&lt;br /&gt;               AND b.application_id = a.flow_id&lt;br /&gt;               AND a.worksheet_id != b.interactive_report_id&lt;br /&gt;               and a.status = 'PRIVATE'&lt;br /&gt;               )&lt;br /&gt;  LOOP&lt;br /&gt;    UPDATE apex_030200.wwv_flow_worksheet_rpts&lt;br /&gt;       SET worksheet_id = x.interactive_report_id&lt;br /&gt;     WHERE ID = x.ID;&lt;br /&gt;     &lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1543162703278712436?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1543162703278712436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/10/saving-saved-interactive-reports-when.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1543162703278712436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1543162703278712436'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/10/saving-saved-interactive-reports-when.html' title='Saving Saved Interactive Reports when Updating Application'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_33EF80fk9sM/SuU1P0nNQOI/AAAAAAAADtQ/ElNfSXkuM04/s72-c/save_key_small.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-530722810478012337</id><published>2009-10-22T08:30:00.000-06:00</published><updated>2009-10-22T08:30:00.209-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WIREFRAME'/><category scheme='http://www.blogger.com/atom/ns#' term='MOCKUPS'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Designing APEX Applications: UI Mockups</title><content type='html'>When doing any sort of development it's important to use the right tool for the right job. With that in mind, I thought I'd discuss mockups for APEX applications, or better yet any GUI. &lt;br /&gt;&lt;br /&gt;One of my biggest pet peeves is when I get a functional or technical spec with modified screen shots of existing applications for the UI mockups. I'm not a graphic artist or a UI expert but I do know that taking a screen shot of a similar application, then spending several hours moving things around in Paint isn't very good. Using MS Paint, or similar applications, would be like developing your application using a typewriter (I've included a picture for those that have never used one :-). &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/Stbwntt0aJI/AAAAAAAADr8/o3pfdONNC-A/s1600-h/typewriter.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 312px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/Stbwntt0aJI/AAAAAAAADr8/o3pfdONNC-A/s320/typewriter.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5392762168900085906" /&gt;&lt;/a&gt;I know some people have developed basic APEX applications and used screen shots for their UI mockups. I think APEX is a great tool for creating demo applications but it shouldn't be used for mockups. People reviewing the design may get carried away with the specifics since it looks like a real application.&lt;br /&gt;&lt;br /&gt;What should you use to create application mockups? Personally I like a good old-fashion hand drawn diagram (I've been known to ask colleagues to give me their mockups on scrap paper). Though they are quick they don't work well in documents and they aren't great when doing several design iterations. Wireframe diagrams are an excellent alternative as they're exactly like hand drawn diagrams with pre-defined shapes.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/Stb0cEpQevI/AAAAAAAADtI/6GJPWXyhwlc/s1600-h/balsamiq_example.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 272px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/Stb0cEpQevI/AAAAAAAADtI/6GJPWXyhwlc/s400/balsamiq_example.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5392766366943050482" /&gt;&lt;/a&gt;&lt;br /&gt;Why use wireframe diagrams?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Quick to develop &lt;span style="font-style:italic;"&gt;(the example above took me 2 minutes to create)&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Easy to modify&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Focus on flow and useability, not specifics&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Cheap/Easy to do multiple design iterations&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;The list could go on, but I'll stop there. I'd like to emphasize on the fact that people will focus on specifics rather than the flow and usability of the application when looking at screen shots. For example: if you use have a screen shot with a drop down list of 100 countries and you only include 2 or 3 in the diagram, readers may wonder where the other 100 or so countries are etc. They aren't focused on the fact that it's a drop down list with countries, rather there's something wrong with the list. With a wireframe diagram it will be extremly clear that it's a drop down list of countries with no real focus on the values inside the select list.&lt;br /&gt;&lt;br /&gt;I've you're looking for an application to do wireframe diagrams I'd recommend &lt;a href="http://www.balsamiq.com/products/mockups" target="_blank"&gt;Balsamiq&lt;/a&gt;. I've been really impressed with it so far as it allows me to do UI mockups really quickly &lt;span style="font-style:italic"&gt;(I have no affiliation with Balsamiq, so please don't take this as an advertisement)&lt;/span&gt;. Of course they're many other tools out there that will do this so I encourage you to find one that is suitable for your organization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-530722810478012337?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/530722810478012337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/10/designing-apex-applications-ui-mockups.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/530722810478012337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/530722810478012337'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/10/designing-apex-applications-ui-mockups.html' title='Designing APEX Applications: UI Mockups'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/Stbwntt0aJI/AAAAAAAADr8/o3pfdONNC-A/s72-c/typewriter.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-437632525483981798</id><published>2009-10-15T03:25:00.006-06:00</published><updated>2009-10-15T03:54:52.189-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='JOBS'/><title type='text'>Oracle and APEX Jobs</title><content type='html'>A lot of people were affected by the recession and may have lost their jobs. I know they're several companies looking for talented workers. To help out I've decided to start a small Jobs section on my blog (see right hand side). If you're interested in submitting a job, please leave a comment on this post with the following information:&lt;br /&gt;&lt;br /&gt;- Job Title&lt;br /&gt;- City the job is in&lt;br /&gt;- Link to position&lt;br /&gt;&lt;br /&gt;To keep with the theme of this blog please only submit Oracle (SQL,PL/SQL) and APEX related jobs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;On a side note I may create a small application where people can post jobs specific to APEX.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/StbxVpZXRgI/AAAAAAAADso/Kw406pQsAw8/s1600-h/jobs.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/StbxVpZXRgI/AAAAAAAADso/Kw406pQsAw8/s320/jobs.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5392762958014531074" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-437632525483981798?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/437632525483981798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/10/oracle-and-apex-jobs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/437632525483981798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/437632525483981798'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/10/oracle-and-apex-jobs.html' title='Oracle and APEX Jobs'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/StbxVpZXRgI/AAAAAAAADso/Kw406pQsAw8/s72-c/jobs.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-41909527006650002</id><published>2009-10-08T05:17:00.004-06:00</published><updated>2009-10-08T05:26:41.571-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='apex.stackexchange.com'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>apex.stackexchange.com</title><content type='html'>&lt;a href="http://stackoverflow.com/" target="_blank"&gt;stackoverflow&lt;/a&gt; is a programming Q &amp; A site that  &lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Jeff Atwood&lt;/a&gt; and &lt;a href="http://www.joelonsoftware.com/" target="_blank"&gt;Joel Spolsky&lt;/a&gt; created a while ago. It is now a very popular programming Q &amp; A site and takes a different approach to asking questions then conventional forums.&lt;br /&gt;&lt;br /&gt;They recently launched a site which allows individuals to host their own version of the application that focuses on a specific topic. I decided to register &lt;a href="http://apex.stackexchange.com" style="font-weight:bold" target="_blank"&gt;apex.stackexchange.com&lt;/a&gt; for Oracle Application Express (APEX) questions. &lt;br /&gt;&lt;br /&gt;I realize that the &lt;a href="http://forums.oracle.com/forums/forum.jspa?forumID=137&amp;start=0" target="_blank"&gt;APEX Forum&lt;/a&gt; is the main source of questions and answers regarding APEX, but I thought I'd see if anyone was interested in a different approach to handle questions.&lt;br /&gt;&lt;br /&gt;If you're interested in trying it out, please go to: &lt;a href="http://apex.stackexchange.com" style="font-weight:bold" target="_blank"&gt;http://apex.stackexchange.com&lt;/a&gt;. You don't need to register to ask a question, but if you want to you can register using an &lt;a href="http://openid.net/" target="_blank"&gt;OpenID&lt;/a&gt; account.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/Ss3K2CIjAVI/AAAAAAAADrU/KnXW0KMjaLs/s1600-h/question.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 197px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/Ss3K2CIjAVI/AAAAAAAADrU/KnXW0KMjaLs/s400/question.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390187358666817874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/Ss3LBAODg2I/AAAAAAAADrc/xiaHoN_eYvA/s1600-h/question_2.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 213px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/Ss3LBAODg2I/AAAAAAAADrc/xiaHoN_eYvA/s400/question_2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5390187547131609954" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-41909527006650002?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/41909527006650002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/10/apexstackexchangecom.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/41909527006650002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/41909527006650002'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/10/apexstackexchangecom.html' title='apex.stackexchange.com'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/Ss3K2CIjAVI/AAAAAAAADrU/KnXW0KMjaLs/s72-c/question.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-715896945962398885</id><published>2009-09-25T06:15:00.000-06:00</published><updated>2009-09-25T06:15:18.063-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Developer Competition 2009 - Top 12</title><content type='html'>Yesterday I found out that the application I submitted for the Oracle Application Express Developer Competition 2009 finished in the top 12! You can view all the winners here: &lt;a href="http://www.oracle.com/technology/products/database/application_express/html/comp_winners.html" target="_blank"&gt;http://www.oracle.com/technology/products/database/application_express/html/comp_winners.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can read about my application here: &lt;a href="http://apex-smb.blogspot.com/2009/09/apex-rules-guidelines.html"&gt;http://apex-smb.blogspot.com/2009/09/apex-rules-guidelines.html&lt;/a&gt;. There's a link where you can download a copy of it as well. &lt;br /&gt;&lt;br /&gt;I put together my application rather quickly in a weekend so it does have some bugs. I'll try to update it soon for those that are using / interested in using it in their organization.&lt;br /&gt;&lt;br /&gt;Thank you to all the judges and congrats to everyone that participated!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-715896945962398885?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/715896945962398885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/09/apex-developer-competition-2009-top-12.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/715896945962398885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/715896945962398885'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/09/apex-developer-competition-2009-top-12.html' title='APEX Developer Competition 2009 - Top 12'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-4649498369516955795</id><published>2009-09-21T09:00:00.020-06:00</published><updated>2009-09-21T09:00:03.502-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Enhanced APEX Session Timeouts</title><content type='html'>APEX has built in logic to set the lifetime of a session. &lt;span style="font-style:italic;"&gt;To configure this option go to Shared Components / Edit Security Attributes / Maximum Session Idle Time in Seconds and set the time in seconds&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This essentially terminates the user's session in the database and the next time they submit the page they'll be redirected to the login screen. &lt;span style="font-weight:bold;font-style:italic"&gt;The user will only know that they are logged out once they submit the page&lt;/span&gt;. If you have an Interactive Report (IR), or use Partial Page Refresh (PPR) the users won't know they're logged out. Instead it will look as though the report is still trying to load.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/SrZjdKYpklI/AAAAAAAADqs/GPxkwVTc1Ow/s1600-h/apex_session_timeout_ir_ex.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 177px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/SrZjdKYpklI/AAAAAAAADqs/GPxkwVTc1Ow/s400/apex_session_timeout_ir_ex.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5383599757223105106" /&gt;&lt;/a&gt;&lt;br /&gt;Another situation that may happen is that the user is filling out a long form on your page, their session timesout, then they click "submit". They'll be redirected to the login page and they'll lose all the information that they entered.&lt;br /&gt;&lt;br /&gt;What if a user wants to extend their session? i.e. they haven't done anything to the page but would like a warning message before we automatically log them out? Or they are entering a log form and don't want to be logged out? I got this idea from the &lt;a href="http://www.aircanada.com/" target="_blank"&gt;Air Canada&lt;/a&gt; web site when I was booking tickets. I really liked the fact that they let me know that they were to end my session, and gave me the option to extend my session.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/SrZjlS8xbPI/AAAAAAAADq0/GlyvVtBhr2Y/s1600-h/ac_session_timeout.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 321px; height: 156px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/SrZjlS8xbPI/AAAAAAAADq0/GlyvVtBhr2Y/s400/ac_session_timeout.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5383599896961051890" /&gt;&lt;/a&gt;&lt;br /&gt;The following solution will allow you to use APEX's session timeout and resolve the issues listed above. You can view the demo here: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2600" target="_blank" style="font-weight:bold"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2600&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;Please note that since the demo page is set to public you can refresh after the session is supposed to have timedout and it will still work. If you set the Idle Session in APEX, this will work for pages that require authentication&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/SrZkYgKz7_I/AAAAAAAADrM/U8se-ZIHyIw/s1600-h/apex_session_extend.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 243px; height: 100px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/SrZkYgKz7_I/AAAAAAAADrM/U8se-ZIHyIw/s400/apex_session_extend.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5383600776682926066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/SrZj0SLARDI/AAAAAAAADrE/0ywt1wBNUNA/s1600-h/apex_session_ended.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 259px; height: 106px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/SrZj0SLARDI/AAAAAAAADrE/0ywt1wBNUNA/s400/apex_session_ended.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5383600154450347058" /&gt;&lt;/a&gt;&lt;br /&gt;Here's a high level overview of what this solution does:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Start a timer (pingApexSession) that will constantly "ping" (therefore refresh) your APEX session every X seconds.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Start a timer (idleTimer) to detect movement on the page.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;If the idleTimer times out, give the user the option to extend session&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;If the user does not extend their session, terminate their session&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;I haven't put this code into a production application yet. As I mention below, I plan to make a jQuery plugin for this, so if you please send me any feedback that would be useful fur the plugin.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This solution uses &lt;a href="http://jquery.com" target="_blank"&gt;jQuery&lt;/a&gt; and the following plugins:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://www.ericmmartin.com/projects/simplemodal/" target="_blank"&gt;Simple Modal&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://paulirish.com/2009/jquery-idletimer-plugin/" target="_blank"&gt;jQuery idleTimer&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://tylermuth.wordpress.com/2009/08/19/japex-a-jquery-plugin-for-apex/" target="_blank"&gt;jApex&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://keith-wood.name/countdown.html" target="_blank"&gt;jQuery Countdown&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;- Create Application Process: AP_NULL&lt;/span&gt;&lt;br /&gt;- Process Point: On Demand&lt;br /&gt;- Name: AP_NULL&lt;br /&gt;- Type: PL/SQL Anonymous Block&lt;br /&gt;- Process Text: NULL;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;- Create Application Process: AP_LOGOUT&lt;/span&gt;&lt;br /&gt;- Process Point: On Demand&lt;br /&gt;- Name: AP_LOGOUT&lt;br /&gt;- Type: PL/SQL Anonymous Block&lt;br /&gt;- Process Text: &lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  apex_custom_auth.LOGOUT (p_this_app                   =&gt; :app_id,&lt;br /&gt;                           p_next_app_page_sess         =&gt; :app_id || ':1');&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;- Create Region: "Extend Session" on Page 0&lt;/span&gt;&lt;br /&gt;- Title: Extend Session&lt;br /&gt;- Type: HTML Text&lt;br /&gt;- Static ID: P0_REG_EXTEND_SESSION&lt;br /&gt;- Region Attributes: style="display:none"&lt;br /&gt;- Region Source: Your session will timeout in: &amp;lt;span id="timeoutCountdownDisplay" style="font-weight:bold"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;You can put whatever message you want. Just make sure the span tags exist for the countdown timer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;- Create Button: "Extend Session" on Page 0&lt;/span&gt;&lt;br /&gt;- Button Name: EXTEND_SESSION&lt;br /&gt;- Text Label: Extend Session&lt;br /&gt;- Display in Region: Extend Session&lt;br /&gt;- Target is a: URL&lt;br /&gt;- URL Target: javascript:gTimeout.timers.killSession.liveFn();&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;- Create Region: "Session Timedout" on Page 0&lt;/span&gt;&lt;br /&gt;- Title: Session Ended&lt;br /&gt;- Type: HTML Text&lt;br /&gt;- Static ID: P0_REG_SESSION_ENDED&lt;br /&gt;- Region Attributes: style="display:none"&lt;br /&gt;- Region Source: Your session has ended. Please login.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;- Create Button: "Login" on Page 0&lt;/span&gt;&lt;br /&gt;- Button Name: LOGIN&lt;br /&gt;- Text Label: Login&lt;br /&gt;- Display in Region: Session Ended&lt;br /&gt;- Target is a: Page in this Application&lt;br /&gt;- Page: 1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;- Create Region: "JavaScript - Session Timeout" on Page 0&lt;/span&gt;&lt;br /&gt;- Title: JavaScript - Session Timeout&lt;br /&gt;- Type: HTML Text&lt;br /&gt;- Template: No Template&lt;br /&gt;- Region Source:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery-1.3.2.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery.simplemodal-1.3.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#idle-timer-0.7.080609.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery.jApex.0.9.2.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery.countdown-1.5.3.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;  //*** Insert script from below ***/&lt;br /&gt;  //Removed for display purposes&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;You'll need to upload the JS files beforehand. Please see the list above to obtain the files&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's the script to put into the region above. I separated them for display purposes.&lt;br/&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;I probably should have created this as a jQuery plugin. I may convert it later on&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var gTimeout = {&lt;br /&gt;  //debug&lt;br /&gt;  debug: false, //Set to True to turn on debugging&lt;br /&gt;  debugFn: function(pMsg) {&lt;br /&gt;    if (gTimeout.debug){&lt;br /&gt;      console.log(pMsg); &lt;br /&gt;    }&lt;br /&gt;  }, //debug&lt;br /&gt;  modalRegions: {&lt;br /&gt;    //Region that contains the "Extend Session" information&lt;br /&gt;    extendSession: {&lt;br /&gt;      id: 'P0_REG_EXTEND_SESSION',&lt;br /&gt;      backgroundColor: '#CCC',&lt;br /&gt;      opacity: 70,&lt;br /&gt;      openFn: function() {&lt;br /&gt;        gTimeout.debugFn('gTimeout.modalRegions.extendSession.openFn');&lt;br /&gt;        // Start display timeout counter&lt;br /&gt;        $('#timeoutCountdownDisplay').countdown('destroy');&lt;br /&gt;        $('#timeoutCountdownDisplay').countdown({&lt;br /&gt;          until: '+' + (gTimeout.timers.killSession.time / 1000),&lt;br /&gt;          compact: true, &lt;br /&gt;          format: 'M:S'&lt;br /&gt;        });&lt;br /&gt;        // Load modal box to give user option to extend session&lt;br /&gt;        $('#' + gTimeout.modalRegions.extendSession.id).modal({&lt;br /&gt;          overlayCss: {backgroundColor: this.backgroundColor},&lt;br /&gt;          opacity: this.opacity&lt;br /&gt;        });&lt;br /&gt;        return;&lt;br /&gt;      }, //openFn&lt;br /&gt;      closeFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.modalRegions.extendSession.closeFn');&lt;br /&gt;        $.modal.close();&lt;br /&gt;        return;&lt;br /&gt;      }//closeFn&lt;br /&gt;    },&lt;br /&gt;    //Region that will be displayed if the user does not extend thier session&lt;br /&gt;    sessionEnded: {&lt;br /&gt;      id: 'P0_REG_SESSION_ENDED',&lt;br /&gt;      backgroundColor: 'black',&lt;br /&gt;      opacity: 70,&lt;br /&gt;      openFn: function() {&lt;br /&gt;        gTimeout.debugFn('gTimeout.modalRegions.sessionEnded.openFn');&lt;br /&gt;        // Close Extend Sessios modal window&lt;br /&gt;        gTimeout.modalRegions.extendSession.closeFn();&lt;br /&gt;        // Open Logout modal window&lt;br /&gt;        $('#' + gTimeout.modalRegions.sessionEnded.id).modal({&lt;br /&gt;          overlayCss: {backgroundColor: this.backgroundColor},&lt;br /&gt;          opacity: this.opacity&lt;br /&gt;        });&lt;br /&gt;        return;&lt;br /&gt;      }// openFn&lt;br /&gt;    }//sessionEnded&lt;br /&gt;  },//modalRegions&lt;br /&gt;  timers: {&lt;br /&gt;    //Ping APEX Session timer will update the database session timer &lt;br /&gt;    pingApexSession: {&lt;br /&gt;      id: -1,&lt;br /&gt;      time: 5000, //Time to keep database session alive. This should be really close to the APEX idle time&lt;br /&gt;      loadFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.pingApexSession.loadFn:');&lt;br /&gt;        this.id = setTimeout('gTimeout.timers.pingApexSession.fn();', this.time);&lt;br /&gt;        return;&lt;br /&gt;      },&lt;br /&gt;      unloadFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.pingApexSession.unloadFn:');&lt;br /&gt;        clearTimeout(this.id); &lt;br /&gt;        this.id = -1;&lt;br /&gt;        return;&lt;br /&gt;      },//unloadFn&lt;br /&gt;      fn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.pingApexSession.fn: Extending APEX Session');&lt;br /&gt;        jQuery.jApex.ajax({&lt;br /&gt;          appProcess: 'AP_NULL',&lt;br /&gt;          success: function(){},&lt;br /&gt;          async: true&lt;br /&gt;        });&lt;br /&gt;        gTimeout.timers.pingApexSession.loadFn();&lt;br /&gt;        return;&lt;br /&gt;      }//fn&lt;br /&gt;    },//pingApexSessions&lt;br /&gt;    //Kill current session. This is called when the user gets the option to extend their session&lt;br /&gt;    killSession: {&lt;br /&gt;      id: -1,&lt;br /&gt;      time: 5000, // Time to kill the APEX session once launched. Should only be run when extend session popup box is loaded&lt;br /&gt;      loadFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.killSession.loadFn:');&lt;br /&gt;        this.id = setTimeout('gTimeout.timers.killSession.killFn();', this.time);&lt;br /&gt;        return;&lt;br /&gt;      },&lt;br /&gt;      unloadFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.killSession.unloadFn: ');&lt;br /&gt;        clearTimeout(this.id); &lt;br /&gt;        this.id = -1;&lt;br /&gt;        gTimeout.modalRegions.extendSession.closeFn(); // Close extendSession Modal &lt;br /&gt;        return;&lt;br /&gt;      },&lt;br /&gt;      killFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.killSession.killFn: Killing APEX Session');&lt;br /&gt;        // Open Logout modal window&lt;br /&gt;        gTimeout.modalRegions.sessionEnded.openFn();&lt;br /&gt;        // Stop ping Apex session&lt;br /&gt;        gTimeout.timers.pingApexSession.unloadFn(); &lt;br /&gt;        // Logout APEX session&lt;br /&gt;        jQuery.jApex.ajax({&lt;br /&gt;          appProcess: 'AP_LOGOUT',&lt;br /&gt;          success: function(){},&lt;br /&gt;          async: true&lt;br /&gt;        });&lt;br /&gt;        return;&lt;br /&gt;      },&lt;br /&gt;      // Prevents the session from being killed. We should be in a about to kill state now&lt;br /&gt;      liveFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.killSession.liveFn: ');&lt;br /&gt;        //Check that we're about to be killed&lt;br /&gt;        if (this.id == -1){&lt;br /&gt;          alert('Session is not marked to be killed');&lt;br /&gt;          return;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        // Stop the kill timer&lt;br /&gt;        this.unloadFn();&lt;br /&gt;        return;&lt;br /&gt;      }//liveFn&lt;br /&gt;    },//killSession&lt;br /&gt;    // Timer for user movement time&lt;br /&gt;    idle:{&lt;br /&gt;      time: 5000, // Time to load the "Extend Session" popup box&lt;br /&gt;      loadFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.idle.loadFn:');&lt;br /&gt;        $.idleTimer(this.time);&lt;br /&gt;        $(document).bind("idle.idleTimer", function(){gTimeout.timers.idle.idleFn();});&lt;br /&gt;        // Trigger countdown timer&lt;br /&gt;        return;&lt;br /&gt;      },&lt;br /&gt;      idleFn: function(){&lt;br /&gt;        gTimeout.debugFn('gTimeout.timers.idle.idleFn:');&lt;br /&gt;        // Load modal box to give user option to extend session&lt;br /&gt;        gTimeout.modalRegions.extendSession.openFn();&lt;br /&gt;        // Only load if we're not in a kill state&lt;br /&gt;        if (gTimeout.timers.killSession.id == -1){&lt;br /&gt;          gTimeout.timers.killSession.loadFn();&lt;br /&gt;        }&lt;br /&gt;        return;&lt;br /&gt;      } //idle Fn     &lt;br /&gt;    } // idle&lt;br /&gt;  },//timers&lt;br /&gt;  loadFn: function() {&lt;br /&gt;    gTimeout.timers.pingApexSession.loadFn(); // Keep database sessions alive&lt;br /&gt;    gTimeout.timers.idle.loadFn(); // Turn on user idle timer&lt;br /&gt;    return;&lt;br /&gt;  }//loadFn&lt;br /&gt;  &lt;br /&gt;};//gTimeout&lt;br /&gt;&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;  // Set Parameters&lt;br /&gt;  gTimeout.timers.pingApexSession.time = 5 * 1000; // Refresh APEX session every 5 seconds. This should be really close to your apex session timeout values&lt;br /&gt;  gTimeout.timers.idle.time = 10 * 1000; // 10 seconds of inactivity will trigger this window&lt;br /&gt;  gTimeout.timers.killSession.time = 10 * 1000; // Once the warning message pops up, user has 10 seconds to extend their session&lt;br /&gt;  // Configure Modal windows (not required)&lt;br /&gt;  gTimeout.modalRegions.extendSession.backgroundColor = '#CCC';&lt;br /&gt;  &lt;br /&gt;  gTimeout.loadFn();&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-4649498369516955795?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/4649498369516955795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/09/enhanced-apex-session-timeouts.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4649498369516955795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/4649498369516955795'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/09/enhanced-apex-session-timeouts.html' title='Enhanced APEX Session Timeouts'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_33EF80fk9sM/SrZjdKYpklI/AAAAAAAADqs/GPxkwVTc1Ow/s72-c/apex_session_timeout_ir_ex.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5258832922530488538</id><published>2009-09-17T09:00:00.000-06:00</published><updated>2009-09-17T09:00:04.492-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Redirects for APEX Tabs instead of page submits</title><content type='html'>With APEX Tabs you may not want the page to be submitted each time the user clicks on a tab. If you look at the link for the tabs they look like: &lt;span style="font-style:italic"&gt;javascript:doSubmit('xxxx');&lt;/span&gt; Where "xxx" is the name of the tab. "doSubmit" will submit the page and could trigger page computations, validations, and processes. If all you want to do is use the tabs as a form of navigation (i.e. when you click on a tab it redirects to another page) then this could cause some problems.&lt;br /&gt;&lt;br /&gt;To avoid triggering Page Processing on tabs you can modify all the conditions on your Page Process (this could be very long) or change the link. They're multiple ways to change the links, here's a simple one using &lt;a href="http://jquery.com" target="_blank"&gt;jQuery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's a link to the demo: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2500" target="_blank"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2500&lt;/a&gt;. Note, in the demo I don't trigger the javascript to change the link automatically so you can see what they look like before and after changing the links.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create an Application Process&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;Note: You may want to only apply this to certain pages depending on the use case&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Name: AP_UNSUBMIT_TABS&lt;br /&gt;Process Point: On Load: After Header&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN (SELECT tab_name,&lt;br /&gt;                   tab_page,&lt;br /&gt;                      '&lt;span class="apexTabURLs" tabname="'&lt;br /&gt;                   || tab_name&lt;br /&gt;                   || '" tabnewurl="'&lt;br /&gt;                   || apex_util.prepare_url (   'f?p='&lt;br /&gt;                                             || :app_id&lt;br /&gt;                                             || ':'&lt;br /&gt;                                             || tab_page&lt;br /&gt;                                             || ':'&lt;br /&gt;                                             || :app_session&lt;br /&gt;                                             || ':'&lt;br /&gt;                                             || tab_name&lt;br /&gt;                                             || '::'&lt;br /&gt;                                             || tab_page&lt;br /&gt;                                             || '::')&lt;br /&gt;                   || '"&gt;&lt;/span&gt;' tabinfo&lt;br /&gt;              FROM apex_application_tabs t&lt;br /&gt;             WHERE application_id = :app_id)&lt;br /&gt;  LOOP&lt;br /&gt;    HTP.p (x.tabinfo);&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create a HTML region&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic"&gt;Note: You'll need to install the jQuery JS file in Shared Components / Static Files&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery-1.3.2.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;  $('span.apexTabURLs').each(function(i){&lt;br /&gt;    var vTabName = $(this).attr('tabname');&lt;br /&gt;    var vNewUrl = $(this).attr('tabnewurl'); &lt;br /&gt;    $('#t20Tabs a[href="javascript:doSubmit(\'' + vTabName + '\');"]').attr('href',vNewUrl);&lt;br /&gt;  });&lt;br /&gt;  // Remove the extra span tags&lt;br /&gt;  $('span.apexTabURLs').remove();&lt;br /&gt;&lt;/script&gt;  &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5258832922530488538?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5258832922530488538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/09/redirects-for-apex-tabs-instead-of-page.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5258832922530488538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5258832922530488538'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/09/redirects-for-apex-tabs-instead-of-page.html' title='Redirects for APEX Tabs instead of page submits'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-131403418684897094</id><published>2009-09-15T09:00:00.002-06:00</published><updated>2009-09-15T22:13:02.125-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Tooltip Help in APEX: An alternative to popup help</title><content type='html'>The default help functionality for APEX is ok but can cause some problems with users browsers since it uses popup windows to display the help. If you do some digging around regarding web development best practices you'll find a lot of articles discussing why you should avoid popup windows. Instead of using the default help popup windows I prefer to use tooltips to display the help. Besides avoiding the popup window, tooltips generate a good user experience by displaying item help very quickly.&lt;br /&gt;&lt;br /&gt;This demo uses a jQuery tooltip plugin: &lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/" target="_blank"&gt;http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/&lt;/a&gt;. Please visit the Bassistance website to find out how to configure the look and feel of the tool tips.&lt;br /&gt;&lt;br /&gt;Here's a link to the demo: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2400" target="_blank"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2400&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/Sq0Cb8Ae2WI/AAAAAAAADqc/flO0nQATWCA/s1600-h/tooltiphelp.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 266px; height: 227px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/Sq0Cb8Ae2WI/AAAAAAAADqc/flO0nQATWCA/s400/tooltiphelp.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5380959808765483362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create or Update Label Template&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: You don't need to create a new template. If you want to, just update the existing templates&lt;/span&gt; &lt;br /&gt;- Copy the "Optional Label with Help" and rename to "Optional Label with ToolTip".&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: You can do this for required labels as well&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Change the "Before Label" From:&lt;br /&gt;&amp;lt;label for="#CURRENT_ITEM_NAME#" tabindex="999"&amp;gt;&amp;lt;a class="t20OptionalLabelwithHelp" href="javascript:popupFieldHelp('#CURRENT_ITEM_ID#','&amp;SESSION.')" tabindex="999"&amp;gt;&lt;br /&gt;&lt;br /&gt;To:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I removed the href reference and replaced with #&lt;/span&gt;&lt;br /&gt;&amp;lt;label for="#CURRENT_ITEM_NAME#" tabindex="999"&amp;gt;&amp;lt;a class="t20OptionalLabelwithHelp" href="#" tabindex="999"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create a HTML region&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;This can be done on P0 to load for each page&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Don't forget to upload the &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt; and &lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/" target="_blank"&gt;tooltip&lt;/a&gt; JS files into Shared Components / Static Files&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery-1.3.2.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery.tooltip.pack-1.3.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;  $('span.itemToolTip').each(function(i){&lt;br /&gt;    $('label[for="' +  $(this).attr('foritem') + '"]').attr('title',$(this).html()).tooltip({ &lt;br /&gt;        track: true, &lt;br /&gt;        delay: 0, &lt;br /&gt;        showURL: false, &lt;br /&gt;        showBody: " - ", &lt;br /&gt;        fade: 250 &lt;br /&gt;      });&lt;br /&gt;  });&lt;br /&gt;  // Remove Original ToolTip Help Text&lt;br /&gt;  $('span.itemToolTip').remove();&lt;br /&gt;});&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;style&gt;&lt;br /&gt;#tooltip {&lt;br /&gt; position: absolute;&lt;br /&gt; z-index: 3000;&lt;br /&gt; border: 1px solid #111;&lt;br /&gt; background-color: #eee;&lt;br /&gt; padding: 5px;&lt;br /&gt; opacity: 0.85;&lt;br /&gt;}&lt;br /&gt;#tooltip h3, #tooltip div { margin: 0; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Create an Application Process&lt;/span&gt;&lt;br /&gt;Name: AP_GET_HELP_TEXT&lt;br /&gt;Process Point: On Load: After Header&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN (SELECT    '&lt;span class="itemToolTip" foritem="'&lt;br /&gt;                   || item_name&lt;br /&gt;                   || '"&gt;'&lt;br /&gt;                   || item_help_text&lt;br /&gt;                   || '&lt;/span&gt;' help_html&lt;br /&gt;              FROM apex_application_page_items&lt;br /&gt;             WHERE application_id = :app_id&lt;br /&gt;               AND page_id = :app_page_id&lt;br /&gt;               AND item_help_text IS NOT NULL)&lt;br /&gt;  LOOP&lt;br /&gt;    HTP.p (x.help_html);&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Change Item Labels&lt;/span&gt;&lt;br /&gt;Change Item labels to "Optional Label with ToolTip". Only do this if you created a new template&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-131403418684897094?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/131403418684897094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/09/tooltip-help-in-apex-alternative-to.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/131403418684897094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/131403418684897094'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/09/tooltip-help-in-apex-alternative-to.html' title='Tooltip Help in APEX: An alternative to popup help'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/Sq0Cb8Ae2WI/AAAAAAAADqc/flO0nQATWCA/s72-c/tooltiphelp.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3608501106123998016</id><published>2009-09-14T09:00:00.004-06:00</published><updated>2009-09-15T05:05:27.833-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Updateable Interactive Report for APEX</title><content type='html'>A colleague had a requirement where he had over 10,000 rows of data which had to be updateable. Using Interactive Reports (IR) was the preferred approach as it would allow users to filter the data to modify the rows they wanted to before submitting the page. Tabular forms wouldn't work since the page would be to large. This is the solution that I proposed to make "Updateable IRs".&lt;br /&gt;&lt;br /&gt;The following solution will work with IRs and standard reports with pagination. If the users applies filters or paginates to another set of data, the changes they make will remain in the collection. This is using a similar technique that I wrote about for &lt;a href="http://apex-smb.blogspot.com/2009/01/apex-report-with-checkboxes-advanced.html" target="_blank"&gt;APEX Report with checkboxes (advanced)&lt;/a&gt;. To summarize this process:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  Store the current query data into a collection as well as the md5 checksum.&lt;/li&gt;&lt;li&gt;  Build an IR against the collection and use APEX_ITEMs to display input fields. &lt;/li&gt;&lt;li&gt;   When a user changes a field, we submit that change to the collection.&lt;/li&gt;&lt;li&gt;   Once the user is done with their changes you'll need to process the collection as required. In the last step in this example I have a query that will help identify changed rows.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;You can do a lot with this approach but if you don't have an urgent need I'd suggest holding off until APEX 4.0. They're some security issues that would need to be addressed before launching this code in a public application. I didn't include the security updates in this example since I did not want to lose scope of the base functionality. Updating the code to make it secure shouldn't be too difficult.&lt;br /&gt;&lt;br /&gt;Here's the link to the demo: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2300" target="_blank"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2300&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/SqxaSe21azI/AAAAAAAADqU/xsH4IhHxhwg/s1600-h/updateable_ir.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 121px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/SqxaSe21azI/AAAAAAAADqU/xsH4IhHxhwg/s400/updateable_ir.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5380774928368102194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Create IR Report Region&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: You can use this for regular reports with pagination as well&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT e.empno,&lt;br /&gt;    apex_item.text (2,&lt;br /&gt;                    ac.c002,&lt;br /&gt;                    NULL,&lt;br /&gt;                    NULL,&lt;br /&gt;                       'class="updateableIR" seqid="'&lt;br /&gt;                    || ac.seq_id&lt;br /&gt;                    || '" attrNum="2"'&lt;br /&gt;                   ) ename,&lt;br /&gt;    apex_item.text (3,&lt;br /&gt;                    ac.c003,&lt;br /&gt;                    NULL,&lt;br /&gt;                    NULL,&lt;br /&gt;                       'class="updateableIR" seqid="'&lt;br /&gt;                    || ac.seq_id&lt;br /&gt;                    || '" attrNum="3"'&lt;br /&gt;                   ) job,&lt;br /&gt;    apex_item.select_list_from_query&lt;br /&gt;       (4,&lt;br /&gt;        ac.c004,&lt;br /&gt;           'select E.ENAME d, E.EMPNO r from emp e where E.EMPNO != '&lt;br /&gt;        || e.empno,&lt;br /&gt;        'class="updateableIR" seqid="' || ac.seq_id || '" attrNum="4"',&lt;br /&gt;        'YES',&lt;br /&gt;        NULL,&lt;br /&gt;        '- Manager -'&lt;br /&gt;       ) mgr,&lt;br /&gt;    apex_item.text (5,&lt;br /&gt;                    ac.c005,&lt;br /&gt;                    NULL,&lt;br /&gt;                    NULL,&lt;br /&gt;                       'class="updateableIR" seqid="'&lt;br /&gt;                    || ac.seq_id&lt;br /&gt;                    || '" attrNum="5"'&lt;br /&gt;                   ) hiredate,&lt;br /&gt;    apex_item.text (6,&lt;br /&gt;                    ac.c006,&lt;br /&gt;                    NULL,&lt;br /&gt;                    NULL,&lt;br /&gt;                       'class="updateableIR" seqid="'&lt;br /&gt;                    || ac.seq_id&lt;br /&gt;                    || '" attrNum="6"'&lt;br /&gt;                   ) comm,&lt;br /&gt;    apex_item.select_list_from_query&lt;br /&gt;                       (7,&lt;br /&gt;                        ac.c007,&lt;br /&gt;                        'SELECT d.dname d, d.deptno r FROM dept d',&lt;br /&gt;                           'class="updateableIR" seqid="'&lt;br /&gt;                        || ac.seq_id&lt;br /&gt;                        || '" attrNum="7"',&lt;br /&gt;                        'YES',&lt;br /&gt;                        NULL,&lt;br /&gt;                        '- Department -'&lt;br /&gt;                       ) deptno&lt;br /&gt;FROM apex_collections ac, emp e&lt;br /&gt;WHERE ac.collection_name = :p2300_collection_name AND ac.c001 = e.empno&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Create Region Items&lt;/span&gt;&lt;br /&gt;- Hidden &amp;amp; Protected: P2300_COLLECTION_NAME&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Create Page Computation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: This is just to set the collection name. You can call it whatever you want&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Item: P2300_COLLECTION_NAME&lt;br /&gt;Computation Point: Before Header&lt;br /&gt;Computation Type: Static Assignment&lt;br /&gt;Computation: P2300_IR_COLLECTION&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Create a Page Process  (PL/SQL)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Name: Load Collection&lt;br /&gt;Process Point: On Lead - Before Header&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- This creates the collection if it isn't created yet.&lt;br /&gt;DECLARE&lt;br /&gt;v_collection_name             apex_collections.collection_name%TYPE&lt;br /&gt;                                                 := :p2300_collection_name;&lt;br /&gt;v_reset_flag                  VARCHAR2 (1) := 'N';&lt;br /&gt;BEGIN&lt;br /&gt;-- Create collection if it does not exist or reset collection required&lt;br /&gt;IF    apex_collection.collection_exists&lt;br /&gt;                                   (p_collection_name            =&gt; v_collection_name) =&lt;br /&gt;                                                                     FALSE&lt;br /&gt;  OR v_reset_flag = 'Y'&lt;br /&gt;THEN&lt;br /&gt; apex_collection.create_collection_from_query&lt;br /&gt;   (p_collection_name            =&gt; :p2300_collection_name,&lt;br /&gt;    p_query                      =&gt; q'! SELECT empno,&lt;br /&gt;    ename,&lt;br /&gt;    job,&lt;br /&gt;    mgr,&lt;br /&gt;    TO_DATE (hiredate, 'DD-MON-YYYY'),&lt;br /&gt;    comm,&lt;br /&gt;    deptno&lt;br /&gt;FROM emp !',&lt;br /&gt;    p_generate_md5               =&gt; 'YES'&lt;br /&gt;   );        -- Generated md5 is important to help identify changed columns&lt;br /&gt;END IF;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Create HTML Region to store JS code:&lt;/span&gt;&lt;br /&gt;Note: This uses &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; and &lt;a href="http://tylermuth.wordpress.com" target="_blank"&gt;Tyler Muth's&lt;/a&gt; &lt;a href="http://tylermuth.wordpress.com/2009/08/19/japex-a-jquery-plugin-for-apex/" target="_blank"&gt;jApex plugin&lt;/a&gt;. You'll have to upload the .js files as static files in Shared Components.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery-1.3.2.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="#APP_IMAGES#jquery.jApex.0.9.2.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;/** &lt;br /&gt; * Updates a cell in a collection&lt;br /&gt; * @author Martin Giffy D'Souza. http://apex-smb.blogspot.com&lt;br /&gt; * @param pThis input item that was changed&lt;br /&gt; *  Must contain the following attributes:&lt;br /&gt; *  - seqid Seq ID from collection&lt;br /&gt; *  - attrnum Attribute number (column number)&lt;br /&gt; * @param pOptions Options&lt;br /&gt; *  - appProcess: Application process to call&lt;br /&gt; *  - collectionName: Collection to update&lt;br /&gt; *  - successFn: Function to execute once completed&lt;br /&gt; */&lt;br /&gt;function updateCollectionCell(pThis, pOptions){&lt;br /&gt;  var vDefaults = {&lt;br /&gt;    appProcess: 'AP_UPDATE_COLLECTION_CELL',&lt;br /&gt;    collectionName: '',&lt;br /&gt;    successFn: function(){}&lt;br /&gt;  };&lt;br /&gt;  pOptions = jQuery.extend({}, vDefaults, pOptions);  &lt;br /&gt;  &lt;br /&gt;  // Check that collection name is present&lt;br /&gt;  if (pOptions.collectionName == ''){&lt;br /&gt;    alert('Missing Collection Name');&lt;br /&gt;    return;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  jQuery.jApex.ajax({&lt;br /&gt;    appProcess: pOptions.appProcess,&lt;br /&gt;    success: pOptions.successFn,&lt;br /&gt;    x01: pOptions.collectionName,&lt;br /&gt;    x02: $(pThis).attr('seqid'), //Seq ID&lt;br /&gt;    x03: $(pThis).attr('attrnum'), //Attribute Number (i.e. column number)&lt;br /&gt;    x04: $(pThis).val() // New Value&lt;br /&gt;  });&lt;br /&gt;  &lt;br /&gt;  return;&lt;br /&gt;}// updateCollectionCell&lt;br /&gt;&lt;br /&gt;//Set all updateableIR columns onChange events&lt;br /&gt;$('.updateableIR').live('change',function(){&lt;br /&gt;  updateCollectionCell(this, {&lt;br /&gt;    collectionName: $v('P2300_COLLECTION_NAME'),&lt;br /&gt;    successFn: function(){}&lt;br /&gt;    });&lt;br /&gt;});&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Create Application Process:&lt;/span&gt;&lt;br /&gt;Name: AP_UPDATE_COLLECTION_CELL&lt;br /&gt;Process Point: On Demand&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- AP_UPDATE_COLLECTION_CELL&lt;br /&gt;BEGIN&lt;br /&gt;apex_collection.update_member_attribute&lt;br /&gt;                             (p_collection_name            =&gt; apex_application.g_x01,&lt;br /&gt;                              p_seq                        =&gt; apex_application.g_x02,&lt;br /&gt;                              p_attr_number                =&gt; apex_application.g_x03,&lt;br /&gt;                              p_attr_value                 =&gt; apex_application.g_x04&lt;br /&gt;                             );&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Query to see which rows were changed&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT ac.collection_name, ac.seq_id, ac.c001, ac.c002, ac.c003, ac.c004,&lt;br /&gt;    ac.c005, ac.c006, ac.c007, ac.md5_original,&lt;br /&gt;    CASE&lt;br /&gt;      WHEN apex_collection.get_member_md5&lt;br /&gt;                                       (:p2300_collection_name,&lt;br /&gt;                                        ac.seq_id) =&lt;br /&gt;                                                ac.md5_original&lt;br /&gt;        THEN 'NO'&lt;br /&gt;      ELSE 'YES'&lt;br /&gt;    END row_change&lt;br /&gt;FROM apex_collections ac&lt;br /&gt;WHERE collection_name = :p2300_collection_name&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3608501106123998016?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3608501106123998016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/09/updateable-interactive-report-for-apex.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3608501106123998016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3608501106123998016'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/09/updateable-interactive-report-for-apex.html' title='Updateable Interactive Report for APEX'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/SqxaSe21azI/AAAAAAAADqU/xsH4IhHxhwg/s72-c/updateable_ir.jpg' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-1791149960201969350</id><published>2009-09-02T09:00:00.005-06:00</published><updated>2009-09-02T09:28:13.370-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Rules &amp; Guidelines</title><content type='html'>After several late nights of nerding I've finally submitted/completed my APEX application for the &lt;a href="http://www.oracle.com/technology/products/database/application_express/html/competition.html" target="_blank"&gt;APEX Developer Competition 2009&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can demo and download the application here: &lt;a href="http://apex.oracle.com/pls/otn/f?p=46865" target="_blank"&gt;http://apex.oracle.com/pls/otn/f?p=46865&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This purpose of this application is to allow development teams to create an online Rules &amp;amp; Guidelines development document. The template for this application is based on Patrick Cimolini's (Cayman Islands Government) presentation at &lt;a href="http://www.odtugkaleidoscope.com/" target="_blank"&gt;ODTUG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The concept of the R&amp;amp;G template is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule:&lt;/span&gt; Follow 100% of the time&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Guideline:&lt;/span&gt; Follow 90% of the time&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Mandatory Headings:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule/Guideline:&lt;/span&gt; Active voice sentence.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why:&lt;/span&gt;Important for Team Buy-In&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Optional Headings:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Result:&lt;/span&gt; Illustration of desired outcome&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How:&lt;/span&gt; How the result is achieved.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Notes:&lt;/span&gt; State the non-obvious&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;See Also:&lt;/span&gt; Point to related Rules and Guidelines&lt;br /&gt;&lt;br /&gt;You can use this template for both APEX development and your PL/SQL standards. I've included the installation files in the demo application so feel &lt;span style="font-weight: bold;"&gt;free&lt;/span&gt; to install at your organization. If you are using it please post any comments/suggestions on this post and I'll try to write some updates.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/Sp4BV-rhSZI/AAAAAAAADqE/DLGLV8dMcs4/s1600-h/rng_screen_shot_01.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 269px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/Sp4BV-rhSZI/AAAAAAAADqE/DLGLV8dMcs4/s400/rng_screen_shot_01.gif" alt="" id="BLOGGER_PHOTO_ID_5376736482241366418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/Sp4BWTCNUYI/AAAAAAAADqM/kgNcLDgq4Q4/s1600-h/rng_screen_shot_02.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 297px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/Sp4BWTCNUYI/AAAAAAAADqM/kgNcLDgq4Q4/s400/rng_screen_shot_02.gif" alt="" id="BLOGGER_PHOTO_ID_5376736487705235842" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-1791149960201969350?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/1791149960201969350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/09/apex-rules-guidelines.html#comment-form' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1791149960201969350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/1791149960201969350'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/09/apex-rules-guidelines.html' title='APEX Rules &amp; Guidelines'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/Sp4BV-rhSZI/AAAAAAAADqE/DLGLV8dMcs4/s72-c/rng_screen_shot_01.gif' height='72' width='72'/><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-6005020381527530542</id><published>2009-07-30T09:00:00.002-06:00</published><updated>2009-07-30T09:00:02.407-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX: $x_disableItem</title><content type='html'>I had an issue where I disabled a radio button (after selecting a value) using the APEX JavaScript function (&lt;a href="http://download.oracle.com/docs/cd/E10513_01/doc/apirefs.310/e12855/javascript_api.htm#CHDDAHDJ"&gt;$x_disableItem&lt;/a&gt;) but my selected value wasn't being saved.&lt;br /&gt;&lt;br /&gt;After some testing I noticed that if I selected a value, disabled the radio, then submitted the page item's value would be null (empty string). &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_33EF80fk9sM/SnDhTxFCoLI/AAAAAAAADp8/_zigDWvuY9E/s1600-h/disableItem_01.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 183px; height: 92px;" src="http://4.bp.blogspot.com/_33EF80fk9sM/SnDhTxFCoLI/AAAAAAAADp8/_zigDWvuY9E/s400/disableItem_01.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5364034885906505906" /&gt;&lt;/a&gt;&lt;br /&gt;You can view an example of this here: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2200"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2200&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;They're several ways to fix this problem. The easiest would be to "&lt;span style="font-style:italic;"&gt;undisable&lt;/span&gt;" (i.e. re-enable) the item before the page is submitted. I know "&lt;span style="font-style:italic;"&gt;undisable&lt;/span&gt;" is not a word but to re-enable a page item you need to call the disable function: $x_&lt;span style="font-weight:bold;"&gt;disable&lt;/span&gt;Item('PX',&lt;span style="font-weight:bold;"&gt;false&lt;/span&gt;);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-6005020381527530542?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/6005020381527530542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/apex-xdisableitem.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6005020381527530542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/6005020381527530542'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/apex-xdisableitem.html' title='APEX: $x_disableItem'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_33EF80fk9sM/SnDhTxFCoLI/AAAAAAAADp8/_zigDWvuY9E/s72-c/disableItem_01.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8765328932854207602</id><published>2009-07-28T09:00:00.000-06:00</published><updated>2009-07-28T09:00:08.316-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX: How to Pass Multiselect List Values in URL</title><content type='html'>When passing multiselect list values, or any multi LOV, in the URL you may have some unexpected behaviors. Here's an example: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2100"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2100&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you take a look at the example you'll notice that the URL doesn't contain all the values that you may have submitted. For example I selected KING (7839), BLAKE (7698), and CLARK (7782). I would expect the URL to contain these values when I pass them via the URL. Instead the URL looks like this: &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2100:1674288126968745::NO::&lt;span style="font-weight:bold;"&gt;P2100_EMPNO_LIST:7839:7698&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Notice how only 2 values are passed in? That's because the delimiter used in LOVs is the same that is used in the URL. What can be even more confusing is that I selected 3 values but when I pass them in the URL only 1 is "accepted". This is because the last value in the URL is the "PrinterFriendly" parameter (please see: &lt;a href="http://download.oracle.com/docs/cd/E14373_01/appdev.32/e11838/concept.htm#BEIJCIAG"&gt;http://download.oracle.com/docs/cd/E14373_01/appdev.32/e11838/concept.htm#BEIJCIAG&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;To fix the issue for all your mutli LOVs you can use a similar technique that I used to resolve the &lt;a href="http://apex-smb.blogspot.com/2009/07/how-to-resolve-null-issue-in-apex-lovs.html"&gt;%null% issue&lt;/a&gt;. An example of the fix can be found here: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2110"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2110&lt;/a&gt;. If you take a look at the example and select several employees the URL now looks like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;http://apex.oracle.com/pls/otn/f?p=20195:2110:1674288126968745::NO::&lt;span style="font-weight:bold;"&gt;P2110_EMPNO_LIST:7839*7698*7782&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Notice how the delimiters are *s for the empnos?&lt;br /&gt;&lt;br /&gt;1- Create Application Process to replace colon delimiter with *&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note: You aren't limited to using * as your delimiter&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Name: AP_REMOVE_URL_DELIM_FROM_ITEMS&lt;br /&gt;Sequence: -10   (helps ensure that it is run before any other process&lt;br /&gt;Point: On Submit: After Page Submission - Before Computations and Validations&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN (SELECT item_name,&lt;br /&gt;                   REPLACE (v (item_name), ':', '*') new_item_value&lt;br /&gt;              FROM (SELECT item_name&lt;br /&gt;                      FROM apex_application_page_items aapi&lt;br /&gt;                     WHERE aapi.application_id = :app_id&lt;br /&gt;                       AND aapi.page_id = :app_page_id&lt;br /&gt;                       AND LOWER (display_as) IN ('checkbox', 'shuttle', 'select list', 'multiselect list') -- Limiting to these types. Can remove if you want to handle all types&lt;br /&gt;                       AND ROWNUM &gt; 0) x&lt;br /&gt;             WHERE INSTR (v (x.item_name), ':') &gt; 0) LOOP&lt;br /&gt;    apex_util.set_session_state (x.item_name, x.new_item_value);&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;color:red;"&gt;Note: This will replace the colon delimiter with a *. This may change some of your validations, page processes etc.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2- Create Application Process to replace * with colon delimiter on page load&lt;br /&gt;&lt;br /&gt;Name: AP_RESET_URL_DELIM_FROM_ITEMS&lt;br /&gt;Sequence: -10   (helps ensure that it is run before any other process)&lt;br /&gt;Point: On Load: Before Header (page template header)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN&lt;br /&gt;    (SELECT item_name,&lt;br /&gt;            REPLACE (v (item_name), '*', ':') new_item_value&lt;br /&gt;       FROM (SELECT item_name&lt;br /&gt;               FROM apex_application_page_items aapi&lt;br /&gt;              WHERE aapi.application_id = :app_id&lt;br /&gt;                AND aapi.page_id = :app_page_id&lt;br /&gt;                AND LOWER (display_as) IN&lt;br /&gt;                      ('checkbox', 'shuttle', 'select list', 'multiselect list')   -- Limiting to these types. Can remove if you want&lt;br /&gt;                AND ROWNUM &gt; 0) x&lt;br /&gt;      WHERE INSTR (v (x.item_name), '*') &gt; 0) LOOP&lt;br /&gt;    apex_util.set_session_state (x.item_name, x.new_item_value);&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8765328932854207602?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8765328932854207602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/apex-how-to-pass-multiselect-list.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8765328932854207602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8765328932854207602'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/apex-how-to-pass-multiselect-list.html' title='APEX: How to Pass Multiselect List Values in URL'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2292577593988949750</id><published>2009-07-24T09:00:00.001-06:00</published><updated>2009-07-24T09:00:05.657-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><title type='text'>Oracle: How to update all sequences</title><content type='html'>If you ever do data refreshes from production to development or test environments you may run into an issue where your sequences are not up to date. It seems that Oracle exports the sequences first, then the data. If your sequence numbers change during the entire export process you may get errors when using them in your refreshed schema.&lt;br /&gt;&lt;br /&gt;To fix this problem you can try to find where your sequences are used and get the MAX(value) to find the next value. Alternatively you can just add a large random number, say 1,000,000, to all your sequences. For most users this will fix the problem and is very easy to do. Here's how:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- Update all sequences&lt;br /&gt;DECLARE&lt;br /&gt;  v_increase_by                     NUMBER;&lt;br /&gt;  v_bkp_increment_by            NUMBER;&lt;br /&gt;  v_str                         VARCHAR2 (1000);&lt;br /&gt;  v_count                       NUMBER;&lt;br /&gt;BEGIN&lt;br /&gt;  v_increase_by                  := 1000000;&lt;br /&gt;&lt;br /&gt;  FOR rec IN (SELECT *&lt;br /&gt;              FROM   user_sequences) LOOP&lt;br /&gt;    -- Backup current incrementation number&lt;br /&gt;    v_bkp_increment_by         := rec.increment_by;&lt;br /&gt;    -- Alter the sequence to increase by a defined amount&lt;br /&gt;    v_str                      := 'alter sequence ' || rec.sequence_name || ' increment by ' || v_increase_by;&lt;br /&gt;&lt;br /&gt;    EXECUTE IMMEDIATE v_str;&lt;br /&gt;&lt;br /&gt;    -- Increase by that amount&lt;br /&gt;    v_str                      := 'select ' || rec.sequence_name || '.nextval from dual';&lt;br /&gt;&lt;br /&gt;    EXECUTE IMMEDIATE v_str&lt;br /&gt;    INTO              v_count;&lt;br /&gt;&lt;br /&gt;    -- Reset the increment factor&lt;br /&gt;    v_str                      := 'alter sequence ' || rec.sequence_name || ' increment by ' || v_bkp_increment_by;&lt;br /&gt;&lt;br /&gt;    EXECUTE IMMEDIATE v_str;&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2292577593988949750?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2292577593988949750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/oracle-how-to-update-all-sequences.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2292577593988949750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2292577593988949750'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/oracle-how-to-update-all-sequences.html' title='Oracle: How to update all sequences'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-604590392188985415</id><published>2009-07-22T09:00:00.004-06:00</published><updated>2009-09-22T15:28:45.108-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><title type='text'>Oracle: Advanced Error Messages</title><content type='html'>&lt;span style="font-style:italic;"&gt;This is not an APEX specific post, however it can be useful for error handling&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A colleague showed me a great way to get more useful debug information. Normally I used &lt;span style="font-style:italic;"&gt;SQLERRM&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;SQLCODE&lt;/span&gt; in an exception to display or store error messages. Using &lt;a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_util.htm"&gt;DBMS_UTILITY&lt;/a&gt; you can get more detailed Oracle error messages. Here's an example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- I put this in a package for demo purposes&lt;br /&gt;CREATE OR REPLACE PACKAGE pkg_err_test&lt;br /&gt;AS&lt;br /&gt;  PROCEDURE sp_err_test (&lt;br /&gt;    p_empno IN emp.empno%TYPE&lt;br /&gt;  );&lt;br /&gt;END pkg_err_test;&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE PACKAGE BODY pkg_err_test&lt;br /&gt;AS&lt;br /&gt;  PROCEDURE sp_err_test (&lt;br /&gt;    p_empno IN emp.empno%TYPE&lt;br /&gt;  )&lt;br /&gt;  AS&lt;br /&gt;    v_ename emp.ename%TYPE;&lt;br /&gt;  BEGIN&lt;br /&gt;    SELECT ename&lt;br /&gt;      INTO v_ename&lt;br /&gt;      FROM emp&lt;br /&gt;     WHERE empno = p_empno;&lt;br /&gt;&lt;br /&gt;    DBMS_OUTPUT.put_line ('Employee name is: ' || v_ename);&lt;br /&gt;  EXCEPTION&lt;br /&gt;    WHEN OTHERS THEN&lt;br /&gt;      -- Basic Error Message&lt;br /&gt;      DBMS_OUTPUT.put_line ('Old Error Message: ' || SUBSTR (SQLERRM, 1, 255));&lt;br /&gt;      DBMS_OUTPUT.put_line ('Old Err Code: ' || SQLCODE);&lt;br /&gt;      -- Advanced Error Messages&lt;br /&gt;      DBMS_OUTPUT.put_line ('-- New Error Messages --');&lt;br /&gt;      DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);   -- Error Message&lt;br /&gt;      DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);   -- Where it occurred&lt;br /&gt;      DBMS_OUTPUT.put_line (DBMS_UTILITY.format_call_stack);   -- Call Stack&lt;br /&gt;  END sp_err_test;&lt;br /&gt;END pkg_err_test;&lt;br /&gt;&lt;br /&gt;-- Run the error test with an invalid employee number so an exception will be raised&lt;br /&gt;EXEC pkg_err_test.sp_err_test(p_empno =&gt; 123);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;DBMS Output:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Old Error Message: ORA-01403: no data found&lt;br /&gt;Old Err Code: 100&lt;br /&gt;-- New Error Messages --&lt;br /&gt;ORA-01403: no data found&lt;br /&gt;&lt;br /&gt;ORA-06512: at "GIFFY.PKG_ERR_TEST", line 9&lt;br /&gt;&lt;br /&gt;----- PL/SQL Call Stack -----&lt;br /&gt;  object      line  object&lt;br /&gt;  handle    number  name&lt;br /&gt;362D7814        24  package body GIFFY.PKG_ERR_TEST&lt;br /&gt;362D70E0         1  anonymous block&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The error message is displayed as well as where the error occurred and the call stack. In large systems this can be very helpful. You should be aware that when called from a package, it does not list the procedure or function (as seen in this example) where the error occurred so you may need to hard code the function or procedure name in your error message.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-604590392188985415?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/604590392188985415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/oracle-advanced-error-messages.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/604590392188985415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/604590392188985415'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/oracle-advanced-error-messages.html' title='Oracle: Advanced Error Messages'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8796385205348355952</id><published>2009-07-21T09:00:00.004-06:00</published><updated>2009-07-21T09:00:02.262-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>How to resolve %null% issue in APEX LOVs</title><content type='html'>&lt;a href="http://www.inside-oracle-apex.com"&gt;Patrick Wolf&lt;/a&gt; mentioned this at &lt;a href="http://www.odtugkaleidoscope.com"&gt;ODTUG Kaleidoscope&lt;/a&gt; this year.&lt;br /&gt;&lt;br /&gt;After you implement your first LOV in an APEX application you'll quickly learn about the %null% problem. APEX substitutes an empty string for &lt;span style="font-style:italic;"&gt;Null return value&lt;/span&gt; as %null%. &lt;br /&gt;&lt;br /&gt;They're several workarounds, like using "&lt;span style="font-weight:bold;"&gt;-1&lt;/span&gt;" as the NULL value. Or modifying your query using "&lt;span style="font-weight:bold;"&gt;'%' || 'null%'&lt;/span&gt;". For example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT ename,&lt;br /&gt;       empno&lt;br /&gt;  FROM emp&lt;br /&gt; WHERE empno = DECODE (:p_empno, '%' || 'null%', empno, NULL, empno, :p_empno)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Instead of using workarounds you can convert %null% to NULL (empty string) by creating the following application process:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Application Process:&lt;/span&gt; &lt;span style="font-style:italic;"&gt;AP_SET_LOV_NULLS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Process Point:&lt;/span&gt; &lt;span style="font-style:italic;"&gt;On Submit - Before Computations and Validations &lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN (SELECT *&lt;br /&gt;              FROM (SELECT item_name&lt;br /&gt;                      FROM apex_application_page_items aapi&lt;br /&gt;                     WHERE aapi.application_id = :app_id&lt;br /&gt;                       AND aapi.page_id = :app_page_id&lt;br /&gt;                       AND LOWER (aapi.lov_display_null) = 'yes'&lt;br /&gt;                       AND aapi.lov_definition IS NOT NULL&lt;br /&gt;                       AND aapi.lov_null_value IS NULL&lt;br /&gt;                       AND ROWNUM &gt; 0) x&lt;br /&gt;             WHERE LOWER (v (x.item_name)) = '%' || 'null%') LOOP&lt;br /&gt;    apex_util.set_session_state (x.item_name, NULL);&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8796385205348355952?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8796385205348355952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/how-to-resolve-null-issue-in-apex-lovs.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8796385205348355952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8796385205348355952'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/how-to-resolve-null-issue-in-apex-lovs.html' title='How to resolve %null% issue in APEX LOVs'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5274087942844629012</id><published>2009-07-20T09:00:00.000-06:00</published><updated>2009-07-20T09:00:02.366-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>JavaScript: ? = If Else</title><content type='html'>&lt;span style="font-style:italic"&gt;This is not directly related to APEX however it will help if you use a lot of JavaScript&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I first started to develop web based applications and used JavaScript I came across some JS code with a &lt;span style="font-weight:bold;"&gt;?&lt;/span&gt; in it. I didn't know what it was for and Googling "JavaScript ?" didn't help either. Here's a quick summary on how it works&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Boolean ? true action : false action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So this:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var x = 2;&lt;br /&gt;if (x &gt; 1)&lt;br /&gt;  window.alert('True');&lt;br /&gt;else&lt;br /&gt;  window.alert('False');&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;&lt;br /&gt;Becomes this: &lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var x = 2;&lt;br /&gt;x&gt;1 ? window.alert('True') : window.alert('False') ;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5274087942844629012?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5274087942844629012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/javascript-if-else.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5274087942844629012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5274087942844629012'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/javascript-if-else.html' title='JavaScript: ? = If Else'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2124332418609889935</id><published>2009-07-16T09:00:00.000-06:00</published><updated>2009-07-16T09:00:02.903-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX_APPLICATION.DO_SUBSTITUTIONS</title><content type='html'>I've run into several instances where I needed to store HTML in a table. The problem is sometimes the HTML references APEX Items. For example if your HTML needs to reference a picture, odds are you'll need to reference &lt;span style="font-style:italic;"&gt;&amp;APP_IMAGES.&lt;/span&gt; (or some image location item). In the past I've done manual &lt;span style="font-style:italic;"&gt;REPLACE &lt;/span&gt;calls for known items, but it was fairly restrictive.&lt;br /&gt;&lt;br /&gt;APEX has a great function (not yet documented to my knowledge) called APEX_APPLICATION.DO_SUBSTITUTIONS. If you pass in a string, it will substitute any APEX values. Here's an example app: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:2000"&gt;http://apex.oracle.com/pls/otn/f?p=20195:2000&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To create demo:&lt;br /&gt;&lt;br /&gt;1- Create table and insert values&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;CREATE TABLE tp2000(line_content CLOB NOT NULL);&lt;br /&gt;&lt;br /&gt;INSERT INTO tp2000&lt;br /&gt;     VALUES ('Google Canada Picture: &lt;img src="' || CHR (38) || 'APP_IMAGES.google_logo.gif"/&gt;');&lt;br /&gt;&lt;br /&gt;INSERT INTO tp2000&lt;br /&gt;     VALUES ('My Current Session: ' || CHR (38) || 'APP_SESSION.');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2- Create Report Region (with substitutions)&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT apex_application.do_substitutions (line_content) content_with_subs&lt;br /&gt;  FROM tp2000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3- Create Report Region (without substitutions)&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT line_content content_without_subs&lt;br /&gt;  FROM tp2000&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2124332418609889935?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2124332418609889935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/apexapplicationdosubstitutions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2124332418609889935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2124332418609889935'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/apexapplicationdosubstitutions.html' title='APEX_APPLICATION.DO_SUBSTITUTIONS'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-2020759965858343870</id><published>2009-07-15T09:00:00.001-06:00</published><updated>2009-07-15T09:00:02.442-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX: How to Develop in 2 Browser Tabs</title><content type='html'>I saw this during a presentation by &lt;a href="http://c2anton.blogspot.com/"&gt;Anton Nielsen&lt;/a&gt; last year. If you've developed with APEX for a while then you've probably wanted to have 2 developer tabs open on your browser at the same time. You'll quickly find out that this doesn't work to well.&lt;br /&gt;&lt;br /&gt;There's an easy way around it. Lets say you're developing on an instance running on your laptop. The URL you normally go to looks something like: http://localhost:8080/apex/&lt;br /&gt;&lt;br /&gt;Go into your hosts file (C:\WINDOWS\system32\drivers\etc\hosts for Windows users). You should see an entry like this:&lt;br /&gt;&lt;br /&gt;127.0.0.1       localhost&lt;br /&gt;&lt;br /&gt;Add: 127.0.0.1       giffy01 on a new line (where "giffy01" is any arbitrary name).&lt;br /&gt;&lt;br /&gt;Your hosts file should now look like:&lt;br /&gt;&lt;br /&gt;127.0.0.1       localhost&lt;br /&gt;127.0.0.1       giffy01&lt;br /&gt;&lt;br /&gt;In your favorite web browser,&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/Slv4uAHDDSI/AAAAAAAADpw/iKR9u6jqO-A/s1600-h/reaons_for_using_ie.jpg"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 199px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/Slv4uAHDDSI/AAAAAAAADpw/iKR9u6jqO-A/s400/reaons_for_using_ie.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5358149650874567970" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;open the following URLs in 2 different tabs:&lt;br /&gt;&lt;br /&gt;http://localhost:8080/apex/&lt;br /&gt;http://giffy01:8080/apex/&lt;br /&gt;&lt;br /&gt;You can now have 2 development tabs open at the same time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-2020759965858343870?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/2020759965858343870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/apex-how-to-develop-in-2-browser-tabs.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2020759965858343870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/2020759965858343870'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/apex-how-to-develop-in-2-browser-tabs.html' title='APEX: How to Develop in 2 Browser Tabs'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/Slv4uAHDDSI/AAAAAAAADpw/iKR9u6jqO-A/s72-c/reaons_for_using_ie.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3074789567405283661</id><published>2009-07-14T07:30:00.000-06:00</published><updated>2009-07-14T07:30:00.054-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX: How to Dynamically Render Regions</title><content type='html'>Suppose you needed to enable and disable report regions on each page based on a parameter. You could add a condition to each region. If the conditions were all the same, the smart thing to do would be to create a function and have your condition reference the function.&lt;br /&gt;&lt;br /&gt;What if your application had 100 pages? Would you remember to apply the condition to each report region in the 100 pages?&lt;br /&gt;&lt;br /&gt;This is not a problem that most developers run into, however when you are building large applications something similar may come up. If you can find a way to dynamically control items, regions, processes, etc this can save on development time.&lt;br /&gt;&lt;br /&gt;At the &lt;a href="http://www.odtugkaleidoscope.com"&gt;ODTUG Kaleidoscope&lt;/a&gt; conference Dennis Vanill gave a presentation on how to use Page 0 items to enable and disable APEX objects dynamically. Using this logic, here's an example on how to dynamically disable a region. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;color:red"&gt;Note: Use this when appropriate. For basic conditions stick with using "regular" conditions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A demo is available here: &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:1900"&gt;http://apex.oracle.com/pls/otn/f?p=20195:1900&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1- Create a page with some report regions&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;-- Interactive Report:&lt;br /&gt;SELECT *&lt;br /&gt;FROM emp&lt;br /&gt;&lt;br /&gt;-- Regular Report&lt;br /&gt;SELECT ename, sal&lt;br /&gt;FROM emp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2- Create Page Process: On Load - Before Header&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;DECLARE&lt;br /&gt;BEGIN&lt;br /&gt;  IF NVL (:p1900_hide_reports_flag, 'N') = 'Y' THEN&lt;br /&gt;    FOR x IN (SELECT region_id&lt;br /&gt;                FROM apex_application_page_regions&lt;br /&gt;               WHERE application_id = :app_id&lt;br /&gt;                 AND page_id = :app_page_id&lt;br /&gt;                 AND source_type IN ('Report', 'Interactive Report')) LOOP&lt;br /&gt;      FOR i IN 1 .. apex_application.g_plug_id.COUNT LOOP&lt;br /&gt;        IF apex_application.g_plug_id (i) = x.region_id THEN&lt;br /&gt;          apex_application.g_plug_display_condition_type (i) := 'NEVER';&lt;br /&gt;        END IF;&lt;br /&gt;      END LOOP;&lt;br /&gt;    END LOOP;&lt;br /&gt;  END IF;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2- (For Demo purposes only)&lt;br /&gt;I added the following on Page 0 to display in the example application. This shows that no conditions were applied to a region&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT region_id,&lt;br /&gt;       region_name,&lt;br /&gt;       source_type,&lt;br /&gt;       condition_type,&lt;br /&gt;       condition_expression1,&lt;br /&gt;       condition_expression2,&lt;br /&gt;       build_option,&lt;br /&gt;       authorization_scheme&lt;br /&gt;  FROM apex_application_page_regions&lt;br /&gt; WHERE application_id = :app_id&lt;br /&gt;   AND page_id = :app_page_id&lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;&lt;br /&gt;You can use the same logic to control computations, items, etc. Take a look at apex_application (&lt;span style="font-style:italic;"&gt;desc apex_application&lt;/span&gt;) for more options.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3074789567405283661?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3074789567405283661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/apex-how-to-dynamically-render-regions.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3074789567405283661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3074789567405283661'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/apex-how-to-dynamically-render-regions.html' title='APEX: How to Dynamically Render Regions'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3003535257074634437</id><published>2009-07-02T09:00:00.004-06:00</published><updated>2009-07-30T11:17:49.064-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX: Saving item values for each user</title><content type='html'>Someone asked me today if APEX could remember input values for specific page items. For example if you have a page with report parameters could APEX remember the report parameters that the user last used the next time they logged in?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; color:red;"&gt;Note: Please read comments below as APEX does support this out of the box on an individual item basis. This solution is to make the option configurable for large applications.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;APEX doesn't support this out of the box, however it does have some great features which can enable you to do this. &lt;span style="font-style=italic;"&gt;You can use cookies for this but I wanted to make the solution work no matter where the user was accessing the application from.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To make things a bit more difficult, I don't want to remember all item values on a page so I must be able to control which items are "remembered" and which items aren't. I can do this by using a naming convention in my items, however I don't want to rename all my page items (I already have a lot of them). Instead I decided to create a table which will list all the items a user can remember.&lt;br /&gt;&lt;br /&gt;You can try the demo &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:1800"&gt;here&lt;/a&gt; (follow the instructions on the page).&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;CREATE TABLE tapex_remember_page_item(&lt;br /&gt;application_id NUMBER NOT NULL,&lt;br /&gt;page_id NUMBER NOT NULL, &lt;br /&gt;item_name VARCHAR2(255) NOT NULL);&lt;br /&gt;&lt;br /&gt;-- You don't need to add a UK, however it may be a good idea. &lt;br /&gt;ALTER TABLE tapex_remember_page_item ADD(&lt;br /&gt;  CONSTRAINT tapex_remember_page_item_uk1&lt;br /&gt;  UNIQUE (application_id, page_id, item_name));&lt;br /&gt;  &lt;br /&gt;-- Since I name all my APEX items in uppercase, just do this as an extra precaution&lt;br /&gt;CREATE OR REPLACE TRIGGER trg_tapex_remember_pg_itm_buir&lt;br /&gt;  BEFORE UPDATE OR INSERT&lt;br /&gt;  ON tapex_remember_page_item&lt;br /&gt;  FOR EACH ROW&lt;br /&gt;BEGIN&lt;br /&gt;  :NEW.item_name := UPPER (:NEW.item_name);&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;INSERT INTO tapex_remember_page_item&lt;br /&gt;            (application_id, page_id, item_name)&lt;br /&gt;     VALUES (20195, 1800, 'P1800_DEPTNO');&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;INSERT INTO tapex_remember_page_item&lt;br /&gt;            (application_id, page_id, item_name)&lt;br /&gt;     VALUES (20195, 1800, 'P1800_MIN_SAL');            &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For this example we'll store the values as APEX Preferences, however you could easily create your own preferences table to manage your data. I think they're several advantages to managing the preferences in your own table, however if you have a small application with a limited number of users then I'd recommend using the APEX_UTIL preference options            &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Create 2 Application Processes:&lt;br /&gt;&lt;br /&gt;AP_GET_PAGE_ITEM_PREFS&lt;br /&gt;On Load: Before Header (page template header)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;DECLARE&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN (SELECT item_name&lt;br /&gt;              FROM tapex_remember_page_item&lt;br /&gt;             WHERE :app_page_id = page_id&lt;br /&gt;               AND :app_id = application_id) LOOP&lt;br /&gt;    apex_util.set_session_state (p_name      =&gt; x.item_name,&lt;br /&gt;                                 p_value     =&gt; apex_util.get_preference (p_preference     =&gt; x.item_name,&lt;br /&gt;                                                                          p_user           =&gt; :app_user&lt;br /&gt;                                                                         )&lt;br /&gt;                                );&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AP_SET_PAGE_ITEM_PREFS&lt;br /&gt;On Submit: After Page Submission - After Computations and Validations&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;DECLARE&lt;br /&gt;BEGIN&lt;br /&gt;  FOR x IN (SELECT item_name&lt;br /&gt;              FROM tapex_remember_page_item&lt;br /&gt;             WHERE :app_page_id = page_id&lt;br /&gt;               AND :app_id = application_id) LOOP&lt;br /&gt;    apex_util.set_preference (p_preference =&gt; x.item_name, p_value =&gt; v (x.item_name), p_user =&gt; :app_user);&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style=italic;"&gt;For those of you that are curious APEX Preferences are stored in : apex_030200.wwv_flow_preferences$ where apex_030200 is the schema name for APEX (could also be called flows_xxxxxx)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3003535257074634437?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3003535257074634437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/07/apex-saving-item-values-for-each-user.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3003535257074634437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3003535257074634437'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/07/apex-saving-item-values-for-each-user.html' title='APEX: Saving item values for each user'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8620057164913827195</id><published>2009-06-28T08:29:00.006-06:00</published><updated>2009-07-01T23:38:05.599-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>ODTUG Kaleidoscope 2009 Summary</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.odtugkaleidoscope.com/?utm_source=speake"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 121px; height: 91px;" src="http://www.odtugkaleidoscope.com/webbutton.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just got back from &lt;a href="http://www.odtugkaleidoscope.com/"&gt;ODTUG Kaleidoscope 2009&lt;/a&gt;. I met a lot of great people and saw many excellent presentations. My biggest regret was not being able to see everyone's presentations! Here are some highlights from the conference:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sunday APEX Symposium&lt;/span&gt;: Saw some excellent presentations on how APEX was used in other organizations.&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://joelkallman.blogspot.com/"&gt;Joel Kallman&lt;/a&gt; (Oracle) had a great opening presentation going over the history and future of APEX&lt;br /&gt;&lt;br /&gt;  - Olivier Dupont (iAdvise): Excellent use of APEX at the airport, even without a mouse or browser access!&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://apex-smb.blogspot.com/2009/06/odtug-kaleidoscope-twitter.html"&gt;My presentation&lt;/a&gt;: Mike Kinahan did a great job filling in for Frank Hoogendoorn on short notice, however my camera man wasn't as good (see picture below). &lt;span style="font-style:italic"&gt;If anyone has some pictures of the presentation can you please let me know?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/Skd-2tH1nSI/AAAAAAAADpo/0t45FGdA2LQ/s1600-h/IMG_3863.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/Skd-2tH1nSI/AAAAAAAADpo/0t45FGdA2LQ/s400/IMG_3863.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5352386160443628834" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;  - Dennis Vanill (PAETEC Software): Using page 0 to cut down on common task for many pages.&lt;br /&gt;&lt;br /&gt;  - Jan Navratil (CampusIT): Demonstrated that APEX can be used in mission critical applications. Use translation as a configuration technique for each client's definitions.&lt;br /&gt;&lt;br /&gt;  - Paul Davidson (Cornerstone Brands): APEX used in large scale call center and how he cut down call time.&lt;br /&gt;&lt;br /&gt;  - Shravan Kumar (Apexor): created the term &lt;span style="font-weight:bold;"&gt;LAOS&lt;/span&gt; (Linux, Apache, Oracle, SQL Developer). Cut down long processes into 4 minutes using APEX!&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://dpeake.blogspot.com/"&gt;David Peake&lt;/a&gt; (Oracle): Anounced an &lt;a href="http://dpeake.blogspot.com/2009/06/application-express-developer.html"&gt;APEX development contest&lt;/a&gt; for some free tickets to Open World.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Presentations&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://tkyte.blogspot.com/"&gt;Tom Kyte&lt;/a&gt;(Oracle) as always had some great presentation and demo. He stressed (again) use the database for as much as you can since Oracle will do things quicker and faster for you.&lt;br /&gt;&lt;br /&gt;  - Michael Hichwa (Oracle): APEX 4.0 Demo. I'll write a separate post about this soon since it will take a lot of space (it's just that good)&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Edit: 1-Jul-2009. &lt;a href="http://roelhartman.blogspot.com/"&gt;Role Hartman&lt;/a&gt; wrote an excellent post for APEX 4.0. Please read it for more info: &lt;a href="http://roelhartman.blogspot.com/2009/07/buzz-around-apex-40.html"&gt;http://roelhartman.blogspot.com/2009/07/buzz-around-apex-40.html&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://daust.blogspot.com/"&gt;Dietmar Aust&lt;/a&gt; (Opal Consulting): Free PDF and XLS printing options for APEX. Check his blog for full details&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://spendolini.blogspot.com/"&gt;Scott Spendolini&lt;/a&gt; (Sumner Technologies): Managing Multiple APEX applications as one. The full sample application is on his web site here: &lt;a href="http://sumnertechnologies.com/framework"&gt;http://sumnertechnologies.com/framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://www.inside-oracle-apex.com/"&gt;Patrick Wolf&lt;/a&gt; (Oracle): Had 2 great presentations. I missed his first one, but was able to attend his second presentation. Besides the content he's an excellent speaker so if you ever have a chance to see him present you should go! Patrick was kind enough to show Dennis and I some more APEX 4.0 features and answer a lot of my questions.&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://insum-apex.blogspot.com/"&gt;Francis Mignault&lt;/a&gt; (Insum): Multi tenant SaaS APEX applications. I develop SaaS applications as well and it was really nice to see a different development approach.&lt;br /&gt;&lt;br /&gt;  - Patrick Cimolini (Cayman Island Government): Development Rules and Guidelines Document for APEX. If you're looking for a simple yet effective way to create a APEX standards document I strongly suggest you get a copy of his presentation (I'm going to see if he'll allow me to post a copy here).&lt;br /&gt;&lt;br /&gt;  - &lt;a href="http://jes.blogs.shellprompt.net/"&gt;John Scott&lt;/a&gt; (Apex Evangelists): Unfortunately I wasn't able to see any of his presentations but I heard they were really good, I'll have to get a copy of his slides and white papers later on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8620057164913827195?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8620057164913827195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/06/odtug-kaleidoscope-2009-summary.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8620057164913827195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8620057164913827195'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/06/odtug-kaleidoscope-2009-summary.html' title='ODTUG Kaleidoscope 2009 Summary'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/Skd-2tH1nSI/AAAAAAAADpo/0t45FGdA2LQ/s72-c/IMG_3863.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-5244552187329534068</id><published>2009-06-16T09:30:00.000-06:00</published><updated>2009-06-16T09:30:00.421-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kaleidoscope'/><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>ODTUG Kaleidoscope - Twitter</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.odtugkaleidoscope.com/?utm_source=speake"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 121px; height: 91px;" src="http://www.odtugkaleidoscope.com/webbutton.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I've broken down and created a Twitter account &lt;a href="http://twitter.com/martindsouza"&gt;http://twitter.com/martindsouza&lt;/a&gt;. I wasn't planning on joining Twitter however it seems like it will be an excellent communication tool for the upcoming &lt;a href="http://www.odtugkaleidoscope.com/"&gt;ODTUG Kaleidoscope&lt;/a&gt; conference.&lt;br /&gt;&lt;br /&gt;On that note, our &lt;a href="http://www.odtugkaleidoscope.com/apexsymposium.html"&gt;presentation's&lt;/a&gt; "Twitter Tag" (I'm new to Twitter so I don't know all the terminology) is: &lt;a href="http://twitter.com/#search?q=%23odtug%20S299"&gt;#ODTUG S299&lt;/a&gt;. Feel free to post something on Twitter or this blog during the conference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-5244552187329534068?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/5244552187329534068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/06/odtug-kaleidoscope-twitter.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5244552187329534068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/5244552187329534068'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/06/odtug-kaleidoscope-twitter.html' title='ODTUG Kaleidoscope - Twitter'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3620837911114611117</id><published>2009-06-15T09:00:00.000-06:00</published><updated>2009-06-15T09:00:00.864-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>How to Quickly Append VARCHAR2 to CLOB</title><content type='html'>&lt;span style="font-style:italic"&gt;This is not an APEX specific issue, however it could be useful for some of your PL/SQL code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I ran into an issue today where I had to append VARCHAR2s to a CLOB many times in a loop. I first tried appending a VARCHAR2 to a CLOB: CLOB := CLOB || VARCHAR2. I noticed that this was taking a long time to run. In order to speed up the process I tried the following techniques:&lt;br /&gt;- Create a "temp" CLOB (TMP_CLOB := VARCHAR2) and then appended it the clob CLOB := CLOB || CLOB&lt;br /&gt;- Use the CLOB := CLOB || TO_CLOB(VARCHAR2)&lt;br /&gt;- Use DBMS_LOB.append (CLOB, VARCHAR2)&lt;br /&gt;&lt;br /&gt;All three options resulted in significant speed increases, however using the "temp" CLOB method resulted in the quickest code. Here is the test that I ran along with the results:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;DECLARE&lt;br /&gt;  v_start TIMESTAMP;&lt;br /&gt;  v_end TIMESTAMP;&lt;br /&gt;  v_clob CLOB;&lt;br /&gt;  v_tmp_clob CLOB;&lt;br /&gt;  v_iterations PLS_INTEGER := 100000; -- Used 1,000, 10,000, and 100,000 for testing&lt;br /&gt;BEGIN&lt;br /&gt;  v_start := SYSTIMESTAMP;&lt;br /&gt;  v_clob := NULL;&lt;br /&gt;&lt;br /&gt;  FOR i IN 1 .. v_iterations LOOP&lt;br /&gt;    v_clob := v_clob || TO_CHAR (SYSTIMESTAMP) || ', ';&lt;br /&gt;  END LOOP;&lt;br /&gt;&lt;br /&gt;  v_end := SYSTIMESTAMP;&lt;br /&gt;  DBMS_OUTPUT.put_line ('CLOB := CLOB || VARCHAR2 method: ' || TO_CHAR (v_end - v_start));&lt;br /&gt;  v_start := SYSTIMESTAMP;&lt;br /&gt;  v_clob := NULL;&lt;br /&gt;&lt;br /&gt;  FOR i IN 1 .. v_iterations LOOP&lt;br /&gt;    v_clob := v_clob || TO_CLOB (TO_CHAR (SYSTIMESTAMP) || ', ');&lt;br /&gt;  END LOOP;&lt;br /&gt;&lt;br /&gt;  v_end := SYSTIMESTAMP;&lt;br /&gt;  DBMS_OUTPUT.put_line ('CLOB := CLOB || TO_CLOB(VARCHAR2) method: ' || TO_CHAR (v_end - v_start));&lt;br /&gt;  v_start := SYSTIMESTAMP;&lt;br /&gt;  v_clob := NULL;&lt;br /&gt;&lt;br /&gt;  FOR i IN 1 .. v_iterations LOOP&lt;br /&gt;    v_tmp_clob := TO_CHAR (SYSTIMESTAMP) || ', ';&lt;br /&gt;    v_clob := v_clob || v_tmp_clob;&lt;br /&gt;  END LOOP;&lt;br /&gt;&lt;br /&gt;  v_end := SYSTIMESTAMP;&lt;br /&gt;  DBMS_OUTPUT.put_line ('CLOB := CLOB || TMP_CLOB method: ' || TO_CHAR (v_end - v_start));&lt;br /&gt;  v_start := SYSTIMESTAMP;&lt;br /&gt;  v_clob := NULL;&lt;br /&gt;  v_clob := 'h'; -- need to initialize it;&lt;br /&gt;&lt;br /&gt;  FOR i IN 1 .. v_iterations LOOP&lt;br /&gt;    DBMS_LOB.append (v_clob, TO_CHAR (SYSTIMESTAMP) || ', ');&lt;br /&gt;  END LOOP;&lt;br /&gt;&lt;br /&gt;  v_end := SYSTIMESTAMP;&lt;br /&gt;  DBMS_OUTPUT.put_line ('DBMS_LOB.append method: ' || TO_CHAR (v_end - v_start));&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The results were as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;1,000 Iterations&lt;/span&gt;&lt;br /&gt;CLOB := CLOB || VARCHAR2 method: +000000000 00:00:00.578000000&lt;br /&gt;CLOB := CLOB || TO_CLOB(VARCHAR2) method: +000000000 00:00:00.063000000&lt;br /&gt;CLOB := CLOB || TMP_CLOB method: +000000000 00:00:00.047000000&lt;br /&gt;DBMS_LOB.append method: +000000000 00:00:00.172000000&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;10,000 Iterations&lt;/span&gt;&lt;br /&gt;CLOB := CLOB || VARCHAR2 method: +000000000 00:00:10.656000000&lt;br /&gt;CLOB := CLOB || TO_CLOB(VARCHAR2) method: +000000000 00:00:00.688000000&lt;br /&gt;CLOB := CLOB || TMP_CLOB method: +000000000 00:00:00.672000000&lt;br /&gt;DBMS_LOB.append method: +000000000 00:00:00.687000000&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;100,000 Iterations&lt;/span&gt;&lt;br /&gt;CLOB := CLOB || VARCHAR2 method: +000000000 00:42:17.453000000&lt;br /&gt;CLOB := CLOB || TO_CLOB(VARCHAR2) method: +000000000 00:00:17.953000000&lt;br /&gt;CLOB := CLOB || TMP_CLOB method: +000000000 00:00:08.140000000&lt;br /&gt;DBMS_LOB.append method: +000000000 00:00:11.110000000&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3620837911114611117?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3620837911114611117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/06/how-to-quickly-append-varchar2-to-clob.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3620837911114611117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3620837911114611117'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/06/how-to-quickly-append-varchar2-to-clob.html' title='How to Quickly Append VARCHAR2 to CLOB'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7852021347517002187</id><published>2009-06-12T09:00:00.003-06:00</published><updated>2009-06-12T17:05:08.712-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX Static Files Not For Secure Content</title><content type='html'>Static files and Images (under Shared Components) are a great way to use external files (such as images, css, js, documents, etc). However, they should not be used to store sensitive information as users don't need to be logged in to access these files.&lt;br /&gt;&lt;br /&gt;Here's an example: In an APEX application I've uploaded a documented called "top_secret.doc" in the Static Files section. I only want logged in users to be able to download this file. After the user logs in their is a HTML region which contains a link to top_secret.doc. The region source is:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;br /&gt;&lt;a href="&amp;APP_IMAGES.secure_doc.doc"&gt;Secure document&lt;/a&gt;.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When the user logs in they now see a link on the first page called "Secure document" which references top_secret.doc.&lt;br /&gt;&lt;br /&gt;At first glance this seems secure since the user must first login before downloading the document. The hyperlink looks something like this: &lt;span style="font-style:italic"&gt;http://localhost:8080/apex/wwv_flow_file_mgr.get_file?p_security_group_id=1037606673759910&amp;p_flow_id=103&amp;p_fname=top_secret.doc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you notice there's no reference to the user's APEX session ID. Anybody can use this URL to download the file even if they don't have access to your application.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;This is &lt;span style="font-weight:bold"&gt;not&lt;/span&gt; a bug or an APEX security hole&lt;/span&gt;, but something that you should be aware of if you are thinking about storing sensitive information in the static files area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-7852021347517002187?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7852021347517002187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/06/apex-static-files-not-for-secure-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7852021347517002187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7852021347517002187'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/06/apex-static-files-not-for-secure-files.html' title='APEX Static Files Not For Secure Content'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-3701143569283005521</id><published>2009-06-11T09:00:00.000-06:00</published><updated>2009-06-11T09:00:00.117-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Quickly Modify APEX Interactive Report Options</title><content type='html'>If your APEX application has many Interactive Reports (IR) it can be tedious to configure IR features for each report, and their columns, such as filtering, highlighting etc.&lt;br /&gt;&lt;br /&gt;Since APEX resides within the database there's a quick way to manage all of your IRs. &lt;span style="color:red; font-style=italic;"&gt;Please note this is not supported by Oracle so please be aware of this.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First login to the database as SYS or SYSTEM.&lt;br /&gt;&lt;br /&gt;Update Interactive Report options: &lt;span style="font-style: italic;"&gt;You can modify more options by looking at the table definition for wwv_flow_worksheets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/Si3Q3CeFohI/AAAAAAAADpY/sPTJxC7mV6Q/s1600-h/24_ir_options.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 252px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/Si3Q3CeFohI/AAAAAAAADpY/sPTJxC7mV6Q/s400/24_ir_options.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5345157976733098514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;UPDATE apex_030200.wwv_flow_worksheets -- Where apex_030200 is your current APEX instance&lt;br /&gt;   SET allow_report_saving = 'Y', -- Configure options as required&lt;br /&gt;       show_finder_drop_down = 'N',&lt;br /&gt;       show_display_row_count = 'Y',&lt;br /&gt;       show_search_bar = 'N',&lt;br /&gt;       show_search_textbox = 'Y',&lt;br /&gt;       show_actions_menu = 'Y',&lt;br /&gt;       show_select_columns = 'N',&lt;br /&gt;       show_sort = 'N',&lt;br /&gt;       show_filter = 'Y',&lt;br /&gt;       show_control_break = 'Y',&lt;br /&gt;       show_highlight = 'Y',&lt;br /&gt;       show_computation = 'N',&lt;br /&gt;       show_aggregate = 'N',&lt;br /&gt;       show_chart = 'Y',&lt;br /&gt;       show_flashback = 'N',&lt;br /&gt;       show_reset = 'Y',&lt;br /&gt;       show_download = 'Y',&lt;br /&gt;       show_help = 'N'&lt;br /&gt; WHERE flow_id = :app_id&lt;br /&gt;   AND page_id = :app_page_id -- Remove this predicate to push changes for all IRs&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Update Interactive Report Columns:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_33EF80fk9sM/Si3Q8jhgbPI/AAAAAAAADpg/BuXPQH8UR80/s1600-h/24_ir_col_options.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 55px;" src="http://2.bp.blogspot.com/_33EF80fk9sM/Si3Q8jhgbPI/AAAAAAAADpg/BuXPQH8UR80/s400/24_ir_col_options.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5345158071505153266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;UPDATE apex_030200.wwv_flow_worksheet_columns&lt;br /&gt;   SET allow_sorting = 'Y',&lt;br /&gt;       allow_filtering = 'N',&lt;br /&gt;       allow_ctrl_breaks = 'Y',&lt;br /&gt;       allow_aggregations = 'N',&lt;br /&gt;       allow_computations = 'Y',&lt;br /&gt;       allow_charting = 'Y'&lt;br /&gt; WHERE flow_id = :app_id&lt;br /&gt;   AND page_id = :app_page_id;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-3701143569283005521?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/3701143569283005521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/06/quickly-modify-apex-interactive-report.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3701143569283005521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/3701143569283005521'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/06/quickly-modify-apex-interactive-report.html' title='Quickly Modify APEX Interactive Report Options'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/Si3Q3CeFohI/AAAAAAAADpY/sPTJxC7mV6Q/s72-c/24_ir_options.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-8242238180310943356</id><published>2009-06-09T09:00:00.001-06:00</published><updated>2009-06-09T09:00:01.142-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Extend APEX Workspace Password</title><content type='html'>Every so often when you log into the APEX development interface, it will require you to change your account password. This isn't a bad idea, however if you develop in several workspaces, and have multiple accounts, it may be a bit cumbersome. You can extend the account password lifetime by doing the following:&lt;br /&gt;&lt;br /&gt;- Login to the APEX Admin&lt;br /&gt;- Home / Manage Service / Security&lt;br /&gt;- Change the Account Password Lifetime (days) to whatever you need.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_33EF80fk9sM/Si3QI1QG_7I/AAAAAAAADpQ/4oa2ZyXsEvY/s1600-h/account_password_lifetime.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 131px;" src="http://1.bp.blogspot.com/_33EF80fk9sM/Si3QI1QG_7I/AAAAAAAADpQ/4oa2ZyXsEvY/s400/account_password_lifetime.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5345157182910824370" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-8242238180310943356?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/8242238180310943356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/06/extend-apex-workspace-password.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8242238180310943356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/8242238180310943356'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/06/extend-apex-workspace-password.html' title='Extend APEX Workspace Password'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_33EF80fk9sM/Si3QI1QG_7I/AAAAAAAADpQ/4oa2ZyXsEvY/s72-c/account_password_lifetime.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132893136140848212.post-7199152224339610537</id><published>2009-06-01T09:00:00.000-06:00</published><updated>2009-06-01T09:00:00.680-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Displaying Percentage Bar in APEX Reports</title><content type='html'>APEX can create "Percentage Bars" within a report. They're probably a lot of 3rd party tools you can use for fancy percentage bars, however if you want a basic display to the user here's a quick way to do it. Click &lt;a href="http://apex.oracle.com/pls/otn/f?p=20195:1600"&gt;here&lt;/a&gt; for a demo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_33EF80fk9sM/Sh9QMdwQ5PI/AAAAAAAADpI/cnJJTKr2r38/s1600-h/22_pct_bar.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 278px;" src="http://3.bp.blogspot.com/_33EF80fk9sM/Sh9QMdwQ5PI/AAAAAAAADpI/cnJJTKr2r38/s400/22_pct_bar.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5341075858160411890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;1- Create your report&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic"&gt;In this report we're using the employees percentage of salary within their department&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT e.ename,&lt;br /&gt;       e.job,&lt;br /&gt;       d.dname,&lt;br /&gt;       e.sal,&lt;br /&gt;       ROUND (e.sal / SUM (e.sal) OVER (PARTITION BY e.deptno) * 100, 0) pct_dep_sal, &lt;br /&gt;       ROUND (e.sal / SUM (e.sal) OVER (PARTITION BY e.deptno) * 100, 0) bar&lt;br /&gt;  FROM emp e,&lt;br /&gt;       dept d&lt;br /&gt; WHERE e.deptno = d.deptno&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;2- Add Percentage Bar for the "bar" column&lt;/span&gt;&lt;br /&gt;- In the Reports Attributes section, click on the "Bar" column attributes&lt;br /&gt;- Under Number/Date formatting enter the following: PCT_GRAPH:330099:CC0000:100&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic"&gt;PCT_GRAPH:&amp;lt;Hex background color&amp;gt;:&amp;lt;Hex foreground color&amp;gt;:&amp;lt;Bar width in pixels&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132893136140848212-7199152224339610537?l=www.talkapex.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.talkapex.com/feeds/7199152224339610537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.talkapex.com/2009/06/displaying-percentage-bar-in-apex.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7199152224339610537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132893136140848212/posts/default/7199152224339610537'/><link rel='alternate' type='text/html' href='http://www.talkapex.com/2009/06/displaying-percentage-bar-in-apex.html' title='Displaying Percentage Bar in APEX Reports'/><author><name>Martin Giffy D'Souza</name><uri>http://www.blogger.com/profile/06992954599899886499</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='18' height='32' src='http://1.bp.blogspot.com/_33EF80fk9sM/SzgnUA82FFI/AAAAAAAADuY/8gLN7sevw8M/S220/IMG_3451+-+Copy.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_33EF80fk9sM/Sh9QMdwQ5PI/AAAAAAAADpI/cnJJTKr2r38/s72-c/22_pct_bar.bmp' height='72' width='72'/><thr:total>6</thr:total></entry></feed>
