tag:blogger.com,1999:blog-48185421643842212822024-03-25T17:53:51.648+08:00Grassroots OracleMentations of an Oracle DeveloperScott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.comBlogger596125tag:blogger.com,1999:blog-4818542164384221282.post-48576159854446073132023-10-11T08:01:00.002+08:002023-10-11T08:01:50.569+08:00Pressing Pause on APEX #JoelKallmanDay<p>To honour this year's #JoelKallmanDay, I'd like to use this as an opportunity to speak about mental health, rather than get technical like I have <a href="http://www.grassroots-oracle.com/search/label/JoelKallmanDay" target="_blank">done in the past</a>.</p><p>Yes, my blog posts have been particularly lean - this is my first post since the same event in 2021 - I <i>completely</i> missed last year. Not just this special event, but from any posts whatsoever.</p><p>It's not that I've moved away from Oracle, nor that I'm short on inspiration - I'm still emailing myself ideas on a regular basis, but I haven't been setting time aside to transform them into something to post.</p><p>And I haven't been totally silent - I did update my <a href="http://www.grassroots-oracle.com/p/presentations.html" target="_blank">Presentations</a> page after presenting at a couple of local meetups this year. And you'll still find me on the Oracle and Stack Overflow forums.</p><p>There have been a few reasons for the slow-down in activity, but in part this has been due to my front-end development time being far less than it has been in the past. The Forms->APEX migration project I joined has been paused, and in the meantime I find myself on a project remediating the environment to first upgrade the stack from fax machines and teletype.... well, things aren't <i>quite </i>that old, but there's no point giving the car a flash new paint job without first replacing the tired old engine, right? </p><p>But when you're into painting, mechanical work is far less exciting, and it can take a toll on how one feels about their job.</p><p>I still get to paint the odd fender, but that's only part-time.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw5jWilQtTGWFsVUxIl9j6ayzUXzFkEvDpfYBRgQS8HuGxoHuNaolyB1W5MLM5CyQTdZx-4qAnlcB-_VcdoNhjNX4jpFTfXMFzrFjEOh-2-xRN5TzjRY6Ml9vZk-SRFdUW3N6HViXjS6hSYy2709ZpBd-78shoQMaRpYNH1_YcWyIiQbZVr3fkhNATW6g/s1411/eclipse_banner.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="483" data-original-width="1411" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw5jWilQtTGWFsVUxIl9j6ayzUXzFkEvDpfYBRgQS8HuGxoHuNaolyB1W5MLM5CyQTdZx-4qAnlcB-_VcdoNhjNX4jpFTfXMFzrFjEOh-2-xRN5TzjRY6Ml9vZk-SRFdUW3N6HViXjS6hSYy2709ZpBd-78shoQMaRpYNH1_YcWyIiQbZVr3fkhNATW6g/w640-h221/eclipse_banner.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Sunset after Eclipse 2023</td></tr></tbody></table><br /><p>It can't always be about rainbows and lollipops, but after many years of working in the candy factory at the end of a rainbow, I have to wait patiently for the new factory to open under a new rainbow.</p><p>Perhaps that's enough mixed-metaphors for now. I'm still here, still passionate about Oracle and the APEX product, and I have exciting times in my relatively near future.</p><p>It's also not the first time I've had setbacks of sorts. There have been significant development works that ended up being permanently parked. These were amazing builds that I had fun being involved with, but for one reason or another they either never ended up in the user's laps, or didn't stay there for long. However, besides feeling like my time was wasted, there wasn't really a direct impact on me.</p><p>Stepping away from the front-end and spending far more time in the back-end - or even finding myself updating some Oracle Forms and tweaking their configuration, really makes me appreciate what I've found in the highly productive world of Oracle APEX development.</p><p>In the meantime, I find community events like this, and perhaps also the first local conference in some time next month will invigorate me enough to take the time to revive my blogging vibe, and maybe a side project or two that haven't gone completely dormant.</p><p>To the reader: how have you handled lulls in your career? Have you found periods of time that, while perhaps still being technically interesting, haven't completely satiated the programmer's need to create? What did you do to quench your thirst?</p>Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com1tag:blogger.com,1999:blog-4818542164384221282.post-13988712270036355562021-11-07T18:44:00.000+08:002021-11-07T18:44:10.848+08:00APEX in tense. #JoelKallmanDay<p>Now I feel extremely luck to live in a part of the world that has been relatively free of impact from COVID-19, certainly from a societal health perspective.</p><p>That said, I'm fairly certain there has been an indirect impact on my non-billable APEX activities - one only needs to look at my blog history over the past few years. Blogging is an outlet I've always enjoyed, and I miss doing regularly. 'Next week' I'll start doing it more regularly. Next week...</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGy25eo8vMiECTT-SstG9IwRnUvYynW-bCXjeY31_UZOZY_P50_xX-iP2ehV1o-rBsHatUbZSlslb-24zG9Kbiq7k7FO0tmebrlcEHD2GCgdz4HGEYrCckIb0bTYTEz2Admij9VhCEy6w/s295/blog_history.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="295" data-original-width="183" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGy25eo8vMiECTT-SstG9IwRnUvYynW-bCXjeY31_UZOZY_P50_xX-iP2ehV1o-rBsHatUbZSlslb-24zG9Kbiq7k7FO0tmebrlcEHD2GCgdz4HGEYrCckIb0bTYTEz2Admij9VhCEy6w/s0/blog_history.PNG" width="183" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Blog frequency dips</td></tr></tbody></table><br /><p>But I was flicking through some tweets and <a href="https://twitter.com/oraclebase/status/1444972557963341829" target="_blank">saw Tim's announcement</a> regarding <a href="https://twitter.com/hashtag/JoelKallmanDay" target="_blank">#JoelKallmanDay</a>, an initiative extending from past appreciation days, but now honouring the late great Joel Kallman, who sadly succumbed to COVID-19.</p><p>While I may be late to the event, I still feel compelled to contribute in some form. I only had the honour of meeting Joel a few times, but I know he's been an influence in my outreach. And I certainly feel his passion through the extended Oracle APEX team, whom I've also shared some wonderful moments with. I think about him frequently.</p><p>Like Tim, I thought I'd do an abridged history of my path to APEX. I had my first exposure to generating HTML from PL/SQL back in University, though too late in my final year project to do anything exciting with it - but I felt back then it seemed quite a powerful concept.</p><p>That said, I ended up cutting my programming teeth with Oracle Forms for a good number of years before my employer in ~2008 asked/directed/suggested I learn Oracle APEX while it was v3.2.</p><p>I was really given the opportunity at that point to jump in the deep end with APEX and explore what could really be done when it comes to designing applications that help the user get the job done. Not only that, I started the conferencing thing and got exposure to people like me from all over the world.</p><p>It wasn't long before I started training other people to use Oracle APEX, and if nothing else, that certainly helps you learn the ins, outs, and shortcomings of your development tool. Combined with regular involvment in the online forums, where even answering a question I thought I knew often comes with other people contributing their own perspectives, offering an enhanced method, or other consideration.</p><p>I've since had the chance to speak at two Kscopes, where I met Joel and quite a few people in the APEX team. They're all so passionate about the product, and offer their own special skills to help mature the product in the right direction - adding features faster than I can learn them. Not only that, they all know how to have fun outside the technology world. Something particularly important for our mental health in these challenging times.</p><p>I've now been on a few projects where we're transitioning Forms application to the web-based world that APEX lives, and now I have the pleasure of helping convert a large Forms application I had a decent part in developing - back before I knew what APEX was.</p><p>For me this is a particularly exciting time. It was somewhat of a plunge to leave my previous job during these testing times, but it's opened a raft of new opportunities - all the while I wish I had more time to tinker with my own little APEX side projects. </p>Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-40381203485151715532021-04-26T17:27:00.005+08:002021-04-26T17:27:47.651+08:00Kicking the tyres on Oracle APEX 21.1<p> It's lockdown on a long weekend, and Oracle APEX 21.1 has just been deployed to <a href="http://apex.oracle.com">apex.oracle.com</a>, how could I not have a play?</p><p>We've been provided a link to <a href="https://apex.oracle.com/pls/apex/apex_pm/r/apex211/new-features" target="_blank">New Features</a>, but for some aspects I'll need some help from the documentation, when it becomes available - and perhaps some examples from people more knowledgable than I.</p><h4 style="text-align: left;">Native Map</h4><p>This will be one of those features where I'll need some more guidance, and I suspect this <a href="https://asktom.oracle.com/pls/apex/f?p=100:551::::RP,551:P551_CLASS_ID,P551_INVITED:8641,N&cs=15D985EE012EBE27731B0737891ED7430" target="_blank">AskTom Office Hours</a> session that I haven't watched yet would probably be a good start.</p><p>The create page wizard looks promising</p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Le5DTfXNMB5ECtJLlr3uetCjOaLfo_huAi60mwa4GvEenOci05moJ9XvkMViqv74ljvNLnEmORhVCvvDOboX5PlOVk4TPNdNe_C69B8dZe7BOL98S_W2HqMv_nGOtw9nxW0MpADCgpM/s1196/20.1-map-create.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="718" data-original-width="1196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Le5DTfXNMB5ECtJLlr3uetCjOaLfo_huAi60mwa4GvEenOci05moJ9XvkMViqv74ljvNLnEmORhVCvvDOboX5PlOVk4TPNdNe_C69B8dZe7BOL98S_W2HqMv_nGOtw9nxW0MpADCgpM/s320/20.1-map-create.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Create native map</td></tr></tbody></table><br /><p></p><p>And after fiddling around with the region attributes, I was able to plot three lat/long addresses onto a map.</p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMMeGyvSxfhjI3Qh16fCNsSsbZlWXDl8sGCaXlbOLEJ-dSwperlrRFmb56mNXGlWV408qFdYuXXPiQ0YngcXi6WNh77Q7aa55JEV1lMEPg9PKbt-PX4vwvLMRcHG-MwBxhEU9knXCeHuo/s1803/21.1-native-map.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1084" data-original-width="1803" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMMeGyvSxfhjI3Qh16fCNsSsbZlWXDl8sGCaXlbOLEJ-dSwperlrRFmb56mNXGlWV408qFdYuXXPiQ0YngcXi6WNh77Q7aa55JEV1lMEPg9PKbt-PX4vwvLMRcHG-MwBxhEU9knXCeHuo/s320/21.1-native-map.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Native map runtime</td></tr></tbody></table><br /><p></p><p>I also noticed there were some native Dynamic Actions associated with the map region, but I'll patiently await further information on this one. </p><p>Good to see it's dark-mode ready, though. </p><h4 style="text-align: left;">Lazy Loading</h4><p>This is one feature I've been waiting to become native, and I probably would have been a little disappointed if it didn't arrive with 21.1, and here it is, nice and simple.</p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMtah1Ycd3ymEdZL2MXpQYbZ9_JDe9S3uHBIi6Mzr_td8dj89MCoYO6jscf4Eqb4cjb45ctWOueQz8IVHixGT28JInhTkvz4WXIVfy7HfRDjix3mNvmgkRuFbM1M9RfpT_6J7xotdHRzc/s714/21.1-lazy-loading.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="205" data-original-width="714" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMtah1Ycd3ymEdZL2MXpQYbZ9_JDe9S3uHBIi6Mzr_td8dj89MCoYO6jscf4Eqb4cjb45ctWOueQz8IVHixGT28JInhTkvz4WXIVfy7HfRDjix3mNvmgkRuFbM1M9RfpT_6J7xotdHRzc/s320/21.1-lazy-loading.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Lazy loading option</td></tr></tbody></table><br /><p></p><p>We can emphasise the behaviour with the browser's device toolbar options, for instance, throttling to 'Low-end mobile'.</p><p>Here I have an IR and Classic Report both using the lazy loading option.</p><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7wMFiI8Q6_A1vlbnxoa9pxCkfrkvTucfAhfarcrtAumDpCK9smuc48VxXKe4aZTp47nzIiVQUHgNd52lExvjE9QwzonXmyi79yI4iapmmuterfikq7B9X5wP-b1T4IqMBkrSTVCvytKQ/s803/21.1-lazy-loading-runtime.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="340" data-original-width="803" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7wMFiI8Q6_A1vlbnxoa9pxCkfrkvTucfAhfarcrtAumDpCK9smuc48VxXKe4aZTp47nzIiVQUHgNd52lExvjE9QwzonXmyi79yI4iapmmuterfikq7B9X5wP-b1T4IqMBkrSTVCvytKQ/s320/21.1-lazy-loading-runtime.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Lazy loading runtime</td></tr></tbody></table><br /></div><div>Custom built solutions can use the no-data-found message to inform the users data is still loading, I would like this feature to offer some facility in that regard.</div><div><br /></div><h4 style="text-align: left;">Code Editor</h4><div>I like it when we're giving options on what code editor features are available, and it looks like we've been provided a few more keys to the playground with the 'Monaco' based code editor.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidbzaPLrtwRSB_zYgqWd7Q4p1g-u6g0mg7WyiOIBx3X6DKwZHl78p_LDrjny81dl22zQ8vow2uezzkFYCx5nhlcwbe0iFu_TT6nSKuGd80NhsZe-2nFGGQh8URldL5xZj6eLLlgYVEziA/s497/21.1-monaco.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="497" data-original-width="348" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidbzaPLrtwRSB_zYgqWd7Q4p1g-u6g0mg7WyiOIBx3X6DKwZHl78p_LDrjny81dl22zQ8vow2uezzkFYCx5nhlcwbe0iFu_TT6nSKuGd80NhsZe-2nFGGQh8URldL5xZj6eLLlgYVEziA/s320/21.1-monaco.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Code editor settings</td></tr></tbody></table><div><br /></div>There are some APEX specific improvements, too. For instance, we're now notified when a page item doesn't exist - thought I think it needs a bit more polish. It appears to be case sensitive, and doesn't clean up very well once you've corrected the problem.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXaHZfsUGO93gBNji4D6j2k_raIUQcz9S7JLnAcxDSu-5f84KxuDKRNy24EAWZ50dZD-o0IOpDiMVZKHkdo9BPNhI3BtP3vqb3PqI4lKn32rDWpt2X-_jwG-KxO17r9EU7yt4xh87HdvE/s720/21.1-item-reference.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="369" data-original-width="720" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXaHZfsUGO93gBNji4D6j2k_raIUQcz9S7JLnAcxDSu-5f84KxuDKRNy24EAWZ50dZD-o0IOpDiMVZKHkdo9BPNhI3BtP3vqb3PqI4lKn32rDWpt2X-_jwG-KxO17r9EU7yt4xh87HdvE/s320/21.1-item-reference.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Code editor item reference check</td></tr></tbody></table><div><br /></div>It seems we have a few more keyboard shortcuts available now for case transformations. That's always nice.</div><div><br /></div><h4 style="text-align: left;">Universal Theme enhancements</h4><div>If you like the Redwood Light theme, it seems that's been given more love compared to the first round.</div><div><br /></div><div>There are some added declarative options, but I'll probably need more context as to how they're used. I don't think the UT application has those guidelines yet, or I didn't see them.</div><div><br /></div><div>Row CSS classes seems like it should have been there all along with Column CSS classes. What would be an example of it's use?</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnALixuWE0QJQETHTfsIsx9WDhhHLekh1AbXsf78IEeulesO2xepFnJEnaBjwfBkun5Gmt-fDEbPgN14UXXzNbc-SiEq95ck4z4G9PofH6nbQp9tkUA4HhxTzg_1HpuTrAAaOswDzgBvU/s701/21.1-row-css-classes.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="479" data-original-width="701" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnALixuWE0QJQETHTfsIsx9WDhhHLekh1AbXsf78IEeulesO2xepFnJEnaBjwfBkun5Gmt-fDEbPgN14UXXzNbc-SiEq95ck4z4G9PofH6nbQp9tkUA4HhxTzg_1HpuTrAAaOswDzgBvU/s320/21.1-row-css-classes.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Grid layout property addition</td></tr></tbody></table><br /></div><div>CSS classes against the Theme Style seems like it will allow more elegance, but again, I'd like to see an example.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqD2oqE-eHw6sdoLbKuAvlGqUvLlQp4Fc_BJtHzr9FuvtHIFIuMJGy7f0XU6T4ZTWvUiyjIrUrEIDQ5rh45HSMnIEuUULZeJqV2xOVOk6QI01ibgXv3ZHvwBvNK-hvKR1iAPXg2x0SUB8/s907/21.1-theme-styles.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="731" data-original-width="907" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqD2oqE-eHw6sdoLbKuAvlGqUvLlQp4Fc_BJtHzr9FuvtHIFIuMJGy7f0XU6T4ZTWvUiyjIrUrEIDQ5rh45HSMnIEuUULZeJqV2xOVOk6QI01ibgXv3ZHvwBvNK-hvKR1iAPXg2x0SUB8/s320/21.1-theme-styles.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Theme style property addition</td></tr></tbody></table><br /></div><div>Having even a cursory look at these new features also made me consider how I've been utilising existing behaviours. The File URL for a theme style seems a better spot than I've been using for custom CSS I've added to fill gaps in the dark mode.</div><div><br /></div><div>Template Options have always had a few surprises in version upgrades, though I'm not sure what the region Heading Level is supposed to do.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE1MzP8TVS6nrMgmIIHXEtldZlzfU2kD4IYBoPDvORuFAK5kw_1QPZsZy52_SbNAb0JFHO01-c-Jea0S6Hjt1HTCgKC8rtHpipLFHN-E3-Xux6vtB4VTsPS3Vnk_PT3FBy3Q09qwY8v5E/s448/21.1-heading.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="448" data-original-width="216" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE1MzP8TVS6nrMgmIIHXEtldZlzfU2kD4IYBoPDvORuFAK5kw_1QPZsZy52_SbNAb0JFHO01-c-Jea0S6Hjt1HTCgKC8rtHpipLFHN-E3-Xux6vtB4VTsPS3Vnk_PT3FBy3Q09qwY8v5E/s320/21.1-heading.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Region template options</td></tr></tbody></table><br /></div><h4 style="text-align: left;">Universal Theme application</h4><div>I notice the UT app has some extra options in the navigation bar.</div><div><br /></div><div>The version facility sounds like a fair addition for those who may be a version or so behind. I wonder what this changes, exactly. Does it affect content, or just the styling that's applied. Though I notice you can't select an older theme while dark mode style is applied.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpaaJb66PNAUyqVtjybLT_3IA0Wv_aA1AMOV2yCELMF57i9tgXGO0xOOVUoCdbRAdsOWnoGoKXModCsgA_K2_c8x_54I7AW49k-xnjLnPRgoEqrLEOS1G0eGKNjpgKhQNglRrrRAarTvE/s409/21.1-ut-navbar.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="409" data-original-width="383" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpaaJb66PNAUyqVtjybLT_3IA0Wv_aA1AMOV2yCELMF57i9tgXGO0xOOVUoCdbRAdsOWnoGoKXModCsgA_K2_c8x_54I7AW49k-xnjLnPRgoEqrLEOS1G0eGKNjpgKhQNglRrrRAarTvE/s320/21.1-ut-navbar.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">UT app navbar</td></tr></tbody></table><br /></div><div>The Style option is pretty cool. I've been playing with a similar feature in my app, but it seems like I've been submitting the page like a chump - I'm curious as to how this work.</div><div><br /></div><h4 style="text-align: left;">Date Picker</h4><div>It's always good to get improvements on such a common component. The Maximum Item seems like a more declarative facility compared to what we have now, but now it appears to be dynamic - responding to a related item's selection. Perfect for from/to selections.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBbdY2vYvrDDsEwt2aaMO_YLII7FmSvitf7HyFwN6blHIuu0-0rF-60bj_4-kJ4FRaMRmJLs5EVSQ3md9ex68chHX1t_xL36NmPRe8KmXXl7hM2i7CXRDUy3E_epclhlazb0MrnUEmkm4/s710/21.1-date-max.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="404" data-original-width="710" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBbdY2vYvrDDsEwt2aaMO_YLII7FmSvitf7HyFwN6blHIuu0-0rF-60bj_4-kJ4FRaMRmJLs5EVSQ3md9ex68chHX1t_xL36NmPRe8KmXXl7hM2i7CXRDUy3E_epclhlazb0MrnUEmkm4/s320/21.1-date-max.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">New date picker settings</td></tr></tbody></table><br /></div><div><div>Display Inline really stands out, must be for when date selection is rather important.</div><div><br /></div></div><div>Now that <a href="https://blog.danielhochleitner.de/" target="_blank">DanielH</a> is on the team, it almost seemed inevitable that the time picker would be enhanced in some form. This could mean another plugin is no longer required, though I'll reserve judgement until after I play some more.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0arQYbrK5GcZ8yBt8v9q5yYfL3oaiMXqaK32bAmHuQZZAOdWmRgWPGdU8hnf6Kwf8t94V8pzpMUZnf4KaIcPaD1Ltw1w88USkp3tATVJuueCTwPk0JzYwLJkX5amPkr2kGXgm-qAYqn4/s509/21.1-clockpicker.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="509" data-original-width="359" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0arQYbrK5GcZ8yBt8v9q5yYfL3oaiMXqaK32bAmHuQZZAOdWmRgWPGdU8hnf6Kwf8t94V8pzpMUZnf4KaIcPaD1Ltw1w88USkp3tATVJuueCTwPk0JzYwLJkX5amPkr2kGXgm-qAYqn4/s320/21.1-clockpicker.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Time picker enhancement</td></tr></tbody></table></div><div><br /></div><h4 style="text-align: left;">Import export as ZIP</h4><div>This seemed inevitable, but I don't think it will impact me so much.</div><div><br /></div><h4 style="text-align: left;">Application Data Loading</h4><div>I need to spend time to revisit this feature. The column mapping aspect intrigues me.</div><div><br /></div><h4 style="text-align: left;">Faceted Search enhancements.</h4><div>I haven't used this facility in production yet, but it's good to see it progress as it's such a ubiquitous web feature.</div><div><br /></div><h4 style="text-align: left;">REST Data sources</h4><div>Schedule frequent loading of CSV data from the web? Getting data into the database easier has gotta be good.</div><div>Juergen has a <a href="https://twitter.com/JuergenSchuster/status/1386268410842132481" target="_blank">good way</a> of putting this:<br /><i><blockquote>"Put your Excel Sheet in your Sharepoint, change it as you like and I give you an real time App on top of it" feature</blockquote></i></div><div><br /></div><div><h4>Markdown upgrades</h4><div>This will float some people's boat.</div><div><br /></div></div><h4 style="text-align: left;">Miscellaneous</h4><div>I like the sound of client side numeric formatting, and improved client side validation.</div><div><br /><div><h4 style="text-align: left;">Conclusion</h4><p>This release seems in line with the <a href="https://apex.oracle.com/en/learn/resources/roadmap/" target="_blank">stated roadmap</a>, though as <a href="https://twitter.com/andre_blu/status/1385972177359486976" target="_blank">Andre describes</a>, there are also some long standing painpoints that exist for the developer that could use some attention at some point.</p><p>The Oracle APEX development team have had some quality additions recently, though the whole COVID situation has potentially slowed some general improvements. </p><p>That said, the product <i>continues </i>to improve, and the team responds well to community feedback. I also look forward to seeing improvements in the <a href="http://apex.oracle.com/vote" target="_blank">feedback application</a> itself.</p><p>Get in there, kick the tyres, and give the development team some constructive feedback. We can all help make this an even better product.</p><h4 style="text-align: left;">Hold the phone! </h4><p>Just as I was about to clean the post up for submission, I saw Juergen's tweet about client side conditions on individual dynamic actions. I think the team are underselling that feature on the New Features list!</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCEKjNX6rTs8sfaYQqmWn-p_11stM_XL1V_pBmcv7uoq6AmgA-viOpU2wJ_PlnCopRDGNta3F-h4ZLzwQe40mxxuBNwwoyGelDr3HLUukG1HodrxtIGsHAeLyQqPZhUzQN31Q89b0vtw8/s980/21.1-clientside-da.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="980" data-original-width="721" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCEKjNX6rTs8sfaYQqmWn-p_11stM_XL1V_pBmcv7uoq6AmgA-viOpU2wJ_PlnCopRDGNta3F-h4ZLzwQe40mxxuBNwwoyGelDr3HLUukG1HodrxtIGsHAeLyQqPZhUzQN31Q89b0vtw8/s320/21.1-clientside-da.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Client side condition in DA actions</td></tr></tbody></table><div><br /></div>Though as handy as this feature will be, I suspect it could be abused - in regard to maintainability. It could leave to code/behaviour that's a little difficult to follow. We'll have to keep an eye on that.<br /><p><br /></p><p><br /></p><p><br /></p></div></div>Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com10tag:blogger.com,1999:blog-4818542164384221282.post-56567436203465461912021-04-19T20:33:00.002+08:002021-04-19T20:40:04.323+08:00Dare Mighty Things<p>As a data engineer (of sorts) I've handled some cool data in my times, and created some interesting plots.</p><p>I still remember when I used rpad with stddev() in SQL*Plus to prove the data we had formed a bell curve.</p><p>More recently I've used Oracle APEX activity logs to identify bottlenecks and high frequency pages.</p><p>But this evening I was in awe as I saw a simple plot appear on my smartphone. This plot used data that spent at least 15 minutes travelling almost twice the distance from the Earth to the Sun to reach us, across an incredible network of computers.</p><p>Data from a craft that made history as it made controlled, powered flight on another planet.</p><p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFY_GgJpsCVofTrM6PkDsK9NuN4XISfbzyQZ6xWFtaV88oIS3YkhdBH1b3JJLlu4uX0up3fvpKcwOj0vUjGMpe4_bDuVaf1bW7MYNh_UNymThwHJ1zmnfUYO-qoPH1qLtxBpVwH3QM6WA/s1205/mars_helo.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="677" data-original-width="1205" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFY_GgJpsCVofTrM6PkDsK9NuN4XISfbzyQZ6xWFtaV88oIS3YkhdBH1b3JJLlu4uX0up3fvpKcwOj0vUjGMpe4_bDuVaf1bW7MYNh_UNymThwHJ1zmnfUYO-qoPH1qLtxBpVwH3QM6WA/w400-h225/mars_helo.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">First Martian flight plot</td></tr></tbody></table></p><p>Sure, <a href="http://www.grassroots-oracle.com/2017/09/cassini-inspires-project-management.html" target="_blank">it's no secret</a> I'm a big fan of all things space, and some may say that this achievement is a little overhyped. </p><p>Not me. </p><p>This is one of those moments that's going to inspire little future engineers that see a diverse group of people around the control room creating a moment in history that's justifiably likened to the first powered flight on Earth over 100 years ago.</p><p>This event is going to be the baseline for exploring Mars in ways that have only been dreamed about so far. And the drive to improve technology to improve the capability of this exploration is going to continue to benefit those of us living on Earth.</p><p>This doesn't mean us humble data engineers crawl deeper into caves of inadequacy. It may have taken a few people to cobble together a small engine on some timber roped together to fly a few hundred feet, but it takes a team of all sorts to send a rocket containing a nuclear powered rover containing a battery powered helicopter to another planet, land it, then fly it in an atmosphere so thin. </p><p>And I feel for that team right now who can't hug their colleagues during tears of triumphant joy at their pent up success. Well done JPL.</p><p>We just need to dare mighty things. Even with our little apps - they make a difference to someone.</p><br />Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-84849417172219726232021-01-21T23:28:00.002+08:002021-01-21T23:43:54.982+08:002020 Blog Review<p>Ahem.</p><pre>select apex_string.format(q'[It's been %s days since my last confession]'
,trunc(Sysdate) - date '2020-04-14'
) "G'day World" from dual</pre><pre>G'day World
-----------
It's been 282 days since my last confession</pre><p>It's been <a href="http://www.grassroots-oracle.com/2020/04/how-to-stay-sane-when-things-change.html" target="_blank">so long</a>, the Blogger UI has changed. I don't think I like it. Maybe another thing to consider adjusting in the new year...</p><p>It's also been four years since my <a href="http://www.grassroots-oracle.com/2017/02/2016-blog-review.html" target="_blank">last blog review</a>, and I <a href="https://twitter.com/swesley_perth/status/1346459840114163712" target="_blank">promised</a> this one may be a doozy.</p><p>2020 was something else, right? I spent a good portion being thankful that I </p><p></p><ol style="text-align: left;"><li>kept my job</li><li>could work from home</li><li>live in such a remote city, which helped keep my family & friends safe</li></ol><p></p><p>Aside from the <a href="https://asktom.oracle.com/pls/apex/f?p=100:551::::551:P551_CLASS_ID,P551_STUDENT_ID:7325,&cs=10C206A926C98836A595DCB16D9E458C2" target="_blank">APEX@Home</a> event in April, I decided to scale my extra-curricular work right down, hence the lack of blog activity over the past year. I've kept active in the forums, because looking through those helps give my brain a bit of a reset when focus starts wandering.</p><p>But I wanted to be sure I had the time, energy, or whatever it was I needed to power through whatever 2020 potentially dished out.</p><p>Thankfully, from my end of the world, things are relatively OK. I've been to a few outdoor gigs, and aside from a few regular adjustments, life is kind of normal. Kind of. We're not completely insulated from the outside world, and things could change in a moment.However, I've used this down time to improve my investment game, should my IT career start to falter.</p><p>But that leads onto another astonishment for the year. I saw a lot of people I knew outside tech lose their jobs, though thankfully most of them had options elsewhere. Meanwhile, I'm presented with numerous avenues. I happened to choose a new avenue.</p><p>As of the end of January 2021, my tenure at Sage Computing Services comes to an end after 13 years. </p><p>When I look back, it's staggering what I've done with the support of Penny at Sage.</p><p></p><ul style="text-align: left;"><li><a href="http://www.grassroots-oracle.com/2019/10/so-you-want-to-learn-oracle-apex.html" target="_blank">Transitioned</a> from Forms based development to Oracle APEX.</li><li>I published a <a href="https://www.packtpub.com/product/oracle-apex-techniques-video/9781849689342" target="_blank">video series</a> using Oracle APEX. </li><li>I published a <a href="https://www.springer.com/us/book/9781484209622#otherversion=9781484209615" target="_blank">book</a> involving Oracle APEX. </li><li>I was recognised as an <a href="https://apexapps.oracle.com/pls/apex/f?p=119297:3:::::IRC_NAME:wesley" target="_blank">Oracle ACE</a>.</li><li>I spoke <a href="https://www.odtug.com/" target="_blank">Kscope</a>. Twice. Well, two cities, 5-6 sessions, I think.</li><li>Helped create some amazing project work with an <a href="http://sagecomputing.com.au/about.html" target="_blank">amazing team</a>.</li><li>Found a great work-life balance.</li></ul><p></p><p>And I still have the yearn for more. I have two more ideas for video series I still want to explore, and one could work as another book. </p><p>It was a really tough choice leaving Sage, but yet again, Penny supported me through the options, and I'm fairly sure I've found a project that's the <i>perfect </i>fit for me, and it was hard to ignore.</p><p>And for a moment there I felt like I was presented with the cliche of red vs blue pill.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1dplQKlgCbhpqd9HXjtvqlt8oeIj9fic8hlKtylz3GGJrlW3FX87uB0DuJ47NItyCNooQ40vq5_Oxtgdn3kIqagYvRLR0PJcEWCgrT69ahlyIEsy54B1dvieAZSO8qwP2KqEEKEV8PUk/s1200/redblue.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="800" data-original-width="1200" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1dplQKlgCbhpqd9HXjtvqlt8oeIj9fic8hlKtylz3GGJrlW3FX87uB0DuJ47NItyCNooQ40vq5_Oxtgdn3kIqagYvRLR0PJcEWCgrT69ahlyIEsy54B1dvieAZSO8qwP2KqEEKEV8PUk/w200-h133/redblue.jpg" width="200" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Development or ...</td></tr></tbody></table><br /><p>I'm not sure which one represents the world of development, but I didn't identify a managerial style job back at University - so while I 'manage' a lot of things as a developer, my passion is cutting code.</p><p>Therefore, the coming years are going to be explored as a contractor at a <a href="https://www.modis.com/" target="_blank">new firm</a>, while I return to a past client to transition them from Forms to Oracle APEX. The good & bad news: I built a bunch of those Forms!</p><p>2020 project challenges were tough. I'd be kidding myself if I didn't think 2021 projects at a new location will be any different, but I'll be looking to step up my skills & habits while I'm at it.</p><p>Hopefully you'll be hearing more from me via this medium in 2021. <br />I've missed it, and I'm ready to come back.</p><p>And here's to seeing <a href="https://www.jwst.nasa.gov/" target="_blank">James Webb Space Telescope</a> finally launch this year!</p>Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com3tag:blogger.com,1999:blog-4818542164384221282.post-90444107748607588772020-04-14T20:42:00.000+08:002020-04-14T20:42:33.278+08:00How to stay sane ... when things change.<i>From an e-mail I sent to colleagues, I thought I should also share it here (revised):</i><br />
<br />
I'm known as the office optimist. And I do literally have many things to be grateful for. I still have a job, I’m able to work from home, and I have a decent study setup. And I’m an experienced introvert, this shelter-in-place business is no problem for me. I feel like one of the last people who’d go stir-crazy.<br />
<br />
But recently I felt I had a crappy week. Worst in some time, and nothing really to do with current events. A vital piece of software kept flaking out on me, and I felt I didn’t achieve what I was aiming complete.<br />
<br />
I opted out of an attempt at a virtual Friday Happy Hour for related reasons, even though I timing worked out that probably could have given it a go.<br />
<br />
In hindsight I understand this is also in part due to a number of reasons I just made up for myself, to justify “not coming”, such as feeling like the audio will be awkward, or even just setting up the video/audio feed.<br />
<br />
I’ve been listening to a few select podcast to keep up to speed with current events, <a href="https://www.stitcher.com/podcast/pushkin-industries/deep-background-with-noah-feldman" target="_blank"><i>Deep Background</i></a> with Noah Feldman being one of them. But this particular episode from 27th March, "How to stay sane during a pandemic", seemed to have been a fly on my wall. I found it really hit the nail on the head, and I feel there’s messages in there that will speak to all of us, from a professor in happiness, no less.<br />
<br />
Noah interviews Laurie Santos, from <i>The Happiness Lab</i>. Well worth the listen.<br />
<a href="https://podcasts.apple.com/nz/podcast/how-to-stay-sane-during-a-pandemic/id1460055316?i=1000469702285">https://podcasts.apple.com/nz/podcast/how-to-stay-sane-during-a-pandemic/id1460055316?i=1000469702285</a><br />
<br />
I hope you’re all doing ok.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtAX4KtPiocBPT2LiQK29srwCrjM4yg1U63iOahhPs1XPlGmACHx0yEvVfUD638zAPJTY4So6i-4d_QvcsHj3PctCSPLx40L4nlgox3_Wmjm5jnGOPmWPbuRH4h90gHkJYRDTB81eYsJ0/s1600/kermit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="394" data-original-width="630" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtAX4KtPiocBPT2LiQK29srwCrjM4yg1U63iOahhPs1XPlGmACHx0yEvVfUD638zAPJTY4So6i-4d_QvcsHj3PctCSPLx40L4nlgox3_Wmjm5jnGOPmWPbuRH4h90gHkJYRDTB81eYsJ0/s400/kermit.jpg" width="400" /></a></div>
<br />Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-1673705140815549192020-04-14T20:13:00.000+08:002020-04-14T20:16:51.831+08:00Oracle APEX @ HomeThe world has obviously lost a number of in-person conferences in recent times, but luckily we have people like <a href="http://www.talkapex.com/" target="_blank">Martin</a> who asked the APEX community to jump, and they responded "how high?"<br />
<br />
And out comes 24 hours of 24 speakers with <a href="https://apexatho.me/pls/apex/f?p=apexathome:home:0" target="_blank">APEX @ Home</a>, on April 16th 2020. A lot of regular speakers appear to have pulled out some awesome sessions, and then there's my dinky one on APEX logic suggestions.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVombWhxFSETstY65bd-GS_O5CVKubtUOTn76W7EUVj2C9UGGJT2_HSvMEra-Ou6DJZdLxzy7IazIqlfzGURSftV1MZfi6NYrJ7xMRDGA8XJI3L6TSJeSiFoKNGArVOXArNsyiLA_CO1A/s1600/apexathome.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="512" data-original-width="1024" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVombWhxFSETstY65bd-GS_O5CVKubtUOTn76W7EUVj2C9UGGJT2_HSvMEra-Ou6DJZdLxzy7IazIqlfzGURSftV1MZfi6NYrJ7xMRDGA8XJI3L6TSJeSiFoKNGArVOXArNsyiLA_CO1A/s400/apexathome.jpg" width="400" /></a></div>
<br />
It's an <a href="https://asktom.oracle.com/pls/apex/f?p=100:500" target="_blank">AskTOM Office Hours</a> session, so it's also recorded for later viewing, but you'll miss the chance for live Q&A.<br />
<br />
And you'll also miss the challenge <a href="https://twitter.com/connor_mc_d/status/1248538557783793665" target="_blank">Connor</a> put out there - to get a virtual selfie with <b>all 24 </b>speakers. Good luck with that.<br />
<br />
What I've wanted to do, but haven't had the time, is roughly plot the time zone differences for each speaker. I'm talking at 8pm, but I bet it's all over the shop for every speaker, at various times of the day!Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-51214710820480493892020-03-15T21:49:00.000+08:002020-03-15T21:49:13.981+08:00Inspect Element Deep Dive, with Oracle APEXIn my previous post about tweaking APEX classic reports, most of the settings were "low-code" configurations. All except the final line of JavaScript that moved the radio group from its default location, to the region's title bar where we'd normally find buttons.<br />
<br />
But how did I conjure that statement?<br />
<br />
When I wrote my book on jQuery in APEX, my general premise was each web page can be queried like a database can, you've just got to learn how to apply the filters to find the relevant component.<br />
<br />
<h4>
Browser Tools</h4>
<br />
In most browsers, if you right-click on any component on the page, then choose 'Inspect Element', you'll see a window appear showing you what the web page looks like prior to markup.<br />
<br />
I can also use F12 in Chrome on my laptop to bring up this console window, but don't presume that's the same anywhere - I borrowed a laptop for a webinar once, and it put the laptop in aeroplane mode. I digress... you can dock this console window to the bottom, side, or have it floating elsewhere.<br />
<br />
Where is my item?<br />
<br />
If I inspect the radio group, it will take me to the specific radio option, in this case 'Accounting'.<br />
<br />
As I move the mouse up the tree, different portions of the page will highlight, signifying exactly what part of the page the HTML represents. Sometimes you'll also see orange & green, signifying <a href="https://twitter.com/elixirgraphics/status/1199681223989305344" target="_blank">margin & padding</a> respectively.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXnj04v3T_GPw0uvx2FzNvzLQpeOyEghmW3YgHcXas2FP0D7dDYK9gfBIIZgSok5lf31x_LGJIeOSjza2Xb0D0-vVvqj_VealnGVHGvS3ACVDeI2_WsGr3ccHFFSFxx0JVQdERz7NtuW4/s1600/zhuzh_inspect_radio.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="878" data-original-width="1254" height="448" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXnj04v3T_GPw0uvx2FzNvzLQpeOyEghmW3YgHcXas2FP0D7dDYK9gfBIIZgSok5lf31x_LGJIeOSjza2Xb0D0-vVvqj_VealnGVHGvS3ACVDeI2_WsGr3ccHFFSFxx0JVQdERz7NtuW4/s640/zhuzh_inspect_radio.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Find the relevant component on the page with help from highlighting</td></tr>
</tbody></table>
<br />
I kept going until I found the P29_DEPT_Z_CONTAINER, which holds all of the contents of my radio group item P29_DEPT_Z. The id property allows us to 'query' this page using the filter (selector) #P29_DEPT_Z_CONTAINER.<br />
<br />
I can wrap this selector with the $() function to return that portion of the page, a portion I would like to move somewhere else.<br />
<br />
You can also see what happens when you enter this in the console window - it returns a result.<br />
<code>$('#P29_DEPT_Z_CONTAINER')</code><br />
<br />
<h4>
What function do I use?</h4>
<br />
I use this <a href="https://oscarotero.com/jquery/" target="_blank">jQuery cheatsheet</a> to help identify the relevant command I need. Sometimes there's alternates depending on what expression is on either side of the equation.<br />
<br />
In this case, I want to take my radio group, and <a href="https://api.jquery.com/appendTo/" target="_blank">append it to</a> somewhere else on the page.<br />
<code>$('the object I want to move').appendTo('where it is going');</code><br />
<br />
<h4>
Where is it going?</h4>
<br />
The next step is to identify the part of the page where my snippet of HTML will be going.<br />
<br />
I can use the same inspect element technique to locate a region already dedicated to placing buttons.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirvYC56c5Cspr1hQ3fWJuBlb-6Uu57gRVhwM6Y2Kg_wiGbEJq4wkb_bB6MbMAJJsvtBZdqk17_oXxB9Obot1xeL3Ct9evKgWAMptMIKV3tZouXUmOS69flUEKRuGMXBBI_y_F9Tm6CO7k/s1600/zhuzh_inspect.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="732" data-original-width="1315" height="355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirvYC56c5Cspr1hQ3fWJuBlb-6Uu57gRVhwM6Y2Kg_wiGbEJq4wkb_bB6MbMAJJsvtBZdqk17_oXxB9Obot1xeL3Ct9evKgWAMptMIKV3tZouXUmOS69flUEKRuGMXBBI_y_F9Tm6CO7k/s640/zhuzh_inspect.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Find the destination using the same technique</td></tr>
</tbody></table>
<br />
Here I've located my zhuzh region by the Static ID I've applied (purple), and there is a div the represents the location of the buttons. I can identify this part using one of the classes (red)<br />
<br />
Classes are prefixed with a dot when used within selectors<br />
<code>.t-Region-headerItems--buttons</code><br />
<br />
You need to take care when determining which selector to use. IDs should be unique (but aren't necessarily), and classes certainly aren't unique.<br />
<br />
A pairing of ID and class is often an effective combination, but you need choose the right class. One you've added your own is often safe, and you can inject classes into the page using various APEX attributes. They can be anything.<br />
<br />
This t-Region set of classes is defined within the Universal Theme. One early problem with APEX was these classes would change from theme to theme, as we didn't have a universal theme, so migrating custom code could be awkward.<br />
<br />
The UT has changed <i>some </i>classes over time, but <a href="https://apex.oracle.com/pls/apex/f?p=42:6303:::NO:::" target="_blank">documented ones</a> should remain constant.<br />
<br />
<h4>
Verifying the selector</h4>
<br />
Using the find function in the Elements tab allows you to test your selector, test how many results are returned on the page. If I just use the class, I actually get two results - one for each standard region I have on the page.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDyt68LxDRorSDaH_tsBhsqZ9BUm8epbm_VPwsu2ojRBGqUXA8iRry7Ce8fhzBAfTGsNVm0DLyYuQ5gjL6eL8gLiAYx3qxQp6m5aac7xOaJSjU2_KDkS6fchS6tu4FYqEcPJ1BDcNS9NU/s1600/zhuzh_find.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="195" data-original-width="978" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDyt68LxDRorSDaH_tsBhsqZ9BUm8epbm_VPwsu2ojRBGqUXA8iRry7Ce8fhzBAfTGsNVm0DLyYuQ5gjL6eL8gLiAYx3qxQp6m5aac7xOaJSjU2_KDkS6fchS6tu4FYqEcPJ1BDcNS9NU/s640/zhuzh_find.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Count components on the page by searching in element tab</td></tr>
</tbody></table>
<br />
Combining these selectors will ensure I only get the button class for the relevant region. This is what forms my destination selector in the appendTo().<br />
<br />
<h4>
Testing the move</h4>
<br />
We can test the final command in the Console tab of the browser tools.<br />
<br />
<code>$('#P29_DEPT_Z_CONTAINER').appendTo('#zhuzh .t-Region-headerItems--buttons')</code><br />
<br />
If I test this without using the #id selector, then the radio HTML will be appended to <i>both </i>regions.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijjIGu62zVNbFVlhPAWqXmeK-OrYFSvrKRnyQLCEJldti0GnvPSQU4xhIVnhIXHcvdkltzMOgaEO6DG8nySEpGf-Zz0jEnJBoFi1yQMAvx9o5N-9Z_ser2Mp9euQ8xkxEL6QANh3gK1QM/s1600/zhuzh_console.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="724" data-original-width="1249" height="370" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijjIGu62zVNbFVlhPAWqXmeK-OrYFSvrKRnyQLCEJldti0GnvPSQU4xhIVnhIXHcvdkltzMOgaEO6DG8nySEpGf-Zz0jEnJBoFi1yQMAvx9o5N-9Z_ser2Mp9euQ8xkxEL6QANh3gK1QM/s640/zhuzh_console.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Test your command within the runtime page</td></tr>
</tbody></table>
<br />
Once you're happy with the result, you can add it to the relevant portion of your page. In this case, I put it in the page attributes 'Execute on Page Load', though often it's within a <a href="http://www.grassroots-oracle.com/2016/10/otn-appreciation-day-apex-dynamic-actions-jquery-selector.html" target="_blank">dynamic action</a>.<br />
<br />
<h4>
Playing with CSS</h4>
<br />
While we're here, it would be remiss of me to mention how you can play with the CSS attributes in the browser tools.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaQ6PT6jZ86MM41Wvr4bdnpxB0-fxci1c66V-MsFuEyqanDxZ9xjhQAOiHzSLR_Zw6XJhwlUwGMNZgYUyhbGJpTP0KTfpqHPBhIDMF4epTRXEI9HwrU5t6BDi8Y7M0B7BjgHv1tWHyucU/s1600/zhuzh_css.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="793" data-original-width="1201" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaQ6PT6jZ86MM41Wvr4bdnpxB0-fxci1c66V-MsFuEyqanDxZ9xjhQAOiHzSLR_Zw6XJhwlUwGMNZgYUyhbGJpTP0KTfpqHPBhIDMF4epTRXEI9HwrU5t6BDi8Y7M0B7BjgHv1tWHyucU/s640/zhuzh_css.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Play with styling on the rendered page</td></tr>
</tbody></table>
<br />
In this example I found the background colour property of the radio group label, and turned it green.<br />
<br />
This was done without re-rendering the page, but it's only relevant until I do re-render the page, just like when we applied the console command to move the radio group.<br />
<br />
But it's a great way to test/tweak CSS commands to see the result before applying it as CSS content rendered with the rest of your page.<br />
<br />
The syntax would be similar, we would take a selector, but in the same syntax as what's found in the Styles sub-tab. You can copy/paste from the tab if you're not sure.<br />
<br />
<code>.t-Region-headerItems--title {color : red}</code><br />
<br />
This CSS in the page would apply the styling during render of all page markup, but we could also do this on demand with jQuery, with just a slight adjustment to the syntax - and this is but one variation.<br />
<code>$('.t-Region-headerItems--title').css('color', 'red');</code><br />
<br />
<h4>
Conclusion</h4>
<br />
These concepts can arm you with some nifty behaviours, above and beyond what comes with APEX.<br />
<br />
Or to think of it a different way, if can really empower your use of dynamic actions, as the same instruments can be wielded as a jQuery selector, dynamic action condition, part of set value action, to name a few.<br />
<br />
Doing this with an <a href="https://community.oracle.com/message/15576314" target="_blank">Interactive Report</a> also provided extra challenges.<br />
<br />
See a video on how to action this blog <a href="https://youtu.be/AHSmM24eVQk" target="_blank">here</a>, and the app <a href="https://apex.oracle.com/pls/apex/sage/r/scott_ut/zhuzh" target="_blank">here</a>.<br />
<br />
Happy APEXing!Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-40356036276287032262020-03-15T21:34:00.000+08:002020-03-15T21:34:16.004+08:00Tweaking Classic ReportsI like classic reports in Oracle APEX.<br />
<br />
They're so versatile, and while it may not look it in this example, adjusting particular declarative settings can make a real difference in a small region displaying pivotal data.<br />
<br />
And this still looks like a report. You should see <a href="https://blogs.oracle.com/apex/thats-a-classic-report-really" target="_blank">what else they can do</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRx2HyLO929eykwTQAUyr-LWNXeLbdm2yCYdatTDk0dON9mL1qls0C1Y90Vbk7fd3NYdlz9_8-nZUpd3cCyFlheBxZ3GDR1ezAFUgEau0pQwGTOK_Q6UqN1EzeRgR1xZ7Kj2m4tyTB7x0/s1600/zhuzh.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="668" data-original-width="1197" height="357" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRx2HyLO929eykwTQAUyr-LWNXeLbdm2yCYdatTDk0dON9mL1qls0C1Y90Vbk7fd3NYdlz9_8-nZUpd3cCyFlheBxZ3GDR1ezAFUgEau0pQwGTOK_Q6UqN1EzeRgR1xZ7Kj2m4tyTB7x0/s640/zhuzh.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Left region is default settings, right region has a few options set</td></tr>
</tbody></table>
<br />
<h4>
Base Behaviour</h4>
The classic report is straight out of the wizard, this example performs a cross join to inflate the data set.<br />
<code>select e.* from emp e cross join emp e2<br />
where :P29_DEPT is null or e.deptno = :P29_DEPT</code><br />
<br />
A where clause has been added to filter by Dept, if supplied.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWUKav1yu09J7kAaNhsL-ptrR-Q3h0VP4yaIBvmnSJeEwdLr8gnAewQ-zAYpGvvdlleiCKN7pzkduygpNHRubs1MA5is2NAosGpNdfScCKopPtuIdF5neXHUho0SHX8b_pY-5xM6GfB9c/s1600/zhuzh_sql.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="116" data-original-width="345" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWUKav1yu09J7kAaNhsL-ptrR-Q3h0VP4yaIBvmnSJeEwdLr8gnAewQ-zAYpGvvdlleiCKN7pzkduygpNHRubs1MA5is2NAosGpNdfScCKopPtuIdF5neXHUho0SHX8b_pY-5xM6GfB9c/s1600/zhuzh_sql.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Page Items to Submit</td></tr>
</tbody></table>
<br />
Note one of the most important properties in APEX - Page Items to Submit, in this case nominating the P29_DEPT item.<br />
<br />
There is a Dynamic Action defined on Even Change for the item, which simply refreshes the nominated region.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgArkUxOCQY2BpqfUbBFEFKM1b0gAv6V4OwgZvEK0PCE1_8gl__v5xv8j5ftkQZL2eRoIpgNN42zW15IUd95mR3BTlTXpT8rBthnojJldIJ3HugMQwIJHkFQ0g6HmMpikc8Zvi6R32xpGQ/s1600/zhuzh_da.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="144" data-original-width="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgArkUxOCQY2BpqfUbBFEFKM1b0gAv6V4OwgZvEK0PCE1_8gl__v5xv8j5ftkQZL2eRoIpgNN42zW15IUd95mR3BTlTXpT8rBthnojJldIJ3HugMQwIJHkFQ0g6HmMpikc8Zvi6R32xpGQ/s1600/zhuzh_da.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Simple Dynamic Action</td></tr>
</tbody></table>
<br />
If we don't set Page Items to Submit on the region, then the database won't know about the change made on the browser. Any item specified in this list upon refresh will have the current value set in the browser sent to APEX session state (a key/value table in the database), so when the query binds the value, the database knows what the browser knows.<br />
<br />
So when I select a department, the employee list refreshes to show the relevant department.<br />
<br />
<h4>
Make Left look like Right</h4>
<div>
This may seem like a long list, but it doesn't take long at all once you know where to click. I estimate 23 clicks, as of 19.2.</div>
<ol>
<li>Modify Region properties</li>
<ol style="list-style-type: lower-alpha;">
<li>Change Template Options for region</li>
<ol style="list-style-type: lower-roman;">
<li>Tick Remove Body Padding</li>
<li>Tick Show Region Icon</li>
</ol>
<li>Add Icon: <code>fa-list</code></li>
<li>Add Static ID: <code>zhuzh</code></li>
</ol>
<li>Modify Report properties</li>
<ol style="list-style-type: lower-alpha;">
<li>Change Template Options for report</li>
<ol style="list-style-type: lower-roman;">
<li>Tick Stretch Report</li>
<li>Report Border Horizontal Only</li>
</ol>
<li>Change Pagination Type to Search Engine.</li>
<li>Sometimes you may which to turn Heading Type from Custom to Off, or at least disable the sort (by adding order by to SQL, or disabling sort on columns)</li>
</ol>
<li>Modify Item properties</li>
<ol style="list-style-type: lower-alpha;">
<li>Change Type to Radio Group</li>
<li>Change Number of Columns to 4 (something relevant to your list. Usually useful for items with small number of options)</li>
<li>Change template option Item Group Display to Display as Pill Button</li>
</ol>
<li>Modify Page Property</li>
<ol style="list-style-type: lower-alpha;">
<li>Set Execute when Page Loads<br />
<code>$('#P29_DEPT_Z_CONTAINER').appendTo('#zhuzh .t-Region-headerItems--buttons')</code><br />
This moves everything holding the radio group together, to a spot made for buttons in the region.<br />Not something I do often, but can be an economic use of space.</li>
</ol>
</ol>
<br />
<h4>
Notes</h4>
<br />
We've found the search engine pagination style great for touch devices, but I tend to prefer the Display Position on the Left, and at the Top, or at least Top & Bottom.<br />
<br />
Report Template Options offer a facility to hide pagination when all rows displayed, but I've never seen it consistently work as I expect, so I continue to use my own JS library call for that.<br />
<br />
The static ID can be whatever you like, so long as it doesn't clash with other IDs on the page, such as item names.<br />
<br />
See my next post for more detail on how I derived that line of JavaScript, and what you can do with the browser tools.<br />
<br />
See a video on how to action this blog <a href="https://youtu.be/JnToWDT-tbc" target="_blank">here</a>.Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-16246459168569456932020-03-15T16:54:00.001+08:002020-03-15T16:54:35.161+08:00Friendly URLs in APEX 20.1We can finally add 'native' to the <a href="https://community.oracle.com/thread/3786640" target="_blank">list of choices</a> when it comes to 'prettified' URLs, as Oracle APEX 20.1 honours the <a href="https://apex.oracle.com/en/learn/resources/sod/" target="_blank">statement of direction</a> with a simple checkbox in application properties.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhum1I5dgBxwcFJo5TlGlJaPPUC9ml1AZ-1qO7dGVAMcfbmoGjTo0qzCbnB6re5Ohm6QbwtO0Aw1x9OIYTaq8HsYTGXEEmUKaSfmuyTySWMdT-0bhrCsIsoD4jCEhHb1OPSp3JgQC3o1Y4/s1600/20.1.friendly_urls.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="252" data-original-width="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhum1I5dgBxwcFJo5TlGlJaPPUC9ml1AZ-1qO7dGVAMcfbmoGjTo0qzCbnB6re5Ohm6QbwtO0Aw1x9OIYTaq8HsYTGXEEmUKaSfmuyTySWMdT-0bhrCsIsoD4jCEhHb1OPSp3JgQC3o1Y4/s1600/20.1.friendly_urls.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">APEX 20.1 Application Properties - Friendly URLs</td></tr>
</tbody></table>
<br />
I tried this with old & new applications, and it appears to be case insensitive.<br />
<br />
<a href="https://apex.oracle.com/pls/apex/sage/r/SCOTT_UT/Zhuzh?P29_DEPT=10">https://apex.oracle.com/pls/apex/sage/r/SCOTT_UT/Zhuzh?P29_DEPT=10</a><br />
<br />
APEX also appears to honour either format, regardless of the setting.<br />
<br />
<a href="https://apex.oracle.com/pls/apex/sage/r/swesley_forum_ut/emp?p6_empno=7566&p6_mode=R">https://apex.oracle.com/pls/apex/sage/r/swesley_forum_ut/emp?p6_empno=7566&p6_mode=R</a><br />
<br />
It contains the workspace name, application and page aliases (if present), however this obfuscates key reference information a developer users hourly ;p<br />
<br />
I wonder if there will be a related API?<br />
<br />
I know some people yearn for this, but is it <i>really </i>that prettier than the original?<br />
<br />
<a href="https://apex.oracle.com/pls/apex/f?p=64956:6:::::P6_EMPNO,P6_MODE:7566,R">https://apex.oracle.com/pls/apex/f?p=64956:6:::::P6_EMPNO,P6_MODE:7566,R</a><br />
<br />
Time may tell. It usually does.<br />
<br />Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com5tag:blogger.com,1999:blog-4818542164384221282.post-77290106455625930542020-02-18T23:28:00.001+08:002020-02-18T23:28:13.738+08:00APEX Component Settings for SwitchWhile I point out a 'hidden' setting for Switch items in APEX, I want to comment on two related item types found in Oracle APEX => radio buttons and checkboxes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO8hSemTFlMaV4TmNLQzh_0HENcdN0e6fJfzWmvkv0yDeIanHaF8o8RG0kB9RoEXNI6JYrTVOtaIHSzADSUw-hAn0Uuswyf0oDxY4MckCNPNBn-Vk_hW9sqH_fD62Zk9eNiOJmhvR0xlA/s1600/switch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="108" data-original-width="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO8hSemTFlMaV4TmNLQzh_0HENcdN0e6fJfzWmvkv0yDeIanHaF8o8RG0kB9RoEXNI6JYrTVOtaIHSzADSUw-hAn0Uuswyf0oDxY4MckCNPNBn-Vk_hW9sqH_fD62Zk9eNiOJmhvR0xlA/s1600/switch.png" /></a></div>
<br />
<h4>
1) Radio button</h4>
I <a href="https://twitter.com/swesley_perth/status/1126357856385503232" target="_blank">really think</a> the standard Template Option for radio groups should 'Display as Pill Button'<br />
<br />
It really provides a simple and effective UX when a small set of options are on offer. Touch devices can select the option as if it's a button, and mouse users only need one click, compared to a select list requiring two. And the click doesn't need to be precise for those tiny <a href="http://www.grassroots-oracle.com/2017/03/oracle-apex-radio-group-universal-theme-button.html" target="_blank">radio group circles</a>. I wish the application builder adopted the pill button approach more often.<br />
<br />
And it's real easy to hook a <a href="http://www.grassroots-oracle.com/2016/10/otn-appreciation-day-apex-dynamic-actions-jquery-selector.html" target="_blank">dynamic action</a> on change of the radio group, perhaps to refresh a classic report with data limited to the selected option. (Don't forget to add page items to submit!)<br />
<br />
<h4>
2) Switch</h4>
<div>
The Switch item was the answer to a number of methods of deploying an "iPhone-like" on/off switch.</div>
<div>
I actually wrote an (internal) item plugin to do just this, but I much prefer using the native option.</div>
<div>
<br /></div>
<div>
A frequent question relates to how switches are rendered. If you don't see what you expect, have a look in Shared Components -> Component Settings.</div>
<div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYMhlK9tdR38wMJZMhKrBBc0lqNOy-5mNjYei1y7jdc3KfyM4Ik9bbVINUJNf3TE0m4fIbq5x6Tjhf1uVezPYqXDSUFGLmaC03A0Gi8kRdQiLwivczMxXElB0qrtA_tYUlg0p5M7Z-Jtg/s1600/component_settings.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="330" data-original-width="735" height="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYMhlK9tdR38wMJZMhKrBBc0lqNOy-5mNjYei1y7jdc3KfyM4Ik9bbVINUJNf3TE0m4fIbq5x6Tjhf1uVezPYqXDSUFGLmaC03A0Gi8kRdQiLwivczMxXElB0qrtA_tYUlg0p5M7Z-Jtg/s640/component_settings.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Application -> Shared Components -> Component Settings</td></tr>
</tbody></table>
</div>
<div>
<br /></div>
<div>
Personally I prefer the 'Pill Button' look, for reasons above. I find the APEX Application Builder seems more washed out with all the Switches in the properties bar, compared to the more softened On/Off pill buttons. If I could change this at the builder level, I would.</div>
<div>
<br /></div>
<div>
The offerings will vary depending on your APEX version, and if the application's Universal Theme has been <a href="http://www.grassroots-oracle.com/2016/12/upgrading-universal-theme.html" target="_blank">refreshed</a>. </div>
<div>
<br /></div>
<div>
Application level settings for plugins can also be found in Component Settings, in addition to built-in APEX feature tweaks. These can something you choose to review after an APEX version upgrade.</div>
<div>
<br /></div>
<h4>
3) Checkbox</h4>
It seems the humble HTML checkbox will always be extant, regardless of the pain it brings to tabuler forms. However, it suffers the same precision requirement as the native radio group selections - though better deployments allow selection using the label as well.<br />
<br />
Go with the Switch (as a pill).<br />
<br />
What do you think?<br />
<br />
<br />Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-72599169391896692282020-02-10T22:28:00.000+08:002020-06-04T11:49:37.565+08:00Validate data type within SQLFor all those pushing data around, especially dirty data, this one is for you.<br />
<br />
Today I was preparing to process data I loaded from a spreadsheet.<br />
A simple filter was required - to ignore the header row, had it been included.<br />
<br />
I'm lucky enough to be working on 19c, and I remembered that a reasonably new function should help me out with all many of data loading issues. With a quick scan of my favourite <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/index.html" target="_blank">reference manual</a>, I found <code>VALIDATE_CONVERSION</code>.<br />
<br />
For example, this gives me 'ORA-01722 invalid number' because of the header row I failed to exclude.<br />
<pre class="brush:sql">select c.*
from my_data_load c
order by to_number(seq);</pre>
But without the to_number, the order returns incorrectly.<br />
<pre class="brush:sql">SEQ
-----
1
10
12
140
2
Order</pre>
Sure, we could say<br />
<code>where seq != 'Order'</code><br />
<br />
But this tool will have more than one use<br />
<pre class="brush:sql">select c.*
from my_data_load c
where validate_conversion(seq as number) = 1
order by to_number(seq);
SEQ
-----
1
2
10
12
140</pre>
<br />
Recreate this result using<br />
<pre class="brush:sql">select * from (
select 'Order' seq from dual
union all select '1' from dual
union all select '2' from dual
union all select '10' from dual
union all select '12' from dual
union all select '140' from dual
)
where validate_conversion(seq as number) = 1
order by to_number(seq)</pre>
And see typical return values (0 or 1) for conversion attempts using<br />
<pre class="brush:sql">select
validate_conversion('1' as number) num1
,validate_conversion('2' as number) num2
,validate_conversion('1b' as number) num_not
,validate_conversion('01-01-2001' as date) date1
,validate_conversion('30-02-2000' as date, 'dd-mm-yyyy') date2
from dual;
NUM1 NUM2 NUM_NOT DATE1 DATE2
---------- ---------- ---------- ---------- ----------
1 1 0 0 0</pre>
It's one of a few tools I'm using to make data loading life easier, and processing data in sets using SQL, not looping & context switching within PL/SQL.<br />
<br />
The kicker, turns out this has been available since 12.2.<br />
<br />
It turns out the usage of validate_conversion in PL/SQL will give the compilation warning PLW-06009. And so does the <a href="https://asktom.oracle.com/pls/asktom/asktom.search?tag=plsql-optimize-level-3-produces-wrong-function-result#9537619800346635174" target="_blank">alternative</a> to check if this returns null:<br />
<code>to_date('z-z-2001' default null on conversion error, 'dd-mm-yyyy')</code><br />
<br />
More examples available from<br />
<a href="https://livesql.oracle.com/apex/livesql/file/tutorial_EDVE861IMHO1W3Q654ES9EQQW.html" target="_blank">LiveSQL</a><br />
<a href="https://oracle-base.com/articles/12c/conversion-function-enhancements-12cr2" target="_blank">Tim Hall</a><br />
<a href="http://db-oriented.com/2017/06/18/write-even-less-with-more-validate_conversion/" target="_blank">Oren Nakdimon</a><br />
<a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/VALIDATE_CONVERSION.html#GUID-DC485EEB-CB6D-42EF-97AA-4487884CB2CD" target="_blank">19c Documentation</a>Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-63811583669027218922020-01-29T22:32:00.000+08:002020-03-18T08:53:00.743+08:00Unpivoting Oracle APEX meta-dataThere are APEX dictionary views for <i>most </i>of the data that represents the 'source' that is your APEX application meta-data.<br />
<br />
<b>Note:</b> <i>This post has beeen updated to reflect me not looking very hard, but I added a performance comparison... just because.</i><br />
<br />
Today I found one place where I really wanted to run a query to find references to potential data - application substitution strings.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNjo3jauZnYO6rveygnwaq1V0oqfyI6toU6RDG5WVJukBwQ0xU5Us8izsLq769vrTHHrgZDUisvNlrl-Rp8kq4wzw5D26ZSy4vr_-pc1X2p8UJiw_eTK5e5ad5h5ZivymurrIIEpNfWrQ/s1600/app_sub.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="118" data-original-width="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNjo3jauZnYO6rveygnwaq1V0oqfyI6toU6RDG5WVJukBwQ0xU5Us8izsLq769vrTHHrgZDUisvNlrl-Rp8kq4wzw5D26ZSy4vr_-pc1X2p8UJiw_eTK5e5ad5h5ZivymurrIIEpNfWrQ/s1600/app_sub.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">APEX Application Substitution Strings</td></tr>
</tbody></table>
<br />
And yes, I have a <a href="http://www.grassroots-oracle.com/2015/08/apex-5-colour-contrast.html" target="_blank">CSS rule</a> to right-align those names, to make it easier to read.<br />
<br />
I couldn't find any references in the APEX dictionary <i>(correction, see below)</i>, so I looked in the Oracle data dictionary to find where it may live.<br />
<pre class="brush:sql">select * from all_tab_columns
where column_name like 'SUB%03';</pre>
So not only are these stored in a place inaccessible to us mere-mortal developers, they are also stored in 20 sets of name/value columns - not rows.<br />
<br />
This means if you have a dozen applications, with references in slightly different locations for each application, then string searches might be a pain.<br />
<br />
Unpivot to the rescue!<br />
<pre class="brush:sql;highlight:[24];">select * from (
select id app_id, alias, name -- key facts
-- all the substitution stringz!
,substitution_string_01, substitution_value_01
,substitution_string_02, substitution_value_02
,substitution_string_03, substitution_value_03
,substitution_string_04, substitution_value_04
,substitution_string_05, substitution_value_05
,substitution_string_06, substitution_value_06
,substitution_string_07, substitution_value_07
,substitution_string_08, substitution_value_08
,substitution_string_09, substitution_value_09
,substitution_string_10, substitution_value_10
,substitution_string_11, substitution_value_11
,substitution_string_12, substitution_value_12
,substitution_string_13, substitution_value_13
,substitution_string_14, substitution_value_14
,substitution_string_15, substitution_value_15
,substitution_string_16, substitution_value_16
,substitution_string_17, substitution_value_17
,substitution_string_18, substitution_value_18
,substitution_string_19, substitution_value_19
,substitution_string_20, substitution_value_20
from apex_190200.WWV_FLOWS -- direct from underlying view
)
unpivot (
(str, val) -- new columns
for rec in -- denoted by
((substitution_string_01, substitution_value_01) as '01'
,(substitution_string_02, substitution_value_02) as '02'
,(substitution_string_03, substitution_value_03) as '03'
,(substitution_string_04, substitution_value_04) as '04'
,(substitution_string_05, substitution_value_05) as '05'
,(substitution_string_06, substitution_value_06) as '06'
,(substitution_string_07, substitution_value_07) as '07'
,(substitution_string_08, substitution_value_08) as '08'
,(substitution_string_09, substitution_value_09) as '09'
,(substitution_string_10, substitution_value_10) as '10'
,(substitution_string_11, substitution_value_11) as '11'
,(substitution_string_12, substitution_value_12) as '12'
,(substitution_string_13, substitution_value_13) as '13'
,(substitution_string_14, substitution_value_14) as '14'
,(substitution_string_15, substitution_value_15) as '15'
,(substitution_string_16, substitution_value_16) as '16'
,(substitution_string_17, substitution_value_17) as '17'
,(substitution_string_18, substitution_value_18) as '18'
,(substitution_string_19, substitution_value_19) as '19'
,(substitution_string_20, substitution_value_20) as '20'
)
)
order by app_id, str </pre>
This query transposes all the string/value columns into rows, each denonimated by the new "REC" column.<br />
<br />
Note, this query can only be executed by those with the APEX Administrator Role, and if you want to have it within a view that could be executed by other schemas, then select access on wwv_flows is needed with grant option.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiud2CcBvED6mXi1RjvneEPvKweuR2KI4CRHpbiUaB307plqAV75optvShjxvjwX_qKXa6M3ayVT8XbZRoN0YGx2-RinWS2-wCL-O6HgvnOgYDyHeJO1ltHfrVSS4P5wfmqtDYOutKcq78/s1600/app_sub_result.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="193" data-original-width="667" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiud2CcBvED6mXi1RjvneEPvKweuR2KI4CRHpbiUaB307plqAV75optvShjxvjwX_qKXa6M3ayVT8XbZRoN0YGx2-RinWS2-wCL-O6HgvnOgYDyHeJO1ltHfrVSS4P5wfmqtDYOutKcq78/s1600/app_sub_result.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Columns unpivoted into rows</td></tr>
</tbody></table>
<br />
By placing the query in a view, I can now make queries like this to find any substitution strings in any applications that have date references.<br />
<pre class="brush:sql">select * from apx_app_sub_strings
where val like 'APP_DATE%';</pre>
Pretty neat, well at least as far as what I was trying to do.<br />
<br />
This query may break in future versions, as it's based on an underlying, undocumented view.<br />
I also think that once upon a time, there were fewer pairs.<br />
<br />
<b>Update:</b> As the community quickly pointed out, I missed & forgot about a view already dedicated for such a task. I was too busy looking for a column number, when really I should have used <code>APEX_APPLICATION_SUBSTITUTIONS</code>.<br />
<br />
I thought I'd see how 'they' solved the problem, and I was a little surprised to see a bunch of <code>UNION</code> statements.<br />
<pre class="brush:sql">SELECT ...
f.substitution_string_18,
f.substitution_value_18,
f.substitution_string_19,
f.substitution_value_19,
f.substitution_string_20,
f.substitution_value_20
from wwv_flow_authorized auth,
wwv_flows f
where f.id = auth.application_id )
select workspace,
workspace_display_name,
application_id,
application_name,
substitution_string_01 as substitution_string,
substitution_value_01 as substitution_value
from substitution
where substitution_string_01 is not null
union all
select workspace,
workspace_display_name,
application_id,
application_name,
substitution_string_02 as substitution_string,
substitution_value_02 as substitution_value
from substitution
where substitution_string_02 is not null
union all...</pre>
After seeing this I couldn't help but run a brute for comparison, running both solutions x times.<br />
<pre>iterations:5000
16.55 secs (.003310 secs per iteration) -- union all
6.54 secs (.001308 secs per iteration) -- unpivot
</pre>
I made sure the underlying join was the same, and I'm not all that surprised the <code>unpivot</code> did the job quicker.<br />
<br />
Update 2: It <a href="https://twitter.com/swesley_perth/status/1240078419137724416" target="_blank">appears 20.1</a> has gone with unpivot.Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com4tag:blogger.com,1999:blog-4818542164384221282.post-81998792018543173352020-01-16T15:56:00.000+08:002020-01-16T15:57:55.730+08:00Performance on Classic Reports with LOVsJust an observation made yesterday that I thougt was worth everone's consideration.<br />
<br />
I created a <i>classic report </i>on a reference table with a touch over 1000 rows, with pagination set at 150 rows per page.<br />
<br />
That’s all I had on the page.<br />
<br />
The table had it's own set of lookups for a couple of columns, so I assigned two LOVs I already defined in Shared Components.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxnv8sv6kn0CDzZEiOwpZumPbeTRnkFINmgWNA1scncOkYX9viGaGoNKGs5NxWzzMeYJVQ3hqy6uMTz_yYmPgZXU-jg3LcccRZ9-J7DVcWsBMsLEfBFr5L7QvNKNgtA7cDr7xzcASn4Vk/s1600/classic_lov.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="189" data-original-width="357" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxnv8sv6kn0CDzZEiOwpZumPbeTRnkFINmgWNA1scncOkYX9viGaGoNKGs5NxWzzMeYJVQ3hqy6uMTz_yYmPgZXU-jg3LcccRZ9-J7DVcWsBMsLEfBFr5L7QvNKNgtA7cDr7xzcASn4Vk/s320/classic_lov.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Classic Report LOV</td></tr>
</tbody></table>
<br />
Next minute, I had a simple reference page taking <b>10 seconds </b>to load.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPmLip3KloxKsPedp5p3KfIc7NleqrGApRrry1ZVBOn2rnCEp00JvSvaMNgwNTrze5ZdhfyV0KcAhipvUjQK7iC3E-13_Z5NS2Ieqdf4sUSOJEeX1XjrHYDCsIWNetsyHvEDZe37MYvWo/s1600/10seconds.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="249" data-original-width="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPmLip3KloxKsPedp5p3KfIc7NleqrGApRrry1ZVBOn2rnCEp00JvSvaMNgwNTrze5ZdhfyV0KcAhipvUjQK7iC3E-13_Z5NS2Ieqdf4sUSOJEeX1XjrHYDCsIWNetsyHvEDZe37MYvWo/s1600/10seconds.png" /></a></div>
<br />
This is information from <a href="http://www.grassroots-oracle.com/2018/10/odc-appreciation-day-apex-workspace-activity-log.html" target="_blank">apex_workspace_activity_logs</a>, showing results where no LOV was applied, two LOVs, and just one. I later found the number of rows shown in the pagination set also varied the result.<br />
<br />
As I removed one of the LOVs, I quickly realised this was the problem.<br />
<br />
I ran the page in <a href="https://docs.oracle.com/en/database/oracle/application-express/18.2/htmdb/utilizing-debug-mode.html#GUID-65F66F2B-ADCB-41B2-8EEE-3B7D7603F50C" target="_blank">debug mode</a>, to see if something crazy was happening as it constructed the query.<br />
When I used debug = YES, it pinned all the effort onto the one line item - but not the query itself.<br />
<code>rows loop: 150 row(s)</code><br />
<br />
Looking again using LEVEL9, I could see that every row took a bit of work, not just the query.<br />
In fact each row had <b>three </b>debug line items referencing my LOV lookup SQL.<br />
<pre class="brush:sql">begin begin SELECT name display_value, id return_value
bulk collect into wwv_flow_utilities.g_display,wwv_flow_utilities.g_value
FROM my_secondary_ref
WHERE SYSDATE BETWEEN eff_start AND COALESCE(eff_end, SYSDATE)
ORDER by 1
; end;
end;</pre>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSK3mPLbc9HTVy5r9sP162StqRMpXTlyrwssB1iJM2WkogGLcNystSTmer0CR8LF63QWwLX7y0ClIvvUbtvWHMizdWFBdOnqEUF2GKPEtL_uXKuonw3xJO1ujsD61HgsAsb8_TdRlu4R8/s1600/debug_lov.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="198" data-original-width="682" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSK3mPLbc9HTVy5r9sP162StqRMpXTlyrwssB1iJM2WkogGLcNystSTmer0CR8LF63QWwLX7y0ClIvvUbtvWHMizdWFBdOnqEUF2GKPEtL_uXKuonw3xJO1ujsD61HgsAsb8_TdRlu4R8/s640/debug_lov.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Debug chart</td></tr>
</tbody></table>
<br />
<a href="https://twitter.com/cczarski/status/1216969333886328832" target="_blank">Apparently</a> these are only melded into the SQL for IR/IG, not Classic Reports. Context switching kills the page instead - well, at least 149 extra executions of the one statement.<br />
<br />
I ran another test so I could check <a href="http://www.grassroots-oracle.com/2012/02/apex-variables-in-sql.html" target="_blank">v$sqlarea</a>, and sure enough, there are far more executions of this lookup tha necessary - unnecessarily churning the CPU.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEKeTIkrUOhg5qho7mjzWinoYjgGvUF4z2e8KsRFtynjLpcu1-N5OLpEIy_OStz9UUyoAtipkxVqs4Z_E-83XsUG8QizDuC3bpKm4q62l8L5FUrnWomavNF4lzPgTYr46UhVMZohPTVaI/s1600/sqlarea_lov.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="63" data-original-width="838" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEKeTIkrUOhg5qho7mjzWinoYjgGvUF4z2e8KsRFtynjLpcu1-N5OLpEIy_OStz9UUyoAtipkxVqs4Z_E-83XsUG8QizDuC3bpKm4q62l8L5FUrnWomavNF4lzPgTYr46UhVMZohPTVaI/s640/sqlarea_lov.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">v$sql_area status</td></tr>
</tbody></table>
<br />
I’ve tended to embed these in my queries anyway, often as some form of <a href="https://oracle-base.com/articles/misc/efficient-function-calls-from-sql" target="_blank">scalar subqery</a>.<br />
This is a habit I started as a <a href="http://www.grassroots-oracle.com/2018/09/oracle-forms-to-apex-ide-transition.html" target="_blank">Oracle Forms</a> developer, since Post-Query lookups made repeated network calls that just slowed the application down.<br />
<pre class="brush:sql">select sm.*
,(select name
from my_lookup m
where sm.id = m.id) my_desc
from some_model sm</pre>
This makes me really wonder how much of our existing page generation time is spent on this work?<br />
Even on small classic report regions. This all adds up.<br />
If only there was a way I could find all occurences of LOVs used in classic reports... wait a minute! I can query the APEX dictionary! ;p<br />
<pre class="brush:sql">select application_id, pagE_id, page_name, region_name
,(select maximum_rows_to_query
from apex_application_page_regions r
where r.region_id = c.region_id) nbr_rows
, column_alias, heading
, named_list_of_values, inline_list_of_values
, column_is_hidden, condition_type
,build_option, column_comment
from apex_application_page_rpt_cols c
where application_id = 102
and display_as_code = 'TEXT_FROM_LOV'
order by nbr_rows desc</pre>
It's a shame such a nify declarative feature impacts performance this way.Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-83155667453054024042020-01-15T20:59:00.002+08:002020-01-15T21:02:26.730+08:00So you've submitted an abstractYou've thought hard about your <a href="http://www.grassroots-oracle.com/2019/11/so-you-want-to-submit-a-conference-abstract.html" target="_blank">conference talk ideas</a>; you then fleshed out your idea and worked hard on an abstract; and finally you plucked up the courage to make the submission to that big conference.<br />
<br />
What next?<br />
<br />
<i>Keep momentum.</i><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvYJgbkq2XQxqJQJmCaeXMB7VJMxfpdLgJ3P8fagi5NVfiKPF1JM-QJFOiVre0W0a_yk9OjQUrC_3tX7vwhtBnFRvL4RwrgEsC_Abc9P8oMl81socK7-eFUlEdbHK6UKeqoLa4c0ChJz4/s1600/newtons-cradle_resize_md.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="389" data-original-width="744" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvYJgbkq2XQxqJQJmCaeXMB7VJMxfpdLgJ3P8fagi5NVfiKPF1JM-QJFOiVre0W0a_yk9OjQUrC_3tX7vwhtBnFRvL4RwrgEsC_Abc9P8oMl81socK7-eFUlEdbHK6UKeqoLa4c0ChJz4/s400/newtons-cradle_resize_md.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">#physics</td></tr>
</tbody></table>
<br />
It really depends on the style of your talk, but in most cases, just keep whatever momentum you have (or had back in December), and work on it in some form every week.<br />
<br />
Wait, abstracts closed. Public voting complete. Aren't I just waiting for a March notification before I bother starting?<br />
<br />
No.<br />
<br />
There are a few reasons you could be working on your talks each week. For instance:<br />
<ol>
<li><b>Rome wasn't built in a day</b> - it depends, but a reasonable talk should take at least 20 hours to develop, plus the time needed to gather the experience the talk represents, past, present, or future. Presentations left to the last minute can look & sound like it. Presentations started early will have time to cultivate, allow your ideas to progress as you write up progress so</li>
<li><b>Experience</b> - even if your talk isn't accepted, you have gained the experience necessary for a topic you've considered worthy enough to talk about it. Maybe you've already gained the experience, but compiling your thoughts will help you gain a deeper understanding of the topic.<br />Maybe you gathered a few important insights along the way.</li>
<li><b>Aim high </b>- OK, maybe you end up getting a "sorry, not this time" email for the big conference. So what's happening locally? Do you have a regular meetup nearby? Is there another conference where this talk would fit well? Would the team at your current workplace benefit from listening to your talk for an hour? If you write it, people will come.</li>
</ol>
<div>
And as an extra tip </div>
<div>
<ul>
<li><b>Transform your speaker notes into search engine fodder </b><br />I need to do this more often. I've seen more organised folk post their notes on GitHub, or as some sort of blog post. As a developer, sometimes I stumble across a great set of slides, but yearn for a little more context or content. It will always be useful for somebody, won't hurt your SEO, and you'll thank yourself immediately, and again in 6 months time when you google your own post.</li>
</ul>
</div>
How am I tackling my own submissions?<br />
<br />
Slow at first, it's been a busy summer, but now I'm back at work building things, I feel like getting back into regular time aside.<br />
<br />
I've submitted four ideas, to help my chances of being accepted. Maybe one idea is really good, but every other Tom, Dick, and Henrietta has submitted some variation of that idea. Perhaps your secondary submission fits rather well instead, among all the rest?<br />
<br />
And given the thoughts above, I could make progress on all these ideas, knowing that they'll be useful somewhere along the line. Our local user group always seem happy to have me yak on about APEX.<br />
<br />
Anyhoo, these were the titles for my Kscope20 submissions.<br />
<ul>
<li>Oracle Reports to AOP Case Study</li>
<li>Visualising APEX Performance Monitoring</li>
<li>Navigating APEX Version Upgrades</li>
<li>A Practical Guide to APEX Authorisation Schemes</li>
</ul>
I was involved in the <a href="https://kscope20.odtug.com/page/abstract-public-voting" target="_blank">public voting</a> exercise, and I not only saw some similar submissions, but a whole bunch of submissions on ideas I've considered, had, or wished that I had. Even if only a third of those submissions ever get produced, there's going to be some amazing content out there.<br />
<br />
My titles are a little utilitarian, and lack some awesome word play I saw when reviewing abstracts, but I'm pretty excited about the building the content.<br />
<br />
What am I doing to prepare these? I haven't got to this yet, have I?<br />
<ul>
<li><b>AOP </b>- I strategically chose this topic as I'm learning this as part of business as usual at work. My aim is to present a cheat-sheet style session to help new AOP developers hit the ground running. All I need to do is show up to work each day to prepare, though I need bed down the session structure.</li>
<li><b>APEX Performance monitoring </b>- I've been writing charts & reports on these log tables for years, and I have the confidence I can piece together this presentation at will. I've offered different formats, so it may even be hands-on.</li>
<li><b>Version upgrades </b>- I've done a few of these over time, and I've been making notes. I need to start playing on an empty canvas to help cultivate exactly how it will play out.<br />And by this I mean probably both a simple text file that slowly fleshes out a list of key items I want to cover, and some sort of scratching/drawing the represents the story of my talk.</li>
<li><b>Authorisation Schemes </b>- this one's been a real slow burn, something I've been wanting to do for a <i>long </i>time, but I hope to turn this into more than just a presentation. This is what I've been hinting about in this sites left menu bar, some form of publication.<br />After piecing together a fairly clear breakdown of content, I may have procrastinated a little.</li>
</ul>
Regardless of where my experience is coming from to formulate the presentation, I typically start with a simple text file, <a href="http://www.grassroots-oracle.com/2012/02/please-practically-plan-your-prezi.html" target="_blank">flesh about my ideas</a>, reorder as necessary, then start my slides.<br />
<br />
Once the slides are done, I tend to go through them a few times, with a text file ready to note down simple modifications I want to make, without disrupting my flow too much.<br />
<br />
Rinse and repeat, until your practice in front of a mirror/camera/friend comes out smooth, and on time.<br />
<br />
Don't worry if you get nervous. We all get nervous.<br />
<br />
PS - some of us have been living under metaphorical rocks, so if you've missed a bunch of posts by Martin Widlake on presenting, I recommend you <a href="https://mwidlake.wordpress.com/tag/presenting/" target="_blank">check them out</a>.Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-19410373905035889442019-12-13T06:16:00.001+08:002019-12-13T06:16:42.353+08:00Friday Funny - Festival of serious yahoosI don't care what you all <a href="https://twitter.com/swesley_perth/status/1201487165265502210" target="_blank">think</a>, this is my blog, and I continue to laugh at this SQL joke.<br />
<br />
<pre class="brush:sql">select column_value
from apex_string.split('YAHOO~SERIOUS~FESTIVAL', '~')
order by dbms_random.value</pre>
<br />
If you're a Simpsons fan, you may recall this <a href="https://www.youtube.com/watch?v=xq0XNILIYTw" target="_blank">clip</a><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjqtcLFiC7yCxDq3HkdQIyHJa4ucbLlle-PUak4doK_eAw_sQpSL7O83innI7c41xB9QDW-L4ZMMtoTAYQdrK3lJHB10hZ5YO-tfjOyLk3UKvY9eEv4MR6FMQlggyuK-XZQZz_i_PinnQ/s1600/yahoo.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="576" data-original-width="768" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjqtcLFiC7yCxDq3HkdQIyHJa4ucbLlle-PUak4doK_eAw_sQpSL7O83innI7c41xB9QDW-L4ZMMtoTAYQdrK3lJHB10hZ5YO-tfjOyLk3UKvY9eEv4MR6FMQlggyuK-XZQZz_i_PinnQ/s400/yahoo.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Yahoo Serious Festival - The Simpsons</td></tr>
</tbody></table>
If you're not aware, <a href="https://www.theguardian.com/tv-and-radio/2019/jun/03/forget-the-pyramids-the-greatest-mystery-of-our-time-is-what-happened-to-yahoo-serious" target="_blank">Yahoo Serious</a> is an Australian actor from the movie of the same name. He made it onto Time magazine, then nothing.<br />
<br />
But how nifty is that <code>apex_string.split</code> function? And it's cousin <code>join</code>?<br />
Although recently I saw Connor use what appears to be a native option, one that doesn't require an APEX package. On the blog topic list...<br />
<br />Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com6tag:blogger.com,1999:blog-4818542164384221282.post-39050891128436236762019-12-10T22:47:00.000+08:002019-12-11T09:29:41.525+08:00Where would we be if we just believe?As a science aficionado, there are certain phrases that ... catch the eye.<br />
<br />
Recently on twitter there was an <a href="https://twitter.com/Dani3lSun/status/1203756445239373825" target="_blank">interesting thread</a> that continued from Michelle Skamene's post on <a href="http://www.laureston.ca/2019/12/05/15-top-tips-to-tune-your-oracle-apex-performance/" target="_blank">Top 15 Tuning Tips for APEX</a>. Michelle provided a wonderful <a href="http://www.laureston.ca/2019/12/10/security-good-practice-and-performance-why-you-should-use-html-expression/" target="_blank">follow-up post</a> summarising the outcomes of the thread.<br />
<br />
Point 9 suggests we avoid HTML in our queries, and use HTML expressions. This is undeniably good practice, but there was a question regarding how much performance is gained. <a href="https://twitter.com/patrickwolf/status/1202985990966497280" target="_blank">Patrick Wolf</a> summarises it well (sorting, XSS, context switching).<br />
<br />
I've been curious about this for a while myself, and what better way to verify the truth than do some science ;p<br />
<br />
I thought about the recent experimentation I did with <a href="http://www.grassroots-oracle.com/2019/11/on-interpreted-code-in-oracle-apex.html" target="_blank">interpreted code</a>, and recent client work I've done with bind variables, so I thought I'd not only compare timings with a simple test harness I use, but see what <code>v$sqlarea</code> had to say.<br />
<br />
When considering what SQL to compare, I decided to use the simple bit of SQL I used for my <a href="https://apex.oracle.com/pls/apex/f?p=109671:10" target="_blank">AskTOM Office Hours demo app</a>. I saw how quickly the embedded HTML expanded to fit repeated business rules, and why not use something simple. If any difference was to be seen, let's see if it shows up with something basic, just like <a href="https://twitter.com/JuergenSchuster/status/1202906998733455360" target="_blank">Juergen suggested</a>.<br />
<br />
The first query is just a simple query on <code>scott.emp</code>, with an extra expression to determine if the row is 'special'. This information is used declaratively within APEX, so these calculations are absent from this testing. The complexity has been transferred, but simplified. That's the reason it's best practice.<br />
<pre class="brush:sql">cursor c_1 is
select /*+ qb_name(c1) */ empno, ename, job, hiredate
,case
when hiredate < date '2000-01-01'
then 'special'
end last_cent
from scott.emp</pre>
So, let's just concentrate on the differences in the SQL we can measure. <br />
<br />
The second query has the HTML tags embedded, repeated on columns where I substituted the column into the class attribute in the previous example. The code required expands quickly, hence the argument to keep the SQL and presentation layer separate.<br />
<pre class="brush:sql">select /*+ qb_name(c2) */empno
,'<b>'||ename||'<b>' ename
,case when hiredate < date '2000-01-01'
then '<span style="color:purple;font-weight:bold;">'
||'<span title="'||job||'">'||to_char(hiredate,'fmddth Mon YYYY')||'</span>'
end ||'</span>'
as hireDate
,case when hiredate < date '2000-01-01'
then '<span style="color:purple;font-weight:bold;">'||job||'</span>'
end job
from scott.emp</pre>
The third query introduces context switching to PL/SQL due to the inclusion of <code>htf.bold</code> and <code>apex_escape.html</code>. This protects the output we'd otherwise have escaped using the <a href="http://www.grassroots-oracle.com/2017/01/apex-attributes-for-escaping-special.html" target="_blank">relevant property</a>. Or you could mitigate usage by sanitising data on the way in.<br />
<pre class="brush:sql">cursor c_3 is
select /*+ qb_name(c3) */empno
,htf.bold(apex_escape.html(ename)) ename
,case when hiredate < date '2000-01-01'
then '<span style="color:purple;font-weight:bold;">'
||'<span title="'||apex_escape.html(job)||'">'||to_char(hiredate,'fmddth Mon YYYY')||'</span>'
end ||'</span>'
as hireDate
,case when hiredate < date '2000-01-01'
then '<span style="color:purple;font-weight:bold;">'||apex_escape.html(job)||'</span>'
end job
from scott.emp;</pre>
If we just compare throughput, there is a clear loser. Context switching between SQL & PL/SQL is just too much, though I would like to think in recent versions of the database, those functions could be enhanced with such devices as the UDF pragma?<br />
<pre>iterations:50000
3.98 secs (.0000796 secs per iteration)
5.16 secs (.0001032 secs per iteration)
33.09 secs (.0006618 secs per iteration)</pre>
I just run these queries lots of times to measure throughput. Tom Kyte wrote a more enhanced test bed called <a href="https://github.com/oracle-developer/runstats">runstats</a>, if you want juicier details.<br />
<pre class="brush:sql">-- and start timing...
l_start := dbms_utility.get_time;
FOR i IN 1 ..c_iterations
LOOP
for x in c_1
loop
null;
end loop;
END LOOP;
l_end := dbms_utility.get_time-l_start;
dbms_output.put_line( TO_CHAR(l_end/100, '99990.00')
|| ' secs ('||(l_end/c_iterations/100) || ' secs per iteration)' );
</pre>
What about <code>v$sqlarea</code>?<br />
<pre class="brush:sql">select substr(sql_text, 1, 22)sql, fetches, parse_calls, buffer_gets, sharable_mem
,persistent_mem, runtime_mem, user_io_wait_time
,plsql_exec_time, cpu_time, elapsed_time, physical_read_bytes
from v$sqlarea
where sql_text like 'SELECT%SCOTT.EMP%'
order by 1</pre>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-HAIfC-WoblxR2rgvel2T3TwNSjw16UtYAXF3qA18vEe-ULuXU1F10mFf6xd7FdmJPhLZHXfhEH-FtMUsz2FXEw8adpr6PC7dJNwGuIkJKGz9qfDm23_0g9sMvY6j3lQVnOHxxebM4WA/s1600/html-stats.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="89" data-original-width="1234" height="46" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-HAIfC-WoblxR2rgvel2T3TwNSjw16UtYAXF3qA18vEe-ULuXU1F10mFf6xd7FdmJPhLZHXfhEH-FtMUsz2FXEw8adpr6PC7dJNwGuIkJKGz9qfDm23_0g9sMvY6j3lQVnOHxxebM4WA/s640/html-stats.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">v$sqlarea results</td></tr>
</tbody></table>
<br />
These statistics validate the timings, and I think also validates this as a performance tip that belongs in Michelle's list.<br />
While performance difference with/without HTML may be marginal <i>in this case</i>, the supplementary benefits make it clear best practice.Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-26850264223225473062019-12-03T23:25:00.000+08:002019-12-03T23:25:23.035+08:00Include new APEX templates in an older APEX instanceHave you seen that super awesome theme in the new APEX version, then wondered how long it will it be before your site upgrades so you can actually use it?<br />
<br />
What if I told you that your current version could be retrofitted to use that template?<br />
<br />
I really like the look of the Content Row template, I think that's going to serve many developers good purpose.<br />
Sure, I could create something similar now, but if I do as much as I can the same, then it should grease the wheels come upgrade time.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrGkAZ9pGdOr36Jo91AqgCectue8TrMADOv3_Cdf0FXSpVIQ2TgR2GGKZlmerhgK02guF0nelvwMHgbVrt8RfNgr1gWkgGcZQ0Z0peKA9Qznx_Y7WaFZMPio_e-yk407fWA1Sc6dGDBos/s1600/content_row.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="498" data-original-width="616" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrGkAZ9pGdOr36Jo91AqgCectue8TrMADOv3_Cdf0FXSpVIQ2TgR2GGKZlmerhgK02guF0nelvwMHgbVrt8RfNgr1gWkgGcZQ0Z0peKA9Qznx_Y7WaFZMPio_e-yk407fWA1Sc6dGDBos/s1600/content_row.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Content Row 18.2 vs 19.2</td></tr>
</tbody></table>
<br />
To make this happen, I<br />
<ol>
<li>Downloaded APEX 19.2</li>
<li>Copied the /theme_42/1.4 folder to my 18.2 instance</li>
<li>Created the report template, including template options</li>
<li>Added the region component in my app</li>
</ol>
The first two steps are all about making the relevant CSS available to your instance.<br />
<br />
After I had the /1.4 folder in place, I thought I would need to increment the Theme folder, but that just introduced other issues.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmX5zfk8IyqscNHmPIp2TsASCueJDCjOTS0-v9EdBdi6txWGc08HYJ4Cje6eXZ7wOaFDuEnzLHW7aTwYw5qdoQCCq-jnJSrzRVVt70Fz3T_nC7bzVwuQtkJaxn-HyBmBN-KkMLUj5s5D8/s1600/file_location.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="46" data-original-width="328" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmX5zfk8IyqscNHmPIp2TsASCueJDCjOTS0-v9EdBdi6txWGc08HYJ4Cje6eXZ7wOaFDuEnzLHW7aTwYw5qdoQCCq-jnJSrzRVVt70Fz3T_nC7bzVwuQtkJaxn-HyBmBN-KkMLUj5s5D8/s1600/file_location.png" /></a></div>
<br />
Instead, I just referenced the ContentRow.css file in the pages I wanted to use it.<br />
This is the path where you can find it, so it can be placed wherever you like on your older instance.<br />
<code>/i/themes/theme_42/1.4/css/core/ContentRow.css</code><br />
Alternatively, you could include this for all pages in the User Interface attributes.<br />
<br />
Then I needed to create the named column (row template) in my 18.2 application, details of which I just copied from a 19.2 instance.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMRUdAnZ9d8rYknyITj2_xYhpGa0m9zc9E4ow3hb07nv6Rqo3W44hSNaOEHS6qjBw-m4LwENd3PdvLgaVtSDfxWlk8VUWpPZfgwkpRwrk1zm4O-rzQcnvVdvW3TKH4DVjCavxvsFZs8_E/s1600/row_template.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="331" data-original-width="562" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMRUdAnZ9d8rYknyITj2_xYhpGa0m9zc9E4ow3hb07nv6Rqo3W44hSNaOEHS6qjBw-m4LwENd3PdvLgaVtSDfxWlk8VUWpPZfgwkpRwrk1zm4O-rzQcnvVdvW3TKH4DVjCavxvsFZs8_E/s1600/row_template.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Content Row syntax</td></tr>
</tbody></table>
<br />
I can even transfer the template options, so I started transferring from details on the page<br />
You can also use this query to find instances within my 19.2 application.<br />
<pre class="brush:sql">select name, display_name, display_sequence, css_classes, group_id
,(select display_name
from APEX_APPL_TEMPLATE_OPT_GROUPS
where template_opt_group_id = group_id) group_name
, help_text
from APEX_APPL_TEMPLATE_OPTIONS
where application_id = 32532
and report_template = 'Content Row'
order by display_sequence</pre>
Then I created the template options in 18.2.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK-bixavFeDwVlpvGuU1fYwKY6FQTuFFM3M5EdKZdE6TizDUXkaLfdn_9atzO3EO6WpC_-JHVm36-Y8JkgU-oUIie_w9jt4xjlXKhGHXDsqRi_2A61KfsTHFMQvrJ31oZxagJe2UNuxjk/s1600/create_option.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="488" data-original-width="810" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK-bixavFeDwVlpvGuU1fYwKY6FQTuFFM3M5EdKZdE6TizDUXkaLfdn_9atzO3EO6WpC_-JHVm36-Y8JkgU-oUIie_w9jt4xjlXKhGHXDsqRi_2A61KfsTHFMQvrJ31oZxagJe2UNuxjk/s640/create_option.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Add Template Option</td></tr>
</tbody></table>
<br />
And sure enough, they become available on my 18.2 region component.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5hysAvGm9m2pWX462_8bWFdGwVU8CVUmGD7T7CoYoN1DOzTqkxHAErqEGqIbqMzuavwuGh7w_BwfqbIjZApwxqzfZunvWAwCmZIl9QCqln9v78uLhvEB_-ywVHnXmLWhg5qpk_rPOZ2U/s1600/template_options.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="565" data-original-width="879" height="411" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5hysAvGm9m2pWX462_8bWFdGwVU8CVUmGD7T7CoYoN1DOzTqkxHAErqEGqIbqMzuavwuGh7w_BwfqbIjZApwxqzfZunvWAwCmZIl9QCqln9v78uLhvEB_-ywVHnXmLWhg5qpk_rPOZ2U/s640/template_options.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Page Designer outcomes</td></tr>
</tbody></table>
<br />
Due to the differences in availability of template option groups, some manifest a little differently, but I personally prefer a one click checkbox to the more fiddly select list.<br />
<br />
All that said, I'm not sure I'm entirely sold on the small screen format, though maybe thing will change when I get more realistic data in there.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMhTGoGfrJYKqvSjcScIn3kRv4ytimqrfHkirXcY_-bk6cwx6OHMnPm5z1HzCz5DsztJtHS0gefPLOsxmnbeOM8FITHyVuvzsH96ChLJK8tW2J-MTR7g1OpG96G7DncThyt3wXreHtswQ/s1600/template_mobile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="457" data-original-width="401" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMhTGoGfrJYKqvSjcScIn3kRv4ytimqrfHkirXcY_-bk6cwx6OHMnPm5z1HzCz5DsztJtHS0gefPLOsxmnbeOM8FITHyVuvzsH96ChLJK8tW2J-MTR7g1OpG96G7DncThyt3wXreHtswQ/s1600/template_mobile.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Content Row - mobile</td></tr>
</tbody></table>
<br />Now I'm sure when I change over to use the actual template when I'm in 19.2, I'll need to re-apply the template options - but Shakeeb likes the idea of retaining shared template options, so you never know.<br />
<br />
This was all done in 18.2. If you're on an earlier version, your mileage may vary.<br />
<br />
If you're not using the Universal Theme, then you're probably not going to get very far.Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-73291020025659946252019-11-28T21:15:00.000+08:002019-11-28T21:16:25.022+08:00Interpreted code in APEXA few years ago I <a href="http://www.grassroots-oracle.com/2016/04/improving-plsql-performance-in-apex.html" target="_blank">posted a comparison</a> between plugin code left in the source attribute, vs code that has been transferred to a PL/SQL package.<br />
<br />
In the interests of <a href="https://twitter.com/nathanwpyle/status/1176860147223867393" target="_blank">good science</a>, and I wanted to chat about it at next week's <a href="http://www.grassroots-oracle.com/2019/11/on-plsql-you-dont-write-when-using-oracle-apex.html" target="_blank">Office Hours</a>, I wanted to repeat this test.<br />
<br />
I had a little difficulty working out how I got the metrics, I think APEX debugging has changed a little since I ran the test. Instead I considered looking at <a href="http://www.grassroots-oracle.com/2012/02/apex-variables-in-sql.html" target="_blank">v$sqlarea</a> to assess performance.<br />
<br />
Turns out I quickly found the relevant queries using the following SQL, which a case statement to help me identify the difference between rows each time<br />
<pre class="brush:sql">select
case
when sql_text like 'begin declare begin wwv_flow_plugin_api.%' then 'API'
when sql_text like 'begin declare function x return varchar2 is begin return null; %' then 'call dynamic'
when sql_text like 'begin declare FUNCTION enkitec_sparkline_render%' then 'parse dynamic'
when module = 'SQL Developer' then ' me'
end which
,executions
,loads
,parse_calls
,disk_reads
,buffer_gets
,user_io_wait_time
,plsql_exec_time
,rows_processed
,cpu_time
,elapsed_time
,physical_read_requests
,physical_read_bytes
,lockeD_total
,pinned_total
,sql_text
from v$sqlarea
where sql_text like '%sparkline%'
order by which</pre>
When APEX invoked the code using an API call, it looked like<br />
<br />
<code>begin declare begin wwv_flow_plugin_api.g_dynamic_action_render_result := apx_plug_sparkline.render (p_dynamic_action => wwv_flow_plugin_api.g_dynamic_action,p_plugin => wwv_flow_plugin_api.g_plugin );end; end;</code><br />
<br />
When APEX needed to parse the entire function, it looked like<br />
<br />
<code>begin declare FUNCTION enkitec_sparkline_render ( p_dynamic_action IN APEX_PLUGIN.T_DYNAMIC_ACTION, p_plugin IN APEX_PLUGIN.T_PLUGIN ) RETURN APEX_PLUGIN.T_DYNAMIC_ACTION_RENDER_RESULT IS</code><br />
<br />
To do this test, all I needed to do was paste the PL/SQL back into the source attribute; I didn’t bother changing what was invoked in the callback fields.<br />
<br />
After 50 page refreshes each in dev – parsing the code was at least twice as slow, based on CPU time.<br />
<br />
I suspect the 'call dynamic' was the builder validating the code.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidkTZUwJbumEk3PokAWGT7-9qrFo4gAHcx9UEXBvroka6R97WZg_Lmmqzlkss-kXu406WRVTbnGrduOaQVI_q_OnviprHsvYMiqzlwsUbZZ-1GFrG50eCHGbi4GStT1FnnY3rwBizMRco/s1600/parse_dev.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="83" data-original-width="1002" height="53" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidkTZUwJbumEk3PokAWGT7-9qrFo4gAHcx9UEXBvroka6R97WZg_Lmmqzlkss-kXu406WRVTbnGrduOaQVI_q_OnviprHsvYMiqzlwsUbZZ-1GFrG50eCHGbi4GStT1FnnY3rwBizMRco/s640/parse_dev.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Basic glimpse</td></tr>
</tbody></table>
<br />
In an environment with more activity, I was able to compare the standard API call with a few hundred that included parsing the code.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYHeznX5mSi_XCQts4XGno4saMes6xHWuu7r78lzdbB53FfXICZ8T9Dr5kIrucfXyKOvk1vnLNEjgJvHbiZMWlFYl4BiEID004euzq8l2sqv2W35tFMFjhkJYdDDpRdFNPkfjCC_9sCBk/s1600/parse_heavy.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="61" data-original-width="1485" height="25" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYHeznX5mSi_XCQts4XGno4saMes6xHWuu7r78lzdbB53FfXICZ8T9Dr5kIrucfXyKOvk1vnLNEjgJvHbiZMWlFYl4BiEID004euzq8l2sqv2W35tFMFjhkJYdDDpRdFNPkfjCC_9sCBk/s640/parse_heavy.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Click/tap to embiggen</td></tr>
</tbody></table>
<br />
If I take 141312 CPU time, divide by 301, then multiply by 17778, I get parsing around 1.8x the amount time as using the API. <br />
The same goes for elapsed time, while the PLSQL Execution time remains the same.<br />
<br />
Plus there’s disk reads, an obscene amount of buffer gets, considering the execution ratio.<br />
<br />
I tried a second plugin (nested reports), and while the CPU ratio seemed the same, the physical reads were over twice as high.<br />
<br />
Remembering this is just placing the code in the box – <i>I haven’t even referenced it</i>.<br />
<br />
Too many words and numbers? How about a graph.<br />
<br />
If this seems a fair reason to reduce the amount of interpreted code you have…<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDdmgRv_hQs-UZL799VHtceVfEaP7m-FAM-2oF9i2fIKwLfkCHxx0gXVEpixCtHsw5dGqpmJMxo79G3JsMsVO7j1rJsnp6gkB77KukHazyPYP-LQxzTo-ViNagBUr6lfcE4XqypynWPZY/s1600/image001.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="288" data-original-width="326" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDdmgRv_hQs-UZL799VHtceVfEaP7m-FAM-2oF9i2fIKwLfkCHxx0gXVEpixCtHsw5dGqpmJMxo79G3JsMsVO7j1rJsnp6gkB77KukHazyPYP-LQxzTo-ViNagBUr6lfcE4XqypynWPZY/s1600/image001.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Twice the work, for <i>nothing</i>.</td></tr>
</tbody></table>
<br />
... then how does this make you feel?<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgJk7-c2QreV-2f6Glj0P3sKh3unElkG5qgGXTC7IYrocteFA6VZlQTCMo2q1NZuRyvcesq4KaikfcHXhVbxqgeAby_n6hLotjJg1KEgR_BuJKpC1gk6MOKofzQHJjvPwXKfT5xMmqAWA/s1600/image002.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="288" data-original-width="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgJk7-c2QreV-2f6Glj0P3sKh3unElkG5qgGXTC7IYrocteFA6VZlQTCMo2q1NZuRyvcesq4KaikfcHXhVbxqgeAby_n6hLotjJg1KEgR_BuJKpC1gk6MOKofzQHJjvPwXKfT5xMmqAWA/s1600/image002.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">What's a buffer, and why do we want to get it?</td></tr>
</tbody></table>
<br />
It seems by removing the code from the source attribute of the plugin, we measurably reduce the amount of work the database does. Imagine if we reduce our PL/SQL usage throughout the application?<br />
<br />
So I conclude<br />
<br />
<ol>
<li>Use bind variables</li>
<li>Put your code in packages</li>
</ol>
Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-48546285735402899062019-11-26T21:55:00.003+08:002019-12-03T23:05:44.727+08:00On the PL/SQL you don't write when using APEX.Fancy joining in on a discussion with PL/SQL and Oracle APEX community members from around the world?<br />
<br />
I'm honoured join Karen Cannell and Scott Spendolini, to be hosted by <a href="http://stevenfeuersteinonplsql.blogspot.com/2019/11/plsql-office-hours-december-3-tips-on.html" target="_blank">Steven Feuerstein</a> in the next <a href="https://asktom.oracle.com/pls/apex/asktom.search?office=401" target="_blank">AskTom PL/SQL Office Hours</a> on December 3, 2019.<br />
<br />
It seems a few people haven't heard of these "office hours" sessions, but they're worth a go - more than just your average webinar. And they're all recorded for later viewing.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig52WHDqARIkSC9zr91X04r1qsna4BTBdsg3EabqhZ2ckib_lUK5f9KyAw0qE6iIAOI1X6nvXhUlfPB_v6BIXqcJzAt77tVe3L4eLanAoa31WWGSJOZwTQFtVhw1UNr2Jni0CBFiteD5A/s1600/office_hours.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="505" data-original-width="750" height="268" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig52WHDqARIkSC9zr91X04r1qsna4BTBdsg3EabqhZ2ckib_lUK5f9KyAw0qE6iIAOI1X6nvXhUlfPB_v6BIXqcJzAt77tVe3L4eLanAoa31WWGSJOZwTQFtVhw1UNr2Jni0CBFiteD5A/s400/office_hours.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Topic</td></tr>
</tbody></table>
This is just the PL/SQL sessions! Every month they have one for Oracle APEX, SQL, Spatial, JavaScript, JSON, Database Security, and even more.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzwBpIAZ-Non68PDCTYiIQ_-crIzJpiOlpcr5QxR9SG3VvEE8W36xECrHTkE2yW_Ks_qzKc3sdsoSt7vtIeUyNgKeJC16_jjkfhSc1Z0jOPJsC61EIB6oaX0_SpqtN1wlzXIRO9ZtjeiU/s1600/office_hours_segments.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="636" data-original-width="701" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzwBpIAZ-Non68PDCTYiIQ_-crIzJpiOlpcr5QxR9SG3VvEE8W36xECrHTkE2yW_Ks_qzKc3sdsoSt7vtIeUyNgKeJC16_jjkfhSc1Z0jOPJsC61EIB6oaX0_SpqtN1wlzXIRO9ZtjeiU/s400/office_hours_segments.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Product segments</td></tr>
</tbody></table>
<br />
It's probably one of the richest learning resources Oracle currently produces, and I really need to tap into more of it.<br />
<br />
If the timezone gods allow it, I recommend live participation, as you really do get your questions answered. The produce managers handle the chatline, ensuring questions get followed through.<br />
<br />
I think Steven's ensuring we have a good 15 minutes for questions, because they always come through. They keep the chat transcripts, too. The one for <a href="https://asktom.oracle.com/pls/apex/f?p=100:551:::NO:551:P551_CLASS_ID,P551_STUDENT_ID:4825&cs=1B45460A1FACDBB9462CD282156412A51" target="_blank">Oracle Forms Modernisation</a> was all about the questions!<br />
<br />
And it's free - you only need to sacrifice your email address, though it's probably the best email feed I have. Concise, infrequent, except my forum feed, of course.<br />
<br />
On December 3, in my 15 minutes of fame, I plan to (spark debate?) about "the PL/SQL you don't need to write". I delivered this as an <a href="https://apex.oracle.com/pls/apex/f?p=109671" target="_blank">APEX application</a>, instead of whipping out the ol' powerpoint.<br />
<br />
Join in next week, and Karen will start with some decent habits, and the other Scott will no doubt enlighten us about security, or some such.<br />
<br />
Free training - from Oracle... well, in this case, delegated to some passionate volunteers. ;p<br />
<br />Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0tag:blogger.com,1999:blog-4818542164384221282.post-54967711932026770392019-11-19T23:14:00.002+08:002019-11-19T23:21:40.854+08:00APEX Low code expressionsThe following where clause expression would normally return false, therefore the query would deliver no rows.<br />
<pre class="brush:sql">select * from dual where null != 'X'
no rows returned</pre>
A null can never equal a value, and hence cannot be determined to be disimilar to another value. False is the expected condition.<br />
<br />
Turns out when using it as what appears to be the <strike>declarative</strike> low code alternative, it returns true – and renders.<br />
<br />
So if you want to display something based on a field that <i>may </i>have a value you don’t want, eg:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtfSn5rSLgO2iHZPeFuiJJSi6fSqs-AfuvSw4fxGPn3WpywNRpTDJIwq6SSIdQm6Zop2iKAZZW8X0a8Ku_s9OIOzs2X0fohLcdHJtT5XzLlxk-HHlNX4Loo6mbPm6glEtzUAxEmsCxxmg/s1600/yuck.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="145" data-original-width="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtfSn5rSLgO2iHZPeFuiJJSi6fSqs-AfuvSw4fxGPn3WpywNRpTDJIwq6SSIdQm6Zop2iKAZZW8X0a8Ku_s9OIOzs2X0fohLcdHJtT5XzLlxk-HHlNX4Loo6mbPm6glEtzUAxEmsCxxmg/s1600/yuck.png" /></a></div>
<br />
This will display the component if P10_NULL is anything but "yuck", including a null value.<br />
<br />
In my business case, there was an occasional value of "D" that I need to hide things for.<br />
<br />
Instead of using (slower) PL/SQL expression<br />
<code>nvl(:P42_CAT,'x') != 'D'</code><br />
<br />
or SQL expression (anything but = D)<br />
<code>lnnvl(:P42_CAT='D')</code><br />
<br />
As <a href="https://twitter.com/kibeha/status/1195272489343111168" target="_blank">Kim suggests</a>, our brain is seeing something SQL-ish, when really it's a low code translation that probably nails most scenarios - and maybe it would be better re-worded slightly as "not equals"<br />
<br />
Our low code alternative is not only faster, but simpler. It turns it into just another if statement, as opposed to a snippet of PL/SQL that's interpreted on the fly, which is why dozens of global page conditions using PL/SQL expressions will <a href="http://www.grassroots-oracle.com/2013/05/performance-of-apex-conditions.html" target="_blank">slow your application</a>.<br />
<br />
Tom Kyte's mantra was to aim to reduce to just a single SQL statement (or no SQL at all).<br />
Perhaps APEX developers should advocate for declarative attributes where possible, only then maybe try an expression or query.Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com2tag:blogger.com,1999:blog-4818542164384221282.post-9347750582780664952019-11-19T22:39:00.000+08:002020-01-20T22:13:10.182+08:00So you want to submit a conference abstract?It used to be our annual Perth conference that got me thinking about abstract ideas, but now it's the Kscope abstract submission deadlines that get my boat rocking.<br />
<br />
But every day is a good day to think about the topics I'd like to might like to share with to your local community.<br />
<br />
I've also been trying to convince a collegue to do their first presentation, and the questions in the ODTUG submission page got me thinking, so I thought I'd share some of those thoughts.<br />
<br />
So here are some of the questions in the Kscope20 <a href="https://kscope20.odtug.com/page/abstracts" target="_blank">abstract submission</a> form.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMzdzqDd_DIrNd8exXquXFiCd1B6pFjHJQL-M-7gqgDAQ2XyNSyGHMNGuwar6UxnRw13R6Auzhd5TFIKLB_YO5_NdNQ-2-RGC2yPJWWjJfE1YdwiOf2qu0wKShPKd1e0LzXJBBqfICXso/s1600/abstract_track.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="310" data-original-width="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMzdzqDd_DIrNd8exXquXFiCd1B6pFjHJQL-M-7gqgDAQ2XyNSyGHMNGuwar6UxnRw13R6Auzhd5TFIKLB_YO5_NdNQ-2-RGC2yPJWWjJfE1YdwiOf2qu0wKShPKd1e0LzXJBBqfICXso/s1600/abstract_track.png" /></a></div>
<br />
This is arguably the best conference for Oracle developers, and we only constitute a portion of delegates! I selected the APEX <i>Track</i>.<br />
<br />
But the <i>Session Title </i>is obsiouly a good place to start. It needs to be catchy, concise, yet inform the reader as to what to expect - even without reading the abstract itself.<br />
What session headline would grab you?<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj89PKLI7ScMBDcGkpv-_5jlQwD_83iewKEkdcE_sLLOILO2E7cqpHA31AvpGrIigrICoPNx-_3wnY-vUYnF4TyHi-52GQfsnhzF6J8Z_ZqAq3BdFjcdnwWoaHpsr37rnARtdNk4ynkJeI/s1600/abstract_title.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="314" data-original-width="503" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj89PKLI7ScMBDcGkpv-_5jlQwD_83iewKEkdcE_sLLOILO2E7cqpHA31AvpGrIigrICoPNx-_3wnY-vUYnF4TyHi-52GQfsnhzF6J8Z_ZqAq3BdFjcdnwWoaHpsr37rnARtdNk4ynkJeI/s1600/abstract_title.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">I like the descriptive distinction between HOLs and Workshops</td></tr>
</tbody></table>
<br />
The title can lead to focussing your content, which is necessary. Scope creep is something that's been on my back these last few years, and a good title can nail a good portion of this down. The Perth conference form asked for 3 objectives, which is an awesome way to focus scope. (I don't think this should be confused with Martin's concept of the <a href="https://mwidlake.wordpress.com/2019/11/22/how-to-not-present-the-terrible-threes/" target="_blank">evil threes</a>)<br />
<br />
Searching for my first presentation topic took some time. Something I felt experienced enough to talk about, something that felt relevant, useful to others. Now I have such a large list of ideas splattered on a Trello board, if anyone is thinking about doing their first presentation but can't think of a topic, I'm sure we can eke one out, even without necessarily knowing your skillset.<br />
<br />
The <i>Session Type</i> can also be a prompt for ideas. Presentations can often be categorised by style and format, something Penny & I explored one year in a <a href="https://prezi.com/z6lo8ch_ook9/presentation-skills/" target="_blank">session of our own</a>.<br />
<br />
Maybe you have a collection of related tips, or you have a case-study to share where successfully utilised a nifty feature? Or some <a href="http://www.grassroots-oracle.com/p/presentations.html#ModelClause" target="_blank">feature</a> people haven't been talking about enough?<br />
<br />
There is also a <i>Sub-categorisation </i>that varies by track, and helps align the content to relevant product sub-sets. There's an impressive amount of detail on these <a href="https://kscope20.odtug.com/page/kscope20-tracks" target="_blank">here</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7VOTcxCsEdnTf9EMJ2EbKxZbZ84LReZ-_R7KkscB6LMGPbOkPS8u50YHL7Nxma06U6PKeeFsB42-4VCwPRCDYZzZdg8pW8scs8xnQNQbqYpdUuJOrzwEZXUvbOxs9khc7X2LdjGOe1Ns/s1600/abstract_subtype.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="189" data-original-width="958" height="124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7VOTcxCsEdnTf9EMJ2EbKxZbZ84LReZ-_R7KkscB6LMGPbOkPS8u50YHL7Nxma06U6PKeeFsB42-4VCwPRCDYZzZdg8pW8scs8xnQNQbqYpdUuJOrzwEZXUvbOxs9khc7X2LdjGOe1Ns/s640/abstract_subtype.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Analytics / APEX / Database / Modern App Dev / ...</td></tr>
</tbody></table>
<br />
Naturally, at some point we need to write the abstract. The few paragraphs that inform the delegate about the story you're delivering. I've been stewing on mine for a while. Write a draft one night, review it another. What's being taught? Is it new? Is it compelling?<br />
<br />
But the abstract is also helping define your scope. A simple aim, an interesting insight, and an awesome outcome.<br />
What were your three main objectives? That's 10+10+10 minutes, with a few on each side - bang, you've got your talk. Now to divide & conquer. But remember, 10 minutes can disappear real fast.<br />
<br />
Make sure there's no boasting or selling going on, that can be left for the notes for the review committee. I like this distinction. The <i>Session Summary </i>educates the delegates <b>what </b>you're talking about, the <i>Notes </i>educate the committee as to <b>why </b>you're gone with this topic, any maybe do some selling (of yourself) there. I also included my 3 session objectives, for a concise perspective.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxdhdVGMV9drGbmVYarjYH0O0xpB7elmLJWAXgjSDdIJzVvSaWfs-d2w2kn05A1gXDmuHRcgXI8N_D4IdOkRIIpW8ny4mVbB0s3FaA6USX7tHBNbwbUxBsFaMadfmv0bVBIz54OYxE9oI/s1600/abstract_summary.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="232" data-original-width="494" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxdhdVGMV9drGbmVYarjYH0O0xpB7elmLJWAXgjSDdIJzVvSaWfs-d2w2kn05A1gXDmuHRcgXI8N_D4IdOkRIIpW8ny4mVbB0s3FaA6USX7tHBNbwbUxBsFaMadfmv0bVBIz54OYxE9oI/s1600/abstract_summary.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">For everyone, then for the selection committee</td></tr>
</tbody></table>
<br />
And don't forget to check grammar and spelling!<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcFv7I-jaSpVvZTE8eyRK4XCRqffEN1XBHnQ_18a1Fax9i57Czo2lSQV2GkfgDJ_Wr0zTzR77RNbBpQ7nGv-kf1vZxxsI_AJBaE37LL-2zeWLDPWdCc8RP8s6FI1opB-TLQV-OmOzBUJI/s1600/abstract_presenter.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="162" data-original-width="445" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcFv7I-jaSpVvZTE8eyRK4XCRqffEN1XBHnQ_18a1Fax9i57Czo2lSQV2GkfgDJ_Wr0zTzR77RNbBpQ7nGv-kf1vZxxsI_AJBaE37LL-2zeWLDPWdCc8RP8s6FI1opB-TLQV-OmOzBUJI/s1600/abstract_presenter.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Who's on first? What's on second?</td></tr>
</tbody></table>
Clearly someone needs to be written as the <i>primary </i>presenter, but do you have a friend?<br />
<br />
Seriously, you may have a colleague that contributed just as much to the topic, why not present with them? Well, there's probably a hoard of reasons, including the fact they may never have presented before - but if you're up for it, mentoring is rewarding for all parties. And starting to present can change your career trajectory.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIUaJWPY_ewyZ23dp_O5_bGL8IJm22A7lMcP7fyzyX97hzQpIVd73rriQd7svCnclzNygOmWDXCBTYaN1HUXLSHG5QCDx3A0zY_7SR0aBN057xvCwM12Zra4Px7BqEB-OeYHbzpUM4xIQ/s1600/abstract_history.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="316" data-original-width="411" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIUaJWPY_ewyZ23dp_O5_bGL8IJm22A7lMcP7fyzyX97hzQpIVd73rriQd7svCnclzNygOmWDXCBTYaN1HUXLSHG5QCDx3A0zY_7SR0aBN057xvCwM12Zra4Px7BqEB-OeYHbzpUM4xIQ/s1600/abstract_history.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Is this good or bad?</td></tr>
</tbody></table>
<br />
This first question about having presented to a <i>live audience </i>before gives the reviewers some context regarding your experience, but this year, after just over a decade of presenting, I got a different perspective on the second question.<br />
<br />
"Over a decade" sounds a little too grandiose. I pick one, sometimes two topics a year, and present them at our local conference. Sometimes I might do one twice, perhaps in a second city, or at a local meetup. I don't get much re-use.<br />
<br />
However, some conference regulars will use & refine the same session <b>numerous </b>times a year. I had the opportunity to do my APEX for Forms Developers session 3 times, and it wasn't until the third that I really felt I nailed it. I had trimmed enough chaff, reordered the odd slide, integrated feedback, and neatened the story. And this is even with practice sessions under the belt, but Martin's recent post on <a href="https://mwidlake.wordpress.com/2019/11/18/controlling-the-presentation-monster-preparing-to-present/" target="_blank">controlling the presentation monster</a> was a good kick in the behind for some aspects of my preparation that has been lacking in recent years. Perhaps I've become a little complacent.<br />
<br />
As for the "<i>Have you presented this session before</i>" question, initially I thought it was a virtue to consider my presentation as 'fresh' for Kscope, something other people haven't had the opportunity to see yet. Perhaps I'd forgotten, because I certainly valued doing my inaugural Kscope session in Perth first.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEuISrW8V2fqS2i30VhHGsH6pJCu_U8ViwArba1wTerX8XgLYPVcycuwz5krPlZ7zhsjmI4Y22gPTupvCoMNV2eL_m85i5WofqOElTeEaaBO0bQfAimfoBZw4wdWjZGe1oA2G7Lt3K8ZA/s1600/abstract_length.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="110" data-original-width="682" height="102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEuISrW8V2fqS2i30VhHGsH6pJCu_U8ViwArba1wTerX8XgLYPVcycuwz5krPlZ7zhsjmI4Y22gPTupvCoMNV2eL_m85i5WofqOElTeEaaBO0bQfAimfoBZw4wdWjZGe1oA2G7Lt3K8ZA/s640/abstract_length.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">(There is a 90 minute option)</td></tr>
</tbody></table>
<i><br /></i>
<i>Session Length</i> is typically one hour. If this seems long, don't worry - it can be filled. And as it turns out, trimming a 60 minute presentation that was already a tad long into the Australian 45 minutes took a lot of cutting. But good cutting, like cutting superfluous code.<br />
<br />
And it reminded me how good it is to get a targeted, concise presentation topic.<br />
<br />
I realised my second abstract could also work as a 30 minute Workshop, so I added to the review committee notes, and maybe <a href="https://twitter.com/kibeha/status/1194603664662507520" target="_blank">improved my chances</a> a notch. My fourth submission could also work as a fully fledged hands on lab, so ... why not?<br />
<br />
There are a heap of regular speakers at these gigs, but as Opal <a href="https://kscope19.odtug.com/p/bl/et/blogid=8&blogaid=869" target="_blank">points out</a>, there are a good percentage of <i>new </i>speakers every year - even at a high demand conference like Kscope. .<br />
<br />
And it's not just Kscope - there are a wealth of conferences around the world, ready to listen to what you have to say. Check out the call for paper schedule at <a href="https://www.clocwise.org/" target="_blank">Clocwise</a> (built with love using Oracle APEX).<br />
<br />
There are a few other questions on the form, and plenty of other considerations when it comes to submitting abstracts, but these few stood out to be and I felt compelled to share.<br />
<br />
I'd also add that there are so many quiet achievers out there that have expert knowledge of various features, they just don't blabber on blogs about it. We've got to find those pearls.<br />
<br />
Also consider taking part in the <a href="https://kscope20.odtug.com/p/cm/ld/fid=344#faq" target="_blank">public voting</a> for Kscope abstracts. It's an interesting way to get a feel for what a good and bad abstract looks like, and may inspire a new range of ideas.<br />
<br />
So bada bing bada boom, once you have your slides nearly done - practice practice practice, and have a listen to <a href="https://www.youtube.com/watch?v=A9kFRAft1-U" target="_blank">this</a> sound advice from Connor - it's a great <i>help </i><ahem>.<br />
<ul>
<li>Honesty - I've heard this from Connor for years, it's so darn true.</li>
<li>Expert - we're all subject matter experts on something.</li>
<li>Love all the things - love the topic. love being there to share.</li>
<li>Practice - matters.</li>
</ul>
I was lucky enough to have as an instrumental guide on my path to speaking. I've heard these messages in various forms over the years, and he really hits the nail on the head.<br />
And now he's being an instrumental <a href="https://community.oracle.com/docs/DOC-917690" target="_blank">advocate</a>, providing various levels of support for Oracle developers around the world - not bad for just a <a href="https://www.youtube.com/watch?v=uowUx6KFaI4" target="_blank">tech guy</a>.<br />
<br />
Seriously though, he will help you out, and you won't feel like you need to write a 400 slide monster.<br />
<i><br /></i>
<i>"Connor, your deck is 90 slides."</i><br />
<i><br /></i>
<i>"Yeah"</i><br />
<i><br /></i>
<i>"But you've only got 5 minutes"</i><br />
<i><br /></i>
<i>"Yeah"</i><br />
<i><br /></i>
<i>"..."</i>Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com2tag:blogger.com,1999:blog-4818542164384221282.post-5014494523032338182019-11-12T23:56:00.000+08:002019-11-19T21:09:44.486+08:00Things I learned at a user group eventYesterday I attended a friendly, <a href="http://www.grassroots-oracle.com/2019/11/do-you-want-to-learn-about-database-technology.html" target="_blank">informative workshop</a> by Shakeeb Rahman and Christina Cho, members of the Oracle APEX product team.<br />
<br />
Reflecting on the worthiness of attending such an event, I thought I'd list out all the things I learned & observed.<br />
<br />
<ol>
<li>Everyone learns. <br />It was observed that 'gurus' such as Trent, Lino, and myself were there, and maybe this might influence the level of detail content delivered. Sure, I like the details, and a particular pace, but I'm there to learn a bunch of things as much as the next person. My REST skills need a lot of work, it's always great to get a demonstration of features found in the new version. The APEX feature set has grown so much, I'm struggling to stay across it all. I attend these sessions because I know the value I can get out of them.</li>
<li>Watching Shakeeb build.<br />The last session involved Shakeeb using Quick SQL to build and populate data in seconds, then transforming the default output to look like a feed like Twitter. He did it in about 30 minutes, only using CSS once, maybe because his perfectionism was showing ;p<br />As awesome as it was seeing the showcase that is APEX in action with declarative/low code techniques, I also get a lot out of seeing Shakeeb's thought processes, and how he moves about the IDE.</li>
<li>REST Services.<br />One of my attractions to this event was the workshop on REST services. I understand the mechanics, but have not had enough practice using the declarative features. Having a hands on lab where I not only receive instructions in person, but get to ask Christina deeper questions as I explore the workshop. This was invaluable to understanding the feature integration. I have a few posts in mind to help bake it in.</li>
<li>Data is important.<br />Our client would have appreciated Shakeeb's opening remarks. While we all know data is important, it can't be iterated enough to those decision makers that may not have enough understanding of the value of databases.</li>
<li>APEX Longevity.<br />I knew this one already, but I like the fact <a href="https://twitter.com/swesley_perth/status/1194262142997807105" target="_blank">this slide</a> has made it into Shakeeb's commentary. APEX has seen so many JavaScript frameworks come and go, with little resistance between versions. I think this is rarely seen in the programming world.</li>
<li>Faceted search looks amazing.<br />This will a boon for creating interactive applications that people are used to even quicker.<br />I'm interested to see how this responds to more complicated queries, but there seems to be options for everything. I look forward to this feature, as we already build similar constructs already.</li>
<li>The native Popup LOV looks even more suburb.<br />They really have learnt from the two solid plugins that came before them. Based on the attributes I saw demonstrated, this has everything we need, and everything we didn't realise we should have. And this is iteration one. Awesome.</li>
<li>I don't need to rely on a <a href="http://www.grassroots-oracle.com/2015/08/apex-5-colour-contrast.html" target="_blank">CSS overlay</a> to <a href="https://twitter.com/swesley_perth/status/1193750318527287296" target="_blank">remove toolips</a></li>
<li>We can hide <a href="https://twitter.com/swesley_perth/status/1193755685483237377" target="_blank">empty display positions</a> in the layout editor</li>
<li>The <a href="https://twitter.com/J_Snyders/status/1194065845103812608" target="_blank">undo/redo tooltip</a> was restored to native HTML in 19.x, different to the rest (thanks to sharing the love on Twitter).</li>
<li>I was reminded of an <a href="https://twitter.com/swesley_perth/status/1193736032358789120" target="_blank">auto-height</a> template option for inline modals.</li>
<li>There is a template option for 'icon and text' button templates to hide text for mobile devices.</li>
<li>A component setting was introduced to transform application Switch items into the pill format - yet another application level optional upgrade between versions.</li>
<li>Syntax in the code editor for SQL Workshop and Quick SQL is now highlighted. I think this improves readability and is a form of inline validation for your syntax.</li>
<li>SQL Workshop Object Browser has a few more tables, including suggested sample queries for the tables - the same sort of group by queries that I use to help analyse what's going on in a table. The same queries that utilised in the faceted search analysis. Code & data re-use right there.</li>
<li>We can now REST enable tables right from the SQL Workshop, with the flick of a switch.</li>
<li>I was reminded <a href="https://www.getpostman.com/" target="_blank">Postman</a> was a nifty tool for REST development.</li>
<li>We can jump to the create application wizard from a table. I can't remember how, nor find the option, but I can't remember everything from the day... I make these notes to help, but hey.</li>
<li>Data dictionary cache is a thing. Again, I can't recall exactly how it worked, but I've made a note to investigate later as I explore the faceted search facilities.</li>
<li>The spotlight search has been expanded, and there are other nifty shortcuts that already exist. I use some already, but I now know to keep aware.</li>
<li>Paged designer multi edit - I am looking forward to these improvements, which include the ability to change template options for multiple components at once - hallelujah! But I wasn't aware that some attributes were previously hidden during multi-edit mode, so this has eased.</li>
<li>The ability to change the application logo has received all the declarative nick-knacks we needed.</li>
<li>This application logo is separate from the one defined in the login screen, which as also received a wodge of <strike>declarative</strike> low code improvements.</li>
<li>There is now a pre-built template style for dark mode. While I was aware of this, it's always beneficially for me to see Shakeeb operate the theme roller, since I don't use it enough.</li>
<li>Theme roller facilities are more refined</li>
<li>The <a href="https://twitter.com/swesley_perth/status/1195205703993921537" target="_blank">Content Row</a> report template - I'm looking forward to this so much I've retrofitted the template into 18.2, for demonstration</li>
<li>All the interactive report dialogs have been re-written, with a fresh look.</li>
<li>Menus UI can be tweaked with a 'callout' nature. We'll see how that's adopted in general...</li>
<li>Inline regions have been given some upgrades. I've been playing with a page to experiment with these recently (post coming), so this event gave me the opportunity to ask some specific questions.</li>
<li>Inline popups can be located near the invoking component, documented in the UT application.</li>
<li>Lino showed me how to define inline region size with classes, instead of jQuery (to be included in post).</li>
<li>Lino is approachable regarding my growing list of AOP questions.</li>
<li>And as the session was beginning, I felt a little inspiration to solve a regular expression problem I was facing last week. Some interesting performance observations noted as I experimented further today, and had a regexp expert to review my work. (post coming)</li>
<li>Christina is another solid member of the APEX family. I've had the pleasure of conversing with quite a few members of the team now, and they're a great bunch.</li>
<li>Juniper berries are used to make gin - it was the drink'n'learn on the <a href="https://twitter.com/swesley_perth/status/1194274558754213894" target="_blank">beer cap</a>, in our afternoon wind-down.</li>
</ol>
<div>
And I reckon there might be a few I left off. The Q & A included some conjecture about 20.1.</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk8zWkFv7PcWHuQiSV4NloGlilJCXnx_8rZ7O98f9nBP_joF0qGWZ1sxCJ6JW5dsQjerqkH7ca7hxWf87P9PsWOVLuXYCPEGStEhg_f-GmxYd5ggVCjNoWj7hP9sP680N9q_an8u0hZ30/s1600/IMG_20191111_091541.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1159" data-original-width="1600" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk8zWkFv7PcWHuQiSV4NloGlilJCXnx_8rZ7O98f9nBP_joF0qGWZ1sxCJ6JW5dsQjerqkH7ca7hxWf87P9PsWOVLuXYCPEGStEhg_f-GmxYd5ggVCjNoWj7hP9sP680N9q_an8u0hZ30/s320/IMG_20191111_091541.jpg" width="320" /></a></div>
</div>
<div>
<br /></div>
<div>
Brisbane & Sydney also get the <strike>pleasure</strike> <strike>enlightment</strike> musings of <a href="https://youtu.be/uowUx6KFaI4" target="_blank">Connor</a>.</div>
<div>
<br /></div>
<div>
Not bad for a user group event, eh? </div>
<div>
<br /></div>
<div>
It's a shame some people struggle to get support from their employers to attend such events, and more of a shame we don't see more students getting engaged. How do we reach them - the next generation?</div>
<div>
<br /></div>
<div>
I'm glad they came, and I'm glad I went. There are some growing APEX markets around here, and some with lulls. If we don't get the visits, the next round of students will not eventuate. It's not just the people who attend the workshops, but the flow on effect from those individuals who report back and share information with other team members. It's certainly what I did with my colleagues. Who knows who's ears could be listening in on that positive feedback.</div>
Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com4tag:blogger.com,1999:blog-4818542164384221282.post-24670795967933728122019-11-04T20:35:00.000+08:002019-11-04T23:21:29.922+08:00Do you want to learn about database technology?Do you live close enough to Melbourne, Brisbane, Sydney, Seoul, or Tokyo to attend a software development roadshow for a day in November?<br />
<br />
Are you interested in how easy it is to build data driven web based applications?<br />
Perhaps you're a student of the programming world?<br />
<br />
Your <a href="http://ausoug.org.au/" target="_blank">local</a> user group is hosting some visitors from the US that I think are worth listening & engaging with, in person. And if you're not a member of the user group, it's only $50 for the day.<br />
<br />
<a href="https://blogs.oracle.com/apex/oracle-apex-apac-tour-2019">https://blogs.oracle.com/apex/oracle-apex-apac-tour-2019</a><br />
<br />
50 bucks.<br />
<br />
For a day of learning, engagement, and networking with industry peers.<br />
<br />
I can't emphasise that networking element enough, particularly for those still formulating their career goals & focus.<br />
<br />
It's been a while since I was a graduate, but I relished the information I gathered at the local user group events. I was recently privvy to witnessing a member of the next generation of technology professional help shape her career at our conference.<br />
<br />
It's worth investing a day in yourself, to help inspire your work tomorrow, to help nurture your love for your job. Whatever the stage of your career.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9a2aclfl1yZNkA7xcCF9H3JHcABmtcNA3QYd8RFjv8zk0HirjyYwmWIV8IZzLESoadLnso3zlaZ7yb4MNP2r7kEvEoycXdJVcNG-RrHTvs9MQR2tLIFIOfzTItgxGfOO3lNYZz7pXaK8/s1600/Connect-2019-Mel-Photo-14-10-19-1-22-18-pm.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="200" data-original-width="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9a2aclfl1yZNkA7xcCF9H3JHcABmtcNA3QYd8RFjv8zk0HirjyYwmWIV8IZzLESoadLnso3zlaZ7yb4MNP2r7kEvEoycXdJVcNG-RrHTvs9MQR2tLIFIOfzTItgxGfOO3lNYZz7pXaK8/s1600/Connect-2019-Mel-Photo-14-10-19-1-22-18-pm.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Warning, tangent ahead.</td></tr>
</tbody></table>
While I now find myself a regular speaker at such events, I also still value attending them, even with the advent of regular, engaging, recorded <a href="https://asktom.oracle.com/officehours" target="_blank">online technology seminars</a> with experts and those that <i>build </i>the product.<br />
<br />
That photo? That's Oracle product manager <a href="https://blogs.oracle.com/author/david-peake" target="_blank">David Peake</a> helping out. That's what these communities do - get you within one degree of separation of the product itself.<br />
<br />
I can't keep up with all the new gadgets being made available in my development tool of choice.<br />
I certainly need more practice with REST technology, and a hands-on-lab with the development team would really help.<br />
We're also about to level up with our version, so another revision of all the new kit will be super handy.<br />
<br />
And Shakeeb is a really slick presenter. It's not just the technology I learn about when watching the sessions by Shakeeb, or Connor & Steven, or many other seasoned (and some new) presenters.<br />
And I'd like to meet Christina, add to the list of the APEX team I've met in person.<br />
<br />
Seeing them in person is something else. Nothing beats having a face-to-face conversation with someone about ... anything really. And to then establish that rapport, that human-to-human contact with other people. It can remind us to be humble. A reminder that we all make mistakes; we all continue to learn; and most importantly - none of us know everything.<br />
<br />
We see regular personalities on the speaking circuit, or those bloggers out there that pump out their experiences online. These are only a small percentage of all the developers out there, working hard, empowered by education, utilising online resources, leveraging off forum conversations. Sometimes it feels like they seem to know so many things about the product, but really, most of them are just making notes, and thankfully publishing them in a manner for us all to benefit. Don't let the <a href="https://davidwalsh.name/impostor-syndrome" target="_blank">imposter syndrome</a> get you down.<br />
<br />
And let's not forget the friendships that are forged at such events. Yes, you're allowed to have friendships at work, it helps keeps smiles on our faces when times are tough.<br />
<br />
So. 50 bucks, unless you're already a member - then it's free!<br />
<br />
Learn about how to get your FREE Oracle instance.<br />
Learn how to use a low code development tool to build apps.<br />
Learn how to source data from web services.<br />
Learn what's in the latest version of the product.<br />
Have an engaging session where you have the platform to ask <i>anything</i>.<br />
And do it - if you have the chance to ask a burning question, odds are there is at least another person nearby with the same question.<br />
<br />
Thank you, Oracle for your growing engagement with the community, and thank you to our local user groups for helping facilitate these visits, and most importantly, thank you to the community - actively producing content, and those who drive up the SEO by quietly read all the content.Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com1tag:blogger.com,1999:blog-4818542164384221282.post-80691794721227568452019-10-10T23:17:00.001+08:002023-10-11T07:58:08.409+08:00OGB Appreciation Day : Oracle Reports Server Queue MonitoringToday is a day to <a href="https://oracle-base.com/blog/2019/09/30/ogb-appreciation-day-2019-thanksogb/" target="_blank">celebrate what's great</a> about our Oracle 'Groundbreakers' community. Our favourite stuff, what we're learning, horror stories, or just a little thanks.<br />
<br />
I missed the second year because of holiday prep - so I decided to beat that this year by writing this the day I saw Tim's <a href="https://twitter.com/oraclebase/status/1178616895567736835" target="_blank">call-out</a> on Twitter. Especially since I'm flying out to Melbourne for <a href="https://www.ausoug.org.au/whats-on/connect2019/" target="_blank">AUSOUG Connect</a>, plus a little R&R.<br />
<br />
I knew I had a few worthy ideas queued up, but I pondered for a moment on the most recent idea I noted.<br />
<br />
So this year I'm going a little meta, or recursive, if you will - I'm acknowledging one of the posts from the original year. <a href="http://www.snapdba.com/2016/10/otn-appreciation-day-oracle-reports-server-job-queue-monitoring/#.XZNe_0YzaUm" target="_blank">Oracle Reports Server Job Queue Monitoring</a>. Thanks, Garth.<br />
<br />
I wouldn't call this a duplicate post, rather a re-inforcement of this blog-fest, and I add some APEX spice.<br />
<br />
I'm not entirely sure how I came across Garth's post, but I'm certain if it wasn't there, I wouldn't have realised I could transform that trusty but transient report queue servlet into table data in 3 easy steps.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYk33JWTH9HF0UIm1OwmYcNvvt71ZZzPHntQPOMvXTu69RGNedOkoJEdjvhbx5HfnEHwpQ_D5LTCccOTnFh9bDN7w-VkSlbHCV6Ey-5i-TTWhz2QoWohQ6W2uoH_jP6oNPKi6JK5LHqFY/s1600/report_queue.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="451" data-original-width="1444" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYk33JWTH9HF0UIm1OwmYcNvvt71ZZzPHntQPOMvXTu69RGNedOkoJEdjvhbx5HfnEHwpQ_D5LTCccOTnFh9bDN7w-VkSlbHCV6Ey-5i-TTWhz2QoWohQ6W2uoH_jP6oNPKi6JK5LHqFY/s640/report_queue.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A reliable page, but a little dated</td></tr>
</tbody></table>
<br />
And once they're in the database, we can APEX <a href="https://stronglang.wordpress.com/2015/09/16/im-going-to-have-to-science-the-shit-out-of-this/" target="_blank">the shit out of it</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOphx4b8VUJecmDGwilQrjb1TR6s4yRgPPIx3crPhhUFNDCHgxjNtcJIPL_89HcVCSIw02dMYQLQxAZfqkxqWDS7o-FMoY6Zo4bKmfk8Y16PkzOfzj8DNHseNTwTFr2oiPnQuhfPHCr3Y/s1600/report_apex.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="413" data-original-width="1395" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOphx4b8VUJecmDGwilQrjb1TR6s4yRgPPIx3crPhhUFNDCHgxjNtcJIPL_89HcVCSIw02dMYQLQxAZfqkxqWDS7o-FMoY6Zo4bKmfk8Y16PkzOfzj8DNHseNTwTFr2oiPnQuhfPHCr3Y/s640/report_apex.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Now we can fold this data into awesomness</td></tr>
</tbody></table>
<br />
As Garth details in a <a href="http://www.snapdba.com/2016/10/configuring-oracle-reports-server-job-queue-monitoring/" target="_blank">second post</a>, and <a href="https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=286556404860653&id=2098657.1&_afrWindowMode=0&_adf.ctrl-state=g1j9j18rj_4" target="_blank">Doc ID 2098657.1</a>, it's a relatively simple matter of<br />
<ol>
<li>DCL to define table owner</li>
<li>DDL to define some objects</li>
<li>Minor Report Server configuration</li>
</ol>
Now we can query rw_server_queue to see <i>how many </i>of <i>which </i>reports were executed <i>each day </i>by <i>who</i>.<br />
<br />
Why would we want to do this? It's 2019, why am I blogging about an Oracle Reports feature?<br />
So we can <a href="http://www.grassroots-oracle.com/2018/10/odc-appreciation-day-apex-workspace-activity-log.html" target="_blank">analyse reports usage</a> in the legacy system before migrating to <a href="https://apexofficeprint.com/" target="_blank">AOP</a>, of course!<br />
<br />
You can also find the relevant SQL <a href="https://github.com/swesley/orclapex-rw-server/" target="_blank">here</a>, to make it easier for some of us to find & utilise.<br />
<br />
So that's now two <a href="https://oracle-base.com/blog/2019/09/30/ogb-appreciation-day-2019-thanksogb/" target="_blank">#ThanksOGB</a> references in one, illustrating how worthy participation in such an even can be.<br />
<br />
<h4>
Past posts</h4>
<br />
2016 OTN - <a href="http://www.grassroots-oracle.com/2016/10/otn-appreciation-day-apex-dynamic-actions-jquery-selector.html" target="_blank">Dynamic Actions</a><br />
2017 ODC - (dog at my homework)<br />
2018 ODC - <a href="http://www.grassroots-oracle.com/2018/10/odc-appreciation-day-apex-workspace-activity-log.html" target="_blank">APEX Workspace Activity Logs</a><br />
2019 OGB - <a href="http://www.grassroots-oracle.com/2019/10/ogb-appreciation-day-oracle-reports-queue-monitoring.html" target="_blank">Oracle Reports Server Queue Monitoring</a><br />
2020 OGB - (quite possibly something that also shares a precursor to Oracle Reports)Scott Wesleyhttp://www.blogger.com/profile/18106937181788036683noreply@blogger.com0