EBS并发请求程序 Html 模板
2017-12-25 16:20
260 查看
一、PL/SQL写包头
CREATE OR REPLACE PACKAGE cux_fengzuo_pkg IS
/*==================================================
Copyright (C) Enterprise Solutions Co.,Ltd.
AllRights Reserved
==================================================*/
PROCEDURE output_line(p_content IN VARCHAR2);
PROCEDURE output_html_head(p_report_title IN VARCHAR2,
p_report_css IN VARCHAR2);
/*==========================================================================+
| Name :
| main
| Arguments :
模板
| errbuf description
| retcode description
| Revision :
| 2017-12-25 Ciel Created
+==========================================================================*/
PROCEDURE main(errbuf OUT VARCHAR2,
retcode OUT VARCHAR2,
p_org_id IN NUMBER,
p_date_from IN VARCHAR2,
p_date_to IN VARCHAR2);
END cux_fengzuo_pkg;
二、写包体
CREATE OR REPLACE PACKAGE BODY cux_fengzuo_pkg IS
------------------- Global variables ------------------------
g_pkg_name CONSTANT VARCHAR2(30) := 'CUX_PROJ_INFO_FZTEST';
g_lookup_type CONSTANT VARCHAR2(120) := 'CUX_PROJ_INFO_FZTEST_LAYOUT'; --快速编码
g_msg_lu_not_found CONSTANT VARCHAR2(300) := 'Report lookup type not found';
g_debug VARCHAR2(1) := nvl(fnd_profile.value('AFLOG_ENABLED'), 'N');
g_nbsp CONSTANT VARCHAR2(240) := chr(38) || 'nbsp;'; --字符集
g_salary_format VARCHAR2(240) := 'FM999G999G999G999G990D00';
--------------------------------------------------------------
/*=================================================
* PROCEDURE NAME: log
*====================================
4000
=============*/
PROCEDURE log(p_content IN VARCHAR2) IS
BEGIN
-- IF g_debug = 'Y' THEN
cux_conc_utl.log_msg(p_msg => p_content);
-- END IF;
END log;
/*=================================================
* PROCEDURE NAME: raise_exception 抛出异常函数
*=================================================*/
PROCEDURE raise_exception(x_return_status VARCHAR2) IS
BEGIN
IF (x_return_status = fnd_api.g_ret_sts_unexp_error)
THEN
RAISE fnd_api.g_exc_unexpected_error;
ELSIF (x_return_status = fnd_api.g_ret_sts_error)
THEN
RAISE fnd_api.g_exc_error;
END IF;
END raise_exception;
/*=================================================+
| FUNCTION
| date_to_char
| DESCRIPTION:
| 日期格式转换
| ARGUMENT:
| p_date - HTML content
| HISTORY:
| 1.00 2017/12/25 Zuo.Feng Created.
+==================================================*/
FUNCTION date_to_char(p_date IN DATE) RETURN VARCHAR2 IS
l_char VARCHAR2(30);
BEGIN
IF p_date IS NOT NULL
THEN
l_char := to_char(p_date, 'YYYY-MM-DD');
END IF;
RETURN l_char;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END date_to_char;
/*=================================================
* FUNCTION NAME: output_blank_filed --输出空文件
*=================================================*/
FUNCTION output_blank_filed(p_char IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN nvl(p_char, g_nbsp);
END output_blank_filed;
/*=================================================
* FUNCTION NAME: get_lookup_meaning --获取快速编码
*=================================================*/
FUNCTION get_lookup_meaning(p_lookup_code IN VARCHAR2) RETURN VARCHAR2 IS
l_meaning VARCHAR2(80);
BEGIN
SELECT flv.meaning
INTO l_meaning
FROM apps.fnd_lookup_values_vl flv
WHERE flv.lookup_type = g_lookup_type
AND flv.lookup_code = p_lookup_code
AND flv.enabled_flag = 'Y'
AND trunc(SYSDATE) BETWEEN
nvl(flv.start_date_active, trunc(SYSDATE - 1)) AND
nvl(flv.end_date_active, trunc(SYSDATE + 1));
RETURN l_meaning;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END get_lookup_meaning;
/*=================================================
* FUNCTION NAME: get_report_title
*=================================================*/
FUNCTION get_report_title RETURN VARCHAR2 IS
l_report_title VARCHAR2(80);
BEGIN
SELECT flt.description
INTO l_report_title
FROM apps.fnd_lookup_types_vl flt, apps.fnd_application fa
WHERE flt.lookup_type = g_lookup_type
AND flt.security_group_id = 0
AND flt.view_application_id = fa.application_id;
RETURN l_report_title;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END get_report_title;
/*=================================================
* FUNCTION NAME: get_client_charset --获取用户字符集
*=================================================*/
FUNCTION get_client_charset RETURN VARCHAR2 IS
l_client_charset VARCHAR2(150);
BEGIN
SELECT v.tag
INTO l_client_charset
FROM fnd_lookup_values_vl v
WHERE v.lookup_type = 'FND_ISO_CHARACTER_SET_MAP'
AND v.lookup_code = fnd_profile.value('ICX_CLIENT_IANA_ENCODING')
AND v.enabled_flag = 'Y'
AND trunc(SYSDATE) BETWEEN
nvl(v.start_date_active, trunc(SYSDATE - 1)) AND
nvl(v.end_date_active, trunc(SYSDATE + 1));
RETURN l_client_charset;
EXCEPTION
WHEN no_data_found THEN
RETURN 'UTF-8';
END get_client_charset;
/*==============================================+
| Function Name: get_org_name
| Function Desc:获取业务实体名称
+==============================================*/
FUNCTION get_org_name(p_org_id IN NUMBER) RETURN VARCHAR2 IS
l_procedure_name VARCHAR2(240) := 'GET_ORG_NAME';
l_org_name VARCHAR2(240);
BEGIN
SELECT o.name
INTO l_org_name
FROM hr_operating_units o
WHERE o.organization_id = p_org_id;
RETURN l_org_name;
EXCEPTION
WHEN no_data_found THEN
RETURN NULL;
WHEN OTHERS THEN
fnd_msg_pub.add_exc_msg(p_pkg_name => g_pkg_name,
p_procedure_name => l_procedure_name,
p_error_text => substr(SQLERRM, 1, 240));
END get_org_name;
/*=================================================+
| PROCEDURE NAME
| output_line
| DESCRIPTION:
| output one HTML line
| ARGUMENT:
| p_content - HTML content
| HISTORY:
| 1.00 2017/12/25 Zuo.Feng Created.
+==================================================*/
PROCEDURE output_line(p_content IN VARCHAR2) IS
BEGIN
cux_conc_utl.out_msg(p_content);
END output_line;
/*=================================================+
| PROCEDURE NAME
| output_title
| DESCRIPTION:
| output report title
| HISTORY:
| 1.00 2017/12/25 Zuo.Feng Created.
+==================================================*/
PROCEDURE output_title(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
x_return_status OUT NOCOPY VARCHAR2,
x_msg_count OUT NOCOPY NUMBER,
x_msg_data OUT NOCOPY VARCHAR2) IS
l_api_name CONSTANT VARCHAR2(30) := 'OUTPUT_TITLE';
l_report_title fnd_lookup_types_vl.meaning%TYPE;
l_report_css fnd_lookup_types_vl.description%TYPE;
BEGIN
-- start activity to create savepoint, check compatibility
-- and initialize message list, include debug message hint to enter api
x_return_status := hand_api.start_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_init_msg_list => p_init_msg_list);
raise_exception(x_return_status);
BEGIN
SELECT l.meaning, l.description
INTO l_report_title, l_report_css
FROM fnd_lookup_types_vl l
WHERE l.lookup_type = g_lookup_type;
EXCEPTION
WHEN no_data_found THEN
hand_api.set_message(p_app_name => hand_api.g_app_name,
p_msg_name => g_msg_lu_not_found,
p_token1 => 'REPORT_LU_TYPE',
p_token1_value => g_lookup_type);
RAISE fnd_api.g_exc_error;
END;
--
-- output title and header
--
output_html_head(l_report_title, l_report_css);
-- API end body
-- end activity, include debug message hint to exit api
x_return_status := hand_api.end_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_commit => p_commit,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
EXCEPTION
WHEN fnd_api.g_exc_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_error,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN fnd_api.g_exc_unexpected_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_unexp,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN OTHERS THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_others,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
END output_title;
/*==============================================+
| PROCEDURE NAME
| output_html_head
| DESCRIPTION:
| output report title and header
| ARGUMENT:
| p_report_title - report name
| HISTORY:
| 1.00 2017/12/25 Zuo.Feng Created.
+==============================================*/
PROCEDURE output_html_head(p_report_title IN VARCHAR2,
p_report_css IN VARCHAR2) IS
l_client_charset VARCHAR2(150);
BEGIN
BEGIN
SELECT v.tag
INTO l_client_charset
FROM fnd_lookup_values_vl v
WHERE v.lookup_type = 'FND_ISO_CHARACTER_SET_MAP'
AND v.lookup_code =
fnd_profile.value('FND_NATIVE_CLIENT_ENCODING')
AND v.enabled_flag = 'Y'
AND trunc(SYSDATE) BETWEEN
nvl(v.start_date_active, trunc(SYSDATE - 1)) AND
nvl(v.end_date_active, trunc(SYSDATE + 1));
EXCEPTION
WHEN no_data_found THEN
l_client_charset := 'UTF-8';
END;
output_line('<html>');
output_line('<head>');
output_line('<meta http-equiv="Content-Type" content="text/html; charset=' ||
l_client_charset || '">');
output_line('<title>' || p_report_title || '</title>');
output_line('<style type="text/css" media="all">');
output_line('body,table{font-size:13px;font-family:"Book Antiqua","Segoe UI", Tahoma, "Trebuchet MS", verdana, helvetica, arial, sans-serif, Georgia;}
#table_margin{margin-left:50px;}
.default_text {mso-number-format:"\@";};
.num
{mso-number-format:"\#\,\#\#0\.00_ \;\[Red\]\\-\#\,\#\#0\.00\\ ";};
.percent
{mso-number-format:Percent;};
.percent1
{font-style:italic;
text-decoration:underline;
text-underline-style:single;
mso-number-format:Percent;}');
IF substr(p_report_css, 1, 1) = '.'
THEN
output_line(';' || p_report_css);
END IF;
output_line('</style>');
output_line('</head>');
output_line('</br>');
output_line('<body>');
output_line('<H3 align=center>' || p_report_title || '</H3>');
output_line('</br>');
END output_html_head;
/*=============================================+
| PROCEDURE NAME
| output_foot
| DESCRIPTION:
| output report title and header
| HISTORY:
| 1.00 2017/11/20 Zuo.Feng Created.
+==============================================*/
PROCEDURE output_html_foot(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
x_return_status OUT NOCOPY VARCHAR2,
x_msg_count OUT NOCOPY NUMBER,
x_msg_data OUT NOCOPY VARCHAR2) IS
l_api_name CONSTANT VARCHAR2(30) := 'OUTPUT_FOOT';
BEGIN
-- start activity to create savepoint, check compatibility
-- and initialize message list, include debug message hint to enter api
x_return_status := hand_api.start_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_init_msg_list => p_init_msg_list);
raise_exception(x_return_status);
-- API body
output_line('</table>');
output_line('</body>');
output_line('</html>');
-- API end body
-- end activity, include debug message hint to exit api
x_return_status := hand_api.end_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_commit => p_commit,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
EXCEPTION
WHEN fnd_api.g_exc_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_error,
e5df
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN fnd_api.g_exc_unexpected_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_unexp,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN OTHERS THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_others,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
END output_html_foot;
-----------------------------------------------------------
-- output_parameter
-----------------------------------------------------------
PROCEDURE output_parameter(p_org_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE) IS
BEGIN
output_line('<table width="100%" cellspacing="0">');
output_line('<tr>');
output_line('<td align="right">' || get_lookup_meaning('ORG_NAME') ||
'</td>');
output_line('<td class="default_text" align="left">' ||
nvl(get_org_name(p_org_id), g_nbsp) || '</td>');
output_line('<td align="right">' || get_lookup_meaning('P_DATE_FROM') ||
'</td>');
output_line('<td class="default_text" align="left">' ||
nvl(date_to_char(p_start_date), g_nbsp) || '</td>');
output_line('<td align="right">' || get_lookup_meaning('P_DATE_TO') ||
'</td>');
output_line('<td class="default_text" align="left">' ||
nvl(date_to_char(p_end_date), g_nbsp) || '</td>');
output_line('<td align="right">' || get_lookup_meaning('PRINT_DATE') ||
'</td>');
output_line('<td class="default_text" align="left">' ||
nvl(date_to_char(SYSDATE), g_nbsp) || '</td>');
output_line('</tr>');
output_line('</table>');
END output_parameter;
/*=================================================
* FUNCTION NAME: process_request 输出报表数据
*=================================================*/
PROCEDURE process_request(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
x_return_status OUT NOCOPY VARCHAR2,
x_msg_count OUT NOCOPY NUMBER,
x_msg_data OUT NOCOPY VARCHAR2,
p_org_id IN NUMBER,
p_date_from IN DATE,
p_date_to IN DATE) IS
l_api_name VARCHAR2(30) := 'PROCESS_REQUEST';
l_savepoint_name VARCHAR2(30);
l_start_date DATE;
l_end_date DATE;
BEGIN
-- start activity to create savepoint, check compatibility
-- and initialize message list, include debug message hint to enter api
x_return_status := hand_api.start_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_init_msg_list => p_init_msg_list);
raise_exception(x_return_status);
-- API body
--output_title
output_title(p_init_msg_list => p_init_msg_list,
p_commit => p_commit,
x_return_status => x_return_status,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
raise_exception(x_return_status);
output_line('<table border="0">');
--output_head
output_line('<tr>');
output_line('<td colspan="3" align="left" style="border:none" class="default_text" nowrap>' ||
get_lookup_meaning('TITLE') || '</td>'); --输出报表题头
output_line('</tr>');
output_line('</table>');
--输出参数
output_parameter(p_org_id, p_date_from, p_date_to); --输出参数和打印日期
/*output line_header 输出报表头*/
output_line('<table width="100%" colspan ="22" cellspacing="0" border="1" cellpadding="0"> ');
output_line('<tr align="center" style="background-color:#BBBBBB">');
output_line('<td align="center">' || get_lookup_meaning('ORG_NAME') ||
'</td>'); --业务实体
output_line('<td align="center">' || get_lookup_meaning('PROJ_ORG') ||
'</td>'); --项目组织
output_line('<td align="center">' || get_lookup_meaning('PROJ_CODE') ||
'</td>'); --项目编号
output_line('<td align="center">' || get_lookup_meaning('PROJ_NAME') ||
'</td>'); --项目名称
output_line('<td align="center">' ||
get_lookup_meaning('PROJ_FULL_NAME') || '</td>'); --项目全称
output_line('<td align="center">' || get_lookup_meaning('PROJ_TYPE') ||
'</td>'); --项目类型
output_line('<td align="center">' ||
get_lookup_meaning('PROJ_MANAGER') || '</td>'); --项目经理
output_line('<td align="center">' || get_lookup_meaning('PROJ_STATUS') ||
'</td>'); --项目状态
output_line('<td align="center">' ||
get_lookup_meaning('BUDGETING_DEPARTMENT') || '</td>'); --预算编制部门
output_line('<td align="center">' ||
get_lookup_meaning('PRODUCT_LINE') || '</td>'); --产品线
output_line('<td align="center">' || get_lookup_meaning('CLIENT') ||
'</td>'); --客户
hss_conc_utl.log_msg('开始');
raise_exception(x_return_status);
-- API end body
-- end activity, include debug message hint to exit api
x_return_status := hand_api.end_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_commit => p_commit,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
EXCEPTION
WHEN fnd_api.g_exc_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hand_api.g_exc_name_error,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN fnd_api.g_exc_unexpected_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hand_api.g_exc_name_unexp,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN OTHERS THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hand_api.g_exc_name_others,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
END process_request;
/*=================================================
* PROCEDURE NAME: main
*=================================================*/
PROCEDURE main(errbuf OUT VARCHAR2,
retcode OUT VARCHAR2,
p_org_id IN NUMBER,
p_date_from IN VARCHAR2,
p_date_to IN VARCHAR2) IS
l_return_status VARCHAR2(30);
l_msg_count NUMBER;
l_msg_data VARCHAR2(4000);
l_api_name VARCHAR2(30) := 'MAIN';
l_date_from DATE;
l_date_to DATE;
BEGIN
--输出日志头
cux_conc_utl.log_header;
hss_conc_utl.log_msg('请求开始');
l_date_from := fnd_conc_date.string_to_date(p_date_from);
l_date_to := fnd_conc_date.string_to_date(p_date_to) + 0.99999;
process_request(p_init_msg_list => fnd_api.g_false,
p_commit => fnd_api.g_false,
x_return_status => l_return_status,
x_msg_count => l_msg_count,
x_msg_data => l_msg_data,
p_org_id => p_org_id,
p_date_from => l_date_from,
p_date_to => l_date_to);
raise_exception(l_return_status);
--输出日志尾
cux_conc_utl.log_footer;
EXCEPTION
WHEN fnd_api.g_exc_error THEN
cux_conc_utl.log_message_list;
retcode := '1';
apps.fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
p_count => l_msg_count,
p_data => l_msg_data);
IF l_msg_count > 1
THEN
l_msg_data := fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
p_encoded => fnd_api.g_false);
END IF;
errbuf := l_msg_data;
WHEN fnd_api.g_exc_unexpected_error THEN
cux_conc_utl.log_message_list;
retcode := '2';
fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
p_count => l_msg_count,
p_data => l_msg_data);
IF l_msg_count > 1
THEN
l_msg_data := fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
p_encoded => fnd_api.g_false);
END IF;
errbuf := l_msg_data;
WHEN OTHERS THEN
fnd_msg_pub.add_exc_msg(p_pkg_name => g_pkg_name,
p_procedure_name => l_api_name,
p_error_text => substrb(SQLERRM, 1, 240));
cux_conc_utl.log_message_list;
retcode := '2';
errbuf := SQLERRM;
END;
END cux_fengzuo_pkg;
三、注册并发请求(应用开发员--并发--先注册可执行,再注册程序)
注意 格式要选 HTML 否则输出的报表会 乱码
1.在这里 p_org_id 值集 选 AR_SRS_OPERATING_UNITS 默认类型 选SQL
SQL:SELECT o.name FROM hr_operating_units o WHERE o.organization_id = fnd_profile.value('DEFAULT_ORG_ID')
提示 :业务实体
2.时间类型的参数
值集选 FND_STANDARD_DATE
四、到CUX:客户化超级用户--快速编码 注册汉字
(理论上PL/SQL 避免出现中文,所以到这里注册成 英文码)
做到这一步,基本上可以跑出报表了
但是在选参数的时候,可能会报错(什么 业务实体 无效。。)
这是因为 没有 设置 业务实体的权限
在系统管理这个职责,进去打开这个功能(注意不是系统管理员)
把你的请求在这里找出来
点更新进去,然后这里选择多个
再运行 ,基本的框架就出来了
再剩下的 就根据功能顾问的需求 来做了。
CREATE OR REPLACE PACKAGE cux_fengzuo_pkg IS
/*==================================================
Copyright (C) Enterprise Solutions Co.,Ltd.
AllRights Reserved
==================================================*/
PROCEDURE output_line(p_content IN VARCHAR2);
PROCEDURE output_html_head(p_report_title IN VARCHAR2,
p_report_css IN VARCHAR2);
/*==========================================================================+
| Name :
| main
| Arguments :
模板
| errbuf description
| retcode description
| Revision :
| 2017-12-25 Ciel Created
+==========================================================================*/
PROCEDURE main(errbuf OUT VARCHAR2,
retcode OUT VARCHAR2,
p_org_id IN NUMBER,
p_date_from IN VARCHAR2,
p_date_to IN VARCHAR2);
END cux_fengzuo_pkg;
二、写包体
CREATE OR REPLACE PACKAGE BODY cux_fengzuo_pkg IS
------------------- Global variables ------------------------
g_pkg_name CONSTANT VARCHAR2(30) := 'CUX_PROJ_INFO_FZTEST';
g_lookup_type CONSTANT VARCHAR2(120) := 'CUX_PROJ_INFO_FZTEST_LAYOUT'; --快速编码
g_msg_lu_not_found CONSTANT VARCHAR2(300) := 'Report lookup type not found';
g_debug VARCHAR2(1) := nvl(fnd_profile.value('AFLOG_ENABLED'), 'N');
g_nbsp CONSTANT VARCHAR2(240) := chr(38) || 'nbsp;'; --字符集
g_salary_format VARCHAR2(240) := 'FM999G999G999G999G990D00';
--------------------------------------------------------------
/*=================================================
* PROCEDURE NAME: log
*====================================
4000
=============*/
PROCEDURE log(p_content IN VARCHAR2) IS
BEGIN
-- IF g_debug = 'Y' THEN
cux_conc_utl.log_msg(p_msg => p_content);
-- END IF;
END log;
/*=================================================
* PROCEDURE NAME: raise_exception 抛出异常函数
*=================================================*/
PROCEDURE raise_exception(x_return_status VARCHAR2) IS
BEGIN
IF (x_return_status = fnd_api.g_ret_sts_unexp_error)
THEN
RAISE fnd_api.g_exc_unexpected_error;
ELSIF (x_return_status = fnd_api.g_ret_sts_error)
THEN
RAISE fnd_api.g_exc_error;
END IF;
END raise_exception;
/*=================================================+
| FUNCTION
| date_to_char
| DESCRIPTION:
| 日期格式转换
| ARGUMENT:
| p_date - HTML content
| HISTORY:
| 1.00 2017/12/25 Zuo.Feng Created.
+==================================================*/
FUNCTION date_to_char(p_date IN DATE) RETURN VARCHAR2 IS
l_char VARCHAR2(30);
BEGIN
IF p_date IS NOT NULL
THEN
l_char := to_char(p_date, 'YYYY-MM-DD');
END IF;
RETURN l_char;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END date_to_char;
/*=================================================
* FUNCTION NAME: output_blank_filed --输出空文件
*=================================================*/
FUNCTION output_blank_filed(p_char IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN nvl(p_char, g_nbsp);
END output_blank_filed;
/*=================================================
* FUNCTION NAME: get_lookup_meaning --获取快速编码
*=================================================*/
FUNCTION get_lookup_meaning(p_lookup_code IN VARCHAR2) RETURN VARCHAR2 IS
l_meaning VARCHAR2(80);
BEGIN
SELECT flv.meaning
INTO l_meaning
FROM apps.fnd_lookup_values_vl flv
WHERE flv.lookup_type = g_lookup_type
AND flv.lookup_code = p_lookup_code
AND flv.enabled_flag = 'Y'
AND trunc(SYSDATE) BETWEEN
nvl(flv.start_date_active, trunc(SYSDATE - 1)) AND
nvl(flv.end_date_active, trunc(SYSDATE + 1));
RETURN l_meaning;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END get_lookup_meaning;
/*=================================================
* FUNCTION NAME: get_report_title
*=================================================*/
FUNCTION get_report_title RETURN VARCHAR2 IS
l_report_title VARCHAR2(80);
BEGIN
SELECT flt.description
INTO l_report_title
FROM apps.fnd_lookup_types_vl flt, apps.fnd_application fa
WHERE flt.lookup_type = g_lookup_type
AND flt.security_group_id = 0
AND flt.view_application_id = fa.application_id;
RETURN l_report_title;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END get_report_title;
/*=================================================
* FUNCTION NAME: get_client_charset --获取用户字符集
*=================================================*/
FUNCTION get_client_charset RETURN VARCHAR2 IS
l_client_charset VARCHAR2(150);
BEGIN
SELECT v.tag
INTO l_client_charset
FROM fnd_lookup_values_vl v
WHERE v.lookup_type = 'FND_ISO_CHARACTER_SET_MAP'
AND v.lookup_code = fnd_profile.value('ICX_CLIENT_IANA_ENCODING')
AND v.enabled_flag = 'Y'
AND trunc(SYSDATE) BETWEEN
nvl(v.start_date_active, trunc(SYSDATE - 1)) AND
nvl(v.end_date_active, trunc(SYSDATE + 1));
RETURN l_client_charset;
EXCEPTION
WHEN no_data_found THEN
RETURN 'UTF-8';
END get_client_charset;
/*==============================================+
| Function Name: get_org_name
| Function Desc:获取业务实体名称
+==============================================*/
FUNCTION get_org_name(p_org_id IN NUMBER) RETURN VARCHAR2 IS
l_procedure_name VARCHAR2(240) := 'GET_ORG_NAME';
l_org_name VARCHAR2(240);
BEGIN
SELECT o.name
INTO l_org_name
FROM hr_operating_units o
WHERE o.organization_id = p_org_id;
RETURN l_org_name;
EXCEPTION
WHEN no_data_found THEN
RETURN NULL;
WHEN OTHERS THEN
fnd_msg_pub.add_exc_msg(p_pkg_name => g_pkg_name,
p_procedure_name => l_procedure_name,
p_error_text => substr(SQLERRM, 1, 240));
END get_org_name;
/*=================================================+
| PROCEDURE NAME
| output_line
| DESCRIPTION:
| output one HTML line
| ARGUMENT:
| p_content - HTML content
| HISTORY:
| 1.00 2017/12/25 Zuo.Feng Created.
+==================================================*/
PROCEDURE output_line(p_content IN VARCHAR2) IS
BEGIN
cux_conc_utl.out_msg(p_content);
END output_line;
/*=================================================+
| PROCEDURE NAME
| output_title
| DESCRIPTION:
| output report title
| HISTORY:
| 1.00 2017/12/25 Zuo.Feng Created.
+==================================================*/
PROCEDURE output_title(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
x_return_status OUT NOCOPY VARCHAR2,
x_msg_count OUT NOCOPY NUMBER,
x_msg_data OUT NOCOPY VARCHAR2) IS
l_api_name CONSTANT VARCHAR2(30) := 'OUTPUT_TITLE';
l_report_title fnd_lookup_types_vl.meaning%TYPE;
l_report_css fnd_lookup_types_vl.description%TYPE;
BEGIN
-- start activity to create savepoint, check compatibility
-- and initialize message list, include debug message hint to enter api
x_return_status := hand_api.start_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_init_msg_list => p_init_msg_list);
raise_exception(x_return_status);
BEGIN
SELECT l.meaning, l.description
INTO l_report_title, l_report_css
FROM fnd_lookup_types_vl l
WHERE l.lookup_type = g_lookup_type;
EXCEPTION
WHEN no_data_found THEN
hand_api.set_message(p_app_name => hand_api.g_app_name,
p_msg_name => g_msg_lu_not_found,
p_token1 => 'REPORT_LU_TYPE',
p_token1_value => g_lookup_type);
RAISE fnd_api.g_exc_error;
END;
--
-- output title and header
--
output_html_head(l_report_title, l_report_css);
-- API end body
-- end activity, include debug message hint to exit api
x_return_status := hand_api.end_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_commit => p_commit,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
EXCEPTION
WHEN fnd_api.g_exc_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_error,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN fnd_api.g_exc_unexpected_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_unexp,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN OTHERS THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_others,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
END output_title;
/*==============================================+
| PROCEDURE NAME
| output_html_head
| DESCRIPTION:
| output report title and header
| ARGUMENT:
| p_report_title - report name
| HISTORY:
| 1.00 2017/12/25 Zuo.Feng Created.
+==============================================*/
PROCEDURE output_html_head(p_report_title IN VARCHAR2,
p_report_css IN VARCHAR2) IS
l_client_charset VARCHAR2(150);
BEGIN
BEGIN
SELECT v.tag
INTO l_client_charset
FROM fnd_lookup_values_vl v
WHERE v.lookup_type = 'FND_ISO_CHARACTER_SET_MAP'
AND v.lookup_code =
fnd_profile.value('FND_NATIVE_CLIENT_ENCODING')
AND v.enabled_flag = 'Y'
AND trunc(SYSDATE) BETWEEN
nvl(v.start_date_active, trunc(SYSDATE - 1)) AND
nvl(v.end_date_active, trunc(SYSDATE + 1));
EXCEPTION
WHEN no_data_found THEN
l_client_charset := 'UTF-8';
END;
output_line('<html>');
output_line('<head>');
output_line('<meta http-equiv="Content-Type" content="text/html; charset=' ||
l_client_charset || '">');
output_line('<title>' || p_report_title || '</title>');
output_line('<style type="text/css" media="all">');
output_line('body,table{font-size:13px;font-family:"Book Antiqua","Segoe UI", Tahoma, "Trebuchet MS", verdana, helvetica, arial, sans-serif, Georgia;}
#table_margin{margin-left:50px;}
.default_text {mso-number-format:"\@";};
.num
{mso-number-format:"\#\,\#\#0\.00_ \;\[Red\]\\-\#\,\#\#0\.00\\ ";};
.percent
{mso-number-format:Percent;};
.percent1
{font-style:italic;
text-decoration:underline;
text-underline-style:single;
mso-number-format:Percent;}');
IF substr(p_report_css, 1, 1) = '.'
THEN
output_line(';' || p_report_css);
END IF;
output_line('</style>');
output_line('</head>');
output_line('</br>');
output_line('<body>');
output_line('<H3 align=center>' || p_report_title || '</H3>');
output_line('</br>');
END output_html_head;
/*=============================================+
| PROCEDURE NAME
| output_foot
| DESCRIPTION:
| output report title and header
| HISTORY:
| 1.00 2017/11/20 Zuo.Feng Created.
+==============================================*/
PROCEDURE output_html_foot(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
x_return_status OUT NOCOPY VARCHAR2,
x_msg_count OUT NOCOPY NUMBER,
x_msg_data OUT NOCOPY VARCHAR2) IS
l_api_name CONSTANT VARCHAR2(30) := 'OUTPUT_FOOT';
BEGIN
-- start activity to create savepoint, check compatibility
-- and initialize message list, include debug message hint to enter api
x_return_status := hand_api.start_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_init_msg_list => p_init_msg_list);
raise_exception(x_return_status);
-- API body
output_line('</table>');
output_line('</body>');
output_line('</html>');
-- API end body
-- end activity, include debug message hint to exit api
x_return_status := hand_api.end_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_commit => p_commit,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
EXCEPTION
WHEN fnd_api.g_exc_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_error,
e5df
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN fnd_api.g_exc_unexpected_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_unexp,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN OTHERS THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_exc_name => hand_api.g_exc_name_others,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
END output_html_foot;
-----------------------------------------------------------
-- output_parameter
-----------------------------------------------------------
PROCEDURE output_parameter(p_org_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE) IS
BEGIN
output_line('<table width="100%" cellspacing="0">');
output_line('<tr>');
output_line('<td align="right">' || get_lookup_meaning('ORG_NAME') ||
'</td>');
output_line('<td class="default_text" align="left">' ||
nvl(get_org_name(p_org_id), g_nbsp) || '</td>');
output_line('<td align="right">' || get_lookup_meaning('P_DATE_FROM') ||
'</td>');
output_line('<td class="default_text" align="left">' ||
nvl(date_to_char(p_start_date), g_nbsp) || '</td>');
output_line('<td align="right">' || get_lookup_meaning('P_DATE_TO') ||
'</td>');
output_line('<td class="default_text" align="left">' ||
nvl(date_to_char(p_end_date), g_nbsp) || '</td>');
output_line('<td align="right">' || get_lookup_meaning('PRINT_DATE') ||
'</td>');
output_line('<td class="default_text" align="left">' ||
nvl(date_to_char(SYSDATE), g_nbsp) || '</td>');
output_line('</tr>');
output_line('</table>');
END output_parameter;
/*=================================================
* FUNCTION NAME: process_request 输出报表数据
*=================================================*/
PROCEDURE process_request(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
x_return_status OUT NOCOPY VARCHAR2,
x_msg_count OUT NOCOPY NUMBER,
x_msg_data OUT NOCOPY VARCHAR2,
p_org_id IN NUMBER,
p_date_from IN DATE,
p_date_to IN DATE) IS
l_api_name VARCHAR2(30) := 'PROCESS_REQUEST';
l_savepoint_name VARCHAR2(30);
l_start_date DATE;
l_end_date DATE;
BEGIN
-- start activity to create savepoint, check compatibility
-- and initialize message list, include debug message hint to enter api
x_return_status := hand_api.start_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_init_msg_list => p_init_msg_list);
raise_exception(x_return_status);
-- API body
--output_title
output_title(p_init_msg_list => p_init_msg_list,
p_commit => p_commit,
x_return_status => x_return_status,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
raise_exception(x_return_status);
output_line('<table border="0">');
--output_head
output_line('<tr>');
output_line('<td colspan="3" align="left" style="border:none" class="default_text" nowrap>' ||
get_lookup_meaning('TITLE') || '</td>'); --输出报表题头
output_line('</tr>');
output_line('</table>');
--输出参数
output_parameter(p_org_id, p_date_from, p_date_to); --输出参数和打印日期
/*output line_header 输出报表头*/
output_line('<table width="100%" colspan ="22" cellspacing="0" border="1" cellpadding="0"> ');
output_line('<tr align="center" style="background-color:#BBBBBB">');
output_line('<td align="center">' || get_lookup_meaning('ORG_NAME') ||
'</td>'); --业务实体
output_line('<td align="center">' || get_lookup_meaning('PROJ_ORG') ||
'</td>'); --项目组织
output_line('<td align="center">' || get_lookup_meaning('PROJ_CODE') ||
'</td>'); --项目编号
output_line('<td align="center">' || get_lookup_meaning('PROJ_NAME') ||
'</td>'); --项目名称
output_line('<td align="center">' ||
get_lookup_meaning('PROJ_FULL_NAME') || '</td>'); --项目全称
output_line('<td align="center">' || get_lookup_meaning('PROJ_TYPE') ||
'</td>'); --项目类型
output_line('<td align="center">' ||
get_lookup_meaning('PROJ_MANAGER') || '</td>'); --项目经理
output_line('<td align="center">' || get_lookup_meaning('PROJ_STATUS') ||
'</td>'); --项目状态
output_line('<td align="center">' ||
get_lookup_meaning('BUDGETING_DEPARTMENT') || '</td>'); --预算编制部门
output_line('<td align="center">' ||
get_lookup_meaning('PRODUCT_LINE') || '</td>'); --产品线
output_line('<td align="center">' || get_lookup_meaning('CLIENT') ||
'</td>'); --客户
hss_conc_utl.log_msg('开始');
raise_exception(x_return_status);
-- API end body
-- end activity, include debug message hint to exit api
x_return_status := hand_api.end_activity(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_commit => p_commit,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
EXCEPTION
WHEN fnd_api.g_exc_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hand_api.g_exc_name_error,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN fnd_api.g_exc_unexpected_error THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hand_api.g_exc_name_unexp,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
WHEN OTHERS THEN
x_return_status := hand_api.handle_exceptions(p_pkg_name => g_pkg_name,
p_api_name => l_api_name,
p_savepoint_name => l_savepoint_name,
p_exc_name => hand_api.g_exc_name_others,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data);
END process_request;
/*=================================================
* PROCEDURE NAME: main
*=================================================*/
PROCEDURE main(errbuf OUT VARCHAR2,
retcode OUT VARCHAR2,
p_org_id IN NUMBER,
p_date_from IN VARCHAR2,
p_date_to IN VARCHAR2) IS
l_return_status VARCHAR2(30);
l_msg_count NUMBER;
l_msg_data VARCHAR2(4000);
l_api_name VARCHAR2(30) := 'MAIN';
l_date_from DATE;
l_date_to DATE;
BEGIN
--输出日志头
cux_conc_utl.log_header;
hss_conc_utl.log_msg('请求开始');
l_date_from := fnd_conc_date.string_to_date(p_date_from);
l_date_to := fnd_conc_date.string_to_date(p_date_to) + 0.99999;
process_request(p_init_msg_list => fnd_api.g_false,
p_commit => fnd_api.g_false,
x_return_status => l_return_status,
x_msg_count => l_msg_count,
x_msg_data => l_msg_data,
p_org_id => p_org_id,
p_date_from => l_date_from,
p_date_to => l_date_to);
raise_exception(l_return_status);
--输出日志尾
cux_conc_utl.log_footer;
EXCEPTION
WHEN fnd_api.g_exc_error THEN
cux_conc_utl.log_message_list;
retcode := '1';
apps.fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
p_count => l_msg_count,
p_data => l_msg_data);
IF l_msg_count > 1
THEN
l_msg_data := fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
p_encoded => fnd_api.g_false);
END IF;
errbuf := l_msg_data;
WHEN fnd_api.g_exc_unexpected_error THEN
cux_conc_utl.log_message_list;
retcode := '2';
fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
p_count => l_msg_count,
p_data => l_msg_data);
IF l_msg_count > 1
THEN
l_msg_data := fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
p_encoded => fnd_api.g_false);
END IF;
errbuf := l_msg_data;
WHEN OTHERS THEN
fnd_msg_pub.add_exc_msg(p_pkg_name => g_pkg_name,
p_procedure_name => l_api_name,
p_error_text => substrb(SQLERRM, 1, 240));
cux_conc_utl.log_message_list;
retcode := '2';
errbuf := SQLERRM;
END;
END cux_fengzuo_pkg;
三、注册并发请求(应用开发员--并发--先注册可执行,再注册程序)
注意 格式要选 HTML 否则输出的报表会 乱码
1.在这里 p_org_id 值集 选 AR_SRS_OPERATING_UNITS 默认类型 选SQL
SQL:SELECT o.name FROM hr_operating_units o WHERE o.organization_id = fnd_profile.value('DEFAULT_ORG_ID')
提示 :业务实体
2.时间类型的参数
值集选 FND_STANDARD_DATE
四、到CUX:客户化超级用户--快速编码 注册汉字
(理论上PL/SQL 避免出现中文,所以到这里注册成 英文码)
做到这一步,基本上可以跑出报表了
但是在选参数的时候,可能会报错(什么 业务实体 无效。。)
这是因为 没有 设置 业务实体的权限
在系统管理这个职责,进去打开这个功能(注意不是系统管理员)
把你的请求在这里找出来
点更新进去,然后这里选择多个
再运行 ,基本的框架就出来了
再剩下的 就根据功能顾问的需求 来做了。
相关文章推荐
- EBS 中HOST主机并发请求模板
- [C++11]并发程序模板(std::thread)
- EBS 并发请求 计划 fnd_conc_release_classes
- EBS并发请求调用CXF webservice 总结
- 【JAVA】JAVA程序根据url请求网站HTML页面
- 微信小程序发送模板消息请求
- APP-FND-00204:并发管理器在运行并发请求xxxxx的派生并发程序 接收事务处理管理器 - RCVOLTM时出错。TM-TIMEOUT.
- ebs中JAVA 并发程序的创建与发布
- 根据可执行,查询请求的职责及并发程序名
- Smarty 模板为 Ajax 请求生成 JSON、XML 和 HTML 响应
- EBS中Java并发程序笔记(1)
- 清除并发请求或者管理器数据程序
- EBS 并发程序运行信息
- [置顶] ajax请求到后台数据,前台不用拼接字符串append追加HTML标签,一样显示到页面 (使用空模板)
- 提交并发请求时使用FUNCTION FND_CONCURRENT.WAIT_FOR_REQUEST等待子并发程序完成
- EBS中Java并发程序笔记(2)
- 帝国 标签模板 使用程序代码 去除html标记 并 截取字符串
- ajax请求到后台数据,前台不用拼接字符串append追加HTML标签,使用空模板一样显示到页面
- EBS 不能打开并发请求输出或者Log
- EBS获取并发程序Trace File