<?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-9029980291688587752</id><updated>2012-01-09T07:58:14.422Z</updated><category term='APEX 4.0'/><category term='SIG'/><category term='SQL'/><category term='General'/><category term='UKOUG 2007'/><category term='Release'/><category term='Javascript'/><category term='Accessibility'/><category term='APEX 4.1'/><category term='AJAX'/><category term='competition'/><category term='APEX'/><category term='sql developer'/><category term='Bookmarklets'/><category term='JSON'/><category term='Developer Tips'/><category term='Interactive Reports'/><category term='Dynamic Actions'/><title type='text'>Let's talk about Application Express</title><subtitle type='html'>Disclaimer: The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-2399151759086307898</id><published>2011-12-08T14:12:00.002Z</published><updated>2011-12-08T14:13:31.524Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Actions'/><category scheme='http://www.blogger.com/atom/ns#' term='Accessibility'/><title type='text'>UKOUG TECHEBS 2011 Presentations</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;I just wanted to do another quick, post-conference follow up post after UKOUG TECHEBS 2011 in Birmingham. At this conference I presented on 2 topics relating to Application Express and as promised, here are the slides and samples I showed during the sessions:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;a href="http://dl.dropbox.com/u/43644750/Presentations/2011/UKOUG/Easy%20Rich%20Web/Dynamic%20Actions.zip"&gt;Materials for "Easy Rich Web, with Application Express and Dynamic Actions"&lt;/a&gt;&lt;span id="goog_1725218712"&gt;&lt;/span&gt;&lt;span id="goog_1725218713"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;a href="http://dl.dropbox.com/u/43644750/Presentations/2011/UKOUG/Highly%20Accessible%20Applications%20in%20APEX/Highly%20Accessible%20Applications%20in%20APEX.zip"&gt;Materials for "Using Application Express to Build Highly Accessible Products"&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;With the accessibility sample, by just looking at the application, I appreciate it's not easy to work out exactly what I did to make it more accessible, so will try and follow up with some more information in the next couple of weeks about the changes. (Hopefully the slides and application together are still of some use now, until I do this.) Also, I had some interesting feedback after the session, where 2 people suggested the screen reader demo's could be done with the projector switched off, which I thought was a great idea to try and provide a more accurate user experience, so will try and incorporate that next time.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Thanks to all who attended, I hope you got something from them.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-2399151759086307898?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/2399151759086307898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=2399151759086307898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2399151759086307898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2399151759086307898'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2011/12/ukoug-techebs-2011-presentations.html' title='UKOUG TECHEBS 2011 Presentations'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-1640915611772913500</id><published>2011-10-06T01:28:00.001+01:00</published><updated>2011-10-10T10:28:21.283+01:00</updated><title type='text'>Oracle OpenWorld 2011 Dynamic Action Presentation</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Just a quick post to follow up from my presentation today at OpenWorld, 'Oracle Application Express 4.1 - Dynamic Actions'. In the session, I promised to provide the slides and sample applications I used, so &lt;a href="http://dl.dropbox.com/u/43644750/Presentations/2011/OOW/OOW2011_Dynamic_Actions.zip"&gt;here they are&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;The zip file contains the slides and 2 sample applications entitled 'Examples' and 'Common Questions'.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Thanks to all who attended, hope you found it useful!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-1640915611772913500?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/1640915611772913500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=1640915611772913500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1640915611772913500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1640915611772913500'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2011/10/oracle-openworld-2011-dynamic-action.html' title='Oracle OpenWorld 2011 Dynamic Action Presentation'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-3343818627258429651</id><published>2011-07-21T13:28:00.012+01:00</published><updated>2011-07-22T21:03:20.740+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Actions'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX 4.1'/><title type='text'>Application Express 4.1 - #BUTTON_ID# Changed Behaviour</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;I just wanted to blog about some changed behaviour that will be landing in APEX 4.1. The change has to do with the #BUTTON_ID# substitution string, available for use within a button template and we hope will have minimal impact.&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What's Changing?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;Prior to 4.1, the value substituted for the #BUTTON_ID# substitution string in a button template depended on the type of button:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Region buttons substituted the internal numeric ID of the button, for example '123456789101112'.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Item buttons actually failed to substitute this value at all, so you would just get the '#BUTTON_ID#' text.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;We had to address and improve this for the new Dynamic Action / Button integration in 4.1, which means that the value substituted for #BUTTON_ID# will now be one of the following:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;If the template is used by an item button, the item name is used, for example 'P1_GO'.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;If the template is used by a region button and a 'Static ID' (new in 4.1) is defined for the button, this is used, for example 'my_custom_id'.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;If the template is used by a region button and no 'Static ID' is defined, an ID in the format 'B||[Internal Button ID] will be used, for example 'B123456789101112'.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;The change in behaviour that could be of potential significance in your applications is #3 above. This was changed so as to be a valid HTML 4.01 identifier (begins with a letter) and to be consistent with how we handle other component IDs in Application Express.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Will this impact your applications?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;If you used a button template, that used an ID value substituted by #BUTTON_ID# (you would have had to add it to the button template, as this was never included by default in our themes), and importantly you hard-coded that ID from other places in your code (for example in custom JavaScript to attach behaviour to the button), then this change in behaviour will cause that code to no longer work.&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What can you do about this?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;To help you identify region buttons that use a template containing the #BUTTON_ID# substitution string, you can run the following query in your workspace in Application Express 4.0:&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; select aapb.application_id,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.page_id,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.button_name,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.label,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.button_id,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.button_template,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aatb.template&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; from apex_application_page_buttons aapb,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;apex_applications aa,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;apex_application_temp_button aatb&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;where aapb.application_id &amp;nbsp; &amp;nbsp; = aa.application_id&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aa.application_id &amp;nbsp; &amp;nbsp; &amp;nbsp; = aatb.application_id&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aa.theme_number &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = aatb.theme_number&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aatb.template_name &amp;nbsp; &amp;nbsp; &amp;nbsp;= aapb.button_template&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aapb.application_id &amp;nbsp; &amp;nbsp; = &lt;b&gt;[Your App ID]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aapb.button_template &amp;nbsp; &amp;nbsp;is not null&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aapb.button_position &amp;nbsp; &amp;nbsp;= 'Region Position'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and upper(aatb.template) &amp;nbsp; &amp;nbsp;like '%#BUTTON_ID#%'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;order by 1,2,3&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;Or when APEX 4.1 comes out, you'll be able to do this (by virtue of the addition of the BUTTON_TEMPLATE_ID column to the APEX_APPLICATION_PAGE_BUTTONS dictionary view):&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; select aapb.application_id,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.page_id,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.button_name,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.label,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.button_id,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aapb.button_template,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aatb.template&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; from apex_application_page_buttons aapb,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;apex_application_temp_button aatb&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;where aapb.button_template_id = aatb.button_template_id&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aapb.application_id &amp;nbsp; &amp;nbsp; = &lt;b&gt;[Your App ID]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aapb.button_template &amp;nbsp; &amp;nbsp;is not null&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and aapb.button_position &amp;nbsp; &amp;nbsp;= 'Region Position'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and upper(aatb.template) &amp;nbsp; &amp;nbsp;like '%#BUTTON_ID#%'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;order by 1,2,3&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;This will not detect where you may have referenced the ID in other code (such as JavaScript code), it just identifies the buttons that could be problematic. So you can then review the pages returned by this query, to isolate any pages that could have issues.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;The easiest way to fix the issue will be to use the 'Button ID' value returned from the query as the new 'Static ID' for the button. This would mean the button would be rendered with the same ID as prior to release 4.1 and any dependent code would still work.&lt;br /&gt;&lt;br /&gt;This will of course be documented in our Release Notes as Changed Behaviour, but I hope this post helps to give a little pre-warning as to whether this may affect you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Updated&lt;/b&gt;: Thank you to Louis-Guillaume Carrier-Bédard for pointing out that the query I&amp;nbsp;(rather stupidly!)&amp;nbsp;initially added does not work in APEX 4.0. My apologies if this caused any inconvenience.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-3343818627258429651?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/3343818627258429651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=3343818627258429651' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3343818627258429651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3343818627258429651'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2011/07/application-express-41-buttonid-changed.html' title='Application Express 4.1 - #BUTTON_ID# Changed Behaviour'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-821270022630985908</id><published>2010-08-05T13:48:00.041+01:00</published><updated>2010-08-07T22:24:31.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX 4.0 Enhancements: Validating Form Data</title><content type='html'>Oracle Application Express 4.0 introduces lots of big &lt;a href="http://www.oracle.com/technology/products/database/application_express/html/4.0_new_features.html" target="_blank"&gt;new features&lt;/a&gt;; websheets, dynamic actions, plug-ins, RESTful web services, team development, updated charts, the list goes on. But there are also many enhancements to existing functionality that we hope will help to simplify the overall process of developing applications in APEX. One such area, and the focus of this post is how data is validated. This post will give you an overview of what's changed with validations and how these changes will make your daily development life a little easier.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 120%; font-weight: bold;"&gt;Item-Centric Validation&lt;/span&gt;&lt;br /&gt;Historically in APEX if you want to validate data input on a page, you create a validation. The validation is a separate component that you need to define and maintain. Now in APEX 4.0, the actual item can handle some simple validation of the data it receives. For example, all item's (both native to APEX and plug-ins) now have a 'Value Required' attribute. By setting this to 'Yes', APEX will automatically validate a value has been entered and raise an error if not, no separate validation required. &lt;br /&gt;&lt;br /&gt;Additional to this 'Value Required' validation, some item types also validate their data, based on how the item is defined. For example, the new 'Number' item type, which you can use for handling numeric data contains settings for 'Minimum Value' and 'Maximum Value'. When these are defined, APEX will automatically validate the data received based on these settings and raise appropriate errors. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_0W0wsNIv6jU/TFrQudMEcLI/AAAAAAAAAKw/ifqyq2afLkI/s1600/number_settings.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5501939391314292914" src="http://2.bp.blogspot.com/_0W0wsNIv6jU/TFrQudMEcLI/AAAAAAAAAKw/ifqyq2afLkI/s400/number_settings.jpg" style="cursor: pointer; display: block; height: 158px; margin: 0px auto 10px; text-align: center; width: 322px;" /&gt;&lt;/a&gt;&lt;span style="display: block; font-size: 80%; text-align: center;"&gt;Settings for the new 'Number' item, settings highlighting are automatically validated&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The new datepicker item in APEX 4.0 also supports this type of automatic validation. Additional to the 'Value Required' setting (available for all items), the datepicker also allows setting 'Format Mask', 'Minimum Date', 'Maximum Date' and 'Year Range'. In doing so, APEX will again automatically validate the data received based on these settings and raise appropriate errors.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_0W0wsNIv6jU/TFrPqujSmFI/AAAAAAAAAKo/LL1CvBwySNI/s1600/date_settings2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5501938227743987794" src="http://1.bp.blogspot.com/_0W0wsNIv6jU/TFrPqujSmFI/AAAAAAAAAKo/LL1CvBwySNI/s400/date_settings2.jpg" style="cursor: pointer; display: block; height: 244px; margin: 0px auto 10px; text-align: center; width: 323px;" /&gt;&lt;/a&gt;&lt;span style="display: block; font-size: 80%; text-align: center;"&gt;Settings for the new 'Date' item, settings highlighting are automatically validated&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Plug-in items may also contain automatic validations, depending on whether the plug-in author has coded in this support.&lt;br /&gt;&lt;br /&gt;You also have a couple of ways of customising the error message that is displayed by APEX when these validations fail, in terms of content and position. To override the default error messages, please refer to this &lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/user.40/e15517/global.htm#CHDEDHBJ" target="_blank"&gt;section&lt;/a&gt; of the user guide. This details all of the 'Text Messages' that you would need to define in your applications to override the defaults. If you want to change where the error is displayed on screen, please see the 'Default Error Display Location' attribute available via 'Edit Application Properties' on the application homepage.&lt;br /&gt;&lt;br /&gt;Finally, debug mode has also been enhanced to show when these validations are executed and whether they passed or failed.&lt;br /&gt;&lt;br /&gt;Item based validations offer a more logical approach to validating data and requires fewer moving parts, which means less to define and less to maintain. Of course, for other more complex situations a separate validation will still be required, but this greatly simplifies some of the more common, simple scenarios.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 120%; font-weight: bold;"&gt;Button-Centric Validation Exclusion&lt;/span&gt;&lt;br /&gt;Again, historically in APEX if you don't want a validation to fire when certain buttons are pressed, you would define that logic in the validation. Let's take an example. If you have a typical 'Form' page used for inserting, updating and deleting data, you may want your validations to fire for insert and update, but not for delete. This would involve going through each validation and setting some condition such as where REQUEST != 'DELETE' or similar, to prevent the validation from firing. Now, in APEX 4.0, the actual button can be defined to either 'Execute Validations' or not.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_0W0wsNIv6jU/TFq9unHkQeI/AAAAAAAAAKY/bOwVD2QPnb0/s1600/button_exclusion2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5501918503258833378" src="http://3.bp.blogspot.com/_0W0wsNIv6jU/TFq9unHkQeI/AAAAAAAAAKY/bOwVD2QPnb0/s400/button_exclusion2.jpg" style="cursor: pointer; display: block; height: 96px; margin: 0px auto 10px; text-align: center; width: 350px;" /&gt;&lt;/a&gt;&lt;span style="display: block; font-size: 80%; text-align: center;"&gt;Specify that pressing the button should not cause any validations to fire.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is much easier, all you need to do is set this at button level and that's it, no item, plug-in or custom validations will fire. Wizard created forms will set this up for you automatically, so when creating these types of forms, the 'Create' and 'Save' buttons execute validations and the 'Delete' and 'Cancel' buttons do not. &lt;br /&gt;&lt;br /&gt;You can also override this at validation level by setting the 'Always Execute' validation attribute to 'Yes' (defaults to 'No'). This could be useful for example if you want to always execute a security check, regardless of any button exclusions.&lt;br /&gt;&lt;br /&gt;Debug mode has again been enhanced here to show if validations are prevented from firing because of the button setting.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 120%; font-weight: bold;"&gt;Tabular Form Validations&lt;/span&gt;&lt;br /&gt;APEX 4.0 now also supports declarative validation of tabular form data. Before APEX 4.0, there was no declarative support for validating this type of form and you would have to do a lot of manual PL/SQL to validate your data. Currently, tabular form validations only support a subset of what's available with page item validation, but do cater for some of the more common scenarios (required values, type checks and string comparisons). We are looking to extend this in a future release of APEX.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 120%; font-weight: bold;"&gt;Error Message Label Placeholders&lt;/span&gt;&lt;br /&gt;This is small but one of my favourites. When defining an error message that displays when a validation fails, if the validation is associated with a specific page item, you can now use the #LABEL# placeholder to dynamically reference the associated item's label.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_0W0wsNIv6jU/TFq8vrKkSnI/AAAAAAAAAKI/L0q9GkM5PDs/s1600/error_message_small2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5501917422013401714" src="http://3.bp.blogspot.com/_0W0wsNIv6jU/TFq8vrKkSnI/AAAAAAAAAKI/L0q9GkM5PDs/s400/error_message_small2.jpg" style="cursor: pointer; display: block; height: 144px; margin: 0px auto 10px; text-align: center; width: 232px;" /&gt;&lt;/a&gt;&lt;span style="display: block; font-size: 80%; text-align: center;"&gt;Use #LABEL# instead of hard-coding the associated item label text.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So instead of having to duplicate the label text in the error message (and have to remember to change it if you change the item's label) as was historically the case, just use the #LABEL# placeholder and that's it. Again, less to define and less to maintain. An equivalent placeholder is also available for the new tabular form validations, #COLUMN_HEADER#.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 120%; font-weight: bold;"&gt;Upgrading Applications&lt;/span&gt;&lt;br /&gt;So finally, what about your existing APEX applications that have been long since built, where you want to take advantage of some of these new features. Well, take a look at the 'Upgrade Application' feature available via the 'Utilities' menu from the application homepage. This assists you in upgrading your application to use some of the new features in APEX 4.0.&lt;br /&gt;&lt;br /&gt;Of particular relevance to validations are the following upgrade types:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Update Text Field Item to Number Field Item, where appropriate&lt;/span&gt; - Locates where you have an unconditional 'Is Numeric' validations on 'Text Field' items and upgrades them to use the 'Number' item type with in-built numeric checking. Also removes the now redundant separate validation.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Update Value Required item attribute to Yes, where appropriate&lt;/span&gt; - Locates where you have unconditional 'Not Null' validations on items and sets those item's 'Value Required' attribute to 'Yes'. Also removes the now redundant separate validation.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Numeric, Required and Date Picker Item updates based upon conditional validations&lt;/span&gt; - Just locates where you have conditional validations for 'Is Numeric', 'Not Null' or 'Is Valid Date' on 'Text Field' items, for your manual review. So you can determine if the validation can be replaced with some item settings and button exclusions.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So quite a few little enhancements that hopefully add up to easier and more intuitive data validation. Good luck with your new APEX 4.0 style validations and let us know what you think!&lt;br /&gt;&lt;br /&gt;Many thanks to &lt;a href="http://www.inside-oracle-apex.com/" target="_blank"&gt;Patrick Wolf&lt;/a&gt; for reviewing this post and filling in the gaps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-821270022630985908?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/821270022630985908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=821270022630985908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/821270022630985908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/821270022630985908'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2010/08/apex-40-enhancements-validating-form.html' title='APEX 4.0 Enhancements: Validating Form Data'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0W0wsNIv6jU/TFrQudMEcLI/AAAAAAAAAKw/ifqyq2afLkI/s72-c/number_settings.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-3491655841701911998</id><published>2010-08-03T13:32:00.007+01:00</published><updated>2010-08-04T10:55:25.394+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX 4.0'/><title type='text'>APEX 4.0 - Do you want to know more?</title><content type='html'>Do you want to ask the Vice President of Database Tools at Oracle and original developer of Application Express a question about Oracle Application Express 4.0?&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://michaelhichwa.blogspot.com/"&gt;Mike Hichwa&lt;/a&gt; is going to be interviewed by Oracle Profit Magazine on APEX, so if you have something you want to ask, questions are being collected for consideration via &lt;a target="_blank" href="http://twitter.com/"&gt;Twitter&lt;/a&gt;. Tweet your questions to @OracleProfit, with the hash tag #askprofit. Selected submissions will receive a 1GB flash drive — and be printed in the November issue of Profit Magazine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-3491655841701911998?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/3491655841701911998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=3491655841701911998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3491655841701911998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3491655841701911998'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2010/08/apex-40-do-you-want-to-know-more.html' title='APEX 4.0 - Do you want to know more?'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-29533662131247536</id><published>2010-07-21T08:45:00.034+01:00</published><updated>2010-08-07T22:25:51.060+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Actions'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Report filtering with APEX 4.0, dynamic action style</title><content type='html'>I've just got back from the APEX SIG event in Birmingham. As ever, the event was well organised and attended and it's always good to catch up with the extremely knowledgable and enthusiastic UK APEX community. If you haven't yet attended one of these events then I'd definitely recommend them, you will undoubtedly learn something new, make some great contacts and enjoy the day! The next event is planned for 3rd November at the Oracle City Office in London, so if you're interested in coming along, please see &lt;a href="http://www.ukoug.org/calendar/show_event.jsp?id=4711" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Down to business. During the event I was asked whether dynamic actions in APEX 4.0 can handle Ajax based filtering of report data. The answer is yes, so thought I'd make the most of the train journey home to blog about how. The approach is slightly different depending on whether you're dealing with classic or interactive report regions. In this post, I will detail the steps to achieve this with Interactive Report Regions (IRRs), fully declaratively without coding 1 line of JavaScript.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;You can also see this working in my sample application &lt;a href="http://apex.oracle.com/pls/otn/f?p=39830:38" target="_blank"&gt;here&lt;/a&gt;. This example shows a report on the EMP table, with quick filters available to filter by department or job via Ajax, partial page refresh.&lt;br /&gt;&lt;br /&gt;The following steps assume that you have the EMP and DEPT tables in your current schema.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;With IRRs, the basic approach involves the following 4 steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create a page with a report region, ensuring the page item filters are referenced in the SQL.&lt;/li&gt;&lt;li&gt;Create the page items for filtering.&lt;/li&gt;&lt;li&gt;Create the dynamic action to fire whenever any of the page item filters change value, to refresh the IRR.&lt;/li&gt;&lt;li&gt;Define the IRR to save these items values in session state after it is refreshed.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now let's walk through these steps in detail.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create the page&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Within an application, click the 'Create Page' button.&lt;/li&gt;&lt;li&gt;Select 'Report', click 'Next'.&lt;/li&gt;&lt;li&gt;Select 'Interactive Report', click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Page Attributes', enter 'Employee Report' for 'Page Name' and 'Region Name'. Importantly, you must also ensure that the 'Region Template' is set to some template that contains the #REGION_STATIC_ID# substitution string, otherwise this example will not work (dynamic actions need this ID to be able to perform the refresh). Most of the new themes now default to an appropriate template when creating new IRRs (as defined by the new Theme 'Region Default' for 'Interactive Reports'). However if you're using an old theme then you may need to select an appropriate template (try 'Region without Buttons and Title'). Also make a note of the page number (I'll assume page 1 for these steps) and click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Tab Attributes', leave as default and click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Enter a SQL SELECT Statement', enter the following query (referencing the page number noted in step 4 when defining the item names) and click 'Next':&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;select e.empno,&lt;br /&gt;e.ename,&lt;br /&gt;d.dname,&lt;br /&gt;e.job,&lt;br /&gt;e.hiredate,&lt;br /&gt;e.sal,&lt;br /&gt;e.comm&lt;br /&gt;from emp e,&lt;br /&gt;dept d&lt;br /&gt;where e.deptno = d.deptno&lt;br /&gt;and e.deptno = nvl(:P1_DEPTNO, e.deptno)&lt;br /&gt;and e.job    = nvl(:P1_JOB, e.job)&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Click 'Finish'.&lt;/li&gt;&lt;li&gt;For purposes of this example, we're going to switch off the standard 'Search' bar to keep things clean. You can do this by right clicking on the 'Employee Report' in tree view and selecting 'Edit Report Attributes'. Then in the 'Search Bar' region, select 'No' for 'Include Search Bar' and 'Apply Changes'.&lt;/li&gt;&lt;/ol&gt;If you now click 'Run Page', you'll see the basic report page as been created. We now need to add the page item filters. &lt;li&gt;Create the page items&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Go to edit the page. We'll create these items in a separate 'Quick Filters' region above the IRR. In 'Tree View', right click on the region position where the IRR has been created (by default this is 'Body (3)' and select 'Create'.&lt;/li&gt;&lt;li&gt;Select 'HTML' and click 'Next'.&lt;/li&gt;&lt;li&gt;Select 'HTML' and click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Title', specify 'Quick Filters', for 'Region Template' select 'Report Filter - Single Row' and amend the 'Sequence' to be say 5, so that this appears before the IRR on the page, click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Region Source', leave blank and click 'Create Region'. This has created a blank region, that will be the container for our filter items. We'll create 2 filters, to filter the employee report by the job and department columns respectively.&lt;/li&gt;&lt;li&gt;In 'Tree View', right click on the 'Quick Filters' region and select 'Create Page Item'.&lt;/li&gt;&lt;li&gt;Select 'Select List', click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Item Name', enter 'P1_DEPTNO', click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Item Attributes', accept defaults and click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Settings', accept defaults and click 'Next'.&lt;/li&gt;&lt;li&gt;Ensure 'Display Null Value' is 'Yes'.&lt;/li&gt;&lt;li&gt;For 'Null Display Value' enter '- Show All -'.&lt;/li&gt;&lt;li&gt;Leave 'Null Return Value' leave as blank, this will be treated as a true null by APEX.&lt;/li&gt;&lt;li&gt;For 'List of Values Query', enter the following query and click 'Next':&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;select dname d,&lt;br /&gt;deptno r&lt;br /&gt;from dept&lt;br /&gt;order by 1&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;For 'Source' accept defaults and click 'Create Item'.&lt;/li&gt;&lt;li&gt;Now for the job select list. In 'Tree View', right click on the 'Quick Filters' region and select 'Create Page Item'.&lt;/li&gt;&lt;li&gt;Select 'Select List', click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Item Name', enter 'P1_JOB', click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Item Attributes', accept defaults except for the 'Begin on New Line' attribute. We want to set this to 'No', so that the filters appear on the same line in the 'Quick Filters' region. Click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Settings', accept defaults and click 'Next'.&lt;/li&gt;&lt;li&gt;Ensure 'Display Null Value' is 'Yes'.&lt;/li&gt;&lt;li&gt;For 'Null Display Value' enter '- Show All -'.&lt;/li&gt;&lt;li&gt;Leave 'Null Return Value' leave as blank, this will be treated as a true null by APEX.&lt;/li&gt;&lt;li&gt;For 'List of Values Query', enter the following query and click 'Next':&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;select distinct job d,&lt;br /&gt;job r&lt;br /&gt;from emp&lt;br /&gt;order by 1&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;For 'Source' accept defaults and click 'Create Item'.&lt;/li&gt;&lt;/ol&gt;If you run the page now, you'll see all the basic page components are created, the regions and the items, but selecting different values from the filters has no effect. We now need to bring these to life. &lt;li&gt;Create the dynamic action&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Go to edit the page. Right click on the 'Dynamic Actions' tree node and select 'Create'.&lt;/li&gt;&lt;li&gt;Select 'Advanced' for the 'Implementation'. We need 'Advanced' here because 'Standard' only supports the 'Show', 'Hide', 'Disable' and 'Enable' actions.&lt;/li&gt;&lt;li&gt;For 'Name', enter 'QUICK FILTER REFRESH', click 'Next'.&lt;/li&gt;&lt;li&gt;For 'When', leave the event as 'Change' and for 'Item(s)', enter 'P1_DEPTNO,P1_JOB'. Leave 'Condition' as 'No Condition'. These selections define the dynamic action will fire whenever either the department or job select list's value changes. Click 'Next'.&lt;/li&gt;&lt;li&gt;For 'Action', select 'Refresh' under the 'Component' category in the select list. The 'Refresh' action currently supports IRRs, classic reports, all item types with cascading LOV support and may also support item or region plug-ins, depending on whether the plug-in author has coded the plug-in to support this (the plug-in documentation should state if this is supported). Charts in APEX 4.0 are not yet supported.&lt;/li&gt;&lt;li&gt;Ensure the 'Fire on Page Load' checkbox is unchecked, there is no need to refresh the report when the page loads, it's already fresh. Click 'Next'.&lt;/li&gt;&lt;li&gt;On the 'Affected Elements' page, we'll define what will be refreshed. Select 'Region' from the 'Selection Type' select list and 'Employee Report' from the 'Region' select list. Click 'Create'.&lt;/li&gt;&lt;/ol&gt;If you now run the page, you'll notice that this still isn't working as expected. Actually, the dynamic action is firing, the report is being refreshed, but it is not being scoped by the filter selection. The problem is the values for the filter page items are not being saved to session state and are therefore not set when the report's SQL is executed. This is easy to fix. &lt;li&gt;Define the IRR to save these items values in session state after it is refreshed&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Right click on the 'Employee Report' and select 'Report Attributes'.&lt;/li&gt;&lt;li&gt;Go the 'Advanced' and for 'Page Items to Submit', enter 'P1_DEPTNO,P1_JOB'. Click 'Apply Changes'.&lt;/li&gt;&lt;/ol&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So that's it, run the page and you will now see the filters are fully functional. Select different jobs and departments and see the report refresh, showing employees scoped by your selections. This example could be easily extended to have different item types used as the filters, not just select lists. A common example would be a slider component where you select a value or range of values, upon which the report is refreshed with rows specific to your selection. I will try and add that to my sample application when I can.&lt;br /&gt;&lt;br /&gt;For classic reports, this is slightly more complicated than as outlined above, as there is no 'Page Items to Submit' attribute (yet!!), so you need to save the values in session state in a slightly different fashion. I will try and add that too when I can. (Hint: Instead of defining the IRR 'Page Items to Submit' as detailed in the last bullet, use the 'Execute PL/SQL Code' action within the dynamic action, to fire before the 'Refresh' action. Just leave the code as 'null;' and set the 'Page Items to Submit' attribute to your page items. This will work, but unfortunately issues 2 Ajax calls to do so, which is not optimal.)&lt;br /&gt;&lt;br /&gt;Also, if you're interested in seeing more examples of refreshing reports with dynamic actions, I have a couple of others in the sample application:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://apex.oracle.com/pls/otn/f?p=39830:27" target="_blank"&gt;Refresh&lt;/a&gt; - Showing an alternative approach for user's to select their 'Saved Reports' in IRRs. Instead of using the default select list in the search region, this has been switched off in favour of a separate report on the left of the page containing the saved reports available to the current user. This report also shows a tooltip for the report description (if defined), when hovering over the report name. The dynamic action is used to refresh this saved report list, so if a user saves a new report or deletes a report, the report list is updated. Again this is all via Ajax and does not require any manual JavaScript coding.&lt;/li&gt;&lt;li&gt;&lt;a href="http://apex.oracle.com/pls/otn/f?p=39830:29" target="_blank"&gt;Refresh 2&lt;/a&gt; - Showing how report row deletion can be handled via Ajax with dynamic actions. This example does require a couple of places within dynamic actions where a line of JavaScript is required.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;To learn more about these examples, please &lt;a href="http://apex.oracle.com/pls/otn/wwv_flow_file_mgr.get_file?p_security_group_id=9839437709896934926&amp;amp;p_fname=f39830.sql&amp;amp;p_inline=NO"&gt;download&lt;/a&gt; the application, install in your workspace and have a closer look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-29533662131247536?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/29533662131247536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=29533662131247536' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/29533662131247536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/29533662131247536'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2010/07/report-filtering-with-apex-40-dynamic.html' title='Report filtering with APEX 4.0, dynamic action style'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-388879308547527489</id><published>2010-07-08T11:10:00.012+01:00</published><updated>2010-08-07T22:26:30.629+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Actions'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX 4.0 - New Dynamic Action Sample Application</title><content type='html'>In Application Express 4.0, we have introduced a new feature called 'Dynamic Actions', which enables you to define client-side behaviour declaratively in APEX. In order to try and help people gain understanding in some of the possibilities this feature offers, I have created a new dynamic action sample application featuring many different examples of both native and plug-in dynamic actions.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You can access this application online &lt;a href="http://apex.oracle.com/pls/otn/f?p=39830" target="_blank"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Alternatively, you can download this application and install it in your own workspace, which I would recommend so you can really see what's going on. Download &lt;a href="http://apex.oracle.com/pls/otn/wwv_flow_file_mgr.get_file?p_security_group_id=9839437709896934926&amp;amp;p_fname=f39830.sql&amp;amp;p_inline=NO"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Please note: Currently the drag and drop example doesn't work in IE, I will try and fix this up when I have time.&lt;br /&gt;&lt;br /&gt;Useful Links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;To sign up for a free workspace and try out APEX 4.0 for yourself, please click &lt;a href="http://apex.oracle.com/i/index.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;To learn more about this and other new features in Oracle Application Express 4.0, please visit our &lt;a href="http://www.oracle.com/technology/products/database/application_express/html/4.0_new_features.html" target="_blank"&gt;New Features&lt;/a&gt; page.&lt;/li&gt;&lt;li&gt;Dynamic action official &lt;a href="http://download.oracle.com/docs/cd/E17556_01/doc/user.40/e15517/advnc.htm#CIHCFDGB" target="_blank"&gt;documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;To follow the Oracle Dynamic Actions OBE, which offers an excellent starting point, click &lt;a href="http://st-curriculum.oracle.com/obe/db/apex/r40/apexdynactions/apexdynactions_ll.htm" target="_blank"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I welcome any feedback you may have and will try and blog some more about some of the specific examples when I can.&lt;br /&gt;&lt;br /&gt;Anthony.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-388879308547527489?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/388879308547527489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=388879308547527489' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/388879308547527489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/388879308547527489'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2010/07/apex-40-new-dynamic-action-sample.html' title='APEX 4.0 - New Dynamic Action Sample Application'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-5182516351858186285</id><published>2010-01-15T02:33:00.022Z</published><updated>2010-08-07T22:27:47.564+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Actions'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>APEX 4.0 - Learn more about Dynamic Actions</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: Please note, I have now updated my dynamic action sample application, the links in this post no longer work. Please see this blog &lt;a href="http://anthonyrayner.blogspot.com/2010/07/apex-40-new-dynamic-action-sample.html"&gt;post&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;As many of you may know, &lt;a href="http://tryapexnow.com/" target="_blank"&gt;APEX 4.0 Early Adopter's&lt;/a&gt; was released before Christmas. In this release, we introduce a new feature called 'Dynamic Actions' that provides a declarative way of defining client-side behaviour, without needing to know JavaScript. There is a simple wizard to create new dynamic actions, whereby you just specify 'When' the dynamic action will fire, the 'Action' itself and 'What' will be affected. As I said, you don't have to know JavaScript to do a fair amount with this feature, but there are also some hooks for JavaScript developers to extend the dynamic action framework to do a whole load more!!&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;To help you understand this feature, I have put together a sample application containing lots of different uses of dynamic actions such as drag and drop, styling page items and interactive reports, retrieving data from the server via AJAX, responding to plug-in item events such as the 'Slider' sliding and more. You can either view the application running on the EA instance &lt;a href="http://tryapexnow.com/apex/f?p=11294" target="_blank"&gt;here&lt;/a&gt; or download it from &lt;a href="http://tryapexnow.com/apex/wwv_flow_file_mgr.get_file?p_security_group_id=129055304374899041&amp;amp;p_fname=f11294.sql&amp;amp;p_inline=NO"&gt;here&lt;/a&gt;, so you can install it in your own EA workspace and have a deeper look. If you haven't yet signed up for the APEX 4.0 Early Adopters, take a look at David Peake's related blog &lt;a href="http://dpeake.blogspot.com/2009/12/apex-40-early-adopter-now-avialable.html" target="_blank"&gt;post&lt;/a&gt; where he explains how to get started.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note&lt;/span&gt;: If you are installing this application, there is one supporting object defined containing a simple PL/SQL function 'getCommission' used by a couple of the examples. During the install, please install this supporting object to get the full functionality. Also, the application requires that you have a copy of the standard 'EMP' table in the parsing schema for the application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The application makes use of a number of native dynamic actions (that will be built-in to APEX), but also contains 5 dynamic action plug-in examples which you can look at, install and play around with. The plug-ins are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tryapexnow.com/apex/wwv_flow_file_mgr.get_file?p_security_group_id=129055304374899041&amp;amp;p_fname=dynamic_action_plugin_com_oracle_apex_draggable.sql&amp;amp;p_inline=NO"&gt;Draggable&lt;/a&gt;&lt;/span&gt; - Define page elements as draggable, with various options such as restricting by vertical or horizontal axis, transparency during drag, containment and more.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tryapexnow.com/apex/wwv_flow_file_mgr.get_file?p_security_group_id=129055304374899041&amp;amp;p_fname=dynamic_action_plugin_com_oracle_apex_droppable.sql&amp;amp;p_inline=NO"&gt;Droppable&lt;/a&gt; &lt;/span&gt;- Define page elements as droppable, with various options such as restricting which draggables can be dropped, styling to guide the user where they can drop the element and more.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tryapexnow.com/apex/wwv_flow_file_mgr.get_file?p_security_group_id=129055304374899041&amp;amp;p_fname=dynamic_action_plugin_com_oracle_apex_execute_plsql_code.sql&amp;amp;p_inline=NO"&gt;Execute PL/SQL Code&lt;/a&gt;&lt;/span&gt; - Define a PL/SQL snippet right from within the dynamic action that will be executed on the server, via AJAX. This is currently only coded for Theme 1.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tryapexnow.com/apex/wwv_flow_file_mgr.get_file?p_security_group_id=129055304374899041&amp;amp;p_fname=dynamic_action_plugin_com_oracle_apex_highlight.sql&amp;amp;p_inline=NO"&gt;Highlight&lt;/a&gt; &lt;/span&gt;- Patrick Wolf's plug-in that provides the ability to highlight elements on the page.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tryapexnow.com/apex/wwv_flow_file_mgr.get_file?p_security_group_id=129055304374899041&amp;amp;p_fname=dynamic_action_plugin_com_oracle_apex_stripe_report.sql&amp;amp;p_inline=NO"&gt;Stripe Report&lt;/a&gt;&lt;/span&gt; - Used for striping interactive report regions with alternate row colours.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I have ensured all the plug-in code is thoroughly commented to try and help you understand exactly what's going on and hopefully get you started in building your own dynamic action plug-ins!! &lt;br /&gt;&lt;br /&gt;Plug-ins are 1 of the major components of APEX 4.0 and if you're interested to learn more I can thoroughly recommend taking a look at Patrick Wolf's &lt;a href="http://www.inside-oracle-apex.com/oracle-apex-4-0-how-to-create-a-plug-in/" target="_blank"&gt;'How to create a plug-in'&lt;/a&gt; blog post and accompanying downloads.&lt;br /&gt;&lt;br /&gt;I hope you like the application and let me know how you get on!!!&lt;br /&gt;&lt;br /&gt;Anthony.&lt;br /&gt;&lt;br /&gt;PS: Many thanks to &lt;a href="http://www.inside-oracle-apex.com/" target="_blank"&gt;Patrick Wolf&lt;/a&gt; for his invaluable help in reviewing these plug-ins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-5182516351858186285?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/5182516351858186285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=5182516351858186285' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/5182516351858186285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/5182516351858186285'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2010/01/apex-40-learn-more-about-dynamic.html' title='APEX 4.0 - Learn more about Dynamic Actions'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-595008449053553110</id><published>2009-08-26T10:28:00.006+01:00</published><updated>2009-09-01T12:52:54.070+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='Accessibility'/><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>Out Now!! Application Express 3.2.1</title><content type='html'>The Oracle Application Express 3.2.1 patch set is now available for download and provides not only fixes to the following &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/html/3.2.1_patchnote.html#BABJCAFA"&gt;bugs&lt;/a&gt;, but also some additional functionality and considerations as summarised by &lt;a target="_blank" href="http://joelkallman.blogspot.com/2009/08/application-express-321-patch-set.html"&gt;Joel&lt;/a&gt; and detailed in the &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/html/3.2.1_patchnote.html#BABJCAFA"&gt;patch set notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can get hold of it by either:&lt;ul&gt;&lt;li&gt;Downloading the full version from &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/download.html"&gt;OTN&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download the patch set 8548651 from &lt;a target="_blank" href="https://metalink.oracle.com/metalink/plsql/f?p=130:5:0::::P_SOURCE,P_SRCHTXT:8,8548651"&gt;METALINK&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;If you're upgrading from any APEX version pre-3.2, then you'll need to use the full &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/download.html"&gt;OTN&lt;/a&gt; release. Otherwise if you're upgrading from 3.2, then you only need the &lt;a target="_blank" href="https://metalink.oracle.com/metalink/plsql/f?p=130:5:0::::P_SOURCE,P_SRCHTXT:8,8548651"&gt;patch set&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Also in this patch set, we have included an additional documentation chapter, entitled &lt;a target="_blank" href="http://download.oracle.com/docs/cd/E14373_01/install.32/e13366/accessibility.htm#sthref495"&gt;Accessibility in Oracle Application Express&lt;/a&gt;. This aims to provide information for users who are accessing Oracle Application Express utilizing only a keyboard or Freedom Scientific's screen reader &lt;a href="http://www.freedomscientific.com/products/fs/jaws-product-page.asp"&gt;JAWS&lt;/a&gt;. It details the current accessibility issues in APEX and shows workarounds where they are possible. (We hope to address a number of these issues in APEX 4.0.)&lt;br /&gt;&lt;br /&gt;I would be very interested to hear from anyone who uses APEX with keyboard only, screen reader or other assistive technology to get feedback on how we can hopefully get better at being accessible to our users with disabilities. Also if you use APEX to build applications that have strict accessibility requirements and have feedback on your experiences then I would love to hear from you also. &lt;br /&gt;&lt;br /&gt;Please drop me an email at the email address in my profile if you would like to talk about this.&lt;br /&gt;&lt;br /&gt;Anthony.&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/9029980291688587752-595008449053553110?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/595008449053553110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=595008449053553110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/595008449053553110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/595008449053553110'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2009/08/out-now-application-express-321.html' title='Out Now!! Application Express 3.2.1'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-3048638306485441645</id><published>2009-07-01T11:22:00.005+01:00</published><updated>2009-08-26T17:18:46.035+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='competition'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>OTNs APEX Developer Competition 2009</title><content type='html'>&lt;span style="font-weight:bold;font-style:italic;"&gt;Are you the...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight:bold;font-style:italic;"&gt;...travelling type?&lt;/span&gt;&amp;nbsp;&amp;nbsp;Fancy winning a free ticket for &lt;a target="_blank" href="http://www.oracle.com/us/openworld/index.htm"&gt;Oracle OpenWorld&lt;/a&gt; in San Francisco (October 11 - 15) to meet with like minded APEX enthusiasts and learn more about APEX and other Oracle technology?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Or maybe more the...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight:bold;font-style:italic;"&gt;...bragging type?&lt;/span&gt;&amp;nbsp;&amp;nbsp;How would the words '&lt;span style="font-style:italic;"&gt;Oracle Application Express Developer Competition Winner 2009&lt;/span&gt;' look on your CV? It does have a certain ring to it, don't you think?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Or even the...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight:bold;font-style:italic;"&gt;...academic type?&lt;/span&gt;&amp;nbsp;&amp;nbsp; What about the prospect of furthering your understanding of APEX by paging through your winning copy of 'Pro Oracle Application Express'?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Whatever your reasons, enter the OTN '&lt;span style="font-weight:bold;"&gt;Oracle Application Express Developer Competition 2009&lt;/span&gt;' by submitting an APEX application that stands out from the crowd and you could be in with the opportunity of winning one of these great prizes or accolades!&lt;br /&gt;&lt;br /&gt;For more information, including submission guidelines, all important judging criteria and registration details, please visit the &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/html/competition.html#09"&gt;OTN page&lt;/a&gt; and David Peake's related &lt;a target="_blank" href="http://dpeake.blogspot.com/2009/06/application-express-developer.html"&gt;post&lt;/a&gt;. Entries close 24 August, 2009.&lt;br /&gt;&lt;br /&gt;Good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-3048638306485441645?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/3048638306485441645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=3048638306485441645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3048638306485441645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3048638306485441645'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2009/07/otns-apex-developer-competition-2009.html' title='OTNs APEX Developer Competition 2009'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-2615627613248262574</id><published>2009-01-22T10:22:00.015Z</published><updated>2009-08-26T17:17:52.194+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='SIG'/><title type='text'>APEX SIG in the UK - Finally!</title><content type='html'>So after much discussion and a lot of hard work from Justin Hudd from &lt;a target="_blank" href="http://www.e-dba.com/"&gt;e-DBA&lt;/a&gt;, the &lt;a target="_blank" href="http://www.ukoug.org/calendar/show_event.jsp?id=4162"&gt;1st APEX SIG event&lt;/a&gt; in the UK is now officially going ahead and booked for February 13th at the &lt;a target="_blank" href="http://www.oracle.com/global/uk/corporate/locations/city.html"&gt;Oracle City Office&lt;/a&gt; in London. The agenda is as follows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Introduction&lt;/span&gt; - Justin Hudd (&lt;a target="_blank" href="http://www.e-dba.com/"&gt;e-DBA&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Latest &amp; Greatest&lt;/span&gt; - &lt;a target="_blank" href="http://dpeake.blogspot.com/"&gt;David Peake&lt;/a&gt; (APEX Product Manager)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;APEX @ Oracle&lt;/span&gt; - Learn How Oracle Utilises Application Express (Me)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;What happens on an APEX Page?&lt;/span&gt; - &lt;a target="_blank" href="http://dgielis.blogspot.com/"&gt;Dimitri Gielis&lt;/a&gt; (&lt;a target="_blank" href="http://www.apex-evangelists.com/"&gt;APEX Evangelists&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Using APEX to Expose your Business to the Web&lt;/span&gt; - &lt;a target="_blank" href="http://application-express-blog.e-dba.com/"&gt;Matt Nolan &amp; Vincent Migue&lt;/a&gt; (&lt;a target="_blank" href="http://www.e-dba.com/"&gt;e-DBA&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Dispelling Myths about Application Express&lt;/span&gt; - &lt;a target="_blank" href="http://jes.blogs.shellprompt.net/"&gt;John Scott&lt;/a&gt; (APEX Evangelists and author of &lt;a target="_blank" href="http://www.amazon.co.uk/Oracle-Application-Express-Experts-Voice/dp/159059827X"&gt;Pro Oracle Application Express&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;APEX Forum&lt;/span&gt; – A Chance to ask the Experts&lt;/li&gt;&lt;/ul&gt;Then the usual post event drinks at a nearby drinkery.&lt;br /&gt;&lt;br /&gt;If your interested in coming along then you'll need to register for the event via the &lt;a target="_blank" href="http://www.ukoug.org/calendar/show_event.jsp?id=4162"&gt;website&lt;/a&gt;. Pricing varies on the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you are already a member of UKOUG then it's &lt;span style="font-weight:bold;"&gt;free&lt;/span&gt; to attend (and you can buy additional places at the members rate of £80 plus VAT for colleagues).&lt;/li&gt;&lt;li&gt;If you are not a member then they have setup a non-member rate of £160 plus VAT.&lt;/li&gt;&lt;/ul&gt;There are only 55 places available so attendance is limited.&lt;br /&gt;&lt;br /&gt;Hopefully see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-2615627613248262574?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/2615627613248262574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=2615627613248262574' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2615627613248262574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2615627613248262574'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2009/01/apex-sig-in-uk-finally.html' title='APEX SIG in the UK - Finally!'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-3202771008489202685</id><published>2008-12-12T11:22:00.020Z</published><updated>2008-12-18T09:33:10.870Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interactive Reports'/><category scheme='http://www.blogger.com/atom/ns#' term='sql developer'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>'Publish to APEX' from SQL Developer 1.5.3</title><content type='html'>Since SQL Developer 1.2.1 and APEX 3.0.1, we've had some useful &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/html/sql_dev_integration.html"&gt;integration&lt;/a&gt; between APEX and SQL Developer, the ability to import and deploy applications, browse the APEX metadata, remote debug PL/SQL in your applications and more. With the latest release of &lt;a target="_blank" href="http://www.oracle.com/technology/software/products/sql/index.html"&gt;SQL Developer 1.5.3&lt;/a&gt;, it is now possible to create a quick and simple APEX application from within SQL Developer (thanks to a bug fix). This is possible through the &lt;span style="font-weight:bold;"&gt;'Publish to APEX'&lt;/span&gt; feature and creates a simple 1 page APEX application containing an &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/html/irrs.html"&gt;Interactive Report Region&lt;/a&gt; based upon a SQL statement.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0W0wsNIv6jU/SUJSQP0cEQI/AAAAAAAAAHM/xwCmDs0SU8I/s1600-h/12-12-2008+11-39-59.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 361px;" src="http://1.bp.blogspot.com/_0W0wsNIv6jU/SUJSQP0cEQI/AAAAAAAAAHM/xwCmDs0SU8I/s400/12-12-2008+11-39-59.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5278872152309502210" /&gt;&lt;/a&gt;&lt;br /&gt;(Note: Requires APEX 3.1 or above.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This feature allows you to take any grid of data, right click on it and select to &lt;span style="font-weight:bold;"&gt;'Publish to APEX'&lt;/span&gt;. (Note a 'grid of data' includes results from executing a SQL statement, results of pre-defined or user-defined reports from the 'Reports' tab, specific table / view properties such as columns, data, constraints etc. and I'm sure there are more.) Upon selecting &lt;span style="font-weight:bold;"&gt;'Publish to APEX'&lt;/span&gt;, the following dialog is displayed:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0W0wsNIv6jU/SUJRzmrNU9I/AAAAAAAAAHE/hdRr22WPrGo/s1600-h/12-12-2008+11-41-43.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 227px;" src="http://4.bp.blogspot.com/_0W0wsNIv6jU/SUJRzmrNU9I/AAAAAAAAAHE/hdRr22WPrGo/s400/12-12-2008+11-41-43.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5278871660228596690" /&gt;&lt;/a&gt;&lt;br /&gt;This dialog allows you to specify 5 properties:&lt;br /&gt;1) &lt;span style="font-weight:bold;"&gt;Workspaces&lt;/span&gt;- The workspace where you want the application to be created (this list will only display workspaces that are associated with the schema of the context of your current grid of data).&lt;br /&gt;2) &lt;span style="font-weight:bold;"&gt;Application Name&lt;/span&gt; - The name of the application that will be created.&lt;br /&gt;3) &lt;span style="font-weight:bold;"&gt;Theme &lt;/span&gt;- The theme for your new application, specifying look and feel.&lt;br /&gt;4) &lt;span style="font-weight:bold;"&gt;Page Name&lt;/span&gt; - The name of the page that will be created.&lt;br /&gt;5) &lt;span style="font-weight:bold;"&gt;SQL&lt;/span&gt; - The SQL that will be used to generate an interactive report region within the page. This defaults to the SQL used to build the original grid of data, but can be changed.&lt;br /&gt;&lt;br /&gt;Upon clicking 'Apply' SQL Developer will create the application and show a dialog with some basic creation information such as application name and ID. This creates a 1 page application in the workspace defined, containing an interactive report region with a source of the SQL specified in the dialog. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0W0wsNIv6jU/SUJUtk_0F1I/AAAAAAAAAHU/LK0ovZz7tWg/s1600-h/12-12-2008+11-42-48.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 244px; height: 400px;" src="http://3.bp.blogspot.com/_0W0wsNIv6jU/SUJUtk_0F1I/AAAAAAAAAHU/LK0ovZz7tWg/s400/12-12-2008+11-42-48.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5278874855233820498" /&gt;&lt;/a&gt;&lt;br /&gt;A few more points to note about this application:&lt;br /&gt;- The application's authentication scheme defaults to 'Database Account Credentials' meaning that you'll need to authenticate into the application using valid database account username and password. This can obviously be changed to something else if required.&lt;br /&gt;- The application will be created in an application group called 'Published from SQL Developer'.&lt;br /&gt;- The interactive report region only displays the first ten columns of the report by default, but again this can easily be changed via the interactive reports menu bar 'Actions' green cog drop down, then select 'Select Columns'.&lt;br /&gt;&lt;br /&gt;Here is an example of the application that is generated. I selected to publish data that showed access attempts to my workspace (selecting from the APEX metadata view apex_workspace_access_log). I then used interactive report features to refine my data to show all the failed login attempts for applications within a workspace, grouped by application:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0W0wsNIv6jU/SUJXt31X-9I/AAAAAAAAAH0/9m10BCRlEzw/s1600-h/12-12-2008+12-22-55.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 302px;" src="http://3.bp.blogspot.com/_0W0wsNIv6jU/SUJXt31X-9I/AAAAAAAAAH0/9m10BCRlEzw/s400/12-12-2008+12-22-55.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5278878158825192402" /&gt;&lt;/a&gt;&lt;br /&gt;Have fun publishing to APEX!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-3202771008489202685?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/3202771008489202685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=3202771008489202685' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3202771008489202685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3202771008489202685'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2008/12/publish-to-apex-from-sql-developer-153.html' title='&apos;Publish to APEX&apos; from SQL Developer 1.5.3'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_0W0wsNIv6jU/SUJSQP0cEQI/AAAAAAAAAHM/xwCmDs0SU8I/s72-c/12-12-2008+11-39-59.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-7108738298338167300</id><published>2008-08-29T08:21:00.008+01:00</published><updated>2008-08-29T09:13:11.496+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Out Now!! Application Express 3.1.2</title><content type='html'>APEX 3.1.2 is now available for download and fixes the following &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/html/3.1.2_patchnote.html#CHDCBDAF"&gt;bugs&lt;/a&gt;. You can get hold of it by either:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Downloading the full version from &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/download.html"&gt;OTN&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download the patchset 7313609 from &lt;a target="_blank" href="https://metalink.oracle.com/metalink/plsql/f?p=130:5:0::::P_SOURCE,P_SRCHTXT:8,7313609"&gt;METALINK&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;If your unsure about which download you need, please read Joel's &lt;a target="_blank" href="http://joelkallman.blogspot.com/2008/08/applicaiton-express-312-released.html"&gt; blog&lt;/a&gt;. As Joel says, if your upgrading from any APEX version pre-3.1, then you'll need to use the full &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/download.html"&gt;OTN&lt;/a&gt; release (which includes the version that comes pre-installed with &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/oracle11g/index.html"&gt;11gR1&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;For details on future plans, please take a look at our &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/apex_sod.html"&gt;Statement of Direction&lt;/a&gt;, which was updated just under 3 weeks ago with details of the 'Forms Converter' of APEX 3.2 and 'Websheets', 'Updateable Interactive Reports', 'Extensible Item Framework' and much more of APEX 4.0.&lt;br /&gt;&lt;br /&gt;Happy patching!&lt;br /&gt;Anthony.&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/9029980291688587752-7108738298338167300?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/7108738298338167300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=7108738298338167300' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/7108738298338167300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/7108738298338167300'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2008/08/out-now-application-express-312.html' title='Out Now!! Application Express 3.1.2'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-3995355541615762578</id><published>2008-08-07T15:58:00.006+01:00</published><updated>2008-08-07T16:39:18.085+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>APEX with eBusiness Suite survey reminder</title><content type='html'>Readers of the APEX blogosphere will already know, we are currently conducting a survey in an attempt to better understand how people are using Application Express with Oracle eBusiness Suite / Oracle Applications. For example, have you implemented a killer reporting module with our &lt;a target="_new" href="http://www.oracle.com/technology/products/database/application_express/html/irrs.html"&gt;'Interactive Reports'&lt;/a&gt; to empower your users to get better information from their eBusiness Suite application data? Have you had other integration successes?&lt;br /&gt;&lt;br /&gt;If so, this is just a quick reminder to anyone who hasn't yet completed &lt;a target="_new" href="http://dpeake.blogspot.com/2008/07/do-you-use-application-express-with.html"&gt;David Peake's&lt;/a&gt; single page &lt;a target="_new" href="http://apex.oracle.com/pls/otn/f?p=54654:1:0"&gt;survey&lt;/a&gt;, please if you can take a moment to fill this in and tell us your thoughts, we would much appreciate it. Information provided is completely confidential, unless you state otherwise.&lt;br /&gt;&lt;br /&gt;Thank you!&lt;br /&gt;Anthony&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-3995355541615762578?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/3995355541615762578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=3995355541615762578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3995355541615762578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3995355541615762578'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2008/08/apex-with-ebusiness-suite-survey.html' title='APEX with eBusiness Suite survey reminder'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-2228812481517027742</id><published>2008-07-16T12:26:00.032+01:00</published><updated>2010-07-30T10:51:53.541+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interactive Reports'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Dynamic Date Filtering in Interactive Reports</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Update&lt;/span&gt;: Please note, in Application Express 4.0, it is now possible to define a 'Row Filter', where you can reference SYSDATE directly from the filter. For further information, please see the 'Adding a Row Filter' section of the &lt;a target="_blank" href="http://download.oracle.com/docs/cd/E17556_01/doc/user.40/e15517/app_comp.htm#BABHCDBJ"&gt;user guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Introduction...&lt;/span&gt;&lt;br /&gt;Whilst the filtering part of &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/html/irrs.html"&gt;interactive reports&lt;/a&gt; currently supports a fair number of options, there &lt;span style="font-weight:bold;"&gt;isn't&lt;/span&gt; currently the facility to specify a dynamic date filter using SYSDATE. A common use case for this would be a dashboard report where you want to display all the overdue items in a dataset. In the interactive report filter definition, it would look something like this...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0W0wsNIv6jU/SH4sH0CUI4I/AAAAAAAAAE0/XNb9gYRMI8M/s1600-h/filter_not_allowed.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0W0wsNIv6jU/SH4sH0CUI4I/AAAAAAAAAE0/XNb9gYRMI8M/s400/filter_not_allowed.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5223661130535412610" /&gt;&lt;/a&gt;&lt;br /&gt;But unfortunately, we do not currently support the use of SYSDATE in the Expression field. So what can you do? I will discuss 3 possible workarounds for achieving this. &lt;br /&gt;&lt;br /&gt;Note: Method 1 does not require any changes from a developer perspective, methods 2 and 3 require some developer work.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;How...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Method 1&lt;/span&gt;&lt;br /&gt;Use the 'Is in the last' operator, and then specify some arbitrarily large amount (100 years).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_0W0wsNIv6jU/SH3f_hIErSI/AAAAAAAAADc/2QC1k-l12Gs/s1600-h/is_in_the_last.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0W0wsNIv6jU/SH3f_hIErSI/AAAAAAAAADc/2QC1k-l12Gs/s400/is_in_the_last.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5223577425136626978" /&gt;&lt;/a&gt;&lt;br /&gt;This could then be saved by the user as a 'Named Report' for future use. Although this is the quickest and easiest method, it isn't very intuitive for the user to come up with and also it's not 100% water tight to use this filter, as it might be possible that a date is entered outside of the arbitrary range specified.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Method 2&lt;/span&gt;&lt;br /&gt;It's possible to specify filters on interactive reports via the URL. This uses the 'IR%' prefix in the 'Item Names' argument in the URL syntax, as detailed in the &lt;a target="_blank" href="http://download.oracle.com/docs/cd/E10513_01/doc/appdev.310/e10499/bldapp.htm#BABDHIDJ"&gt;documentation&lt;/a&gt;. This method involves dynamically provisioning a link to the interactive report page and could be implemented by creating a SQL report to look like a menu, like this:&lt;br /&gt;&lt;br /&gt;1) Add a region of type 'SQL Report' and for the 'Region Source', specify:&lt;pre&gt;select sysdate from dual&lt;/pre&gt;2) Ensure the following is set during the wizard creation:&lt;pre&gt;- Report Template: template: [theme number].Borderless&lt;/pre&gt;3) Go the 'Report Attributes' page and specify the following:&lt;pre&gt;- Pagination Scheme: No pagination.&lt;br /&gt;- Untick the 'Show' checkbox for the SYSDATE column.&lt;br /&gt;- Click 'None' for 'Headings Type'.&lt;/pre&gt;3) Add a column link to the report by going the 'Report Attributes' page and clicking the 'Add Column Link' link from the 'Tasks' menu on the right. For this column link, specify the following values:&lt;pre&gt;- Link Text: 'Overdue Reviews'&lt;br /&gt;- Page: 2&lt;br /&gt;- Clear Cache: '2,CIR'&lt;br /&gt;- Item 1 Name: IRLT_REVIEW_DATE&lt;br /&gt;- Item 1 Value: #SYSDATE#&lt;/pre&gt;Note: My interactive report is on page 2 of my application, but change all occurences of 2 to to whatever your page is.&lt;br /&gt;&lt;br /&gt;This generates a link like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0W0wsNIv6jU/SH30P0flDrI/AAAAAAAAAEc/EKZgNxiC3DI/s1600-h/dynamic_url.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0W0wsNIv6jU/SH30P0flDrI/AAAAAAAAAEc/EKZgNxiC3DI/s400/dynamic_url.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5223599695445954226" /&gt;&lt;/a&gt;&lt;br /&gt;Of particular interest here are...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Clear Cache = '2,CIR'&lt;br /&gt;This clears the cache for page 2, and also uses the new 'CIR' parameter, which clears all settings that could already have been applied to the interactive report (including any default report settings).&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Item Names = 'IRLT_REVIEW_DATE'&lt;br /&gt;This can be broken down as follows:&lt;br /&gt;  &lt;ul&gt;&lt;li&gt;'IR': This is used to set interactive report filters dynamically over the URL.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;'LT': The characters directly after the 'IR' prefix are equivalent to the 'Operator' value in the interactive report 'Filter' dialog, so in this case 'LT' specifies a 'Less than' operator. Note: You could also use 'LTE' which would specify a 'Less than or equal to' operator. See &lt;a target="_blank" href="http://download.oracle.com/docs/cd/E10513_01/doc/appdev.310/e10499/bldapp.htm#BABDHIDJ"&gt;here&lt;/a&gt; for more options.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;'REVIEW_DATE': Then after the underscore, this is the column name on which to apply the filter, equivalent to the 'Column' value in the interactive report 'Filter' dialog. In this case we are filtering on the 'REVIEW_DATE' column.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_0W0wsNIv6jU/SH3y2mYMd_I/AAAAAAAAAEM/BfkgOuZAzIM/s1600-h/irr_dynamic_via_url.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0W0wsNIv6jU/SH3y2mYMd_I/AAAAAAAAAEM/BfkgOuZAzIM/s400/irr_dynamic_via_url.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5223598162648528882" /&gt;&lt;/a&gt;&lt;br /&gt;This method works well, but does require some sort of separate menu or link to go to the interactive report, which steps out of the normal use-case for interactive reports.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Method 3&lt;/span&gt;&lt;br /&gt;The final method requires the developer to code a derived column to calculate if the record is overdue in the report SQL. A snippet something like:&lt;br /&gt;&lt;pre&gt;(case &lt;br /&gt;   when review_date &lt; sysdate then 'Yes' &lt;br /&gt; else &lt;br /&gt;   'No' &lt;br /&gt; end) review_overdue&lt;/pre&gt;Once this has been done by the developer, the user could then choose to apply a filter on this column as shown in the screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0W0wsNIv6jU/SH4esFWXqQI/AAAAAAAAAEs/Z3YcAXK0scA/s1600-h/derived_filter.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0W0wsNIv6jU/SH4esFWXqQI/AAAAAAAAAEs/Z3YcAXK0scA/s400/derived_filter.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5223646360495433986" /&gt;&lt;/a&gt;&lt;br /&gt;This could then be saved by the user as a 'Named Report' for future use.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note: With methods 1 and 3, the developer could also default these reports for users, saving the report as 'Default Report Settings' in the 'Save Report' dialog. This means that when any user logs into and sees this report, they will default to these filters. One consideration here though, when the developer saves the 'Default Report Settings', you cannot specify a 'Name' for the report, so the user would see the filter as it is coded without a named tab.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Conclusion...&lt;/span&gt;&lt;br /&gt;So method 3 would be my preferred choice, because it works and I believe provides the most user friendly solution for the users whilst keeping within the standard use-case for interactive reports. One consideration of this approach though would be that no index would be used on that column (see comments).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A couple of questions for the community...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Would you find it useful to be able to filter by SYSDATE?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Would you find it useful to be able to filter not just by a value, but by another column value?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;What else would you like to see incorporated into Interactive Reports to make them even better?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Further Reading...&lt;/span&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/html/irrs.html"&gt;General overview and information on interactive reports&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.oracle.com/technology/obe/apex/apex31nf/apex31advirr.htm"&gt;Marcie Young's Advanced Interactive Report Tutorial&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://download.oracle.com/docs/cd/E10513_01/doc/appdev.310/e10499/bldapp.htm#BABDHIDJ"&gt;APEX documentation page on dynamic interactive report filtering via the URL&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://dpeake.blogspot.com/2008/03/advanced-interactive-reports.html"&gt;David Peake's (APEX PM) blog post on 'Advanced Interactive Reports&lt;/a&gt;&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/9029980291688587752-2228812481517027742?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/2228812481517027742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=2228812481517027742' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2228812481517027742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2228812481517027742'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2008/07/dynamic-date-filtering-in-interactive.html' title='Dynamic Date Filtering in Interactive Reports'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_0W0wsNIv6jU/SH4sH0CUI4I/AAAAAAAAAE0/XNb9gYRMI8M/s72-c/filter_not_allowed.gif' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-8522536244914511556</id><published>2008-07-10T13:59:00.003+01:00</published><updated>2008-07-10T14:06:45.936+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>New job...</title><content type='html'>Just a quick note to say I've recently made a commitment to Application Express and joined the APEX development team here at Oracle. I am very excited to work for a cracking team on a great product and look forward to blogging much more about it in the future.&lt;br /&gt;&lt;br /&gt;Anthony.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-8522536244914511556?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/8522536244914511556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=8522536244914511556' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/8522536244914511556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/8522536244914511556'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2008/07/new-job.html' title='New job...'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-2806816298218580890</id><published>2008-02-10T19:06:00.002Z</published><updated>2008-02-27T17:40:29.501Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Dynamic Quick Picks - APEX style!</title><content type='html'>&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Update...&lt;/span&gt;&lt;br /&gt;Following a &lt;a target="_blank" href="http://forums.oracle.com/forums/thread.jspa?messageID=2347721"&gt;discussion&lt;/a&gt; on the APEX forum regarding this post, I have improved the QUICK_PICK procedure so that it can handle a query containing bind variables. This is making use of the in-built function WWV_FLOW_UTILITIES.GET_BINDS(), with a technique proposed in the forums &lt;a target="_blank" href="http://forums.oracle.com/forums/thread.jspa?messageID=1726269&amp;#1726269"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Introduction...&lt;/span&gt;&lt;br /&gt;Have you ever admired the quick pick links that appear on some of the APEX pages under select lists. For example editing the 'Display As' property of a page item you can quick pick common display types, as shown here:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0W0wsNIv6jU/R69NPjwhY5I/AAAAAAAAACs/l1Df07yoqFE/s1600-h/apex_quick_pick.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0W0wsNIv6jU/R69NPjwhY5I/AAAAAAAAACs/l1Df07yoqFE/s400/apex_quick_pick.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5165432227309380498" /&gt;&lt;/a&gt;&lt;br /&gt;So, I wanted to implement this same feature in my own applications, only dynamically generating the quick pick options based on data. For example, in the standard EMP table there is a column called Job. I wanted to display 2 quick picks for this field, based on the top 2 occurences of values for jobs in the EMP table.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;How...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 1)&lt;/span&gt; Firstly we need a generic database function to handle rendering the links. Here is the code:&lt;br /&gt;&lt;pre&gt;create or replace&lt;br /&gt;PROCEDURE QUICK_PICK&lt;br /&gt;( p_query VARCHAR2&lt;br /&gt;, p_item VARCHAR2) AS&lt;br /&gt;  TYPE cur_type IS REF CURSOR;&lt;br /&gt;  cur cur_type;&lt;br /&gt;  v_display VARCHAR2(4000);&lt;br /&gt;  v_return VARCHAR2(4000);&lt;br /&gt;  l_names DBMS_SQL.VARCHAR2_TABLE; &lt;br /&gt;  l_query VARCHAR2(1000);&lt;br /&gt;BEGIN&lt;br /&gt;  l_query := p_query;&lt;br /&gt;  --get any binds and replace with the value from session&lt;br /&gt;  l_names := WWV_FLOW_UTILITIES.GET_BINDS(l_query);&lt;br /&gt;  FOR i IN 1..l_names.COUNT LOOP&lt;br /&gt;  l_query := REPLACE( LOWER(l_query),&lt;br /&gt;                      LOWER(l_names(i)),&lt;br /&gt;                      '(select v('''|| &lt;br /&gt;                        LOWER( LTRIM(l_names(i), ':')) ||&lt;br /&gt;                        ''') from dual)');&lt;br /&gt;  END LOOP;&lt;br /&gt;  HTP.P('&amp;lt;div&amp;gt;');&lt;br /&gt;  OPEN cur FOR l_query;&lt;br /&gt;  LOOP&lt;br /&gt;    FETCH cur INTO v_display, v_return;&lt;br /&gt;    EXIT WHEN cur%NOTFOUND;&lt;br /&gt;    HTP.ANCHOR('javascript:setValue(''' || &lt;br /&gt;                p_item || ''',''' || &lt;br /&gt;                v_return || ''');',&lt;br /&gt;    '[' || v_display || ']',&lt;br /&gt;    null,&lt;br /&gt;    'class=''itemlink''');&lt;br /&gt;  END LOOP;&lt;br /&gt;  CLOSE cur;&lt;br /&gt;  HTP.P('&amp;lt;/div&amp;gt;');&lt;br /&gt;  HTP.P('&amp;lt;br/&amp;gt;');&lt;br /&gt;END QUICK_PICK;&lt;br /&gt;&lt;/pre&gt;So this procedure takes a SQL query (p_query) and a page item ID (p_item) as parameters. The results from the query specified in p_query will be used as the display and setting values of each quick pick link, so the query must contain two columns in the select statement (the first selected column should be the display value to be used and the second the return value, see query below for an example). The item name specified in p_item will be the item that the quick pick link will set.&lt;br /&gt;&lt;br /&gt;This procedure just opens a dynamic cursor based on the query specified in the p_query parameter. Then calls the &lt;a target="_blank" href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/w_htp.htm#BABCGEIF"&gt;HTP.ANCHOR&lt;/a&gt; function to generate the anchor HTML tag. The procedure also pads the lot in a div tag and adds a line break at the end for presentation (you may want to change this if you have another page item on the same line as the select list being set). The following is an example of the HTML generated by this procedure:&lt;br /&gt;&lt;pre&gt;&amp;lt;div&amp;gt;&lt;br /&gt;  &amp;lt;a class="itemLink"&lt;br /&gt;     href="javascript:setValue('P2_JOB','SALESMAN');"&amp;gt;&lt;br /&gt;        [SALESMAN]&lt;br /&gt;  &amp;lt;/a&amp;gt;&lt;br /&gt;  &amp;lt;a class="itemLink" &lt;br /&gt;     href="javascript:setValue('P2_JOB','CLERK');"&amp;gt;&lt;br /&gt;        [CLERK]&lt;br /&gt;  &amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 2)&lt;/span&gt; Secondly, we need to call this function in APEX. You can do this by adding a page item with the following settings:&lt;br /&gt;Name &gt; Name: [whatever you want, P1_QUICK_PICK_JOB would be fine for this]&lt;br /&gt;Name &gt; Display As: Display As Text (based on PL/SQL, does not save state)&lt;br /&gt;(Note: This display type is not available when creating a page item, so it must be set after creation.)&lt;br /&gt;Displayed &gt; Sequence: [just after the select list item you wish the quick pick link to set]&lt;br /&gt;Label &gt; Label: [blank]&lt;br /&gt;Label &gt; Template: No Label&lt;br /&gt;Source &gt; Source Type: PL/SQL Anonymous Block&lt;br /&gt;&lt;pre&gt;BEGIN&lt;br /&gt;  QUICK_PICK('SELECT  summed_rows.job display&lt;br /&gt;              ,       summed_rows.job return&lt;br /&gt;                      FROM  (SELECT    job,&lt;br /&gt;                                       SUM(1) qty&lt;br /&gt;                             FROM      emp&lt;br /&gt;                             WHERE     job IS NOT NULL&lt;br /&gt;                             GROUP BY  job&lt;br /&gt;                             ORDER BY  SUM(1) DESC&lt;br /&gt;                             ) summed_rows&lt;br /&gt;                      WHERE  ROWNUM    &lt;= 2'&lt;br /&gt;                    , 'P2_JOB');&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;This example uses a query that selects the top 2 occurences of job values in the emp table. The second parameter indicates that the page item 'P2_JOB' will be set by the quick pick link.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 3)&lt;/span&gt; So finally, there is one more thing to do, create the css used by the link. I have copied the inbuilt class used by APEX to render these links and re-specified it in its own 'custom.css' file. You can do this by creating a file with the following contents:&lt;br /&gt;&lt;pre&gt;a.itemLink:link {&lt;br /&gt;color:#811919;&lt;br /&gt;font-size:11px;&lt;br /&gt;margin:0pt 5px 5px 0pt;&lt;br /&gt;text-decoration:none;&lt;br /&gt;white-space:nowrap;&lt;br /&gt;}&lt;/pre&gt;Then save this as 'custom.css' and upload it to APEX via 'Shared Components &gt; Cascading Style Sheets'. Finally to make it available to the application, we need to reference this in the page template, so add the following line to the 'Definition &gt; Header' code, after the default theme css declaration:&lt;br /&gt;&lt;pre&gt;&amp;lt;link rel="stylesheet" href="#WORKSPACE_IMAGES#custom.css" &lt;br /&gt;      type="text/css" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The results can be seen here:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0W0wsNIv6jU/R69NeTwhY6I/AAAAAAAAAC0/Y49ayBxnpcI/s1600-h/custom_quick_pick.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0W0wsNIv6jU/R69NeTwhY6I/AAAAAAAAAC0/Y49ayBxnpcI/s400/custom_quick_pick.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5165432480712450978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Conclusion...&lt;/span&gt;&lt;br /&gt;So that's it. Then in order to add more quick pick links to other select items, just create other page items referencing the QUICK_PICK database procedure as detailed in step 2.&lt;br /&gt;&lt;br /&gt;Limitation: Currently the css doesn't work in IE, only Firefox, so the links just display as normal text. When I find out why and will post an update.&lt;br /&gt;&lt;br /&gt;Hope it helps,&lt;br /&gt;Anthony&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/9029980291688587752-2806816298218580890?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/2806816298218580890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=2806816298218580890' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2806816298218580890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2806816298218580890'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2008/02/dynamic-quick-picks-apex-style.html' title='Dynamic Quick Picks - APEX style!'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_0W0wsNIv6jU/R69NPjwhY5I/AAAAAAAAACs/l1Df07yoqFE/s72-c/apex_quick_pick.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-1651489977875756087</id><published>2008-01-27T18:22:00.001Z</published><updated>2008-05-05T20:24:34.553+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='UKOUG 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>UKOUG - My presentation slides are now available...</title><content type='html'>Just a quick post to mention my slides from my UKOUG presentation, 'Building The Rich User Interface with Oracle Application Express and Ajax' are now available to &lt;a href="http://www.ukoug.org/other/?t=de_com_ar"&gt;download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sorry about the delay for anyone who wanted to take a look at this sooner, I wanted to tidy up some of the code before making it available and have only just had a chance to look at it.&lt;br /&gt;&lt;br /&gt;If you are interested in catching this again, I will be doing a very similar presentation at the &lt;a target="_blank" href="http://www.ukoug.org/calendar/show_event.jsp?id=3350"&gt;UKOUG Combined SIG Day&lt;/a&gt; at Baylis House in Slough on 27th February.&lt;br /&gt;&lt;br /&gt;So come along and say hi!&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/9029980291688587752-1651489977875756087?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/1651489977875756087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=1651489977875756087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1651489977875756087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1651489977875756087'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2008/01/ukoug-my-presentation-slides-are-now.html' title='UKOUG - My presentation slides are now available...'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-9076228025080915479</id><published>2007-12-10T17:02:00.001Z</published><updated>2007-12-10T20:54:21.532Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='UKOUG 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>UKOUG - Day 3</title><content type='html'>So with my presentation firmly behind me, and after having the best night's sleep in weeks, I headed into day 3 looking forward to catching John Scott talk about &lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=shwprs&amp;prs_prsid=1462&amp;day_dayid=11"&gt;'Debugging APEX Applications'&lt;/a&gt;, Dimitri Gielis present &lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=shwprs&amp;prs_prsid=1395&amp;day_dayid=11"&gt;'Integration of BI (XML) Publisher and APEX (Oracle Application Express)'&lt;/a&gt; and also sit on the panel for my first APEX roundtable discussion group. &lt;br /&gt;&lt;br /&gt;John's presetation was very good, he presented well and showed numerous techniques for debugging your APEX applications. Specifically of interest was the use of the &lt;a target="_blank" href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_appinf.htm"&gt;DBMS_APPLICATION_INFO&lt;/a&gt; package which can be used to monitor progress of long running queries / reports and display this progress information back to the user. He also mentioned that as an APEX developer he believes that you have the responsibility to have a good understanding of the database, so as to be able to benefit from the features and build better applications, a point which I totally agree with. If you ever get a chance to watch John present, then do it as I'm positive there will be something in there that you can benefit from. Nice job John!&lt;br /&gt;&lt;br /&gt;So then it was time to get ready for the APEX roundtable. I was pretty nervous and left John's presentation quarter of an hour before the end so as to go up to the room and get myself ready. The session was chaired by Jeremy Duggan (Chair of the Modelling, Analysis and Design SIG), and I was on the panel with &lt;a target="_blank" href="http://dgielis.blogspot.com/"&gt;Dimitri Gielis&lt;/a&gt;, &lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=shwprs&amp;prs_prsid=1583&amp;day_dayid=12"&gt;Peter Lorenzen&lt;/a&gt; and unofficially, but answering a lot of the questions &lt;a target="_blank" href="http://jes.blogs.shellprompt.net/"&gt;John Scott&lt;/a&gt;. Around 20 people turned up, which was reasonable considering it was lunch time! Some of the topics that came up were:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;APEX / Forms / ADF&lt;/li&gt;Choosing the right tool for the right project. This is a massive topic with lots of arguments for and against. For a good overview  of the main factors, take a look at Duncan Mills' article, &lt;a target="_blank" href="http://www.oracle.com/technology/products/forms/pdf/apex_forms_jdev.pdf"&gt;'The Right Tool For the Right Job'&lt;/a&gt;. Also, if you are in the Netherlands, Dimitri will be &lt;a target="_blank" href="http://dgielis.blogspot.com/2007/11/apex-or-adf.html"&gt;discussing&lt;/a&gt; this with Lucas Jellema on Monday 17th December.&lt;br /&gt;&lt;li&gt;Validations&lt;/li&gt;Specifically around the current issues with validating tabular form data. Dimitri mentioned Patrick Wolf's &lt;a target="_blank" href="http://apexlib.sourceforge.net/"&gt;ApexLib&lt;/a&gt; framework which greatly improves tabular form handling, including out-of-the-box client and server validations for mandatory, date and numeric fields. Alternatively, if you don't want to or cannot use Patrick's framework, you can code your validations referencing the global fxx arrays as mentioned in this rather old, but still useful &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/howtos/tabular_form.html"&gt;article&lt;/a&gt;. Finally, the &lt;a target="_blank" href="http://www.oracle.com/technology/products/database/application_express/apex_sod.html"&gt;Statement of Direction&lt;/a&gt; implies that version 4.0 will give us, 'Improved tabular forms, including support for validations...', so looking forward to that.&lt;br /&gt;&lt;li&gt;URL Tampering&lt;/li&gt;And how this can be combated using the APEX built-in 'Session State Protection', see Dimitri's &lt;a target="_blank" href="http://dgielis.blogspot.com/2007/03/session-state-protection-and-url.html"&gt;article&lt;/a&gt; or the official &lt;a target="_blank" href="http://download.oracle.com/docs/cd/B32472_01/doc/appdev.300/b32471/sec.htm#CDDGIGJH"&gt;documentation&lt;/a&gt;.&lt;br /&gt;&lt;li&gt;Page Comments&lt;/li&gt;Specifically, can these be mandated if this is a development standard? No, not currently but as John suggested this could be easily monitored through the APEX views. The issue also came up that the comments are right down the bottom of the page, which can lead to oversight. This question came up in the forums a couple of weeks ago and Patrick Wolf added a feature to the &lt;a target="_blank" href="http://inside-apex.blogspot.com/2007/11/oracle-apex-builder-plugin-v18-release.html"&gt;APEX Builder Plugin&lt;/a&gt; which addresses this issue by highlighting the 'Comments' link in yellow if there is a comment. Thank you Patrick!&lt;br /&gt;&lt;li&gt;Source Control&lt;/li&gt;This keeps on cropping up at the moment. Basically if you are using a source control system such as CVS or SubVersion, what is the best strategy for managing the APEX application files? This can either be done at page level or application level and can be automated through use of the supplied command line tools 'ApexExport' and 'ApexExportSplitter'. APEX development team, how do you manage this?&lt;br /&gt;&lt;li&gt;JavaScript&lt;/li&gt;A few JavaScript related questions came up. There are lots of libraries available in the APEX release that you can make use as a developer, the functions are &lt;a target="_blank" href="http://apex.oracle.com/pls/otn/f?p=38704:1"&gt;unofficially documented&lt;/a&gt; by &lt;a target="_blank" href="http://carlback.blogspot.com/"&gt;Carl Backstrom&lt;/a&gt; and according to the statement of direction will be officially documented and supported from 3.1, which is good news. Also what happens if a user has JavaScript turned off? Well, APEX can be used to build applications that meet accessibility requirements, but it requires some workarounds. See Sergio's article &lt;a target="_blank" href="http://www.orablogs.com/sergio/archives/001679.html"&gt;Application Express and Accessibility&lt;/a&gt; if you are interested in the steps involved. Peter also added that all client-side validations should be backup up with server-side / APEX validations as best practice.&lt;br /&gt;&lt;li&gt;Team Development&lt;/li&gt;What is best practice for working on large projects with many developers? We mentioned an excellent article written by Ben Wootton, entitled, &lt;a target="_blank" href="http://www.oracle.com/technology/pub/articles/wootton-apex-bps.html"&gt;'Best Practices for Oracle Application Express Collaborative Development'&lt;/a&gt; as an excellent reference point. This details use of page locks, page groups, use of Application Reports for monitoring, commenting changes, use of PL/SQL functions / procedures rather than embedding logic in page processes and lots more.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0W0wsNIv6jU/R116G4o-0CI/AAAAAAAAACc/I5DAlakE5J4/s1600-h/DSC00261.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0W0wsNIv6jU/R116G4o-0CI/AAAAAAAAACc/I5DAlakE5J4/s400/DSC00261.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5142400608229052450" /&gt;&lt;/a&gt;Dimitri and John after the session.&lt;br /&gt;&lt;br /&gt;So that was about it, a very interesting and interactive discussion with loads of input from all the panel and much of the group, Jeremy doing a good job of keeping it all together. And it was great to meet Dimitri and Peter for the first time and catch up with John having met him on day 2. &lt;br /&gt;&lt;br /&gt;Unfortunately I had to head back to Reading earlier than expected in the afternoon, so was unable to catch Dimitri's presentation. A very enjoyable day none the less and looking forward to next time!&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/9029980291688587752-9076228025080915479?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/9076228025080915479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=9076228025080915479' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/9076228025080915479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/9076228025080915479'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/12/ukoug-day-3.html' title='UKOUG - Day 3'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_0W0wsNIv6jU/R116G4o-0CI/AAAAAAAAACc/I5DAlakE5J4/s72-c/DSC00261.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-4713112911557744394</id><published>2007-12-10T11:34:00.000Z</published><updated>2007-12-10T20:56:50.861Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='UKOUG 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>UKOUG - Day 2</title><content type='html'>It had finally arrived, Tuesday 4th December. A day that had been engrained on my brain ever since receiving 'UKOUG 2007 - Speaker Confirmation' in my Inbox back in July. The day of my first big presentation, &lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=shwprs&amp;prs_prsid=1774&amp;day_dayid=10"&gt;'Building The Rich User Interface with Oracle Application Express and Ajax'&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;So very nervous I headed down to Birmingham from Reading and arrived at the ICC at around 9.30am. I was speaking at 11.15 so gave myself a bit of time to register and go over the slides one last time. A worthwhile activity as I was soon to realise on discovering 3 of my slides were missing which I must have deleted the previous night. Thank goodness for backups!! &lt;br /&gt;&lt;br /&gt;I headed up to Hall 8b, the venue for my presentation. It was a good size, around 170 capacity but didn't seem to big so I was ok with that. There was no session in there before me so had plenty of time to get setup and settled, or so I thought. The technician arrived soon after me and asked if I was going to be using the supplied laptop or my own, I said my own and he worringly replied, 'You are the first person who's wanted to use their own'. I replied 'Is that a problem?', and he assured it wasn't but there would just be a bit of setup to get it working. &lt;br /&gt;&lt;br /&gt;Time went by, people started arriving and my opening slide was still no where to be seen on the big wall behind me. The room of around 50 people was filled with silence, Harrison my session chair did a good job of trying to break it with a quick poll of how many people had used APEX before, which was most (but not all) of the room. I then ran through my agenda which seemed like it took about 5 minutes but probably only lasted about 30 seconds. Anyway, with numerous trips back and forth to the control room by the technician, my opening slide finally appeared on the big wall, a sigh of relief from me and after all the waiting and anticipation, I could talk.&lt;br /&gt;&lt;br /&gt;It went ok. I know there are a few things I could have explained better and in more detail. I had always been worried about the amount of technical information I was trying to get across in 1 hour (although originally I was worried I wouldn't be able to fill it!) and in hindsight, I think I should have gone for longer. &lt;br /&gt;&lt;br /&gt;So having finished talking in about the right time, there were a few questions and the job was done. &lt;a target="_blank" href="http://jes.blogs.shellprompt.net/"&gt;John Scott&lt;/a&gt; came up to me afterwards and introduced himself. It was great to finally meet him having only known of him before. He said my presentation was really good, which means a lot coming from someone like John and also suggested that I should have a longer time slot to get through everything, I definitely agree.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0W0wsNIv6jU/R10luoo-0BI/AAAAAAAAACU/8F1IYhzvxSA/s1600-h/DSC00260.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0W0wsNIv6jU/R10luoo-0BI/AAAAAAAAACU/8F1IYhzvxSA/s400/DSC00260.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5142307832640491538" /&gt;&lt;/a&gt;Me, full of relief!&lt;br /&gt;&lt;br /&gt;For anyone who is interested in getting the slides I have currently taken them offline just because I wanted to change a few small things. Once these changes are made I will post a link on my blog. I am also trying to get a demo up and running which will have all the code available to download. Watch this space! &lt;br /&gt;&lt;br /&gt;Having done my presentation, and with the weight of an elephant lifted from my shoulders I was then free to enjoy some of the conference. &lt;br /&gt;&lt;br /&gt;Really enjoyed Zory Zeharieva of CERN present, &lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=shwprs&amp;prs_prsid=1541&amp;day_dayid=10"&gt;'A Real-Life Experience of Rapidly Building Web-Interfaces with Oracle Application Express at CERN'&lt;/a&gt;. She presented well and covered some best practices for building scalable applications which was very interesting and also expressed some concerns around the way APEX application files are managed within versioning systems, a common concern which came up in a few places over the conference. &lt;br /&gt;&lt;br /&gt;Also then dropped in on Oracle's Barry McGillin talking about, &lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=shwprs&amp;prs_prsid=1577&amp;day_dayid=10"&gt;'Consolidate Your Microsoft Access Applications to Oracle Application Express'&lt;/a&gt;. Barry is a great speaker, informative and easy to listen to (even at the end of a very long day!). He showed how to migrate an Access database with data into an Oracle database and then use the APEX 3.0 feature 'Application Migration Workshop' to build your APEX application. Well worth a look for anyone planning on doing this kind of thing.&lt;br /&gt;&lt;br /&gt;So the day of presentations was over, and it was up to the free bar to relax and catch up with some people. Had a very pleasant drink with some colleagues and headed back to the hotel for a good night's sleep.&lt;br /&gt;&lt;br /&gt;UKOUG day 2 done and dusted. The months of worry and preparation were worth it and my life can now resume normality. Presenting is, although nerve-wrenching and time-consuming, a very rewarding experience and I would recommend it to anyone.&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/9029980291688587752-4713112911557744394?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/4713112911557744394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=4713112911557744394' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/4713112911557744394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/4713112911557744394'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/12/ukoug-day-2.html' title='UKOUG - Day 2'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_0W0wsNIv6jU/R10luoo-0BI/AAAAAAAAACU/8F1IYhzvxSA/s72-c/DSC00260.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-3434056492703660658</id><published>2007-12-02T10:31:00.001Z</published><updated>2008-08-20T09:31:36.865+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Problem with 'Not Null' validations</title><content type='html'>&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Introduction...&lt;/span&gt;&lt;br /&gt;A &lt;a target="_blank" href="http://forums.oracle.com/forums/thread.jspa?threadID=590799"&gt;question&lt;/a&gt; popped up on the forum this week about the ability to bypass not null validations. The problem is if you define a 'Not null' validation on a page item, the user can enter a blank space and the validation will allow it. But there is a simple workaround and it requires no changes to any of your existing validations.&lt;br /&gt;&lt;br /&gt;Note this will only work in APEX version 3.0 or higher. If you are looking to implement this on 2.2 or 2.2.1, then please refer to the link above to the forum post where this was discussed, where I posted a solution for 2.2 (the views were changed slightly). Unfortunately, pre 2.2 this method is not possible, as I'm referencing the APEX dictionary views that were introduced in 2.2.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;How...&lt;/span&gt;&lt;br /&gt;To get around this you can use an APEX application process to trim all the items for the current page that have associated not null validations. Create the following application process:&lt;br /&gt;&lt;br /&gt;Sequence:      1&lt;br /&gt;Process Point: On Submit: After Page Submission - Before Computations and Validations&lt;br /&gt;Name:          TRIM_NOT_NULL_ITEMS&lt;br /&gt;Type:          PL/SQL Anonymous Block&lt;br /&gt;&lt;br /&gt;Process Text:&lt;br /&gt;&lt;pre&gt;BEGIN&lt;br /&gt;  FOR cur IN&lt;br /&gt;    ( SELECT  items.item_name&lt;br /&gt;      FROM    apex_application_page_items items,&lt;br /&gt;              apex_application_page_val vals&lt;br /&gt;      WHERE   items.application_id  = TO_NUMBER(:APP_ID)&lt;br /&gt;      AND     items.page_id         = TO_NUMBER(:APP_PAGE_ID)&lt;br /&gt;      AND     items.item_name       = vals.associated_item&lt;br /&gt;      AND     vals.validation_type  &lt;br /&gt;                = 'Item specified is NOT NULL'&lt;br /&gt;    )&lt;br /&gt;  LOOP&lt;br /&gt;    apex_util.set_session_state( cur.item_name&lt;br /&gt;                               , TRIM(v(cur.item_name)));&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;/pre&gt;&lt;br /&gt;I added this to a form on EMP and setup a not null validation on the job item. Then loaded the page, keyed a space for the job field and on inspection of the debug, you can see that before the process fires, session state shows a " " for P12_JOB, which would have passed the not null validation.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0W0wsNIv6jU/R1KNYc63F0I/AAAAAAAAABk/HteUgTpGDA0/s1600-R/debug_proof_before.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0W0wsNIv6jU/R1KNYc63F0I/AAAAAAAAABk/nXpgjagcH6g/s400/debug_proof_before.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5139325576002606914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And then after the process has fired, it has been trimmed and set in session to "", which causes the not null validation to correctly fail.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0W0wsNIv6jU/R1KNYc63F1I/AAAAAAAAABs/ni_cvqNwXjI/s1600-R/debug_proof.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0W0wsNIv6jU/R1KNYc63F1I/AAAAAAAAABs/K-1JUp9HD6o/s400/debug_proof.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5139325576002606930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope it helps,&lt;br /&gt;Anthony&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/9029980291688587752-3434056492703660658?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/3434056492703660658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=3434056492703660658' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3434056492703660658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3434056492703660658'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/12/problem-with-not-null-validations.html' title='Problem with &apos;Not Null&apos; validations'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_0W0wsNIv6jU/R1KNYc63F0I/AAAAAAAAABk/nXpgjagcH6g/s72-c/debug_proof_before.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-4392752763291141973</id><published>2007-11-19T12:56:00.000Z</published><updated>2007-12-10T13:19:22.758Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Debugging with the APEX repository</title><content type='html'>&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Introduction...&lt;/span&gt;&lt;br /&gt;I was recently working on an APEX application on a familiar 'Form on a Table' wizard-built page and encountering a &lt;a target="_blank" href="http://ora-00957.ora-code.com"&gt;ORA-00957 Duplicate Column Name&lt;/a&gt; error, meaning that a column name must be specified more than once in the INSERT.&lt;br /&gt;&lt;br /&gt;So the problem must be that I had more than one page item bound to the same database column. This page had got quite bloated with lots of other business logic so I started by turning off regions, the old 'process of elimination', debugging through seeing if there was anything obvious, but nothing sprang up. Then I thought if only there was a way to view all the page items on my page which were bound to the same database column. Well there is, using the APEX repository.&lt;br /&gt;&lt;br /&gt;For those of you who are not familiar with the repository, it is basically a set of views that expose all the APEX application metadata. For further information see &lt;a target="_blank" href="http://anthonyrayner.blogspot.com/2007/06/time-for-application-clean-up-with-apex.html"&gt;Have a clean up, utilising the APEX repository&lt;/a&gt; which contains links to loads more information.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;How...&lt;/span&gt;&lt;br /&gt;In the repository there is a view called APEX_APPLICATION_PAGE_DB_ITEMS which is what we are interested in. It is described in the APEX_DICTIONARY view as...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;'Identifies Page Items which are associated with Database Table Columns.  This view represents a subset of the items in the APEX_APPLICATION_PAGE_ITEMS view.'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We can then run the following query to return all the items for a specific application / page bound to a db column more than once.&lt;br /&gt;&lt;pre&gt;SELECT   db_column_name,&lt;br /&gt;         SUM(1) Duplicates&lt;br /&gt;FROM     apex_application_page_db_items&lt;br /&gt;WHERE    page_id = :page_id&lt;br /&gt;AND      application_id = :app_id&lt;br /&gt;GROUP BY db_column_name&lt;br /&gt;HAVING   SUM(1) &gt; 1&lt;br /&gt;ORDER BY SUM(1) DESC&lt;br /&gt;&lt;/pre&gt;(Note: This view does not contain conditional rendering information, so if this was required you would need to join to APEX_APPLICATION_PAGE_ITEMS on ITEM_ID).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Conclusion...&lt;/span&gt;&lt;br /&gt;So if ever you think, I wish I could see this information about this page / report or whatever, you probably can, just take a look into the repository. I wonder if there would be any scope for an APEX debugging framework that defines sets of processes linked to common 'ORA' errors. So for this example, it would simply be:&lt;br /&gt;&lt;br /&gt;Error:  ORA-00957 - Duplicate column name&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Step 1: Run the following query, binding in your page and application id.&lt;br /&gt;&lt;pre&gt;SELECT   db_column_name,&lt;br /&gt;         SUM(1) Duplicates&lt;br /&gt;FROM     apex_application_page_db_items&lt;br /&gt;WHERE    page_id = :page_id&lt;br /&gt;AND      application_id = :app_id&lt;br /&gt;GROUP BY db_column_name&lt;br /&gt;HAVING   SUM(1) &gt; 1&lt;br /&gt;ORDER BY SUM(1) DESC&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Step 2: Investigate all rows returned from the query and unbind items which should not be bound to the database column.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Step 3: Retest your page.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That would be nice.&lt;br /&gt;Anthony.&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/9029980291688587752-4392752763291141973?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/4392752763291141973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=4392752763291141973' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/4392752763291141973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/4392752763291141973'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/11/debugging-with-apex-repository.html' title='Debugging with the APEX repository'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-8789979797887359915</id><published>2007-11-19T12:53:00.000Z</published><updated>2007-12-10T13:19:22.758Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Survey results</title><content type='html'>Following the recent survey I conducted on this blog, 'What would you like to read more about on my blog?', the results were:&lt;br /&gt;&lt;br /&gt;Developer Tips             - 54%&lt;br /&gt;AJAX General               - 45%&lt;br /&gt;AJAX with JSON             - 45%&lt;br /&gt;BI Publisher Integration   - 33%&lt;br /&gt;Access Migration           - 0%&lt;br /&gt;&lt;br /&gt;I will thus be focusing my efforts on Developer Tips and AJAX related posts in the near future. I was quite surprised at the 0% interest in 'Access Migration' and would have thought this was be quite popular as this is one of the main platforms systems are built on that APEX applications replace. Or maybe it's just that developers aren't using the migration functionality built in to APEX / SQL Developer and just doing it without looking at these. Interesting.&lt;br /&gt;&lt;br /&gt;Thank you all for your feedback. More to come shortly.&lt;br /&gt;Anthony.&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/9029980291688587752-8789979797887359915?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/8789979797887359915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=8789979797887359915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/8789979797887359915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/8789979797887359915'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/11/survey-results.html' title='Survey results'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-6729089273299857503</id><published>2007-09-24T13:14:00.000+01:00</published><updated>2007-12-10T13:19:22.759Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>What do you want to learn about?</title><content type='html'>In the interest of trying to write good posts that the APEX community will find useful, I have added a new 'poll' feature to my blog. My first poll is entitled simply, 'What would you like to read more about on my blog?' and I have suggested a few titles to pick from. You can cast your vote by selecting from the check boxes on the right of the page, below 'About Me'. &lt;br /&gt;&lt;br /&gt;If you have any other suggestions or areas you wish to learn about or understand better, then please add a comment to this post.&lt;br /&gt;&lt;br /&gt;Look forward to hearing from you!&lt;br /&gt;Anthony.&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/9029980291688587752-6729089273299857503?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/6729089273299857503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=6729089273299857503' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/6729089273299857503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/6729089273299857503'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/09/what-do-you-want-to-learn-about.html' title='What do you want to learn about?'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-6957907693464624708</id><published>2007-09-05T16:43:00.000+01:00</published><updated>2007-12-10T13:19:22.760Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>UKOUG 2007 agenda packed with APEX</title><content type='html'>The &lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685"&gt;agenda&lt;/a&gt; for UKOUG 2007 has just been released and there is currently a total of 13 presentations on or relating to APEX (and a &lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=shwcti&amp;prs_prsid=2248&amp;day_dayid=9"&gt;keynote&lt;/a&gt; delivered by &lt;a target="_blank" href="http://asktom.oracle.com/pls/asktom/f?p=100:1:2411184379404168"&gt;Tom Kyte&lt;/a&gt;!). They are...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=searchshwprs&amp;amp;prs_prsid=1575&amp;day_dayid=9&amp;amp;src_dayid=9%2C+10%2C+11%2C+12&amp;prs_keywords=apex"&gt;Oracle Application Express 3.0: Introduction and New Features&lt;/a&gt; with Barry McGillin&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;amp;dlgact=searchshwprs&amp;prs_prsid=1518&amp;amp;day_dayid=9&amp;src_dayid=9%2C+10%2C+11%2C+12&amp;amp;prs_keywords=apex"&gt;APEX and photographs, a mashup made in....&lt;/a&gt; with Dr Jagdev Panesar&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=searchshwprs&amp;amp;prs_prsid=1634&amp;day_dayid=9&amp;amp;src_dayid=9%2C+10%2C+11%2C+12&amp;prs_keywords=application+express"&gt;Choose Your Weapon – an Overview of Oracle Development Tools&lt;/a&gt; with Mr Sten Vesterli&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;amp;dlgact=searchshwprs&amp;prs_prsid=1615&amp;amp;day_dayid=9&amp;src_dayid=9%2C+10%2C+11%2C+12&amp;amp;prs_keywords=apex"&gt;Harvesting the Advantages of a Database Centric Development Approach&lt;/a&gt; with Toon Koppelaars&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=searchshwprs&amp;amp;prs_prsid=1774&amp;day_dayid=9&amp;amp;src_dayid=9%2C+10%2C+11%2C+12&amp;prs_keywords=apex"&gt;Building The Rich User Interface with Oracle Application Express and AJAX&lt;/a&gt; with Anthony Rayner&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;amp;dlgact=searchshwprs&amp;prs_prsid=1541&amp;amp;day_dayid=9&amp;src_dayid=9%2C+10%2C+11%2C+12&amp;amp;prs_keywords=application+express"&gt;A Real-Life Experience of Rapidly Building Web-Interfaces&lt;/a&gt; with Oracle Application Express at CERN with Zory Zaharieva&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=searchshwprs&amp;amp;prs_prsid=1577&amp;day_dayid=9&amp;amp;src_dayid=9%2C+10%2C+11%2C+12&amp;prs_keywords=application+express"&gt;Consolidate your Microsoft Access Applications to Oracle Application Express&lt;/a&gt; with Barry McGillin&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;amp;dlgact=searchshwprs&amp;prs_prsid=1252&amp;amp;day_dayid=9&amp;src_dayid=9%2C+10%2C+11%2C+12&amp;amp;prs_keywords=apex"&gt;Programming real applications with Application Express&lt;/a&gt; with Andrew Woodward&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=searchshwprs&amp;amp;prs_prsid=1462&amp;day_dayid=9&amp;amp;src_dayid=9%2C+10%2C+11%2C+12&amp;prs_keywords=apex"&gt;Debugging APEX Applications&lt;/a&gt; with John Scott&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;amp;dlgact=searchshwprs&amp;prs_prsid=1395&amp;amp;day_dayid=9&amp;src_dayid=9%2C+10%2C+11%2C+12&amp;amp;prs_keywords=apex"&gt;Integration of BI (XML) Publisher and APEX (Oracle Application Express)&lt;/a&gt; with Dimitri Gielis&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=searchshwprs&amp;amp;prs_prsid=1271&amp;day_dayid=9&amp;amp;src_dayid=9%2C+10%2C+11%2C+12&amp;prs_keywords=apex"&gt;Apex the extra tinkering to render structures&lt;/a&gt; with Derek Scuffell&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;amp;dlgact=searchshwprs&amp;prs_prsid=1968&amp;amp;day_dayid=9&amp;src_dayid=9%2C+10%2C+11%2C+12&amp;amp;prs_keywords=apex"&gt;Oracle Linuxfest: 'Migrating to Oracle 11g on Linux'&lt;/a&gt; with Oracle Technology Network&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="_blank" href="http://conference.ukoug.org/default.asp?p=685&amp;dlgact=searchshwprs&amp;amp;prs_prsid=1583&amp;day_dayid=9&amp;amp;src_dayid=9%2C+10%2C+11%2C+12&amp;amp;prs_keywords=apex"&gt;How to Make Your Oracle APEX Application Secure.&lt;/a&gt; with Peter Lorenzen&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Loads to learn so come along, I'll be there and presentating 'Building The Rich User Interface with Oracle Application Express and AJAX' so looking forward to doing that (scary!) and listening to many more! Hope you can make it! &lt;br /&gt;Anthony.&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/9029980291688587752-6957907693464624708?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/6957907693464624708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=6957907693464624708' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/6957907693464624708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/6957907693464624708'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/09/ukoug-2007-agenda-packed-with-apex.html' title='UKOUG 2007 agenda packed with APEX'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-1373021118757853236</id><published>2007-09-03T21:43:00.000+01:00</published><updated>2007-12-10T13:19:22.760Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='Bookmarklets'/><title type='text'>Developer productivity gains with 'Bookmarklets'</title><content type='html'>&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"&gt;Introduction...&lt;/span&gt;&lt;br /&gt;The ability to manipulate web content with Javascript on the fly is becoming more and more widespread, with tools such as Firefox's &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt;, IE's &lt;a target="_blank" href="http://www.bhelpuri.net/Trixie/"&gt;Trixie&lt;/a&gt; and a whole host of other browser add-ons providing the ability to apply scripts to web pages. &lt;a target="_blank" href="http://www.bookmarklets.com"&gt;Bookmarklets&lt;/a&gt; are probably one of the simplest and easiest ways to achieve this, storing Javascript code in the URL of a bookmark or favorite. I have built a few which I find helpful in automating some of the more mundane tasks whilst developing with APEX. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"&gt;How...&lt;/span&gt;&lt;br /&gt;All you need to do is drag the following links onto your bookmarks / favorites toolbar in your browser. They are all compatible with Firefox and Internet Explorer.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="javascript:(function(){ var i,x;for(i=0,j=10;x=document.getElementsByName(%22f01%22)[i];++i,j=j+10) { x.value=j; }})()"&gt;Bulk Edit - Repad sequence numbers&lt;/a&gt; - Sequence numbers by default are padded by 10, but as the development process ensues, items get moved, processes get added and sequence numbers inevitably get scrunched up. This bookmarklet repads sequence numbers by 10 when in bulk edit pages where the 1st column is the sequence number, such as bulk editing page items, computations or validations.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="javascript:(function(){var i,x; for(i=0;x=document.getElementsByTagName(%22textarea%22)[i];++i) {x.rows += 20; x.cols+= 40;}})()"&gt;General - Enlarge textareas&lt;/a&gt; - Enlarges small textareas for easier editing, useful for 'Region Definition &gt; Source' or 'Page Process &gt; Source'.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="javascript:(function(){ var i,x;for(i=0;x=document.getElementsByName(%22f05%22)[i];++i) {x.value=%22LEFT%22; }var j,y;for(j=0;y=document.getElementsByName(%22f06%22)[j];++j) {y.value=%22LEFT%22; }})()"&gt;Report Attributes - Alignment LEFT&lt;/a&gt; - Sets both 'Column Alignment' and 'Heading Alignment' to 'LEFT' whilst on the 'Report Attributes' page.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="javascript:(function(){var i,x;for(i=0;x=document.getElementsByName(%22f09%22)[i];++i){x.checked=%22checked%22;}})()"&gt;Report Attributes - Sort All&lt;/a&gt; - Checks all the 'Sort' checkboxes whilst on the 'Report Attributes' page.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Once this is done, you can just click the bookmark / favorite when on the appropriate page and the Javascript will be applied.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"&gt;Conclusion...&lt;/span&gt;&lt;br /&gt;In my opinion bookmarklets are fantastic for implementing these type of simple extensions, the main reasons are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Portability(1) - All my bookmarklets will work in Firefox and Internet Explorer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Portability(2) - And this is important, using a Firefox add-on such as &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/2410"&gt;Foxmarks&lt;/a&gt; which synchronizes bookmarks between different instances of Firefox (home and work), your bookmarklets will be available to you on any browser you have synchronized.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Simplicity - Minimal learning curve for deployment, assuming a basic understanding of Javascript and bookmarks.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Categorisation - Easy to organise your bookmarklets into folders and subfolders, just as you would with your regular bookmarks.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ease of use - I have my bookmarklets available on my bookmarks toolbar, ready for  quick deployment.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;As APEX developers, we live in a world of 'browser-based development', rather than a traditionally rich IDE such as JDeveloper and Eclipse. The standard browser was not designed to be used as a development tool and thus anything we can do to help increase development productivity, such as write custom bookmarklets or use the &lt;b&gt;essential&lt;/b&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt; can really help. So have a go and write your own, here are &lt;a target="_blank" href="http://subsimple.com/bookmarklets/writeyourown.asp"&gt;some general guidelines&lt;/a&gt; including a very useful &lt;a target="_blank" href="http://subsimple.com/bookmarklets/jsbuilder.htm"&gt;bookmarklet builder&lt;/a&gt;. During development, I find a 'could I automate this?' attitude helps in identifying bookmarklet opportunities.&lt;br /&gt;&lt;br /&gt;Let me know if you have any more useful productivity increasing bookmarklets to share and I'll add them to this post.&lt;br /&gt;&lt;br /&gt;Anthony.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Update - Another way...&lt;/span&gt;&lt;br /&gt;Following the advise of &lt;a target="_blank" href="http://inside-apex.blogspot.com/"&gt;Patrick&lt;/a&gt; and &lt;a target="_blank" href="http://dgielis.blogspot.com/"&gt;Dimitri&lt;/a&gt;, I've taken a look at the &lt;a target="_blank" href="http://inside-apex.blogspot.com/2007/05/oracle-apex-builder-plugin-available.html"&gt;APEX Builder Plugin&lt;/a&gt; and it really is awesome, congratulations Patrick! &lt;br /&gt;&lt;br /&gt;It is compatible with both Firefox (with Greasemonkey) and IE (with IE7Pro), and it's fantastic. Whilst bookmarklets are great for a quick fix, if you want to get serious about building your own productivity customisations then I strongly advise you to invest a little time looking at this plugin.&lt;br /&gt;&lt;br /&gt;It does not change the APEX base install in any way and just requires the developer to have one of the above add-ons installed in their browser and the plugin scripts available to the workspace, either on the server or stored in the database as static files. Within a couple of hours I had it installed, had a good look around and was building my own extensions. &lt;br /&gt;&lt;br /&gt;One of the features of the plugin is the creation of a custom 'Set' select list at the top of any page in the Application Builder. This comes with some useful pre-rolled 'Setters', and also and importantly allows the developer to easily define their own 'Set' options for all or specific pages. This not only makes work more efficient for the developer, it can also be leveraged for enforcing standards across a team developing in APEX.&lt;br /&gt;&lt;br /&gt;I was able to recreate the functionality from my bookmarklet, 'Bulk Edit - Repad sequence numbers' on all the bulk-edit pages accessible via the 'Page Definition' page, with the following code:&lt;br /&gt;&lt;pre&gt;// Page Items&lt;br /&gt;&lt;br /&gt;ApexBuilderPlugin.addSetOperation&lt;br /&gt;  ( "General"&lt;br /&gt;  );&lt;br /&gt;ApexBuilderPlugin.addSetOperation&lt;br /&gt;  (  "Repad sequence numbers"&lt;br /&gt;  ,  { "f01":  function(pField, pRow)&lt;br /&gt;               {&lt;br /&gt;                 return pRow + '0';&lt;br /&gt;               }&lt;br /&gt;     }&lt;br /&gt;  );&lt;/pre&gt;&lt;br /&gt;For further information on how to do this, please refer to the &lt;a target="_blank" href="http://apexplugin.svn.sourceforge.net/viewvc/*checkout*/apexplugin/trunk/Documentation/HowToInstall.html"&gt;How to Install&lt;/a&gt; guide.&lt;br /&gt;&lt;br /&gt;As well as providing the ability to define your own 'set' operations, it also provides the ability to map keyboard shortcuts to common functions, such as F10 for 'Apply Changes' or F8 for 'Run Page' and a much neater solution to the enlarge textarea problem.&lt;br /&gt;&lt;br /&gt;Great work Patrick!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Another Update...&lt;/span&gt;&lt;br /&gt;I am now delighted to announce that my 'Repad Sequence Number' customisation will be included in the next official distribution of the plugin. Thanks to Patrick for giving me a &lt;a target="_blank" href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1791091&amp;group_id=194148&amp;atid=948269"&gt;mention&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Further Information...&lt;/span&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.bookmarklets.com"&gt;Bookmarklet homepage&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://subsimple.com/bookmarklets/writeyourown.asp"&gt;General Guidelines&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://subsimple.com/bookmarklets/jsbuilder.htm"&gt;Bookmarklet Builder&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="https://www.squarefree.com/bookmarklets/webdevel.html"&gt;Web Development Bookmarklets&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://awads.net/wp/2006/09/07/oracle-bookmarklets-the-easiest-way-to-search-documentation-and-more"&gt;Oracle bookmarklets by Eddie Awad for searching documentation&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://inside-apex.blogspot.com/2007/05/oracle-apex-builder-plugin-available.html"&gt;APEX Builder Plugin&lt;/a&gt;&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/9029980291688587752-1373021118757853236?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/1373021118757853236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=1373021118757853236' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1373021118757853236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1373021118757853236'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/09/developer-productivity-gains-with.html' title='Developer productivity gains with &apos;Bookmarklets&apos;'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-1435256431530680510</id><published>2007-08-17T08:55:00.000+01:00</published><updated>2007-12-10T13:19:22.760Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>New Oracle Magazine APEX / AJAX article</title><content type='html'>Just found an interesting &lt;a target="_blank" href="http://www.oracle.com/technology/oramag/oracle/07-sep/o57browser.html"&gt;article&lt;/a&gt; by David Peake (APEX product manager), in the September / October '07 edition of Oracle magazine, entitled 'Express 2.0'. This gives a brief introduction into implementing AJAX based functionality into APEX applications, and then goes onto a step-by-step example on how to implement dynamic tooltips.&lt;br /&gt;&lt;br /&gt;Worth a look.&lt;br /&gt;Anthony.&lt;br /&gt;&lt;br /&gt;Update: David has just started his own &lt;a target="_blank" href="http://dpeake.blogspot.com/"&gt;blog&lt;/a&gt; so be sure to add it to your feeds!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9029980291688587752-1435256431530680510?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/1435256431530680510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=1435256431530680510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1435256431530680510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1435256431530680510'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/08/new-oracle-magazine-apex-ajax-article.html' title='New Oracle Magazine APEX / AJAX article'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-3635403610955727021</id><published>2007-08-07T18:32:00.000+01:00</published><updated>2007-12-10T13:19:22.761Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Javascript debugging, an alternative to alert()</title><content type='html'>&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Introduction...&lt;/span&gt;&lt;br /&gt;This is a simple trick to provide a more flexible approach for displaying debugging output when working on javascript code in your APEX applications. It uses a couple of debugging javascript functions, print() and println() which will show your debug messages in the current page's footer. This allows for multiple messages to be output without having to click through each one, as is necessary with the alert() function. With other benefits too such as being able to copy the text output which is not possible with alert().&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;How...&lt;/span&gt;&lt;br /&gt;1. First add the following line to your 'Page Template &gt; Definition &gt; Footer', at the beginning:&lt;br /&gt;&lt;pre&gt;&amp;lt;div id="debug"&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;(It doesn't really matter where this goes in the 'Footer' code, as long as it's before the closing &amp;lt;/body&amp;gt; tag.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Then we need to make the following two javascript functions available for use in your application. (The recommended approach would be to store them in a '.js' file and place this file on your web server.)&lt;br /&gt;&lt;pre&gt;//print output messages to your page&lt;br /&gt;function print(p_value){&lt;br /&gt;  $x("debug").innerHTML = $x("debug").innerHTML + &lt;br /&gt;                          p_value;&lt;br /&gt;}&lt;br /&gt;//print output messages to your page with a line break&lt;br /&gt;function println(p_value){&lt;br /&gt;  $x("debug").innerHTML = $x("debug").innerHTML + &lt;br /&gt;                          p_value + '&amp;lt;br/&amp;gt;';&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;3. You can then call either print() or println() from within your javascript code.&lt;br /&gt;&lt;br /&gt;Happy debugging!&lt;br /&gt;Anthony.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Update...&lt;/span&gt;&lt;br /&gt;Do you Firebug? Then there is a simpler way!&lt;br /&gt;&lt;br /&gt;If you use Firefox with Firebug, then another way of debugging is to use the built-in &lt;a target="_blank" href="http://www.getfirebug.com/console.html"&gt;Console API&lt;/a&gt;. This details some very useful calls such as:&lt;br /&gt;&lt;br /&gt;console.log - Writes a message to the Firebug console&lt;br /&gt;&lt;br /&gt;console.trace - Writes an interactive stack trace to the Firebug console with information about the calling function and also the parameters passed to the function. It is interactive in the sense that you can click the function name to take you straight to the function source, very nice!&lt;br /&gt;&lt;br /&gt;This API provides more calls as well which look very useful, so it's worth taking a &lt;a target="_blank" href="http://www.getfirebug.com/console.html"&gt;look&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(Thank you Carl!)&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/9029980291688587752-3635403610955727021?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/3635403610955727021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=3635403610955727021' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3635403610955727021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/3635403610955727021'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/08/javascript-debugging-alternative-to.html' title='Javascript debugging, an alternative to alert()'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-5837473382458614489</id><published>2007-06-23T12:04:00.000+01:00</published><updated>2007-12-10T13:19:22.761Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Checking for Duplicates</title><content type='html'>Here is a quick way to check for duplicate records in the database, by using the 'group by' and 'having' sql commands.&lt;br /&gt;&lt;br /&gt;The following example uses the trusty 'EMP' table and checks for duplicates in the 'JOB' column.&lt;br /&gt;&lt;pre&gt;select   job,&lt;br /&gt;         sum(1) Duplicates &lt;br /&gt;from     emp&lt;br /&gt;group by job&lt;br /&gt;having   sum(1) &gt; 1&lt;br /&gt;order by sum(1) desc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Or generically this query could be expressed:&lt;br /&gt;&lt;pre&gt;select   [duplicate_column_name],&lt;br /&gt;         sum(1) Duplicates&lt;br /&gt;from     [table_name]&lt;br /&gt;group by [duplicate_column_name]&lt;br /&gt;having   sum(1) &gt; 1&lt;br /&gt;order by sum(1) desc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hope it helps!&lt;br /&gt;Anthony.&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/9029980291688587752-5837473382458614489?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/5837473382458614489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=5837473382458614489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/5837473382458614489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/5837473382458614489'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/06/checking-for-duplicates.html' title='Checking for Duplicates'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-2538331494815277406</id><published>2007-06-16T11:36:00.000+01:00</published><updated>2007-12-10T13:19:22.762Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>AJAX retrieval using Javascript Object Notation (JSON)</title><content type='html'>&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Introduction...&lt;/span&gt;&lt;br /&gt;Typically, most of the AJAX examples out there for APEX either use plain text or xml for data transmission. This post details how to implement AJAX functionality using Javascript Object Notation or JSON, retrieving multiple items from an application process. JSON, or the &lt;a href="http://www.json.org/fatfree.html" target="_blank"&gt;fat free alternative to XML&lt;/a&gt; is a simple, lightweight syntax for representing data and can be easily integrated into an APEX application. Due to its light weight, it has performance advantages over using XML and is also very easy to understand and manipulate on the client side.&lt;br /&gt;&lt;br /&gt;This post will show how to create a simple &lt;a href="http://apex.oracle.com/pls/otn/f?p=23510:1" target="_blank"&gt;example&lt;/a&gt; of AJAX with JSON, where a user selects either 'Car' or 'Bike' from a select list, then either car or bike 'models' will be populated into 2 page items.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Pre-requisites...&lt;/span&gt;&lt;br /&gt;In order to parse the JSON text and create the javascript objects in your javascript code, you will need to download the &lt;a href="http://www.json.org/json.js" target="_blank"&gt;JSON open source parser&lt;/a&gt;. Once downloaded, it must be made available in your APEX environment. The best way to do this is to save the file into the following directory on your web server:&lt;br /&gt;&lt;pre&gt;  &lt;span style="font-size:100%;"&gt;ORACLE_HOME\Apache\Apache\images\javascript&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;And then reference it by adding the following to your 'Page Template &gt; Definition &gt; Header', just after the '#HEAD#' substitution string:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;  &amp;lt;script src="#IMAGE_PREFIX#javascript/json.js"&lt;br /&gt;  type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Alternatively, if you have restricted access to the web server (as with apex.oracle.com), then upload the 'json.js' file as a static file, via 'Shared Components &gt; Static Files', ensure you associate it with your application and then add this reference to the page template:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;  &amp;lt;script src="#APP_IMAGES#json.js"&lt;br /&gt;  type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/pre&gt;Note: The static file method will not be as fast in execution as copying the file directly on the server.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;How...&lt;/span&gt;&lt;br /&gt;Step 1: Create a new, blank page, call it 'AJAX - JSON Demo Page'. (I'll assume it's page 1 for the rest of this example.)&lt;br /&gt;&lt;br /&gt;Step 2: Create a HTML, empty region, call it 'AJAX - JSON Region'.&lt;br /&gt;&lt;br /&gt;Step 3: Create the following 3 page items:&lt;br /&gt;- The activator will be a select list, where you either select 'Car' or 'Bike'. Selecting one of these options will invoke the 'onChange'&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt; event specified and call the 'Get_Multiple_Items()' javascript function, specified in step 5. Set the following:&lt;br /&gt;Type = Select List&lt;br /&gt;Item Name = P1_ACTIVATOR&lt;br /&gt;Region = AJAX - JSON Region&lt;br /&gt;List of Values Query = STATIC2:Car;Car,Bike;Bike&lt;br /&gt;Label = Activator&lt;br /&gt;Element &gt; HTML Form Element Attributes = onChange="get_Multiple_Items();"&lt;br /&gt;&lt;br /&gt;(All other attributes just leave as default.)&lt;br /&gt;&lt;br /&gt;- Item 1 to return the first model of either 'Car' or 'Bike', set the following:&lt;br /&gt;Type = Text Field&lt;br /&gt;Item Name = P1_RETURN_ITEM_1&lt;br /&gt;Region = AJAX - JSON Region&lt;br /&gt;Label = Return Item 1&lt;br /&gt;&lt;br /&gt;(All other attributes just leave as default.)&lt;br /&gt;&lt;br /&gt;- Item 2 to return the second model of either 'Car' or 'Bike', set the following:&lt;br /&gt;Type = Text Field&lt;br /&gt;Item Name = P1_RETURN_ITEM_2&lt;br /&gt;Region = AJAX - JSON Region&lt;br /&gt;Label = Return Item 2&lt;br /&gt;&lt;br /&gt;(All other attributes just leave as default.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 4: Create an application process via 'Shared Components', set the following:&lt;br /&gt;Name = RETURN_MULTIPLE_ITEMS&lt;br /&gt;Process Point = On Demand: Run this application process when requested by a page process&lt;br /&gt;Type = PL/SQL Anonymous Block&lt;br /&gt;Process Text =&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;declare&lt;br /&gt;return_item_1 varchar2(100);&lt;br /&gt;return_item_2 varchar2(100);&lt;br /&gt;return_str varchar2(2000) := '';&lt;br /&gt;begin&lt;br /&gt;owa_util.mime_header('text/html', FALSE );&lt;br /&gt;htp.p('Cache-Control: no-cache');&lt;br /&gt;htp.p('Pragma: no-cache');&lt;br /&gt;owa_util.http_header_close;&lt;br /&gt;&lt;br /&gt;if :P1_ACTIVATOR = 'Car' then&lt;br /&gt;  return_item_1 := 'Ferrari';&lt;br /&gt;  return_item_2 := 'Ford';&lt;br /&gt;elsif :P1_ACTIVATOR = 'Bike' then&lt;br /&gt;  return_item_1 := 'Suzuki';&lt;br /&gt;  return_item_2 := 'Ducati';&lt;br /&gt;end if;&lt;br /&gt;&lt;br /&gt;return_str := '{&lt;br /&gt;                 "model":[&lt;br /&gt;                   "'||return_item_1||'",&lt;br /&gt;                   "'||return_item_2||'"&lt;br /&gt;                 ]&lt;br /&gt;               }';&lt;br /&gt;&lt;br /&gt;htp.prn(return_str);&lt;br /&gt;&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;(All other attributes just leave as default.)&lt;br /&gt;&lt;br /&gt;Of particular interest here is the following lines of code:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;  return_str := '{&lt;br /&gt;               "model":[&lt;br /&gt;                 "'||return_item_1||'",&lt;br /&gt;                 "'||return_item_2||'"&lt;br /&gt;               ]&lt;br /&gt;             }';&lt;/span&gt;&lt;/pre&gt;So this is where we need to encode the result into the correct JSON syntax, so as to be parsed successfully in the client.&lt;br /&gt;&lt;br /&gt;JSON syntax is exactly the same as the syntax used to define normal object and array literals in javascript. For a detailed description of the syntax, see the &lt;a href="http://www.json.org/" target="_blank"&gt;JSON homepage&lt;/a&gt;. In my example, if the user selects 'Bike', the following string would be returned by the process:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;  {"model":["Suzuki","Ducati"]}&lt;/span&gt;&lt;/pre&gt;So here we have a single member called 'model', containing an array of the two return values, 'Suzuki' and 'Ducati'.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 5: Create a javascript function on the page&lt;br /&gt;We now need to create the function that will setup, send and receive the request from the server. This will use the built-in 'htmldb_Get' ajax function to call the application process called 'RETURN_MULTIPLE_ITEMS', created in step 4. Set the following:&lt;br /&gt;Page Attributes &gt; HTML Header &gt; HTML Header =&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;script language="JavaScript" type="text/javascript"&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;function get_Multiple_Items() {&lt;br /&gt;var get = new htmldb_Get(null,&lt;br /&gt;                 &amp;APP_ID.,&lt;br /&gt;                 'APPLICATION_PROCESS=RETURN_MULTIPLE_ITEMS',&lt;br /&gt;                 0);&lt;br /&gt;get.add('P1_ACTIVATOR',$x('P1_ACTIVATOR').value);&lt;br /&gt;&lt;br /&gt;gReturn = get.get();&lt;br /&gt;&lt;br /&gt;if (gReturn) {&lt;br /&gt;  var myJSONObject = gReturn.parseJSON();&lt;br /&gt;  $x('P1_RETURN_ITEM_1').value = myJSONObject.model[0];&lt;br /&gt;  $x('P1_RETURN_ITEM_2').value = myJSONObject.model[1];&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//--&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Of particular interest here are the following lines of code:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;  var myJSONObject = gReturn.parseJSON();&lt;/span&gt;&lt;/pre&gt;This calls the function 'parseJSON()' which parses the JSON text to produce an object, and then...&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;  $x('P1_RETURN_ITEM_1').value = myJSONObject.model[0];&lt;/span&gt;&lt;/pre&gt;The resulting object 'myJSONObject' can then be accessed like any normal javascript object. In this case, we are retrieving the first value from a member called 'model' (which was created in step 4). This value then sets the 'P1_RETURN_ITEM_1' value.&lt;br /&gt;&lt;br /&gt;Now run your page and you should be able to see some nice AJAX and JSON in action! Or take a look &lt;a href="http://apex.oracle.com/pls/otn/f?p=23510:1" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Conclusion...&lt;/span&gt;&lt;br /&gt;So it's a pretty simple little example, but I really like how easy it is to manipulate the object client-side. The only downfall is that the syntax to encode the JSON string in the application process takes a bit of getting used to, but I found it fairly easy to get my head around. Ideally, you would have a server-side encoder for this and there are many &lt;a href="http://www.json.org/" target="_blank"&gt;available&lt;/a&gt;, just none for PL/SQL that I've found*. There are lots available for Java, which could potentially be loaded in the database and called via a PL/SQL wrapper.&lt;br /&gt;&lt;br /&gt;I have not done this for this example because I felt it was overkill for what I was trying to achieve. To just return a few items like I have done here, manually encoding the JSON text was fairly painless, although I'm sure it could quickly get very painful if creating large, nested structures, where a proper encoder may be more beneficial (and performance gains would be more apparent).&lt;br /&gt;&lt;br /&gt;Also, bear in mind my example doesn't really do anything in the application process which warrants a trip to the database (just checking hard-coded strings, which could be done client-side). The purpose of this post was to highlight how to implement JSON with AJAX in APEX so I tried to reduce complexity elsewhere to focus on the main points.&lt;br /&gt;&lt;br /&gt;Hope it helps,&lt;br /&gt;Anthony.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;* Update...&lt;/span&gt;&lt;br /&gt;Since writing this article, it appears a &lt;a target="_blank" href="http://reseau.erasme.org/Librairie-JSON"&gt;PL/SQL JSON library&lt;/a&gt; has cropped up from France. I have yet to try it but will take a look and blog about it soon.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:georgia;font-size:130%;"  &gt;Further Information and Links...&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.json.org/fatfree.html" target="_blank"&gt;Article: 'JSON: The Fat-Free Alternative to XML'&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.json.org/json.js" target="_blank"&gt;Javascript source file containing JSON parser&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.json.org/" target="_blank"&gt;JSON homepage, including links to many server-side encoders&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Json" target="_blank"&gt;JSON wiki&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=9029980291688587752&amp;amp;postID=2538331494815277406" target="_blank" rfc4627="" html="" org=""&gt;JSON RFC 4627&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.developer.com/lang/jscript/article.php/3596836" target="_blank"&gt;Article: 'Speeding Up AJAX with JSON'&lt;/a&gt;&lt;br /&gt;&lt;a href="http://apex.oracle.com/pls/otn/f?p=11933:63" target="_blank"&gt;Carl Backstrom's APEX AJAX Site&lt;/a&gt;&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/9029980291688587752-2538331494815277406?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/2538331494815277406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=2538331494815277406' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2538331494815277406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2538331494815277406'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/06/ajax-retrieval-using-javascript-object.html' title='AJAX retrieval using Javascript Object Notation (JSON)'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-1154691781081742782</id><published>2007-06-07T23:54:00.001+01:00</published><updated>2007-12-10T13:19:22.762Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Have a clean up, utilising the APEX repository</title><content type='html'>&lt;span style="font-weight: bold;font-family:georgia;font-size:130%;"  &gt;Introduction...&lt;/span&gt;&lt;br /&gt;Remember switching those conditions to 'Never' on various APEX components and forgotten where and when? Use the awesome APEX repository to have a tidy up.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:georgia;font-size:130%;"  &gt;How...&lt;/span&gt;&lt;br /&gt;The following query will return all of the following APEX components that have a condition set to 'Never':&lt;br /&gt;Breadcrumbs, computations, list entries, list of values, navigation bars entries, branches, processes, regions, report columns, validations, buttons, items, tabs and shortcuts.&lt;br /&gt;&lt;br /&gt;The query allows for either viewing components by application, or by workspace. To view by application enter the application ID for the app_id bind variable, to view all applications in a workspace just leave app_id as null.&lt;br /&gt;&lt;pre&gt;select&lt;br /&gt;  component,&lt;br /&gt;  description,&lt;br /&gt;  sequence,&lt;br /&gt;  location,&lt;br /&gt;  identifier,&lt;br /&gt;  app_id&lt;br /&gt;from&lt;br /&gt;(&lt;br /&gt;  select &lt;br /&gt;    'Breadcrumb Entry' component,&lt;br /&gt;    entry_label description,&lt;br /&gt;    null sequence,&lt;br /&gt;    'Page: ' || defined_for_page location,&lt;br /&gt;    breadcrumb_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_BC_ENTRIES&lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select &lt;br /&gt;    'Application Computation' component,&lt;br /&gt;    computation_item description,&lt;br /&gt;    computation_sequence sequence,&lt;br /&gt;    'Shared Component - Logic' location,&lt;br /&gt;    application_comment_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_COMPUTATIONS &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select &lt;br /&gt;    'List Entry' component,&lt;br /&gt;    entry_text description,&lt;br /&gt;    display_sequence sequence,&lt;br /&gt;    'Shared Component - Navigation - List (' || &lt;br /&gt;      list_name || ')' location,&lt;br /&gt;    list_entry_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_LIST_ENTRIES &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'LOV Entry' component,&lt;br /&gt;    display_value description,&lt;br /&gt;    display_sequence sequence,&lt;br /&gt;    'Shared Component - User Interface - LOV (' || &lt;br /&gt;      list_of_values_name location,&lt;br /&gt;    lov_entry_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_LOV_ENTRIES &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select &lt;br /&gt;    'Navigation Bar Entry' component,&lt;br /&gt;    icon_subtext description,&lt;br /&gt;    display_sequence sequence,&lt;br /&gt;    'Shared Component - Navigation' location,&lt;br /&gt;    nav_bar_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_NAV_BAR &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Page Branch' component,&lt;br /&gt;    branch_point description,&lt;br /&gt;    process_sequence sequence,&lt;br /&gt;    'Page: ' || page_id location,&lt;br /&gt;    branch_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_PAGE_BRANCHES &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Page Computation' component,&lt;br /&gt;    item_name description,&lt;br /&gt;    execution_sequence sequence,&lt;br /&gt;    'Page: ' || page_id location,&lt;br /&gt;    computation_id identifier,&lt;br /&gt;    application_id app_id &lt;br /&gt;  from APEX_APPLICATION_PAGE_COMP &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select &lt;br /&gt;    'Page Process' component,&lt;br /&gt;    process_name description,&lt;br /&gt;    execution_sequence sequence,&lt;br /&gt;    'Page: ' || page_id location,&lt;br /&gt;    process_id identifier,&lt;br /&gt;    application_id app_id &lt;br /&gt;  from APEX_APPLICATION_PAGE_PROC &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Page Region' component,&lt;br /&gt;    region_name description,&lt;br /&gt;    display_sequence sequence,&lt;br /&gt;    'Page: ' || page_id location,&lt;br /&gt;    region_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_PAGE_REGIONS &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Report Column' component,&lt;br /&gt;    column_alias description,&lt;br /&gt;    display_sequence sequence,&lt;br /&gt;    'Page: ' || page_id || ' (' || &lt;br /&gt;      region_name || ')' location,&lt;br /&gt;    region_report_column_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_PAGE_RPT_COLS &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Page Validation' component,&lt;br /&gt;    validation_name description,&lt;br /&gt;    validation_sequence sequence,&lt;br /&gt;    'Page: ' || page_id location,&lt;br /&gt;    validation_id identifier,&lt;br /&gt;    application_id app_id &lt;br /&gt;  from APEX_APPLICATION_PAGE_VAL &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Button' component,&lt;br /&gt;    button_name description,&lt;br /&gt;    button_sequence sequence,&lt;br /&gt;    'Page: ' || page_id || ' (' || &lt;br /&gt;      region || ')' location,&lt;br /&gt;    button_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_PAGE_BUTTONS &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Page Item' component,&lt;br /&gt;    item_name description,&lt;br /&gt;    display_sequence sequence,&lt;br /&gt;    'Page: ' || page_id || ' (' || &lt;br /&gt;      region || ')' location,&lt;br /&gt;    item_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_PAGE_ITEMS &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Parent Tab' component,&lt;br /&gt;    tab_name description,&lt;br /&gt;    display_sequence sequence,&lt;br /&gt;    'Shared Component - Navigation - Tabs' location,&lt;br /&gt;    parent_tab_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_PARENT_TABS &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Application Process' component,&lt;br /&gt;    process_name description,&lt;br /&gt;    process_sequence sequence,&lt;br /&gt;    'Shared Component - Logic' location,&lt;br /&gt;    application_process_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_PROCESSES &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Shortcuts' component,&lt;br /&gt;    shortcut_name description,&lt;br /&gt;    null sequence,&lt;br /&gt;    'Shared Component - User Interface' location,&lt;br /&gt;    shortcut_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_SHORTCUTS &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;  union&lt;br /&gt;  select&lt;br /&gt;    'Tab' component,&lt;br /&gt;    tab_name description,&lt;br /&gt;    display_sequence sequence,&lt;br /&gt;    'Shared Component - Navigation - Tabs' location,&lt;br /&gt;    tab_id identifier,&lt;br /&gt;    application_id app_id&lt;br /&gt;  from APEX_APPLICATION_TABS &lt;br /&gt;  where upper(condition_type) = 'NEVER'&lt;br /&gt;)&lt;br /&gt;where app_id = decode(:app_id,null,app_id,:app_id)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The APEX repository views that are being used return different information for the different component types, so I have used generic place holders for the results of an inline view, which does a series of unions on queries retrieving data from the views. I have tried to ensure the what is retrieved for each component type is descriptive enough so as to be able to easily locate the component in your application builder and delete it. A sample result is shown below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0W0wsNIv6jU/RmlPRbCLgBI/AAAAAAAAAA8/5_MkmD742Xk/s1600-h/apex_clean_up_report.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_0W0wsNIv6jU/RmlPRbCLgBI/AAAAAAAAAA8/5_MkmD742Xk/s400/apex_clean_up_report.gif" alt="" id="BLOGGER_PHOTO_ID_5073673615942844434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;By the way, in writing this post, for an easy and accurate way to get a definitive list of all the apex components that could be conditionally displayed, I went to the 'APEX_DICTIONARY' view and applied the following predicate:&lt;br /&gt;&lt;pre&gt;upper(column_name) = 'CONDITION_TYPE'&lt;br /&gt;&lt;/pre&gt;This returned a list of APEX views that have columns with the name 'CONDITION_TYPE'. These views were then used as a basis for my main query.&lt;br /&gt;&lt;br /&gt;Tidy app, tidy mind.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:georgia;font-size:130%;"  &gt;Further information...&lt;/span&gt;&lt;br /&gt;Patrick Wolf's excellent &lt;a target="_blank" href="http://inside-apex.blogspot.com/2007/06/power-of-oracle-apex-repository.html"&gt;post&lt;/a&gt;  and presentation slides on 'The Power of the Apex Repository'.&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/9029980291688587752-1154691781081742782?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/1154691781081742782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=1154691781081742782' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1154691781081742782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/1154691781081742782'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/06/time-for-application-clean-up-with-apex.html' title='Have a clean up, utilising the APEX repository'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_0W0wsNIv6jU/RmlPRbCLgBI/AAAAAAAAAA8/5_MkmD742Xk/s72-c/apex_clean_up_report.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-567480339346770750</id><published>2007-06-07T17:25:00.000+01:00</published><updated>2007-12-10T13:19:22.762Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Developer Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Browse Apache files from your browser</title><content type='html'>If, like me you have worked on APEX projects with restricted access to the server where the Oracle HTTP Server is installed, there are a few things you can do to view information stored on the server, directly via the browser.&lt;br /&gt;&lt;br /&gt;You can look at:&lt;br /&gt;&lt;br /&gt;1. Image files&lt;br /&gt;A new feature of APEX 3.0 allows browsing of images that are part of the APEX distribution and available for use, located in following directory:&lt;br /&gt;&lt;br /&gt;ORACLE_HOME\Apache\Apache\images\menu&lt;br /&gt;&lt;br /&gt;From the 'Application Builder', from the shortcut menu click on the 'Find' torch, pictured below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0W0wsNIv6jU/RmlFAbCLf9I/AAAAAAAAAAc/0GioBatKOXM/s1600-h/apex_find.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_0W0wsNIv6jU/RmlFAbCLf9I/AAAAAAAAAAc/0GioBatKOXM/s320/apex_find.gif" alt="" id="BLOGGER_PHOTO_ID_5073662328768790482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This will load a popup, where you can search a whole load of useful APEX stuff, of interest here is the 'Images' tab. Click this, ensure 'Show' is set to 'Standard Images' and you will be able browse the images currently available. By clicking on an image, APEX will also provide you with a link to be used in your application.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0W0wsNIv6jU/RmlFAbCLf-I/AAAAAAAAAAk/T_3H6FzPkAE/s1600-h/apex_find_images.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_0W0wsNIv6jU/RmlFAbCLf-I/AAAAAAAAAAk/T_3H6FzPkAE/s320/apex_find_images.gif" alt="" id="BLOGGER_PHOTO_ID_5073662328768790498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Note: This technique can also be used to view cascading style sheets available to you. These CSS shown here are solely the theme independent ones and thus always available to you regardless of theme.&lt;br /&gt;&lt;br /&gt;If however, you wish to view a specific CSS file via the browser, read on...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. CSS and Javascript files&lt;br /&gt;You can look at other files that are contained within the images directory on the server (not just images!), via the virtual path specified in the following configuration file:&lt;br /&gt;&lt;br /&gt;ORACLE_HOME\Apache\modplsql\conf\dads.conf&lt;br /&gt;&lt;br /&gt;This can be done directly from the browser by removing everything after the port number and replacing it with a path to the file you wish to look at. This would typically be used to look up a '.css' or '.js' file that the current page references, something like:&lt;br /&gt;&lt;pre&gt;src="/i/javascript/htmldb_html_elements.js"&lt;br /&gt;&lt;/pre&gt;Then use this reference at the end of your url, as shown in the picture below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_0W0wsNIv6jU/RmlFf7CLf_I/AAAAAAAAAAs/u0sV_CAC6rM/s1600-h/apex_url.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_0W0wsNIv6jU/RmlFf7CLf_I/AAAAAAAAAAs/u0sV_CAC6rM/s320/apex_url.gif" alt="" id="BLOGGER_PHOTO_ID_5073662869934669810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Activity Logs&lt;br /&gt;Although you cannot see the exact access_log files from the browser, there is a report which shows similar information, which can be accessed via:&lt;br /&gt;&lt;br /&gt;Home &gt; Utilities &gt; Application Express Views &gt; APEX_WORKSPACE_ACTIVITY_LOG&lt;br /&gt;&lt;br /&gt;This contains information like workspace, application, apex_user, page_id, view_date, think_time and ip_address to name a few.&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/9029980291688587752-567480339346770750?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/567480339346770750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=567480339346770750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/567480339346770750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/567480339346770750'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/06/browse-apex-images-without-access-to.html' title='Browse Apache files from your browser'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_0W0wsNIv6jU/RmlFAbCLf9I/AAAAAAAAAAc/0GioBatKOXM/s72-c/apex_find.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9029980291688587752.post-2360644859891771933</id><published>2007-06-06T11:29:00.003+01:00</published><updated>2008-12-13T15:11:06.992Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>UK market rate for an APEX developer</title><content type='html'>For you contractors out there, check out this &lt;a target="_blank" href="http://www.itjobswatch.co.uk/contracts/uk/oracle%20apex.do"&gt;link&lt;/a&gt; to the 'IT JobsWatch' site, where they have some interesting statistics on the current APEX market in the UK for the last 3 months.&lt;br /&gt;&lt;br /&gt;When I checked on the 6th June, there were 22 advertisements for contracts in the last 3 months, with 6 of those listing a daily rate averaging £428, it seems the APEX wave is still swelling!&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;Quarterly Update: 4th September 2007&lt;br /&gt;Adverts in last 3 months: 59&lt;br /&gt;Average Daily Rate: £366 (from 10 adverts quoting a rate)&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;Quarterly Update (a bit late!!): 1st February 2008&lt;br /&gt;Adverts in last 3 months: 52&lt;br /&gt;Average Daily Rate: £359 (from 14 adverts quoting a rate)&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;Quarterly Update: 12th April 2008&lt;br /&gt;Adverts in last 3 months: 66&lt;br /&gt;Average Daily Rate: £421 (from 27 adverts quoting a rate)&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;Quarterly Update: 10th July 2008&lt;br /&gt;Adverts in last 3 months: 60&lt;br /&gt;Average Daily Rate: £442 (from 30 adverts quoting a rate)&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;Quarterly Update (very late): 12th December 2008&lt;br /&gt;Adverts in last 3 months: 56&lt;br /&gt;Average Daily Rate: £384 (from 14 adverts quoting a rate)&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/9029980291688587752-2360644859891771933?l=anthonyrayner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonyrayner.blogspot.com/feeds/2360644859891771933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9029980291688587752&amp;postID=2360644859891771933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2360644859891771933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9029980291688587752/posts/default/2360644859891771933'/><link rel='alternate' type='text/html' href='http://anthonyrayner.blogspot.com/2007/06/market-rate-for-apex-developer.html' title='UK market rate for an APEX developer'/><author><name>Anthony Rayner</name><uri>http://www.blogger.com/profile/04412495232341508437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
