APEX开发实践(25)- APEX & EBS集成开发指导
本文参考了Oracle官方的文档《Extending Oracle E-Business Suite Release 12.2 using Oracle APEX》(2024年11月更新的5.1版本)。
版本要求
Oracle EBS: 12.2.7 或以上版本
Oracle DB:19c 或以上版本
APEX:24.1 或以上版本
ORDS:24.3 或以上版本
基本概念
APEX可以直接对EBS的数据进行开发,创建基于EBS数据的应用。可以通过数据库视图访问EBS的APPS schema,并查询(SELECT)数据。但不能对EBS的数据直接进行增删改(INSERT,DELETE,UPDATE)的操作。这在EBS中是绝对禁止的。APEX只能通过EBS提供的开放的公共的API接口对EBS数据进行增删改的操作。
APEX的EBS扩展可以无缝集成EBS的验证和授权。APEX应用可以使用EBS的登录验证。APEX包括了预设置的验证机制,通过HTTP头的变量使用Oracle访问管理(Oracle Access Manager - OAM)。如果EBS使用了OAM做登录验证,APEX和EBS的统一登录验证就变成一件很简单的事情。否则,需要在EBS的APPS schema里写APEX用户访问的验证函数。
APEX与EBS集成的架构
应用服务器架构
Oracle建议分别单独部署APEX的应用服务器和EBS的应用服务器(如下图)。一套用于部署ORDS,另一套用于部署EBS。

数据库架构
Oracle建议在EBS的数据库上配置APEX(如下图)。在EBS数据库中将配置两个schema。一个是APEX_230100,用于部署APEX引擎。另一个是XX_APEX。给XX_APEX授权访问EBS的数据后,APEX应用可以通过XX_APEX访问EBS的数据。Oracle禁止APEX的应用直接访问EBS的schema APPS。

环境准备
APEX版本:24.2
ORDS版本:23.2.2。(官方建议24.3或更高版本)
地址:http://ds.jasolar.com:8080/ords/appsdev/
Oracle RDBMS : 19.0.0.0.0
Oracle Applications : 12.2.7 +相对应的补丁
地址:http://jjl1u.jasolar.com:8000/OA_HTML/AppsLogin
补丁要求
-
Oracle Weblogic补丁:10.3.6.231017的PSU,补丁号35586779(注:由于EBS12.2.7已经进入Extend Support,不能直接从Oracle支持官网下载);
-
Oracle Application框架补丁:R12.FWK.C,补丁号36839803;
-
Oracle EBS补丁:
-
R12.AD.C,补丁号:36119925
-
R12.TXK.C,补丁号:36117775
-
R12.ATG_PF.C,补丁号:36034949
-
所有的补丁下载连接:
打完这些补丁之后,要用SQLPlus执行ADAPEXSCHREG.sql把APEX用户注册到ERP中。这个sql脚本在$AD_TOP/patch/115/sql/目录下。依照APEX EBS的命名规则,本案例中,APEX的用户为XX_APEX。执行的脚本示例如下:
sqlplus apps/<APPS password> @$AD_TOP/patch/115/sql/ADAPEXSCHREG.sql XX_APEX
验证示例
验证的目的是通过APEX一个表单,去更新APPS用户里的用户数据(邮箱)。如前述,APEX的用户是XX_APEX,不能直接对APPS用户里的表进行增删改的操作。在ERP里用APPS创建一个叫xx_apex_ebs_user的视图,然后调用一个叫xx_apex_sample_apis的程序包。APPS用户下创建这张视图和程序包如下:
xx_apex_ebs_user视图:
注:视图仅仅是为了XX_APEX的表单读取apps.fnd_user表的用户数据。
CREATE OR REPLACE VIEW xx_apex_ebs_user
( user_id
, user_name
, start_date
, end_date
, description
, email_address
, user_guid
, person_party_id
, CONSTRAINT APEX_EBS_USER_pk
PRIMARY KEY (user_id)
RELY DISABLE NOVALIDATE
)
AS
SELECT user_id
, user_name
, start_date
, end_date
, description
, email_address
, user_guid /* Used for Single-Sign On */
, person_party_id /* FK to party information */
FROM fnd_user;
GRANT READ ON xx_apex_ebs_user TO XX_APEX;
GRANT READ on fnd_responsibility_vl TO XX_APEX;
xx_apex_sample_apis
注:程序包也不是直接更新apps.fnd_user表的数据,而是通过调用fnd_user_pkg.updateuser()来更新。
create or replace package xx_apex_sample_apis as
function apex_validate_login ( p_username in varchar2
, p_password in varchar2
) return boolean;
procedure apex_update_email ( p_username in varchar2
, p_owner in varchar2
, p_email_address in varchar2
);
end;
/
create or replace package body xx_apex_sample_apis as
function apex_validate_login ( p_username in varchar2
, p_password in varchar2
) return boolean
is
begin
return fnd_user_pkg.validatelogin(p_username, p_password);
end apex_validate_login;
procedure apex_update_email ( p_username in varchar2
, p_owner in varchar2
, p_email_address in varchar2
)
is
begin
wf_event.setdispatchmode('async');
fnd_user_pkg.updateuser(x_user_name=>p_username, x_owner=>p_owner, x_email_address=>p_email_address);
end apex_update_email;
end xx_apex_sample_apis;
/
show errors
grant execute on xx_apex_sample_apis to XX_APEX;
APEX端的表单创建不在本文详述,参考P31~P32页关于获取用户信息的设置和操作。
-
在APEX的共享组件里创建3个应用级的项:EBS_APP_ID,EBS_RESP_ID,EBS_SEC_GROUP(用户ERP和APEX之间传参);
-
在APEX的页中,在呈现前(Pre_Rendering)创建一个处理,获取用户信息;
begin
for c1 in (select responsibility_name
, description
from apps.fnd_responsibility_vl
where application_id = :EBS_APP_ID
and responsibility_id = :EBS_RESP_ID
) loop
:P4_RESPONSIBILITY_NAME := c1.responsibility_name; //注意修改项ID
:P4_RESP_DESCRIPTION := c1.description; //注意修改项ID
end loop;
exception
when others then
null;
end;
定义APEX的验证和授权
在前面执行注册APEX用户的脚本时候,会创建一个fnd_apex的package,里面包括两个函数:authentication(验证)和authorization(授权)。
验证
在应用-》共享组件-》验证方案中创建一个调用apps.find_apex.authentication()的定制(CUSTOM)的验证方案。

