Managing Multiple Applications
#orclAPEX
APEX
commons.wikimedia.org/wiki/Mount_Rainier#/media/File:Mount_Rainier_cloud_cover.jpg
https://twitter.com/hashtag/orclapex
*anything you've seen another website do
Weblogic
18.1
/ords/f?p=LEMENU:HOME:5885404473198::::
ACC_A1.fmb
ACC_A2.fmb
PER_B1.fmb
PER_A2.fmb
PER_C1.fmb
COMMON.mmb
FORM_UTIL.pll
t2
jquery Migrate
New templates
New Template Options
Corrections
New field types
AnyChart -> OracleJET
Tabular -> IG
Form Regions
openModal()
.bind()
f1810, f1820, f1830, f1840
OAuth2
(Azure)
lose intended destination?
An outstanding process problem
Switch on deploy, no API
Alternative
f?p=&APP_ID.:1:&APP_SESSION.:APEX_AUTHENTICATION=dbaccounts
select
2 lvl
,application_name label
,apex_page.get_url
(p_application => app_id
,p_page => 1
,p_request => 'MENU') -- let's track popular usage
,null is_current_list_entry
,icon img
,null imgattr
,null imgalt
,null attribute01
,null attribute02
,null attribute03
,'drop' page_group_name
,app_id order_dropdown
from lemenu_apps
Common to all apps
y = a(1 + r)x
{500+ pages} = 15mb
{1 page} = 100kb
groups \ sub
page-groups
page-sub-groups
f1810 - Land
f1820 - Sea
f1830 - Air
f1840 - Space
f1850 - Underground
f1899
Push change to all
Universal Theme manages subscription internally
5.x+
Create new application...
f101 - Login
f1810
f1820
f1830
Define in each app
Share value across apps
pk_pref.date(:app_user);
&F_DATE_FORMAT.
Globalisation =>
- Mix authentication
- Embrace Data driven concepts
- Go Universal Theme (UT)
- Re-use stuff
Application Access Control
'Y' in (:F_ADMIN, :F_DEV)
"complexity goes somewhere"
OK for smaller deployments?
Authorisation Schemes
AAAA - View Access
AAAC - Remove Access
AAAB - Add Access
f?p=LEMENU:LOGIN
Link to page
The page itself
Logs out if function returns false
or Branch away
On Load: Before Header
- Check user still valid
- Check app availability
l_url := APEX_UTIL.PREPARE_URL
('f?p=LEMENU:HOME:' -- app:page
||v('SESSION') -- retain session
||':APP_SUSPENDED'); -- request
htp.init();
apex_util.redirect_url(l_url, false);
Declarative solution
App Error Handler
IF p_error.apex_error_code =
'APEX.SESSION.EXPIRED' then
l_result.message := 'Your session was left unattended' --...
||htf.script('document.addEventListener("DOMContentLoaded",
function(event) {
$(".t-Icon").removeClass("t-Icon")
.addClass("fa fa-emoji-sleeping fa-5x u-color-12-text");
$(".t-Alert-body p").hide();
});');
- Parse Smartly
- Privilege Granularity
- Page Protection Options
www.grassroots-oracle.com/2015/12/customising-apex-50-workspace-login.html
Every render, submit, AJAX call
select 'javascript:$s(''P88_HOUR'','''
||to_char(view_date,'mm/dd/yy hh24')||''');' lnk
,to_char(view_date,'mm/dd hh24') label
,count(*) hits -- green line series
,sum(elapsed_time) wait_time -- blue bar series
from apex_workspace_activity_log
where view_date between ...
and app_id ...
and page_id ...
and apex_user ..
apex_workspace_activity_log
aggregate
18.1 - rolling 24 hours
business data
Different Behaviour
Decades of change
Digital Natives
New needs
Balance Legacy
no magic pill
"Digital Transformation"
I don't know if you've noticed...
Different release cycle
Defined scope
User set
data
APEX
New privileges
IDE
survival of the fittest
java -> XML
Share credentials
Share Business Data
from devs
from users
C#
Forms
.fmx
FSAL
count(*) v$session every 15 mins
ancient survivor
Forms sessions
Forms users
APEX interactions
~100 users each
Form
User
Date
Host
which forms have our
user group been using
last month?
log.form_visit
(p_current_form => name_in('SYSTEM.CURRENT_FORM')
,p_user => GET_APPLICATION_PROPERTY(username)
,p_host => sys_context('userenv','host')
);
proof
directory_parser
Reporting just grows
UT 1.2
Rome wasn't built in a day
data
Subscriptions / App Items
1899 - Template
- App
- App
Theme 25
Needs security upgrade
Post-Authentication
something slow
generally tightened rules
iframe, wait for result
apex_workspace_activity_log
#Kscope19
Built with by Scott Wesley
grassroots-oracle.com
f1810
Pull update to app
1899
SELECT some_stuff
EXECUTE some_stuff
1.2
1.0
www.grassroots-oracle.com/2019/01/oracle-apex-application-session-sharing.html
Tomcat
UT 1.0
Untouched in 5+ years
DB Accounts
b) import
(n)
DML
commit;
reporting_parser
IR / Charts / Drill
blogs.oracle.com/apex/thats-a-classic-report-really
Avoid the monolith
Life-cycle control
Mitigate APEX
upgrade delay
UT 1.2
Recently migrated to UT
Motivation & tools to divide & conquer
SELECT
1 lvl
,'' label
,apex_page.get_url
(p_application => '1801'
,p_page => 'STATS'
,p_items => 'P102_APP_ID,P102_PAGE_ID'
,p_values => v('APP_ID')||','||v('APP_PAGE_ID')
) target
,null is_current_list_entry
,'fa-combo-chart' img
,null imgattr
,null imgalt
,null attribute01
,null attribute02
,null attribute03
,'bar' page_group_name
,10 order_dropdown
FROM dual
union all
Pages
Time
Graphs make Monitoring magnificent
crm_parser
transactional
commons.wikimedia.org/wiki/File:Siamese_Crocodile_white_background.jpg
copy &
subscribe
Video
- App
- App
Master
Subscribers
Developer changes code
analytics
T
W
M
Weekend
Blog
Book
AnyChart
Tabular Form
AnyChart
f101 (global)
:f_alien := 'Y';
Sunday Symposium
+ Geek night
Monday
+ community event
Tuesday
+ Happy hour
Wednesday
+ Special Event
Thursday Morning
Define granular Security
commons.wikimedia.org/wiki/File:Changyuraptor.png
a) export
f101.sql
twitter.com/joelkallman/status/1126460098895855616
101
102
103
105
211
202
108
Updated regularly
UT 1.2
Menu
APEX
- App
18.2
4.0
- App
apex_application_pages
page_security
Similar concept:
www.grassroots-oracle.com/2015/12/customising-apex-50-workspace-login.html
UT 1.1
Users want more
Login window can also time out
Sharing
Menus
Subscriptions
Security
Monitoring
Forum
hit flurry
Untouched in 7+ years
Theme 2
SELECT many_many_things
job
,apex_page.get_url
(p_application => app_id
,p_page => 1
,p_request => 'MENU')
legacy.fmb
crutch.rep
,apex_page.get_url
(p_application => app_id
,p_page => 1
,p_request => 'CARD')
f1820 (local)
:f_alien := 'N'
f1810 (global)
where :f_alien = 'Y'
- Builder
- My Apps
SELECT emp_list_vw
EXECUTE pk_emp_dir
accidental flood
of AJAX requests