tag:blogger.com,1999:blog-10032096871730388962024-03-10T09:55:45.512+01:00APEX by Gis all about APEX and OracleMarko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.comBlogger67125tag:blogger.com,1999:blog-1003209687173038896.post-21530088321344019622022-11-25T11:14:00.008+01:002022-11-25T21:17:54.329+01:00APEX 22.2 Clear Active Tab<p>From APEX version 22.2 there's a changed behavior how active tabs or region display selectors (RDS) are stored in the browser session storage:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI7orJ9A7GxAs1jZrVuM7dK1EYUmp3XtZ0mQAuq08Mo2mUl1mgCRxJBlwYbXXLS-DCV9PuopywGEVKfIp4Ke-PzTfju_q2fWDBxKMY-3yKGpvMgWO_x8bJ4NCruRZFxnjbcgT0X7HZ6vYtUcQIqwnoz-hrI-n1SzN7DCTYFnXtYsncvC4JESufBQLCrA/s2192/Screenshot%202022-11-25%20at%2011.14.17.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="664" data-original-width="2192" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI7orJ9A7GxAs1jZrVuM7dK1EYUmp3XtZ0mQAuq08Mo2mUl1mgCRxJBlwYbXXLS-DCV9PuopywGEVKfIp4Ke-PzTfju_q2fWDBxKMY-3yKGpvMgWO_x8bJ4NCruRZFxnjbcgT0X7HZ6vYtUcQIqwnoz-hrI-n1SzN7DCTYFnXtYsncvC4JESufBQLCrA/w640-h194/Screenshot%202022-11-25%20at%2011.14.17.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br />In versions before 22.2 they were stored without a prefix (session storage scope) and now they are stored with the prefix <i><b>ORA_WWV_apex.apexTabs</b></i>.<p></p><p>In some of my applications I've used a custom JS function to clear active tab:</p>
<script src="https://gist.github.com/mgoricki/ee464611db5e3721e40d71632629c0fa.js"></script>
<p><br /></p><p>From APEX 22.2 you need to set <b><i>prefix</i><i>:</i></b></p>
<script src="https://gist.github.com/mgoricki/551fa963312207463a0e5951fabbe78c.js"></script>
<p><br /></p><p><br /></p><p><span style="background-color: #1e1e1e; color: #ce9178; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 12px; white-space: pre;"><br /></span></p><p><br /></p><p><i style="background-color: white; color: #666666; font-family: "Open Sans"; font-size: 14.3px;">Tested in APEX 22.2.0</i></p>Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-15908584058239514922021-11-19T10:43:00.002+01:002021-11-19T10:43:35.478+01:00Set Up Environment Banner<p>If you work on many different APEX environments, as I do, from APEX 21.2 you can easily set up a banner that will be visible on the left or the top of the APEX Builder to easily identify the environment.</p><p><br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><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/AVvXsEgvo8TP2_BYBR9SqQCiDuyNg37acE-XnX82UMN3UbKge02-A2qJksRbvy856x3pulUChyxyDaW4yXN2BoITY31eukIcDAFTKik6IlR0Zbq3wqG21AceVfRigl4meEKmbU3EMRnTlnqp8PW1/" style="margin-left: auto; margin-right: auto;"><img data-original-height="1662" data-original-width="2048" height="519" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvo8TP2_BYBR9SqQCiDuyNg37acE-XnX82UMN3UbKge02-A2qJksRbvy856x3pulUChyxyDaW4yXN2BoITY31eukIcDAFTKik6IlR0Zbq3wqG21AceVfRigl4meEKmbU3EMRnTlnqp8PW1/w640-h519/Screen+Shot+2021-11-19+at+10.23.25.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Environment Bar on the left of the APEX Builder</td></tr></tbody></table></div><p></p><p><br /></p><p>You can do this on instance or workspace level. To modify this on the instance level you need to log in as instance admin (Manage Instance > Define Environment Banner):</p><p><br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvWNkAdQUDzItD5XCMgnEjm_VbJO7vVUqSaxyDDmuf56_j0n1E23yB7vuZ0qJIbqrtUFN0TaRuHNcrTiIQoUMV8DEI_U6ayBKCTlkWK4cmS7fVtyjWSkfqGsOvH4-c_gf9NpPyABZUkKBa/" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="960" data-original-width="1604" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvWNkAdQUDzItD5XCMgnEjm_VbJO7vVUqSaxyDDmuf56_j0n1E23yB7vuZ0qJIbqrtUFN0TaRuHNcrTiIQoUMV8DEI_U6ayBKCTlkWK4cmS7fVtyjWSkfqGsOvH4-c_gf9NpPyABZUkKBa/w640-h384/image.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div>You can also do this with the API:<p></p><p><script src="https://gist.github.com/mgoricki/57c454064a523d73d29493c3d66c908e.js"></script></p><p>On the Workspace level, you can do this in Manage Service > Define Environment Banner.</p><p>Unfortunately, API for setting Workspace params currently (APEX 21.2.0) doesn't work:</p><p><script src="https://gist.github.com/mgoricki/62dbe4d41d440fedbcfad3c9d9b2125b.js"></script></p><p><br /><br /></p><p><i style="background-color: white; color: #666666; font-family: "Open Sans"; font-size: 14.3px;">Tested in APEX 21.2.0</i></p><p><br /></p>Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-70432937779696947742021-11-17T20:06:00.001+01:002021-11-17T20:06:09.958+01:00Full-width Page Layout on specific pages<p>If you set <i>Body Content Max Width</i> property in Theme Roller of UT theme to some fixed value (other than Auto) your body content will be centered on the screen. </p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5kasowftAqG3tWCQOIkog0XEuDUO4D5s1dakIyIkw6JW6BGOpzhddIqAxYfai1FkKud6iRJUwnz8Dy6K5E3FBlTaY6BJCMw3PviliGx5NxiNS11pNgGHc6qHJlZegaI5ADw3xnajwwQlX/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1044" data-original-width="634" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5kasowftAqG3tWCQOIkog0XEuDUO4D5s1dakIyIkw6JW6BGOpzhddIqAxYfai1FkKud6iRJUwnz8Dy6K5E3FBlTaY6BJCMw3PviliGx5NxiNS11pNgGHc6qHJlZegaI5ADw3xnajwwQlX/w244-h400/image.png" width="244" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div>What if you want to reset this on specific pages and use the full width of the screen?<p></p><div class="separator" style="clear: both; text-align: left;">In this case, you should add the following line of the CSS to the page property <i>Inline CSS</i>: </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtkpOpt-9XfBRSXMw2uEaenXmAzODsV5Vz3gL33j7z7eq0CHMi94ekwJYuKgzI1zuHLx0wpUacrHC80luIp8uujo51jtEMoce0JnGnkCzYR3CB1vW7xJnWy32C7h96l6ds5eI3j06ol21-/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="446" data-original-width="720" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtkpOpt-9XfBRSXMw2uEaenXmAzODsV5Vz3gL33j7z7eq0CHMi94ekwJYuKgzI1zuHLx0wpUacrHC80luIp8uujo51jtEMoce0JnGnkCzYR3CB1vW7xJnWy32C7h96l6ds5eI3j06ol21-/" width="320" /></a></div></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">If you want to define it in the static CSS file you can also reference it as:</div>
<script src="https://gist.github.com/mgoricki/f8c0091db141cc352917884f442f0b06.js"></script>
<div class="separator" style="clear: both; text-align: left;"><br /></div><div><br /></div><div>...or the declarative way - just set region position to <i>Before Content Body</i> and set the margins. 🙂</div><br /><i style="background-color: white; color: #666666; font-family: "Open Sans"; font-size: 14.3px;">Tested in APEX 21.1.5</i><p></p>Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-42748284730808016372020-11-03T21:28:00.005+01:002020-11-03T21:31:10.288+01:00Manage APEX users from your app<p>I had one interesting task: to enable application end-users to manage users (to create new users from the app). Of course, I'm talking about APEX users and authentication.</p><p>Sounds simple, but is it?! I've done this 10 years ago...no problem...</p><p>To make it work I've used <a href="https://docs.oracle.com/en/database/oracle/application-express/20.2/aeapi/CREATE_USER-Procedure.html#GUID-95721E36-4DAB-4BCA-A6F3-AC2BACC52A66" target="_blank">apex_util.create_user API</a>:</p>
<script src="https://gist.github.com/mgoricki/7078d8ee93e436aa9a3d11622bc3d7dd.js"></script>
<p>As noted in a comment above, you need to add Workspace Admin privilege to the user you create so that this user can create other users. Sounds good...but you have one big problem. This user can login to the APEX Builder (of course, you can disable APEX builder access on test/production environments, but who does that in reality 😉).</p><p>The thing that worked before (I think last in APEX 5.1) was that you could create a new user that is locked by default:</p>
<script src="https://gist.github.com/mgoricki/bb401d1377ffe272cc6f99a977cb38d6.js"></script>
<p>You can't login to the APEX builder, but unfortunately, you can't login to the app neither.</p><p>So I came to a new solution, and it's a simple one. </p><p>By default I add new end-users to predefined User Group (don't forget to create user group before):</p>
<script src="https://gist.github.com/mgoricki/7318a2c997d1cbc3a3ac33ae06a21b9d.js"></script>
<p>After that, on the APEX workspace instance level (Manage Instance > Security > Development Environment Authentication Schemes > APEX Accounts), I've added Post-Authentication procedure that doesn't allow users from that group (in my case APP_END_USERS) to login to the APEX Builder:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNGGEPtvcnXlMDuluZ-AMe2enXmxuHg8RG0gG94-fHOO-DzXBsk9mWxSGdLGSCQHJO-G1oYB9WfspNI5uOydfbhwFOeNI3Vc8_SX9QRPo1FbMeo26ltw6ZjldRB1B1bOTC1aJPCPP6o8pO/s900/Screen+Shot+2020-11-03+at+21.03.35.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="347" data-original-width="900" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNGGEPtvcnXlMDuluZ-AMe2enXmxuHg8RG0gG94-fHOO-DzXBsk9mWxSGdLGSCQHJO-G1oYB9WfspNI5uOydfbhwFOeNI3Vc8_SX9QRPo1FbMeo26ltw6ZjldRB1B1bOTC1aJPCPP6o8pO/s16000/Screen+Shot+2020-11-03+at+21.03.35.png" /></a></div><br /><div class="separator" style="clear: both; text-align: left;"><br /></div>...and it works. When you try to login to the APEX builder, you'll get something like this:<div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAvSEuAzVv0v950nxDm1FoJc99Oy9WGxkEepc6i3u7NrJFmZDtOLGtXH5mlSzNGuUqkBY2x2tYciHmGVh6w2ry-lQn1BcTTMghlf80ESiHR76lRdjYyyH7gV9ZfVMQrugqsJheXp-4NoSV/s800/Screen+Shot+2020-11-03+at+21.21.24.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="704" data-original-width="800" height="353" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAvSEuAzVv0v950nxDm1FoJc99Oy9WGxkEepc6i3u7NrJFmZDtOLGtXH5mlSzNGuUqkBY2x2tYciHmGVh6w2ry-lQn1BcTTMghlf80ESiHR76lRdjYyyH7gV9ZfVMQrugqsJheXp-4NoSV/w400-h353/Screen+Shot+2020-11-03+at+21.21.24.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i><br /></i></div><div class="separator" style="clear: both; text-align: left;"><i>*Note: this is only a part of the code. Don't forget to add more security checks to your apps.</i></div><div class="separator" style="clear: both; text-align: left;"><i><br /></i></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">...and that's all folks! Stay safe & enjoy!</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><p><i>Tested in APEX 20.2.0.00.20</i></p></div></div>Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-29009914788905633402020-10-27T15:57:00.004+01:002020-10-27T15:57:47.018+01:00Reset APEX builder login authentication scheme<p>If you change Development Environment Authentication Schemes (aka the way you login to the APEX Builder) at the instance level and you don't read a confirm dialog carefully, as I didn't you may struggle to login as the instance admin next time:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ygQJDvKyBhUAqlJA0fbDpJA0Ghgmr9WqxgVdkWo6uhtTU2CMmdsR41R159gSW1ud1FoOazUaE6Ub3wlHKwaqU0Bo1JM_xN3qjAoMbSasfERBynGS2-Nz_q6RtfFHpQizlgrz237NxkVx/" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="684" data-original-width="654" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ygQJDvKyBhUAqlJA0fbDpJA0Ghgmr9WqxgVdkWo6uhtTU2CMmdsR41R159gSW1ud1FoOazUaE6Ub3wlHKwaqU0Bo1JM_xN3qjAoMbSasfERBynGS2-Nz_q6RtfFHpQizlgrz237NxkVx/w306-h320/image.png" width="306" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p></p><p>In my case, I've changed it to the Database Accounts, and though that doesn't affect the instance admin account. But I was wrong. In my case, the solution was to create a database user with username <i>admin</i>.</p><p>After that, I've logged in as instance admin and changed the authentication back to the APEX Accounts.</p><p>If you change it to some other Authentication Scheme you may need to use PL/SQL API:</p>
<script src="https://gist.github.com/mgoricki/83b4277be8888ebf175c0579fbf4daee.js"></script>
<p><br /></p><p>Link in the <a href="https://docs.oracle.com/en/database/oracle/application-express/20.2/aeapi/Available-Parameter-Values.html#GUID-75DCF658-5A76-4E81-B12D-04E254A3D80A" target="_blank">documentation</a>.</p><p><br /></p><p>That's all! Stay safe & enjoy!</p><p><i>Tested in APEX 20.2.0.00.20</i></p>Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-76153081400612991872020-07-14T14:21:00.001+02:002020-07-14T14:21:46.669+02:00Bulk submit all region items to session stateRecently I came across one simple but effective solution so why not to share it... <div><br /></div><div>Colege and I were building a search page with lots of filters on the left side of the screen (similar to Faceted Search). In the middle of the page, we've created an Interactive Report that uses a function that returns the SQL query. There's a lot of logic going in there and we used the <i>v</i> function to fetch item values (no worries, SQL query uses only bind variables). It was just easier and faster than to put everything into input parameters. Also, I'm not a fan of using functions to return SQL queries, but in this case, it was a perfect match. </div><div><br /></div><div>The only problem was that we didn't want to submit the page to get item values into the session state nor to put all the items into region property <i>Page Items to Submit </i>(it's hard to handle that with lots of items). So we needed a quick and easy solution to submit all items from the filter region to the session state and here it is:</div><div><br /></div><div>First, I've created a dummy AJAX Callback process, that doesn't do anything, just returns empty JSON object:</div><div><img alt="" height="494" src="data:image/png;base64,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" width="334" /></div><div><br /></div><div>After that, I've created a simple JS function</div><div>
<script src="https://gist.github.com/mgoricki/3cab11308a1bdf10ab236d4d1a6e0618.js"></script>
</div><div><br /></div><div>Function loops through region items (didn't test it for all possible item types in APEX), adds them to the JS array, and with the use of the feature of <a href="https://docs.oracle.com/en/database/oracle/application-express/20.1/aexjs/apex.server.html#.process" target="_blank">apex.server.process</a> that you can put an array of item names in property pageItems, it submits them to the session state.</div><div>On success, it refreshes the Interactive Report region.</div><div><br /></div><div>That's all!</div><div><br /></div><div>Stay safe & enjoy!</div><div><br /></div><div><i>Tested in APEX 20.1.0.00.13</i></div><div><br /></div><div> </div>Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com6tag:blogger.com,1999:blog-1003209687173038896.post-12391377341428186822019-11-10T20:52:00.001+01:002019-11-10T22:52:37.158+01:00Region Display Selector - How to Prevent Scroll on Page Load<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
A few days ago I visited my dear friends <a href="https://twitter.com/AljazMali" target="_blank">Aljaž Mali</a> and <a href="https://twitter.com/AndrejGrlica" target="_blank">Andrej Grlica</a> and they had one interesting case. They had a page where they used region display selector in <i>Scroll Window</i> mode to display some regions in tabs. Since region display selector wasn't positioned on top of the page, on page load navigation was scrolled down to the first tab region (<a href="https://apex.oracle.com/pls/apex/f?p=100309:63" target="_blank">as in this example</a>).<br />
<br />
To fix it, the first thought from Andrej and me was to somehow do it with JavaScript, but after we examined JS API we concluded that there isn't any clean solution.<br />
<br />
And then, as always, four eyes are better than two...we came out with a nice but dirty solution.<br />
<br />
<h3 style="text-align: left;">
The Fix</h3>
<div>
To fix it you need to:</div>
<div>
<ul style="text-align: left;">
<li>create a dummy region with <i>Region Display Property</i> turned on an put it before all other regions with that property on</li>
<li>use region template - <i>Blank with Attributes </i></li>
<li>add <i>Static ID </i>(in our case it was noScrollTab)</li>
<li>add the following CSS to the page either as inline CSS or to the external static file (preferred way)</li>
</ul>
<script src="https://gist.github.com/mgoricki/aa11a527b214009d30e788460bfd0201.js"></script>
<br />
<h3 style="text-align: left;">
How?</h3>
</div>
</div>
<div>
What have we done here? We created a region on the first position in region display selector - the region that usually is scrolled down to on page load and then with CSS we've positioned it to the top left corner of the page and hid it.<br />
<br />
The demo is available <a href="https://apex.oracle.com/pls/apex/f?p=100309:64" target="_blank">here</a>.<br />
<br />
Tested in APEX 19.2.0.00.18.<br />
<br />
Enjoy!<br />
<br />
<br /></div>
</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-30895109563604452542019-11-07T23:43:00.000+01:002019-11-10T22:53:52.488+01:00APEX 19.2: Finally, API for component export <div dir="ltr" style="text-align: left;" trbidi="on">
I don't remember when I was so excited about the new APEX feature as at the moment when I've discovered that there's a new parameter in procedure apex_export.get_application called p_components that enables component export. I know, it's small, but it opens a big playground.<br />
<br />
Maybe the reason for this excitement is that for some time now, I'm working on an APEX app for creating patches of database object and APEX components and the only missing piece was API for component export. I had that working before APEX 19.2, but I had to use an internal export procedure which is not so convenient.<br />
<br />
The only thing that you could do with the apex_export API before 19.2 was to export a whole application or all components in some predefined structure.<br />
<br />
From APEX 19.2 you can export any component that you want through the API. So, how can you do that...<br />
<br />
<br />
<h3 style="text-align: left;">
The Code...</h3>
<br />
... is pretty straight forward. Just select component from a new dictionary APEX_APPL_EXPORT_COMPS. The columns that you need for component export are TYPE_NAME and ID, for example:<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<script src="https://gist.github.com/mgoricki/13fba0f250b2ac142b7729f0833c8a8c.js"></script>
Then you should combine them in the array in form TYPE_NAME:ID (currently there's a bug in 19.2 docs, where you can find that the array values should be formed as TYPE:NAME):<br />
<br />
<script src="https://gist.github.com/mgoricki/9e1f11d705bd8ff6fba98ce33cb7e4e2.js"></script>
The output of the get_application procedure is a table of apex_t_export_file (with <i>name</i> and <i>contents</i> columns). <i>Name</i> column will always have same value (in format f{APP_ID}_components.sql, for example, f100_components.sql) and the <i>contents</i> column will have export code (as a CLOB). No matter how many components do you add to the array you'll always get only one file/element as an output. The only time when you can get more files is if you set p_split parameter to true.<br />
<br />
After that, you can spool code into SQL file as shown in the example in the <a href="https://docs.oracle.com/en/database/oracle/application-express/19.2/aeapi/GET_APPLICATION_Function.html#GUID-A8E626D6-D7DE-4E59-8F90-3666A7A41A87" target="_blank">documentation</a> or play with it in so many different ways. For example, one of the ways is to create an application to manage your APEX component exports (with nice filenames), as shown here <a href="https://apex.oracle.com/pls/apex/f?p=apexbyg:62">https://apex.oracle.com/pls/apex/f?p=apexbyg:62</a>.<br />
<br />
More about that in the next blog post.<br />
<br />
Tested in APEX 19.2.0.00.18.<br />
<br />
Enjoy!<br />
<br />
<br /></div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com2tag:blogger.com,1999:blog-1003209687173038896.post-79415712867244158082019-06-07T10:23:00.001+02:002019-06-07T10:23:59.438+02:00Username Display Fix<div dir="ltr" style="text-align: left;" trbidi="on">
This thing is very simple, but it got me confused...so I hope it will help someone.<br />
<br />
I was building a small APEX app (in APEX 19.1.*) with a custom authentication scheme (custom plugin) and when I've logged in to the app I've noticed that the username is in lowercase. So the first thing that got to my mind was that there's some problem with my authentication plugin. But that wasn't it.<br />
<br />
I'm not 100% sure but I think from APEX 18.1 there's a change how navigation bar looks like. By default when you create an app you'll get username with a nice icon and drop down with Sign Out link. Before, at least in APEX 5.1, by default, there was only a Log Out link. Maybe that's the reason why I didn't notice this thing before.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjMfVnwjKQvzZEFCmRo0aHF_MUHgwUKkvQeMgp-gGw-W92nClvGCQh731DvzSlYGBaNMlHC4hnRnIQAzOBRsZRArIwHGGHu_KjKRoThmJF5NLTFMHMQw7T_A9QUyKPj-XkMeEougCY9_as/s1600/Untitled+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1189" data-original-width="1600" height="473" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjMfVnwjKQvzZEFCmRo0aHF_MUHgwUKkvQeMgp-gGw-W92nClvGCQh731DvzSlYGBaNMlHC4hnRnIQAzOBRsZRArIwHGGHu_KjKRoThmJF5NLTFMHMQw7T_A9QUyKPj-XkMeEougCY9_as/s640/Untitled+2.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So, lowercase is actually forced by CSS. So if you want to display your username as it came out from authentication scheme (in my case uppercase) you only need to remove Shared Components > Navigation Bar List > &APP_USER. > List Item CSS Classes property that's by default set to has-username</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieNcR_2DNyZOO5TGjcoM8AI2LvWOwQbktqlMpzj-hQ2j-LtZjHzOTUxnXO2w9SIZ_jHadr5Tt3bJk77S_Pe_I4U-6I94FNGfDf35ctWTuiGbwoMwpXwv-7_KX_wb5vDzqPl3pKd16Z3K1w/s1600/Untitled+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1309" data-original-width="1600" height="522" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieNcR_2DNyZOO5TGjcoM8AI2LvWOwQbktqlMpzj-hQ2j-LtZjHzOTUxnXO2w9SIZ_jHadr5Tt3bJk77S_Pe_I4U-6I94FNGfDf35ctWTuiGbwoMwpXwv-7_KX_wb5vDzqPl3pKd16Z3K1w/s640/Untitled+4.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Tested in APEX 19.1.0.00.15</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Enjoy!</div>
<br /></div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com5tag:blogger.com,1999:blog-1003209687173038896.post-70874337402296656242019-05-09T14:47:00.001+02:002019-05-09T14:47:15.584+02:00Generate APEX URL in JavaScript<div dir="ltr" style="text-align: left;" trbidi="on">
When developers want to generate APEX URL from a JavaScript the thing that most of them will do is to concatenate URL string like this:<br />
<br />
<script src="https://gist.github.com/mgoricki/c2e868a9113703126acf04002239023d.js"></script>But there's one (unfortunately) <u>undocumented</u> feature that you can use to make it easier. It's possible to do it by using <b>apex.util.makeApplicationUrl </b>function that excepts a JavaScript object as the only parameter. In that object, you can define all that is needed to generate an APEX URL.<br />
<br />
Here is an example:<br />
<br />
<script src="https://gist.github.com/mgoricki/075df9e025924f2b1ef0cbeaaf52fc15.js"></script>
<i>Note: the function will not generate the checksum for pages or items with session state protection turned on.</i><br />
<i><br /></i>
<div>
Enjoy!</div>
<div>
<br /></div>
<div>
Tested in APEX 19.1.0.00.15</div>
<i><br /></i></div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com1tag:blogger.com,1999:blog-1003209687173038896.post-88842736359199214422018-12-10T06:00:00.000+01:002018-12-10T08:44:22.920+01:00Don't duplicate your radio items 🧐<div dir="ltr" style="text-align: left;" trbidi="on">
A few days ago I've managed to produce a very weird bug that was hard to figure out. Thankfully, it was only in a demo application. I hope this blog post will help somebody to fix it a bit faster.<br />
<br />
<h3 style="text-align: left;">
The problem...</h3>
<div>
...was that I couldn't click on the second radio group item with label "Accounting".</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggb_X9mSo8TC4ye4k_cU4J7nhfmKv0AfK6pYM6DZnEMtUh-2Aavv4eV-0R0lJaDKbylJUejuBfH_tMPbW9I7Zkgo46RkK6UZN1we8Fn89Z8AH39kaofDL_6fxGjOlRQABPHYHhOc6wCSI1/s1600/Dec-07-2018+09-00-26.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="292" data-original-width="576" height="323" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggb_X9mSo8TC4ye4k_cU4J7nhfmKv0AfK6pYM6DZnEMtUh-2Aavv4eV-0R0lJaDKbylJUejuBfH_tMPbW9I7Zkgo46RkK6UZN1we8Fn89Z8AH39kaofDL_6fxGjOlRQABPHYHhOc6wCSI1/s640/Dec-07-2018+09-00-26.gif" width="640" /></a></div>
<h3 style="text-align: left;">
</h3>
<h3 style="text-align: left;">
How I did it</h3>
<div>
I've created two radio group items. The first one that I've created was P58_RADIO (with label "Radio Group") and the second one was a duplicate of the first one so it was automatically named P58_RADIO_1. After that, I've moved that item before P58_RADIO and suddenly I couldn't click on "Accounting" label of the second radio group item (as shown above).<br />
<br />
The problem is how APEX internal engine renders radio group items. This is the code for the radio item named P58_RADIO:<br />
<br />
<script src="https://gist.github.com/mgoricki/3413dffca106e941a02bebb8ae81e4ce.js"></script>
</div>
<div>
<br />
If you take a closer look at input and label HTML tags of radio buttons you can see how APEX is generating the ID and FOR HTML attributes: <b>item name</b> + <b>underscore</b> + <b>sequence (starting from 1). </b>In my case, "Accounting" label had FOR attribute that was equal to the ID of a duplicated item (P58_RADIO_1) and that didn't allow me to click on it.<br />
<br /></div>
<h3 style="text-align: left;">
</h3>
<h3 style="text-align: left;">
How to fix it</h3>
<div>
I don't expect from APEX team to change the way how radio items are rendered so just be careful how you're naming your page items. </div>
<div>
<br /></div>
<h3 style="text-align: left;">
CSS fix for Null Display Value</h3>
<div>
Also, in APEX 18.2.0.00.12 (and probably in some lower version), there's a UI bug with horizontal radio group items where property "Display Null Value" is turned on. The display value for null values is displayed in a row before other radio group item values. To fix it, use the following CSS:<br />
<br /></div>
<script src="https://gist.github.com/mgoricki/f6a099f2b4e22eb8327cbba1c4e7c6fb.js"></script>
<br />
<div>
Enjoy!</div>
<div>
<br /></div>
<div>
Tested in APEX 18.2.0.00.12.</div>
</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com3tag:blogger.com,1999:blog-1003209687173038896.post-79592203804071001002018-09-14T13:12:00.000+02:002018-09-14T13:13:50.270+02:00How to set IG default values for email fields when downloading report<div dir="ltr" style="text-align: left;" trbidi="on">
Few days ago I've got interesting APEX question (I don't mind that the question was sent by mail, but there's <a href="https://community.oracle.com/community/technology_network_community/database/developer-tools/application_express" target="_blank">Oracle Community Forum</a> where you can get quicker answer and more people will benefit from it).<br />
<br />
..and the question is: how to define default values for fields that are shown when you want to download Interactive Grid report and send it by the e-mail.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPxZDcKrUJKMhmY8XsxGrTP4-dg3Bi70aiwJGKxCMCUY15qTFXjas4A3C6VPD6gUL_JiOx9zWSHAEsYPNB_a6ATmJt6y7FD_mfw5G-SE5En-PD9vcMnEP42U1GV7PawbVA9VMF6N_ZDr80/s1600/Screen+Shot+2018-09-14+at+12.05.43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="955" data-original-width="800" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPxZDcKrUJKMhmY8XsxGrTP4-dg3Bi70aiwJGKxCMCUY15qTFXjas4A3C6VPD6gUL_JiOx9zWSHAEsYPNB_a6ATmJt6y7FD_mfw5G-SE5En-PD9vcMnEP42U1GV7PawbVA9VMF6N_ZDr80/s640/Screen+Shot+2018-09-14+at+12.05.43.png" width="536" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Maybe I'm wrong but I think there's no native way to do this so I found a workaround.</div>
<div class="separator" style="clear: both; text-align: left;">
You can do this for a specific region/page or globally by using global page (page 0).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
First of all you need to create on click dynamic action triggered on checkbox item "Send as Email":</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipGCxqdb9rVTRaHLgHK5VR8FjFHMNZPJ2N1Fz3dG15eZW1AabpO04AFqe-b_LcrhI3AO7LKDt0daeREjB3uQQKF_z3hux_CYW-zjXHN-cgJjsby6_fBQZhWLp-BTYleY2zkiRBR0rBcu49/s1600/Screen+Shot+2018-09-14+at+12.12.34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="540" data-original-width="550" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipGCxqdb9rVTRaHLgHK5VR8FjFHMNZPJ2N1Fz3dG15eZW1AabpO04AFqe-b_LcrhI3AO7LKDt0daeREjB3uQQKF_z3hux_CYW-zjXHN-cgJjsby6_fBQZhWLp-BTYleY2zkiRBR0rBcu49/s1600/Screen+Shot+2018-09-14+at+12.12.34.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The Event Scope attribute must be set to Dynamic and if you want to restrict this dynamic action to the specific region you should define Static Container (jQuery Selector) property with static ID of IG region (for example #emp, if static ID of a region is emp).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
You also need to create true dynamic action of a type Execute JavaScript Code where you can define items and values that you want to set:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg43VvIqCWZhBQOeTMb6okhKDTpqFsiBgNUdKvKYKtTj5l3YNk6yTB2N5wbpPL9SfqL9EEXstmLwI9-o_bvLYhwoaS2-EsU0E9zI42C8P6vE6XhhjKyJriDcA7HUvvNhX5TJ_aIOXYW0mu7/s1600/Screen+Shot+2018-09-14+at+13.04.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="267" data-original-width="550" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg43VvIqCWZhBQOeTMb6okhKDTpqFsiBgNUdKvKYKtTj5l3YNk6yTB2N5wbpPL9SfqL9EEXstmLwI9-o_bvLYhwoaS2-EsU0E9zI42C8P6vE6XhhjKyJriDcA7HUvvNhX5TJ_aIOXYW0mu7/s1600/Screen+Shot+2018-09-14+at+13.04.04.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Demo is available <a href="https://apex.oracle.com/pls/apex/f?p=100309:54" target="_blank">here</a>.<br />
<br />
Tested in APEX 18.1.0.00.45.<br />
<br />
Enjoy!</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-45943417400850543262018-08-17T11:20:00.000+02:002018-08-17T11:20:53.254+02:00APEX 18.1: Fix Interactive Grid JS error in translated apps<div dir="ltr" style="text-align: left;" trbidi="on">
Recently one of our clients upgraded APEX from 5.1 to 18.1 and all Interactive Grid regions/pages were instantly "broken". There was some strange JS error (<i>"...to few arguments"</i>) in the console window.<br />
<br />
After some investigation I found out the cause of the error. It's actually reported as a known issue (<a href="https://www.oracle.com/technetwork/developer-tools/apex/downloads/apex181-known-issues-4478237.html" target="_blank">28202781 - INTERACTIVE GRID IN TRANSLATED APP GIVES ERROR ON UPGRADE</a>). Apparently the text string APEX.IG.SUMMARY was changed in APEX 18.1 to have fewer parameters and if you have translated application it will raise a JS error at runtime. I don't know why APEX raises error in this case and I hope that this will be fixed in some next release, but for now here's the way how you can fix this.<br />
<br />
Of course, you can go to APEX builder > Shared Components > Text Messages and translate it there with the new text message that will have exactly two parameters (if you have less than two you'll again get JS error). Original text is <i>Interactive Grid. Report: %0, View: %1.</i><br />
<i><br /></i>
You can also do it with PL/SQL script:<br />
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">BEGIN
FOR i IN (SELECT workspace_id
FROM apex_workspaces
WHERE workspace = :WORKSPACE_NAME)
LOOP
apex_util.set_security_group_id(i.workspace_id);
END LOOP;
FOR i IN (SELECT *
FROM apex_application_translations
WHERE application_id = :APP_ID
AND translatable_message = 'APEX.IG.SUMMARY')
LOOP
apex_lang.update_message(
p_id => i.translation_entry_id,
p_message_text => 'Interactive Grid. Report: %0, View: %1');
COMMIT;
EXIT;
END LOOP;
END;
/</span></pre>
<br />
Tested with APEX 18.1.0.00.45<br />
<br />
Enjoy!</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-44680820166982103912018-06-27T21:30:00.002+02:002018-06-27T21:30:44.598+02:00APEX 18.1: No need for configuration tables any more<div dir="ltr" style="text-align: left;" trbidi="on">
There's probably no application that doesn't need some kind of configuration table for storing different data across different environments (development/test/production) - like URL to the report server, configuration parameters and stuff like that.<br />
<br />
Before APEX 18.1 in most cases I would create some simple key-value configuration table, set procedure and get function...repeating same task over and over again.<br />
<br />
From APEX 18.1 you don't have to do that anymore. There's new feature called Application Settings.<br />
<br />
There are two ways to manage Application Settings. One is from the Application Builder (Shared Components):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkimobLs3FtJgrauiVXgXd7HECsXgXmd9HfVIuzhZvjHzjVmv_BqBRS7f9YAYdsJLrD_y3vb5PvDUh4yac2yGgb0OBV_lN7bc4t2pJR2eO1xW1yc5IMXgkAP6NF8nyLesjlz4MUF59Kvjo/s1600/Screen+Shot+2018-06-27+at+21.03.07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="479" data-original-width="800" height="383" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkimobLs3FtJgrauiVXgXd7HECsXgXmd9HfVIuzhZvjHzjVmv_BqBRS7f9YAYdsJLrD_y3vb5PvDUh4yac2yGgb0OBV_lN7bc4t2pJR2eO1xW1yc5IMXgkAP6NF8nyLesjlz4MUF59Kvjo/s640/Screen+Shot+2018-06-27+at+21.03.07.png" width="640" /></a></div>
<br />
You can define several properties there, but the one I like the most is <i>On Upgrade Keep Value</i>. If set to <i>Yes</i> it will keep the setting value upon application upgrade. That means that you can export your application from the development environment and import it to the other environments without any worries that parameter values will be overridden.<br />
<br />
There's also API to control those parameters from PL/SQL. There's new package apex_app_setting with set_value procedure and get_value function. For more info see <a href="https://docs.oracle.com/database/apex-18.1/AEAPI/APEX_APP_SETTING.htm#AEAPI-GUID-22D1A770-2748-42CB-A679-F89CD33B1335" target="_blank">documentation</a>.<br />
<br />
Enjoy!<br />
<br /></div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-55995213925440007912018-06-08T11:28:00.000+02:002018-06-08T11:28:44.067+02:00APEX 18.1: Generate URL checksum outside APEX session<div dir="ltr" style="text-align: left;" trbidi="on">
As a follow up to my previous <a href="http://apexbyg.blogspot.com/2018/06/apex-181-debugging-of-apex-sessions-was.html" target="_blank">blog post about APEX sessions</a>, there's one more thing that you can do now (in APEX 18.1) by using apex_session package - generate checksum for URLs created outside APEX session - for example in some email notifications created in a DB job.<br />
<br />
First of all you need to enable Deep Linking (go to the Application Properties > Security > Session Management and set Deep Linking to Enabled). You can learn more about deep linking in the <a href="https://docs.oracle.com/database/apex-18.1/HTMDB/establishing-user-identity-through-authentication.htm#HTMDB25773" target="_blank">documentation</a>.<br />
<br />
Also, you have to enable Session State Protection for the item that you want to set in URL (in my case P2_DEPTNO):<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiueesga3ypfqxfCBiT9tS60TTKOEJpC-QLjgnZbCp5DsbsU4ZePkXToC4TliwoGAaKoveR7hJV7IrpxdIi29C1Z8V-49WCOAMRGCO7FzShI80vplEE-rhGMUQswL-UO10BShzptE1bgR6U/s1600/Screen+Shot+2018-06-08+at+11.09.44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="267" data-original-width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiueesga3ypfqxfCBiT9tS60TTKOEJpC-QLjgnZbCp5DsbsU4ZePkXToC4TliwoGAaKoveR7hJV7IrpxdIi29C1Z8V-49WCOAMRGCO7FzShI80vplEE-rhGMUQswL-UO10BShzptE1bgR6U/s1600/Screen+Shot+2018-06-08+at+11.09.44.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Before generating URL you have to create session:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">begin
apex_session.create_session(105,1,'MGORICKI');
end;
/</span></pre>
<div>
As I said in my <a href="http://apexbyg.blogspot.com/2018/06/apex-181-debugging-of-apex-sessions-was.html" target="_blank">previous blog post</a>, to use any of the procedures from the apex_session package you have to run them as application parsing schema, one of schemas assigned to the workspace or one of the users with APEX_ADMINISTRATOR_ROLE role.<br />
<br />
After that you should be able to create URL with the checksum by calling apex_page.get_url function:<br />
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">MGORICKI@db12c.local> begin
2 dbms_output.put_line(
3 apex_page.get_url (
4 p_application => 105,
5 p_page => 2,
6 p_items => 'P2_DEPTNO',
7 p_values => '10')
8 );
9 end;
10 /
f?p=105:2:::NO::P2_DEPTNO:10
MGORICKI@db12c.local> exec apex_session.create_session(105,1,'MGORICKI');
PL/SQL procedure successfully completed.
MGORICKI@db12c.local> begin
2 dbms_output.put_line(
3 apex_page.get_url (
4 p_application => 105,
5 p_page => 2,
6 p_items => 'P2_DEPTNO',
7 p_values => '10')
8 );
9 end;
10 /
f?p=105:2:10768192845699::NO::P2_DEPTNO:10&cs=1oFPSPIwCRBbRJ-gn0limWuA1XoCpqism6d38e0-EDXXNyZ8HKLmoJjZNBY7P_rGEL94hPmaZWw1skLp84bPqlg</span></pre>
<br />
Enjoy!</div>
</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com2tag:blogger.com,1999:blog-1003209687173038896.post-80774549370672247902018-06-07T12:08:00.000+02:002018-06-07T12:08:32.451+02:00APEX 18.1: Debugging of the APEX sessions was never easier<div dir="ltr" style="text-align: left;" trbidi="on">
I've already <a href="http://apexbyg.blogspot.com/2017/08/how-to-debugtrace-apex-session.html" target="_blank">blogged about apex_session package</a> and the debugging of the APEX sessions in version 5.1. Same package got bigger in 18.1 with 4 new great procedures:<br />
<ul style="text-align: left;">
<li><a href="https://docs.oracle.com/database/apex-18.1/AEAPI/APEX_SESSION.htm#AEAPI-GUID-348C879F-3B45-4F4E-8641-518C711CE76F" target="_blank">CREATE_SESSION</a></li>
<li><a href="https://docs.oracle.com/database/apex-18.1/AEAPI/APEX_SESSION.htm#AEAPI-GUID-E37F7000-633D-466C-BA8F-0051EDB7A0CC" target="_blank">DELETE_SESSION</a></li>
<li><a href="https://docs.oracle.com/database/apex-18.1/AEAPI/APEX_SESSION.htm#AEAPI-GUID-27465355-B6EB-412A-BFAC-F63FCDB396E0" target="_blank">ATTACH</a></li>
<li><a href="https://docs.oracle.com/database/apex-18.1/AEAPI/APEX_SESSION.htm#AEAPI-GUID-95C1F12F-7B2A-4E86-B244-A9801B95BB72" target="_blank">DETACH</a></li>
</ul>
<div>
Those procedures made debugging of the APEX sessions even easier. The same was possible before by using <a href="http://oos-utils.readthedocs.io/en/latest/oos_util_apex/#create_session" target="_blank">OraOpenSource's OOS_UTIL_APEX package</a>, but it's somehow nicer when you can use native functionality.</div>
<div>
<br /></div>
<div>
With this procedures you can create or join existing session from your favorite IDE and use/debug all those session dependent features like:</div>
<div>
<ul style="text-align: left;">
<li>collections</li>
<li>item session state</li>
<li>apex_mail</li>
<li>...</li>
</ul>
</div>
<div>
To use any of the procedures you have to run them as application parsing schema, one of schemas assigned to the workspace or one of the users with APEX_ADMINISTRATOR_ROLE role.</div>
<div>
<br /></div>
<div>
To create session run following command:</div>
<div>
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">begin
apex_session.create_session(100,1,'MGORICKI');
end;
/</span></pre>
</div>
<div>
After that, if you run following SQL statement:<br />
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">select v('APP_ID') as app_id
, v('APP_SESSION') as app_session
, v('APP_USER') as app_user
from dual;</span></pre>
you'll see that all necessary APEX variables are set:</div>
<div>
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">MGORICKI@db12c.local> select v('APP_ID') as app_id, v('APP_SESSION') as app_Session, v('APP_USER') as app_user from dual;
APP_ID APP_SESSION APP_USER
MGORICKI@db12c.local> exec apex_session.create_session(100,1,'MGORICKI');
PL/SQL procedure successfully completed.
MGORICKI@db12c.local> select v('APP_ID') as app_id, v('APP_SESSION') as app_Session, v('APP_USER') as app_user from dual;
APP_ID APP_SESSION APP_USER
100 2847775298572 MGORICKI
</span></pre>
It's similar if you want to join existing session. You just have to copy session ID (3rd parameter from APEX URL) of the runtime app and add it to the apex_session.attach call:</div>
<div>
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">begin
apex_session.attach (
p_app_id => 100,
p_page_id => 1,
p_session_id => 837851762118
);
end;
/</span></pre>
After that you can get/set item session state, query/create/modify collection and a lot more...<br />
<br />
<h3 style="text-align: left;">
Set/Get Item Session State</h3>
</div>
<div>
Lets say you have v function call inside of a view or a procedure (I don't encourage you to do that, it's better to use bind variables or input parameters). Now, you can easily debug it from IDE by setting item session state:</div>
<div>
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">MGORICKI@db12c.local> create or replace view v_emp_filtered
2 as
3 select *
4 from emp
5 where deptno = v('P1_DEPTNO');
View V_EMP_FILTERED created.
MGORICKI@db12c.local>
MGORICKI@db12c.local> select * from v_emp_filtered;
no rows selected
MGORICKI@db12c.local> exec apex_util.set_session_state('P1_DEPTNO', 10);
PL/SQL procedure successfully completed.
MGORICKI@db12c.local> select * from v_emp_filtered;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7839 KING PRESIDENT 17-NOV-81 5000 10 10
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10 </span></pre>
</div>
<div>
<br /></div>
<div>
<h3 style="text-align: left;">
Create/Query Collections</h3>
</div>
<div>
Same goes for the collections. You can now query/create/modify them from IDE:</div>
<div>
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; font-size: 12px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><span style="color: #333333; font-family: "consolas" , "andale mono wt" , "andale mono" , "bitstream vera sans mono" , "nimbus mono l" , "monaco" , "courier new" , monospace;">MGORICKI@db12c.local> select seq_id, c001 as empno, c002 as ename, c006 as sal from apex_collections where collection_name = 'EMP';
no rows selected
MGORICKI@db12c.local> exec apex_collection.create_collection_from_query('EMP', 'select * from emp');
PL/SQL procedure successfully completed.
MGORICKI@db12c.local> select seq_id, c001 as empno, c002 as ename, c006 as sal from apex_collections where collection_name = 'EMP';
SEQ_ID EMPNO ENAME SAL
1 7839 KING 5000
2 7698 BLAKE 2850
3 7782 CLARK 2450
4 7566 JONES 2975
5 7788 SCOTT 3000
6 7902 FORD 3000
7 7369 SMITH 800
8 7499 ALLEN 1600
9 7521 WARD 1250
10 7654 MARTIN 1250
11 7844 TURNER 1500
12 7876 ADAMS 1100
13 7900 JAMES 950
14 7934 MILLER 1300
14 rows selected.</span></pre>
</div>
<div>
To reset your IDE environment use delete or detach procedures.<br />
<br />
You can find more about the apex_session package <a href="https://docs.oracle.com/database/apex-18.1/AEAPI/APEX_SESSION.htm#GUID-710E9F4F-157C-4EBA-BBA9-3E0B9EE4002A" target="_blank">in documentation</a>.<br />
<br />
Enjoy!</div>
</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-47617633490962478182017-12-12T11:43:00.001+01:002017-12-12T11:45:47.891+01:00Interactive Grid: How to Fix Blank Toolbar DIV<div dir="ltr" style="text-align: left;" trbidi="on">
One of the best functionalities of the Interactive Grid is declarative master-detail option. That's the reason why I like to use them also in readonly mode. Most of the time I don't need toolbar in detail regions so I turn it off (Region Attributes > Toolbar > Show = No).<br />
<br />
But, currently (in APEX 5.1.4.00.04 and less) there's little bug that I can't ignore. It's 9px blank div above report headers:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwUf6eIDsy1T5gweKRlzwTNzpmX3kv6wl2uTemdGcgtIttHCfunEVrh8HbCME6epazC5gQR_2Ybp7A3VDfkrie0YcePFi_0dpDeSzFd6u11Sfob4rfJp69Ghk8DiAlNdCLTE1sNpwXKGcl/s1600/Screen+Shot+2017-12-12+at+11.28.09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="794" data-original-width="1600" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwUf6eIDsy1T5gweKRlzwTNzpmX3kv6wl2uTemdGcgtIttHCfunEVrh8HbCME6epazC5gQR_2Ybp7A3VDfkrie0YcePFi_0dpDeSzFd6u11Sfob4rfJp69Ghk8DiAlNdCLTE1sNpwXKGcl/s640/Screen+Shot+2017-12-12+at+11.28.09.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
At first I thought that's easy - I'll just use <a href="https://css-tricks.com/almanac/selectors/e/empty/" target="_blank">:empty CSS pseudo selector</a> and hide DIV element with CSS class .a-IG-header:
<br />
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; color: #404040; font-family: Menlo, Consolas, mono-space; line-height: 1.5; margin-bottom: 1em !important; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><code class="language-css" style="background-color: transparent; border-radius: 2px; border: none; box-shadow: none; box-sizing: border-box; color: #333333; font-family: Consolas, "Andale Mono WT", "Andale Mono", "Bitstream Vera Sans Mono", "Nimbus Mono L", Monaco, "Courier New", monospace; line-height: 1.5;">.a-IG-header:empty{
display:none
}</code></pre>
But that breaks sticky headers when you scroll down. To fix that I had to use different CSS:
<br />
<pre style="background-color: #fbfaf9; border-radius: 2px; border: 1px solid rgb(204, 204, 204); box-shadow: rgb(204, 204, 204) 0px 0px 0.5em inset; box-sizing: border-box; color: #404040; font-family: Menlo, Consolas, mono-space; line-height: 1.5; margin-bottom: 1em !important; overflow: auto; padding: 0.7em 1em; word-wrap: normal;"><code class="language-css" style="background-color: transparent; border-radius: 2px; border: none; box-shadow: none; box-sizing: border-box; color: #333333; font-family: Consolas, "Andale Mono WT", "Andale Mono", "Bitstream Vera Sans Mono", "Nimbus Mono L", Monaco, "Courier New", monospace; line-height: 1.5;">.a-IG-header:empty{
padding:0;
border-bottom:0
}</code></pre>
If you want to use other regions for master-detail pages take a look at my plugin on <a href="https://apex.world/ords/f?p=100:710:0::::P710_PLG_ID:HR.BILOG.MGORICKI.MASTERDETAIL" target="_blank">apex.world</a>.<br />
<br />
Demo is available <a href="https://apex.oracle.com/pls/apex/f?p=100309:43" target="_blank">here</a>.<br />
<br />
<i>Tested on apex.oracle.com (v5.1.4.00.04).</i><br />
<br />
Enjoy!</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com3tag:blogger.com,1999:blog-1003209687173038896.post-75675530834894728712017-11-29T23:26:00.001+01:002017-11-29T23:26:21.040+01:00Pimp Your Forms - Post/Pre Text Icons<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
I saw this at the presentation from <a href="https://twitter.com/patrickwolf" target="_blank">Patrick Wolf</a> (I believe somewhere in 2016.). You may already know this but today it took me some time to remember how it works.<br />
<br />
There's an easy way to make your forms look nicer by using declarative option to display pre/post item property values as a part of an item (Display as Block). You can display icons, text or links there.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYMsLVbdjSE48sLd-jKnxexP8lYlMQ3Q-HOYzWQztHtLAGGg2NmkccmW51W9Je2e3Kq0EZV1E7IEB7Z5GW-xe6m3uclP2-XtCSgsIyslMFLGourE-YgQgXwmWBd5p8wWgOM2ABKHKR3pq/s1600/Screen+Shot+2017-11-29+at+22.57.58.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="376" data-original-width="712" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYMsLVbdjSE48sLd-jKnxexP8lYlMQ3Q-HOYzWQztHtLAGGg2NmkccmW51W9Je2e3Kq0EZV1E7IEB7Z5GW-xe6m3uclP2-XtCSgsIyslMFLGourE-YgQgXwmWBd5p8wWgOM2ABKHKR3pq/s320/Screen+Shot+2017-11-29+at+22.57.58.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<i><br /></i>
<br />
<h3 style="text-align: left;">
How To</h3>
To enable this, go to the Template Options of the item and set property Item Pre/Post Text to Display as Block:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii9YoesL-TnFOzD-TfMnSPmTFdsJJcgjOB0nV-M6QuwcKPfUlxAUCRSyXtsihCdUeVX5eR5_T7UGLhL_f7T7-XQcfauDxBaWd7WgHZHmSlf3yL79m1L3QkYoe7kdOpwBrgqg4CsZLcDZHa/s1600/Screen+Shot+2017-11-29+at+23.00.08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="576" data-original-width="1028" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii9YoesL-TnFOzD-TfMnSPmTFdsJJcgjOB0nV-M6QuwcKPfUlxAUCRSyXtsihCdUeVX5eR5_T7UGLhL_f7T7-XQcfauDxBaWd7WgHZHmSlf3yL79m1L3QkYoe7kdOpwBrgqg4CsZLcDZHa/s400/Screen+Shot+2017-11-29+at+23.00.08.png" width="400" /></a></div>
<br />
<br />
<br />
After that, put the following HTML code in Pre/Post Text item property (in this case it displays Euro currency icon):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYV_TscSn7959jstACdYIxybDpLcecyJVvN1Biok7JZgGy9n2PdfnjmHoPYY-obmQqNOxG1-g5bfagDnnE85PLNUwnYj-SmJvnTMTIjyeAlS0kBr23FqymGHQWXUU4bU4qApoU1Y3gTCjV/s1600/Screen+Shot+2017-11-29+at+23.09.48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="608" data-original-width="818" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYV_TscSn7959jstACdYIxybDpLcecyJVvN1Biok7JZgGy9n2PdfnjmHoPYY-obmQqNOxG1-g5bfagDnnE85PLNUwnYj-SmJvnTMTIjyeAlS0kBr23FqymGHQWXUU4bU4qApoU1Y3gTCjV/s400/Screen+Shot+2017-11-29+at+23.09.48.png" width="400" /></a></div>
<br />
<br />
You can use any of the icons from <a href="https://apex.oracle.com/pls/apex/f?p=42:4000" target="_blank">Font APEX library</a> there.<br />
<h3 style="text-align: left;">
</h3>
<div>
<br /></div>
<h3 style="text-align: left;">
Note</h3>
<div style="text-align: left;">
In version 5.1.3.00.5 there's a CSS bug with icon alignment. You can fix this by adding following CSS (preferable to global CSS file or Theme Roller):</div>
<div style="text-align: left;">
<br />
<i><span style="font-family: Courier New, Courier, monospace;">.t-Form-itemText .fa {</span></i><br />
<i><span style="font-family: Courier New, Courier, monospace;"> vertical-align:middle;</span></i><br />
<i><span style="font-family: Courier New, Courier, monospace;"> top:-1px;</span></i><br />
<i><span style="font-family: Courier New, Courier, monospace;">}</span></i><br />
<br /></div>
<div>
Demo is available <a href="https://apex.oracle.com/pls/apex/f?p=100309:48" target="_blank">here</a>.</div>
<div>
<br /></div>
<div>
Enjoy!</div>
</div>
<br /></div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com2tag:blogger.com,1999:blog-1003209687173038896.post-46310884849344174552017-08-04T10:44:00.001+02:002017-08-04T10:48:59.496+02:00How to debug/trace APEX session<div dir="ltr" style="text-align: left;" trbidi="on">
In most cases you don't have access to production environment and reproducing of a production bug can be a real problem.<br />
<br />
If you don't use <a href="http://www.oraopensource.com/logger/" target="_blank">logger</a> (which I strongly recommend) or you don't have a <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/managing-feedback.htm#HTMDB28140" target="_blank">feedback page</a> you can always use APEX's native debugging tool.<br />
<br />
There's a easy way to use native <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/utilizing-debug-mode.htm#HTMDB10003" target="_blank">APEX debu</a>g and you can turn it on:<br />
<ul style="text-align: left;">
<li>with 5th <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/utilizing-debug-mode.htm#HTMDB30195" target="_blank">URL parameter</a> that can be set to YES or to some value between LEVEL0 to LEVEL9 (there's no LEVEL3 and LEVEL7). YES equals LEVEL4 (more on debug levels <a href="http://apexbyg.blogspot.hr/2013/02/apex-debug-levels.html" target="_blank">here</a> and <a href="http://docs.oracle.com/database/apex-5.1/AEAPI/Constants-2.htm#AEAPI29184" target="_blank">here</a>). You can use this only for applications that have debugging property turned on (under application properties). </li>
<li>programatically with <a href="http://docs.oracle.com/database/apex-5.1/AEAPI/APEX_DEBUG.htm#AEAPI29182" target="_blank">apex_debug</a> package.</li>
</ul>
<div>
But on production environment you probably want to track a specific user session. To turn it on for specific user session you can use <a href="http://docs.oracle.com/database/apex-5.1/AEAPI/SET_DEBUG-Procedure.htm#AEAPI-GUID-9E5FC479-1B37-4B77-B992-E82720CB95FE" target="_blank">apex_session</a> package (new from APEX 5.1).</div>
<div>
<br /></div>
<div>
To find out what session you want to track you can ask your end user to read you a third parameter in URL (don't do that 🙂) right after application and page id or you can track it yourself by querying APEX dictionary view apex_wokspace_sessions:</div>
<div>
<div>
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: consolas, menlo, monaco, "lucida console", "liberation mono", "dejavu sans mono", "bitstream vera sans mono", "courier new", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">select *
from apex_workspace_sessions
where workspace_name = &WORKSPACE_NAME
and user_name = &USERNAME;</pre>
</div>
<div style="margin: 0px;">
After that you can call apex_session.set_debug to turn on debugging for this specific user session:</div>
</div>
<div>
<br /></div>
<div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: consolas, menlo, monaco, "lucida console", "liberation mono", "dejavu sans mono", "bitstream vera sans mono", "courier new", monospace, sans-serif; font-size: 13px; margin: 0px 0px 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">begin
apex_session.set_debug(p_session_id => &SESSION, p_level => 4);
commit;
end;
/</pre>
</div>
</div>
<div>
Other solution is to use APEX builder (if you have access). To turn it on in APEX builder go to the Monitor Activity > Active Sessions find the session and change session attribute Debug Level</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxbky_HHOx2-q5S0q-3LFHy3E6-0Dt5mhaXX8n2ASkgYvoQHRTykXMRI72FNOjcvENbSx1AVRM410rUUBr2j6h5GAHMZ9bWIpLHrTQ4WA0EF1jfgV1TcWc38te-J4-t6fE3d_xmgsWahI/s1600/Screen+Shot+2017-08-04+at+10.23.20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="812" data-original-width="934" height="347" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxbky_HHOx2-q5S0q-3LFHy3E6-0Dt5mhaXX8n2ASkgYvoQHRTykXMRI72FNOjcvENbSx1AVRM410rUUBr2j6h5GAHMZ9bWIpLHrTQ4WA0EF1jfgV1TcWc38te-J4-t6fE3d_xmgsWahI/s400/Screen+Shot+2017-08-04+at+10.23.20.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Then you can ask your end user to try to reproduce an application bug and after that you can query apex_debug_messages dictionary view to check for errors or you can use APEX Builder to do the same (Application > Utilities > Debug Messages).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
You can use same package (apex_session) to turn on SQL tracing (procedure set_trace). Tracing can be turned on also with <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/enabling-sql-tracing-and-using-tkprof.htm#HTMDB10004" target="_blank">URL parameter</a>. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div>
Enjoy!</div>
<div>
<br /></div>
<div>
<i style="background-color: white; color: #666666; font-family: "trebuchet ms", trebuchet, verdana, sans-serif; font-size: 13.2px;">Tested on APEX 5.1.2.00.09</i></div>
</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com1tag:blogger.com,1999:blog-1003209687173038896.post-18224394890666295392017-06-07T07:49:00.000+02:002020-03-11T08:20:44.317+01:00Auto hide client-side messages<div dir="ltr" style="text-align: left;" trbidi="on">
Probably somebody did a blog post about it but I haven't found it yet.<br />
<br />
<h3 style="text-align: left;">
The Problem</h3>
<div>
If you didn't modify your Universal theme, by default, success and validation messages appear in the top right corner of a page and you have to close them manually or they disappear when you refresh/submit your page.</div>
<div>
<br /></div>
<div>
It can be confusing when you are on a page with Interactive Grid and you change something repeatedly and successfully - it seems like nothing happened. So let's see how to hide them...<br />
<br /></div>
<h3 style="text-align: left;">
The Solution</h3>
<div>
It can be done by using theme hooks under apex.message namespace.<br />
<br /></div>
<h3 style="text-align: left;">
How To</h3>
<div>
If you want that all your client-side messages are hidden after 3 seconds you should call this code:</div>
<div>
<div>
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: consolas, menlo, monaco, "lucida console", "liberation mono", "dejavu sans mono", "bitstream vera sans mono", "courier new", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">apex.message.setThemeHooks({
beforeShow: function(pMsgType, pElement$){
setTimeout(function() {
$('.t-Body-alert .t-Alert').fadeOut('slow');
}, 3000);
}
});</pre>
<div class="separator" style="background-color: white; clear: both;">
Where the second parameter in setTimeout function (with value 3000) is a number of milliseconds. In my case, it's 3 seconds.</div>
<div class="separator" style="background-color: white; clear: both; color: #666666; font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif; font-size: 13.2px;">
<span style="color: black; font-family: "times new roman"; font-size: small;"><br /></span></div>
<div class="separator" style="background-color: white; clear: both;">
If you want to hide only success or error/validation messages you can use pMsgType variable. For example:</div>
<div class="separator" style="background-color: white; clear: both;">
<br /></div>
<div>
<div>
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: consolas, menlo, monaco, "lucida console", "liberation mono", "dejavu sans mono", "bitstream vera sans mono", "courier new", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">apex.message.setThemeHooks({
beforeShow: function(pMsgType, pElement$){
if (pMsgType==apex.message.TYPE.SUCCESS){
setTimeout(function() {
$('.t-Body-alert .t-Alert').fadeOut('slow');
}, 3000);
}
}
});</pre>
</div>
</div>
</div>
</div>
<div>
For error/validation messages pMsgType parameter equals error.</div>
<div>
<br /></div>
<div>
To apply this code for all pages in application put this in Page Load dynamic action on the global page (page 0) or in your custom JS file (preferred).<br />
<br />
The demo is available <a href="https://apex.oracle.com/pls/apex/f?p=100309:33:" target="_blank">here</a>.</div>
<div>
<br /></div>
<div>
Enjoy!</div>
<div>
<br /></div>
<div>
<i style="background-color: white; color: #666666; font-family: "trebuchet ms", trebuchet, verdana, sans-serif; font-size: 13.2px;">Tested on APEX 5.1.1.00.08</i></div>
</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com20tag:blogger.com,1999:blog-1003209687173038896.post-54694806714031814122017-04-28T11:41:00.001+02:002018-11-14T19:22:46.782+01:00How to make any table header sticky<div dir="ltr" style="text-align: left;" trbidi="on">
<h3 style="text-align: left;">
The Problem</h3>
If you're using Interactive Reports and Grids in your apps you may know that there's a property Fixed To that fixes the report's column headers to the top of the page or region so that the column headers remain visible as the user vertically scrolls the report. But there's no such option for Classic report regions or your custom HTML tables.<br />
<br />
<h3 style="text-align: left;">
The Solution</h3>
<div>
You can easily do it by using two JS widgets that are build into APEX - Sticky Table Header and Sticky Widget.<br />
<br /></div>
<h3 style="text-align: left;">
How To </h3>
<div>
To add it to the Classic report region you have to create After Refresh dynamic action that fires after refresh of your Classic report region:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_bpmIIqoe9-rzmh4keM9js57siT5D9_Pgsy5VPulcoUSMn-Zre8dOAV3O1RVi-IZk3R68nZpaP9SUNbtjYlYy0B_sgc0_Y0tMcq4ZZRqqIG2FgA_yDsFIyoTg-4_ioCQwRxw1yhP-1X_e/s1600/Screen+Shot+2017-04-28+at+11.18.23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_bpmIIqoe9-rzmh4keM9js57siT5D9_Pgsy5VPulcoUSMn-Zre8dOAV3O1RVi-IZk3R68nZpaP9SUNbtjYlYy0B_sgc0_Y0tMcq4ZZRqqIG2FgA_yDsFIyoTg-4_ioCQwRxw1yhP-1X_e/s400/Screen+Shot+2017-04-28+at+11.18.23.png" width="400" /></a></div>
<div>
<br /></div>
<div>
and define true action that executes the following JavaScript code:<br />
<br />
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: consolas, menlo, monaco, "lucida console", "liberation mono", "dejavu sans mono", "bitstream vera sans mono", "courier new", monospace, sans-serif; font-size: 13px; margin: 0px 0px 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">var vRegion$ = $(this.triggeringElement);
vRegion$.setTableHeadersAsFixed();
vRegion$.find('.js-stickyTableHeader').stickyWidget();</pre>
<div class="separator" style="clear: both; text-align: left;">
Dynamic action should look like this:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkTVCF-YF6sRm99fHNTbNPdfS_Z3gtAEqnl2ZT4dHe36GtPi_PYfL9GMWkx7zwp_KwQQVMIa8Qu_t5A6S5dMPv9S7XQDSJQtEbQqZ62M8ghHKZfKx79Dck7EvO1b7j-XjGUyecvkIdoMYH/s1600/Screen+Shot+2017-04-28+at+11.30.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkTVCF-YF6sRm99fHNTbNPdfS_Z3gtAEqnl2ZT4dHe36GtPi_PYfL9GMWkx7zwp_KwQQVMIa8Qu_t5A6S5dMPv9S7XQDSJQtEbQqZ62M8ghHKZfKx79Dck7EvO1b7j-XjGUyecvkIdoMYH/s400/Screen+Shot+2017-04-28+at+11.30.04.png" width="350" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
Remember to set property Fire on Initialization to Yes.<br />
<br />
For the additional options you can check out the file libraries/apex/widget.stickyWidget.js in APEX installation folder or through page source view when you're running your application in debug mode.<br />
<br />
For custom HTML tables you can use the same principle and if your custom HTML table is not rendering dynamically fire the JS code above only on page load.<br />
<br />
The demo is avaliable <a href="https://apex.oracle.com/pls/apex/f?p=100309:31" target="_blank">here</a>.<br />
<br />
<i style="background-color: white; color: #666666; font-family: "trebuchet ms", trebuchet, verdana, sans-serif; font-size: 13.2px;">Tested on APEX 5.1.1.00.08</i><br />
<br />
Enjoy!</div>
<div>
<br />
<i><b><u>Update on November 14, 2018.</u></b></i><br />
<i>Following example doesn't work in some versions of APEX (like 18.*). To fix it add a reference to the JS Widget in page property JavaScript File URLs or globally (theme or User Interface Attributes):</i><br />
<i><br /></i>
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: consolas, menlo, monaco, "lucida console", "liberation mono", "dejavu sans mono", "bitstream vera sans mono", "courier new", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow-wrap: normal; overflow: auto; padding: 5px; width: auto;">#IMAGE_PREFIX#libraries/apex/#MIN_DIRECTORY#widget.stickyTableHeader#MIN#.js?v=#APEX_VERSION#</pre>
<i>Thanks for the fix goes to <a href="https://twitter.com/alanarentsen" target="_blank">Alan Arentsen</a>.</i></div>
</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com6tag:blogger.com,1999:blog-1003209687173038896.post-39281588287688516722017-04-06T08:30:00.003+02:002017-08-11T22:21:40.995+02:00Auto format number items in APEX<div dir="ltr" style="text-align: left;" trbidi="on">
One of the questions that I get constantly is how to make a number format masks live - to format number fields as you type or when you leave an item.<br />
<br />
In APEX you can define a number format masks in property Format Mask of number fields:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV15xYzGyiW5S-S9mDih7g5SMPfvlp8EOyl9HdQpiggy_DIjNd6X9ryXxR1R2qVJrXCiQhiNefxLx6yYhQBgELQmz2NtjisOFG4S7xTkkub9CugqEVJJO9OpCD9GQfK_UuHnqCX2Ps-o2r/s1600/Screen+Shot+2017-03-31+at+10.03.55.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV15xYzGyiW5S-S9mDih7g5SMPfvlp8EOyl9HdQpiggy_DIjNd6X9ryXxR1R2qVJrXCiQhiNefxLx6yYhQBgELQmz2NtjisOFG4S7xTkkub9CugqEVJJO9OpCD9GQfK_UuHnqCX2Ps-o2r/s1600/Screen+Shot+2017-03-31+at+10.03.55.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
But it's only affected on page load and after page submit for validating format. There's nothing that prevents end user to enter a string or a number in wrong format.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiISsjQjnDQEtbZ9S_tzzmkgYHfwZOozQ0eyxOxmUhyphenhyphenUeuCze8DrBqwg469tlM_lZhS4VdtjURvXfxFUQiKD3inY1YxpGWeGYS9ozywQAHIeBM9BDF7drWrvcwG3JZy43SDHXWXN67pvcuL/s1600/Mar-31-2017+10-54-59.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiISsjQjnDQEtbZ9S_tzzmkgYHfwZOozQ0eyxOxmUhyphenhyphenUeuCze8DrBqwg469tlM_lZhS4VdtjURvXfxFUQiKD3inY1YxpGWeGYS9ozywQAHIeBM9BDF7drWrvcwG3JZy43SDHXWXN67pvcuL/s640/Mar-31-2017+10-54-59.gif" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
There's a great JS library for that - autoNumeric.js. So let's see how can you implement it in your apps.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
1) Download <a href="https://github.com/BobKnothe/autoNumeric" target="_blank">autoNumeric.js from GitHub</a> (<b>this demo works with autoNumeric library version v2.0.13)</b>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
2) Unzip the file and upload autoNumeric.min.js (from dist folder) to your workspace (or application) files (Shared Components > Static Workspace/Application Files) or to your server file location.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkyUPlfZ3rF0FhpjuALVUdIOEx22hNU1U-_cUgjLg07Ku6ovjSGYaTXAN-p4kOXTIT3AGQBCHIKrUHGZLRHXDgohVak6OLgrALVF-iaJqEFbNjd7gS30Pn4pBSEYxzZldn3wNhuIojOcLi/s1600/Screen+Shot+2017-03-31+at+11.10.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="88" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkyUPlfZ3rF0FhpjuALVUdIOEx22hNU1U-_cUgjLg07Ku6ovjSGYaTXAN-p4kOXTIT3AGQBCHIKrUHGZLRHXDgohVak6OLgrALVF-iaJqEFbNjd7gS30Pn4pBSEYxzZldn3wNhuIojOcLi/s640/Screen+Shot+2017-03-31+at+11.10.22.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
3) Add reference to the file in your application. I usually do it under the Shared Components > User Interface Attributes > Desktop > JavaScript File URLs</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBljKi6JDrbFFaablx3oBnvXSrpeR8XfxCx1lX3vJmRsxxeWGoSAoQVmve_17hL3Af_8lvagZCtYufPql4Fqxw1EkuyNXcXbaCBwRYjsiXwKM-sogLe-STuwjbS40qYwTlejrpP7xxxqH9/s1600/Screen+Shot+2017-03-31+at+11.14.11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBljKi6JDrbFFaablx3oBnvXSrpeR8XfxCx1lX3vJmRsxxeWGoSAoQVmve_17hL3Af_8lvagZCtYufPql4Fqxw1EkuyNXcXbaCBwRYjsiXwKM-sogLe-STuwjbS40qYwTlejrpP7xxxqH9/s640/Screen+Shot+2017-03-31+at+11.14.11.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Now you can use it in your APEX apps. To use it for all APEX number type items you can create onLoad dynamic action on the global page (in most apps this is page 0). Number type items have CSS class number_field so you can initialize AutoNumeric on it, for example:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGgetXDa_cFOpAbYzeS426cGKncv6FPzG8AhZdqz5iVobdmTtJCHov3Kue6asQrN6vYru2OcIa0Yc8c3woMxPusnRyk2PtI-6PP4YR-Hprq8is2Yqx3P0wrWpOyUgToP13RlM_YokJvVjx/s1600/Screen+Shot+2017-04-06+at+08.17.50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGgetXDa_cFOpAbYzeS426cGKncv6FPzG8AhZdqz5iVobdmTtJCHov3Kue6asQrN6vYru2OcIa0Yc8c3woMxPusnRyk2PtI-6PP4YR-Hprq8is2Yqx3P0wrWpOyUgToP13RlM_YokJvVjx/s400/Screen+Shot+2017-04-06+at+08.17.50.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
To explicitly override defaults from the global page you can create onLoad dynamic action on the specific page (remember to put greater sequence id from the one on the page 0) and use the update method to change the default properties:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo8VLm9ieHVHEKtPlRpm0NqbENVwcYq_m7LK4MDnxbYa2CZZyqZuiH4m_y4V1fV42XR2x4p7ypiW-e2yjS2KyOVv7rdIcHas2WYqKfsRpkB36D6Whkn6VcEN5J8qeKcwDZa9Bxeji9r4xd/s1600/Screen+Shot+2017-04-06+at+08.20.19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo8VLm9ieHVHEKtPlRpm0NqbENVwcYq_m7LK4MDnxbYa2CZZyqZuiH4m_y4V1fV42XR2x4p7ypiW-e2yjS2KyOVv7rdIcHas2WYqKfsRpkB36D6Whkn6VcEN5J8qeKcwDZa9Bxeji9r4xd/s400/Screen+Shot+2017-04-06+at+08.20.19.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
For other methods and properties see <a href="https://github.com/autoNumeric/autoNumeric" target="_blank">autoNumeric.js documentation</a>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
You can see demo <a href="https://goo.gl/jbW0mL" target="_blank">here</a>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i>Edit (Thanks to <a href="https://twitter.com/rimblas" target="_blank">Jorge Rimblas</a>): You don't have to hardcode group and decimal separators, you can get them with apex.locale.getGroupSeparator() and apex.locale.getDecimalSeparator().</i></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="background-color: white; clear: both; color: #666666; font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif; font-size: 13.2px;">
Enjoy!</div>
<div class="separator" style="background-color: white; clear: both; color: #666666; font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif; font-size: 13.2px;">
<br /></div>
<div class="separator" style="background-color: white; clear: both; color: #666666; font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif; font-size: 13.2px;">
<i style="font-size: 13.2px;">Tested on APEX 5.1.1.00.08</i></div>
<div class="separator" style="background-color: white; clear: both; color: #666666; font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif; font-size: 13.2px;">
<i style="font-size: 13.2px;"><br /></i></div>
<div class="separator" style="background-color: white; clear: both; color: #666666; font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif; font-size: 13.2px;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br /></div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com2tag:blogger.com,1999:blog-1003209687173038896.post-879936220828392112017-03-17T10:03:00.003+01:002017-03-17T10:03:55.263+01:00APEX 5.1 Master detail (with Interactive/Classic Detail Report)<div dir="ltr" style="text-align: left;" trbidi="on">
You probably know that in APEX 5.1 you can easily make a master-detail report regions declaratively by using an Interactive Grids (IG).<br />
<br />
But what if you don't want all those fancy IG stuff (I know, I know...you can hide/disable all of it) but plain old Classic (or Interactive) Report for a detail report. No problem, it's only few clicks away!<br />
<br />
Let's take a well known example with the dept and emp tables.<br />
<br />
First of all you have to create an Interactive Grid over the dept table (master):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5BekhzEaTECcs57sb53N_nASuw1uzjqJuLLC1rJmVxH3_lhKW7Mo1Gc59gw3OYh56LN1BYqTJmwUGH6jYkIuc__APYXlHmd2YHt7U1quN4BUbkIbZNMBd2cBeexkWB2zLOuhFVu4zhAze/s1600/Screen+Shot+2017-03-17+at+09.12.41.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5BekhzEaTECcs57sb53N_nASuw1uzjqJuLLC1rJmVxH3_lhKW7Mo1Gc59gw3OYh56LN1BYqTJmwUGH6jYkIuc__APYXlHmd2YHt7U1quN4BUbkIbZNMBd2cBeexkWB2zLOuhFVu4zhAze/s640/Screen+Shot+2017-03-17+at+09.12.41.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Don't forget to put the DEPTNO into SQL Query. It can be hidden, but you have to put it in.<br />
<br />
Next step is to create a hidden item (with Value Protected property set to No) where you will temporary store the DEPTNO of the selected grid row (in my case it's P28_DEPTNO):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTUQCzrPXPsSgbgnLiHCe61JEBuxK15nLkuy_O6DKf5qtLHAK7EUx9GlFAcwnkHqeMmL5cLAmdp8NYsIfofuu3F97cbXwqtJPMxSPQwlHUyxS2TEMu2-8TPnZ98dlx2Mf0uaJWC9k_V80u/s1600/Screen+Shot+2017-03-17+at+09.18.06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTUQCzrPXPsSgbgnLiHCe61JEBuxK15nLkuy_O6DKf5qtLHAK7EUx9GlFAcwnkHqeMmL5cLAmdp8NYsIfofuu3F97cbXwqtJPMxSPQwlHUyxS2TEMu2-8TPnZ98dlx2Mf0uaJWC9k_V80u/s1600/Screen+Shot+2017-03-17+at+09.18.06.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
Then you can create your detail report (Classic or Interactive) over the emp table with where condition that references your hidden item (don't forget to put it in Page Items to Submit):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO_NH83Bi32EmqmEj4drur9rpBDGkFwcj13mm4cxKtqrfEpIL9mvOQt0gqds0e2lbyOyQa_wRlZvrdMUK4NdHijXZ2RJJfI9umBwqHKUaJt7jtGweAGN_egT5zOEaeCGe_LRDRS28vlLil/s1600/Screen+Shot+2017-03-17+at+09.36.13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO_NH83Bi32EmqmEj4drur9rpBDGkFwcj13mm4cxKtqrfEpIL9mvOQt0gqds0e2lbyOyQa_wRlZvrdMUK4NdHijXZ2RJJfI9umBwqHKUaJt7jtGweAGN_egT5zOEaeCGe_LRDRS28vlLil/s1600/Screen+Shot+2017-03-17+at+09.36.13.png" /></a></div>
<br />
<br />
Next step is to create a dynamic action with event Selection Change [Interactive Grid] over the dept region:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyqqqPfhBJ5_q42qLLY3JQ6COZsfqe2V__8gc1WfkvOkO1mX3AdARHVnyHXg9kjm1qvLV6nGPlUn6noT3xghjOgZCWodq1Vev9q5KXt_APEMbnnw3sHvGxQKPs7HIci0925Jqznxz0Y_uX/s1600/Screen+Shot+2017-03-17+at+09.20.59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyqqqPfhBJ5_q42qLLY3JQ6COZsfqe2V__8gc1WfkvOkO1mX3AdARHVnyHXg9kjm1qvLV6nGPlUn6noT3xghjOgZCWodq1Vev9q5KXt_APEMbnnw3sHvGxQKPs7HIci0925Jqznxz0Y_uX/s1600/Screen+Shot+2017-03-17+at+09.20.59.png" /></a></div>
<br />
For first true action use Set Value with the Set Type Javascript Expression and define it as:<br />
<br />
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">this.data.selectedRecords.length != 1 ? '': this.data.model.getValue( this.data.selectedRecords[0], "DEPTNO")</pre>
and for an Affected element choose your hidden item:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5ou0UoaDQ5nejiJzBEKK94CFVl3qeHTj_ktQwialj-Dn9XmWdVU9vrz3Y31-HlGW-dPOJe-Cmp6ybayUpmSCMG1fm4cXLjM9hnEMCgYleg9X6WrBUGMyhmvh-qi4uhauZQHHBkW60rSnU/s1600/Screen+Shot+2017-03-17+at+09.43.25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5ou0UoaDQ5nejiJzBEKK94CFVl3qeHTj_ktQwialj-Dn9XmWdVU9vrz3Y31-HlGW-dPOJe-Cmp6ybayUpmSCMG1fm4cXLjM9hnEMCgYleg9X6WrBUGMyhmvh-qi4uhauZQHHBkW60rSnU/s1600/Screen+Shot+2017-03-17+at+09.43.25.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The second true action should be a refresh of your detail region...and thats all.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Live demo is available <a href="https://apex.oracle.com/pls/apex/f?p=100309:28" target="_blank">here</a>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
You can use similar approach if you want this to work with a multiple selected rows (for example in editable grid) but then you should change Set Value DA and where condition of your emp query to support this.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Enjoy!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i style="background-color: white; color: #666666; font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif; font-size: 13.2px;">Tested on APEX 5.1.0.00.45</i></div>
<br /></div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com11tag:blogger.com,1999:blog-1003209687173038896.post-25697777390352010662017-03-03T09:25:00.001+01:002017-03-03T09:25:21.565+01:00APEX 5.1 quick fix: Closing modal page before confirm/alert dialog <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="p1">
<span class="s1">When I have to do some things repeatedly it’s good indication that I should share this in a blog post. This time it's quick one and I’m sure that it will be fixed by Shakeeb in next the APEX (Universal theme) version.</span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">There’s a problem in APEX 5.1.0.00.45 UT when you call confirm/alert dialog with apex.message JS API from modal page. The problem is that you can close modal page before closing confirm/alert dialog.</span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">You can fix this by adding this CSS block to your custom CSS files or to Theme Roller’s Custom </span>CSS property:</div>
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; margin: 0px; padding: 0px; white-space: inherit;"><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">body .ui-front ~ .ui-front{
z-index:902
}</span></code></pre>
<div class="p1">
<span class="s1">Demo is available <a href="https://apex.oracle.com/pls/apex/f?p=100309:23:" target="_blank">here</a>.</span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica; -webkit-text-stroke: #000000}
span.s1 {font-kerning: none}
</style>
<br />
<div class="p1">
<span class="s1">Enjoy!</span></div>
</div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0tag:blogger.com,1999:blog-1003209687173038896.post-43721301645740290422017-02-24T12:17:00.002+01:002017-02-24T12:17:59.529+01:00How to create simple local web server for APEX static files<div dir="ltr" style="text-align: left;" trbidi="on">
Today I've run into a problem that happens to me quite often. I've started a new project at the new client and one of the first things that I've had to do is to modify Universal Theme to meet their corporate design. They had simple APEX architecture with the EPG and without any custom CSS or JS in their apps.<br />
<br />
At first, I thought that I would have to do some minor changes in CSS so I've started to use Custom CSS property in Theme Roller. It's great tool, but as I had to do more and more changes it was just too slow.<br />
<br />
So I've asked them to provide me with some Web repository where I can easily put and change my files. Because this is a quite big company (actually a bank) with very strict security policies I knew that this would take a too looooong time. So I've started to look for an alternative.<br />
<br />
Off course, my first thought was a great tool named <a href="https://github.com/OraOpenSource/apex-frontend-boost" target="_blank">APEX Front End Boost</a> (if you don't know it, check it out), but again, because strict security policies, I wasn't been able to install it on the PC that I was working on. The good thing was that I had Node.js already installed there.<br />
<br />
So I've googled around for other solutions, but almost every solution was starting like this:<br />
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; margin: 0px; padding: 0px; white-space: inherit;"><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">npm install ...</span></code></pre>
and it was a bummer because I couldn't install anything from npm.<br />
<br />
So I've decided to build my own solution. I thought, I'm not a Node.js developer but I know JavaScript so it shouldn't be too hard...and it wasn't.<br />
<br />
I've found one simple server script and added some additional stuff like Access-Control-Allow-Origin and Content-Type headers:<br />
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><span style="color: #303336; font-family: consolas, menlo, monaco, lucida console, liberation mono, dejavu sans mono, bitstream vera sans mono, courier new, monospace, sans-serif;">var fs = require('fs');
var path = require('path');
var http = require('http');
var staticBasePath = '.';
var staticServe = function(req, res) {
var fileLoc = path.resolve(staticBasePath);
fileLoc = path.join(fileLoc, req.url);
fs.readFile(fileLoc, function(err, data) {
if (err) {
res.writeHead(404, 'Not Found');
res.write('404: File Not Found!');
return res.end();
}
var vExt = req.url.split('.').pop(), vContType;
switch(vExt) {
case 'css':
vContType = 'text/css';
break;
case 'js':
vContType = 'text/javascript';
break;
case 'png':
vContType = 'image/png';
break;
default:
vContType = 'text/plain';
}
res.setHeader('Content-Type', vContType);
// Chrome Fix
res.setHeader('Access-Control-Allow-Origin', '*');
res.statusCode = 200;
res.write(data);
return res.end();
});
};
var httpServer = http.createServer(staticServe);
httpServer.listen(8085); </span></pre>
...started it:<br />
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; font-family: consolas, menlo, monaco, "lucida console", "liberation mono", "dejavu sans mono", "bitstream vera sans mono", "courier new", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><span style="color: #303336;">node node_server.js</span></pre>
..and voila! I had my static file server running on localhost:8085 (change the port number if you already have something running on 8085) and I could access files through URL like this http://localhost:8085/custom_theme/custom.css (where custom_theme is directory where node_server.js is located).<br />
<br />
The next goal was that other developers don't have any problems with the application runtime while I'm doing my CSS changes. So at first, I've created one application item F_THEME_PATH<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjenWXfXATUUjW-Jv2pDnm224PU3F2j2lyjcW0ik7BUlOHCiAmOQ_sJkVJjcMBwAlzgMOJXLZQbyrNCFLLJjgTf-BAA4An5qNzT_mqMSk9-abN92itRhSf1taNr7isqdL2iCSAq0TvFz9KZ/s1600/app_item.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="323" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjenWXfXATUUjW-Jv2pDnm224PU3F2j2lyjcW0ik7BUlOHCiAmOQ_sJkVJjcMBwAlzgMOJXLZQbyrNCFLLJjgTf-BAA4An5qNzT_mqMSk9-abN92itRhSf1taNr7isqdL2iCSAq0TvFz9KZ/s640/app_item.png" width="640" /></a></div>
<br />
<br />
and application computation (after authentication) to populate it in developement environment (with build option included for developement only)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi58Ozt1x0BqIE1GxAtJES3iLEBKgEPux3KUw3sVS8ZEQhwkKbPcbb7thxABB8oGAI7wm6MAl9pp88njd4ct5gDN96TP-VwK62wNYQfNIomg2yhNpEL09Uyxhyphenhyphen85tyXg-rlbtnBTAa_trrP/s1600/app_computation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="369" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi58Ozt1x0BqIE1GxAtJES3iLEBKgEPux3KUw3sVS8ZEQhwkKbPcbb7thxABB8oGAI7wm6MAl9pp88njd4ct5gDN96TP-VwK62wNYQfNIomg2yhNpEL09Uyxhyphenhyphen85tyXg-rlbtnBTAa_trrP/s640/app_computation.png" width="640" /></a></div>
<br />
and the other application computation to populate it on production and test environments which always returns path to workspace images (also defined by build option):<br />
<br />
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><span style="color: #303336; font-family: consolas, menlo, monaco, lucida console, liberation mono, dejavu sans mono, bitstream vera sans mono, courier new, monospace, sans-serif;">return '&WORKSPACE_IMAGES.custom_theme/';</span><span style="font-family: consolas, menlo, monaco, "lucida console", "liberation mono", "dejavu sans mono", "bitstream vera sans mono", "courier new", monospace, sans-serif; font-size: 13px;">
</span></pre>
<div>
<br /></div>
The idea is - if I'm logged in take files from my local server and for other users take files from APEX workspace files. On test and production evnironments always take files from APEX workspace files.<br />
<br />
Because there's a great feature to upload zip file with directory structure to APEX workspace files it was really easy to refresh new version of my files when I was sattisfied with my modifications. <br />
<br />
The last thing was to add reference to my files. You can do this in several places in APEX. I've decided to do it in user interface properties:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTeolWaS1pLZAlLlo6_fx__M3m4Cng9HrKTYdSD5OETf7dHbbvlxUiUNOuP70owhsKwYGYr1YH3tpZe0YsszTcK49zOv4_BMBWiY6Lc4xW41B-THhREPQJLaK_prVYNSKve41bj5yvf4pq/s1600/files.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTeolWaS1pLZAlLlo6_fx__M3m4Cng9HrKTYdSD5OETf7dHbbvlxUiUNOuP70owhsKwYGYr1YH3tpZe0YsszTcK49zOv4_BMBWiY6Lc4xW41B-THhREPQJLaK_prVYNSKve41bj5yvf4pq/s400/files.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
Enjoy!<br />
<br />
<i style="background-color: white; color: #666666; font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif; font-size: 13.2px;">Tested on APEX 5.1.0.00.45 and Node 5.2.0</i><br />
<br /></div>
Marko Goričkihttp://www.blogger.com/profile/00170426101592251779noreply@blogger.com0