在“编辑应用程序定义”的“安全性”中要选择创建的定制验证方案。

在“编辑应用程序定义”的“用户界面”的“登录URL”中设置指向EBS的用户登录连接http://jjl1u.jasolar.com:8000/OA_HTML/AppsLogin。

授权
Oracle建议在应用层级定义一个权限方案。另外,还应该为应用程序定义会话状态保护,以防止用户通过修改URL来访问页面。
在应用-》共享组件-》授权方案中创建一个调用apps.find_apex.authorization()的权限方案。留意方案类型为“返回布尔值的PL/SQL函数。验证授权方案为“每次页访问一次”。

在页面中设置授权
在页面属性的安全性设置里,选择上一步配置好的授权方案,并选择“页需要验证”。另外,根据授权的具体情况设置“页访问保护”是否“无限制”。“无限制”意味着以使用具有或不具有会话状态参数的 URL (不必具有校验和) 请求页。

启用深链接和超时设置
为了确保页面在没有活动(超时)的时候退出会话状态并要求重新登录,在应用-》共享组件-》安全性-》会话管理中启用深链接。在“会话超时URL”和“会话空闲超时URL”输入EBS的登录URL。

启用APEX应用的嵌入模式
允许APEX应用嵌入到EBS中。在“安全性”-》“浏览器安全”中设置:“嵌入到框架中”:允许相同来源;“HTTP响应头”:Content-Security-Policy: frame-ancestors ‘self' https://<EBS_hostname>:<port>;。
注:这里必须要加上’self‘。否则在嵌入EBS的APEX页面打开模式对话框的时候会报拒接连接的错误,打不开页面。

在EBS里注册APEX应用(页面)
配置APEX URL
用SYSADMIN身份登录EBS。在左侧导航菜单选择“功能管理员,标准”-》“主页”。在主页中按照下图路径编辑APEX的URL输入APEX的访问路径。

添加EBS功能
在同一个页面,按照下图路径创建APEX功能(本示例的功能是更新用户邮箱)


注:这里输入的代码是创建此功能的EBS内部名称。一经创建,不能再更改。
点击右上角的“继续”。选择APEX页面的布局方式,APEX 工作区,APEX的应用以及页面。可以在下面的“HTML调用”中检查选择的appid和pageid是否正确。另外,可以点击绿色“+”添加EBS和APEX之间的传参。所有操作确认后点击右上角的“提交”。

添加成功后,可以搜索到添加好的功能。

添加EBS菜单
在同一个页面,按照下图路径创建EBS菜单。

把上一步创建功能(函数)关联到新建的菜单中。

添加成功后,可以搜索到添加好的菜单。

添加EBS责任
在左侧导航菜单先择“用户管理”-》“责任”
添加责任信息如下图。注意:
-
菜单:选择上一步添加的菜单;
-
应用产品:选择“应用对象程序库”;
-
用于产品:选择“Oracle Self Service Web Applications”;
-
下面的“组”中,数据组名:选择“标准”;应用产品:选择“应用对象程序库”;

添加EBS用户
在同一个页面,选择“用户”。在下面的“注册”选择“用户账户”,点击开始。

创建用户之后,在右上角点击“分配职责”。给这个新建用户分配上一步创建的职责。

最后一步
在左侧导航菜单选择“系统管理员”-》“并发”-》“请求”。在弹出的窗口选择“提交新请求”。搜索并选择“编译安全菜单”(注:留意对应的应用产品是“应用对象程序库”),然后提交。
注:这一步必须在微软的Edge浏览器操作。打开页面之后把浏览器设置为“在Internet Explore模式下重新加载”。如果是第一次操作还要根据提示下载安装oaj2se JAVA运行环境。

完成后,可以查找提交的请求的阶段和状态。

在左侧导航菜单选择“功能管理员,标准”-》“主页”。在主页中按照下图路径清除缓存。

验证功能
先来看ja057965这个用户现在的邮箱是空的。下面要通过嵌入在ERP里的APEX表单修改用户的邮箱。

用新建的ja057965用户登录ERP。可以看到APEX的表单。同时可以看到ERP的用户和APEX的用户是一致的。

填入用户邮箱并提交。

回到ERP的用户管理,可以看到ja057965用户的邮箱已更新。

浙公网安备 33010602011771号