Loading...

Follow APEX by G on Feedspot

Continue with Google
Continue with Facebook
or

Valid
APEX by G by Marko Gorički - 2w ago
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:

But there's one (unfortunately) undocumented feature that you can use to make it easier. It's possible to do it by using apex.util.makeApplicationUrl 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.

Here is an example:

Note: the function will not generate the checksum for pages or items with session state protection turned on.

Enjoy!

Tested in APEX 19.1.0.00.15

Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 
Few days ago I've got interesting APEX question (I don't mind that the question was sent by mail, but there's Oracle Community Forum where you can get quicker answer and more people will benefit from it).

..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.


Maybe I'm wrong but I think there's no native way to do this so I found a workaround.
You can do this for a specific region/page or globally by using global page (page 0).

First of all you need to create on click dynamic action triggered on checkbox item "Send as Email":


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).

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:



Demo is available here.
Tested in APEX 18.1.0.00.45.
Enjoy!
Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 
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 ("...to few arguments") in the console window.

After some investigation I found out the cause of the error. It's actually reported as a known issue (28202781 - INTERACTIVE GRID IN TRANSLATED APP GIVES ERROR ON UPGRADE). 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.

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 Interactive Grid. Report: %0, View: %1.

You can also do it with PL/SQL script:
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;
/

Tested with APEX 18.1.0.00.45
Enjoy!
Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 
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.

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.

From APEX 18.1 you don't have to do that anymore. There's new feature called Application Settings.

There are two ways to manage Application Settings. One is from the Application Builder (Shared Components):


You can define several properties there, but the one I like the most is On Upgrade Keep Value. If set to Yes 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.

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 documentation.
Enjoy!
Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 
As a follow up to my previous blog post about APEX sessions, 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.

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 documentation.

Also, you have to enable Session State Protection for the item that you want to set in URL (in my case P2_DEPTNO):


Before generating URL you have to create session:
begin
apex_session.create_session(105,1,'MGORICKI');
end;
/
As I said in my previous blog post, 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.

After that you should be able to create URL with the checksum by calling apex_page.get_url function:
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

Enjoy!
Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 
I've already blogged about apex_session package and the debugging of the APEX sessions in version 5.1. Same package got bigger in 18.1 with 4 new great procedures:
Those procedures made debugging of the APEX sessions even easier. The same was possible before by using OraOpenSource's OOS_UTIL_APEX package, but it's somehow nicer when you can use native functionality.

With this procedures you can create or join existing session from your favorite IDE and use/debug all those session dependent features like:
  • collections
  • item session state
  • apex_mail
  • ...
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.

To create session run following command:
begin
apex_session.create_session(100,1,'MGORICKI');
end;
/
After that, if you run following SQL statement:
select v('APP_ID') as app_id
, v('APP_SESSION') as app_session
, v('APP_USER') as app_user
from dual;
you'll see that all necessary APEX variables are set:
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
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:
begin
apex_session.attach (
p_app_id => 100,
p_page_id => 1,
p_session_id => 837851762118
);
end;
/
After that you can get/set item session state, query/create/modify collection and a lot more...

Set/Get Item Session State
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:
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

Create/Query Collections
Same goes for the collections. You can now query/create/modify them from IDE:
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.
To reset your IDE environment use delete or detach procedures.

You can find more about the apex_session package in documentation.
Enjoy!
Read Full Article
  • Show original
  • .
  • Share
  • .
  • Favorite
  • .
  • Email
  • .
  • Add Tags 

Separate tags by commas
To access this feature, please upgrade your account.
Start your free month
Free Preview