When a button on page has a name which is contained in another button's name (for example button "SAVE" and another button "SAVE_AND_CONFIRM") be careful with defining Server-side condition for page process, computations or branches when Type is "Request is contained in Value".
If Value of Server-side condition is "SAVE_AND_CONFIRM" (so we want for example to execute page process when button "SAVE_AND_CONFIRM" is pressed) process will be executed also when button "SAVE" is pressed. I presume that this is happening because APEX is using LIKE operator to check if request is contained in value... and in our example SAVE is contained in both button names/requests.
My quick (and maybe dirty solution) was to rename button "SAVE_AND_CONFIRM" to "SV_AND_CONFIRM".
Sunday, 23 June 2019
Wednesday, 20 March 2019
Oracle APEX - be careful not to duplicate APEX_ITEM ID for different items
When page gets complicated and there are a lot of regions, it is easy to forget which items created with APEX_ITEM package have which ID.
This IDs is later used in page processes and are referenced as APEX_APPLICATION.G_Fxx collections (where xx is ID defined in APEX_ITEM funtions call).
For example, if we have two SELECT statements as source for two different regions on page
SELECT
level as nivo,
apex_item.checkbox(1, level) as nivo_input
FROM dual
CONNECT BY level <= 10;
SELECT
level + 30 as nivo,
apex_item.text(1, level + 30) as nivo_input
FROM dual
CONNECT BY level <= 10;
This IDs is later used in page processes and are referenced as APEX_APPLICATION.G_Fxx collections (where xx is ID defined in APEX_ITEM funtions call).
For example, if we have two SELECT statements as source for two different regions on page
SELECT
level as nivo,
apex_item.checkbox(1, level) as nivo_input
FROM dual
CONNECT BY level <= 10;
SELECT
level + 30 as nivo,
apex_item.text(1, level + 30) as nivo_input
FROM dual
CONNECT BY level <= 10;
There will be no error when page is generated and shown. Items are working as they are supposed to. You can mark checkboxes from first region and enter/alter values in second region.
BUT!!!!
If we have after submit process which loops through collection APEX_APPLICATION.G_F01 and do some work... we encounter a problem. LOOP takes data from both items and do the operation in process (deletes rows).
Example of process:
APEX_DEBUG.ENABLE;
FOR t IN 1 .. apex_application.g_f01.count LOOP
apex_debug.message('how many: ' || apex_application.g_f01.count);
END LOOP;
Debug after processing:
We can see that process combined values from 2 items.
Example of process:
APEX_DEBUG.ENABLE;
FOR t IN 1 .. apex_application.g_f01.count LOOP
apex_debug.message('how many: ' || apex_application.g_f01.count);
END LOOP;
Debug after processing:
We can see that process combined values from 2 items.
Using TABLE operator with apex_application.g_fxx collections
From Oracle version 12.1 it is possible to use TABLE operator with APEX apex_application.g_fxx collections to get Your data directly into SELECT statement as table.
Example:
SELECT column_value as vl
FROM table(apex_application.g_f01)
WHERE column_value is not null
Examples and detailed explanation:
https://roelhartman.blogspot.com/2018/02/apexapplicationgf0x-array-processing-in.html
Example:
- In interactive or classic report define one field as checkbox (APEX_ITEM package)
- Create new process which executes after submit
- Inside PLSQL code You can use following SELECT to get checked values
SELECT column_value as vl
FROM table(apex_application.g_f01)
WHERE column_value is not null
Examples and detailed explanation:
https://roelhartman.blogspot.com/2018/02/apexapplicationgf0x-array-processing-in.html
Thursday, 14 March 2019
Oracle APEX - Conditions for Classic Report Gallery Row Template
When editing Classic Report template of style Gallery it is possible to define 4 different row templates, which are later used to render a page region correctly.
Interesting is that APEX will choose first one which meet desired conditions, similar to CASE or IF statement.
So, in upper example first template will be chosen when value exists for both CARD_LINK and CARD_LINK_TARGET. Every card in gallery will have link with target set.
Second template will be chosen only when CARD_LINK value exists. No target in link will be set.
Third template will be chosen when conditions for first two are not met.
It is possible to quickly edit template when You have it used on page. Find it on Page Shared Components:
Interesting is that APEX will choose first one which meet desired conditions, similar to CASE or IF statement.
So, in upper example first template will be chosen when value exists for both CARD_LINK and CARD_LINK_TARGET. Every card in gallery will have link with target set.
Second template will be chosen only when CARD_LINK value exists. No target in link will be set.
Third template will be chosen when conditions for first two are not met.
It is possible to quickly edit template when You have it used on page. Find it on Page Shared Components:
On right side there is Edit Component Button:
Subscribe to:
Posts (Atom)