EBS PLSQL + HTML 报表开发
EBS使用PLSQL开发HTML报表
使用PLSQL存储过程准备好数据源,并控制输出的逻辑,最后生成带HTML标签的文本输出,再通过在EBS中设置报表的输出格式为HTML。
如果熟悉Web前端的设计和开发,我感觉用这种方法很方便。
完全将报表开发转变成Web开发了,报表的灵活行被无限放大了。
开发示例:
1.使用PLSQL开发HTML样式的销售订单报表,并通过javascript将数据导出到Excel中
CREATE OR REPLACE PACKAGE CUX_WX_OMRPT01 IS
-- Author : DENG
-- Created : 2022/5/16 10:46:31
-- Purpose : EBS REPORT TRAINING
PROCEDURE MAIN(ERRBUF OUT VARCHAR2,
RETCODE OUT VARCHAR2,
P_ORDER_FROM IN VARCHAR2,
P_ORDER_TO IN VARCHAR2);
END CUX_WX_OMRPT01;
/
CREATE OR REPLACE PACKAGE BODY CUX_WX_OMRPT01
-- Author : DENG
-- Created : 2022/5/16 10:46:31
-- Purpose : EBS REPORT TRAINING IS
C_SPRT VARCHAR2(2) := ',';
--ouput log
PROCEDURE WRITE_LOG(P_LOG VARCHAR2) IS
BEGIN
FND_FILE.PUT_LINE(FND_FILE.LOG, P_LOG);
EXCEPTION
WHEN OTHERS THEN NULL;
END WRITE_LOG;
--output content
PROCEDURE WRITE_OUTPUT(P_CONTENT VARCHAR2) IS
BEGIN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, P_CONTENT);
EXCEPTION
WHEN OTHERS THEN NULL;
END WRITE_OUTPUT;
--BEGIN
PROCEDURE MAIN(ERRBUF OUT VARCHAR2, RETCODE OUT VARCHAR2, P_ORDER_FROM IN VARCHAR2, P_ORDER_TO IN VARCHAR2) IS
CURSOR GETDATA_HEADER_CUR(P_ORDER_FROM VARCHAR2, P_ORDER_TO VARCHAR2) IS
SELECT OH.ORDER_NUMBER, --订单头 订单号码
OT.NAME, --订单头 订单类型
PARTY.PARTY_NAME, --订单头 客户名称
CUST.ACCOUNT_NUMBER, --订单头 客户代码
OH.HEADER_ID
FROM OE_ORDER_HEADERS_ALL OH,
HZ_CUST_ACCOUNTS CUST,
HZ_PARTIES PARTY,
OE_TRANSACTION_TYPES_TL OT
WHERE CUST.PARTY_ID = PARTY.PARTY_ID
AND OH.SOLD_TO_ORG_ID = CUST.CUST_ACCOUNT_ID
AND OH.ORDER_TYPE_ID = OT.TRANSACTION_TYPE_ID
AND OT.LANGUAGE = USERENV('LANG')
AND OH.ORG_ID = FND_PROFILE.VALUE('ORG_ID')
AND OH.ORDER_NUMBER BETWEEN P_ORDER_FROM AND P_ORDER_TO
ORDER BY OH.ORDER_NUMBER;
CURSOR GETDATA_LINE_CUR(P_HEADER_ID NUMBER) IS
SELECT OL.LINE_NUMBER || '.' || OL.SHIPMENT_NUMBER ||
DECODE(OL.COMPONENT_NUMBER, NULL, NULL, '.') || OL.COMPONENT_NUMBER LINE_NUM, --订单行 行号
SHIP_FROM_ORG.ORGANIZATION_CODE, --订单行 仓库代码
OL.ORDERED_ITEM, --订单行 商品型号
OL.ORDERED_QUANTITY, --订单行 数量
OL.UNIT_SELLING_PRICE, --订单行 销售单价
OL.ORDERED_QUANTITY * OL.UNIT_SELLING_PRICE AMOUNT,
--订单行 销售金额
OL.FLOW_STATUS_CODE, --订单行 订单状态
OL.SHIPPING_METHOD_CODE --订单行 发运方法
FROM OE_ORDER_LINES_ALL OL, MTL_PARAMETERS SHIP_FROM_ORG
WHERE OL.HEADER_ID = P_HEADER_ID
AND OL.SHIP_FROM_ORG_ID = SHIP_FROM_ORG.ORGANIZATION_ID(+)
ORDER BY OL.LINE_NUMBER;
BEGIN
-- Parameter Log
WRITE_LOG('****************************************');
WRITE_LOG('*** Parameter List ***');
WRITE_LOG('****************************************');
WRITE_LOG('P_ORDER_FROM = ' || P_ORDER_FROM);
WRITE_LOG('P_ORDER_TO = ' || P_ORDER_TO);
WRITE_LOG('****************************************');
--HTML FORMAT start
WRITE_OUTPUT('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html" />
<title>PLSQL生成HTML报表</title>
<script type="text/javascript" language="javascript">
function PrintTableToExcel(objTab)
{
try
{
var xls = new ActiveXObject( "Excel.Application" );
}
catch(e)
{
alert("要打印该表,您必须安装Excel电子表格软件,同时浏览器须使用“ActiveX 控件”,您的浏览器须允许执行控件。
请点击【帮助】了解浏览器设置方法!");
return false;
}
xls.visible = true;
var xlBook = xls.Workbooks.Add;
var xlsheet = xlBook.Worksheets(1);
var x = 1;
var y = 1;
for (var i = 0; i < objTab.rows.length; i++)
{
y = 1;
for (var j = 0; j < objTab.rows[i].cells.length; j++)
{
xlsheet.Cells(x, y).Value = objTab.rows[i].cells[j].innerHTML;
xlsheet.Cells(x, y).Borders.LineStyle = 1;
y++;
}
x++;
}
xlsheet.Columns.AutoFit; //自动适应大小
return;
}
</script>
</head>
<body>');
WRITE_OUTPUT('<input type="button" value="导出至Excel" οnclick=PrintTableToExcel(test) />'); WRITE_OUTPUT('<table id="test">'); FOR GETDATA_HEADER_REC IN GETDATA_HEADER_CUR(P_ORDER_FROM, P_ORDER_TO) LOOP WRITE_OUTPUT('<tr>'); WRITE_OUTPUT('<th colspan="2">订单号码:' || GETDATA_HEADER_REC.ORDER_NUMBER || '</th>'); WRITE_OUTPUT('<th colspan="2">订单类型:' || GETDATA_HEADER_REC.NAME || '</th>'); WRITE_OUTPUT('<th colspan="2">客户名称:' || GETDATA_HEADER_REC.PARTY_NAME || '</th>'); WRITE_OUTPUT('<th colspan="2">客户代码:' || GETDATA_HEADER_REC.ACCOUNT_NUMBER || '</th>'); WRITE_OUTPUT('</tr>'); WRITE_OUTPUT('<tr> <td>行号</td><td>仓库代码</td>
<td>商品型号</td><td>数量</td>
<td>销售单价</td><td>销售金额</td>
<td>订单状态</td><td>发运方法</td></tr>'); FOR GETDATA_LINE_REC IN GETDATA_LINE_CUR(GETDATA_HEADER_REC.HEADER_ID) LOOP WRITE_OUTPUT('<tr>'); WRITE_OUTPUT('<td>' || GETDATA_LINE_REC.LINE_NUM || '</td>'); WRITE_OUTPUT('<td>' || GETDATA_LINE_REC.ORGANIZATION_CODE || '</td>'); WRITE_OUTPUT('<td>' || GETDATA_LINE_REC.ORDERED_ITEM || '</td>'); WRITE_OUTPUT('<td>' || GETDATA_LINE_REC.ORDERED_QUANTITY || '</td>'); WRITE_OUTPUT('<td>' || GETDATA_LINE_REC.UNIT_SELLING_PRICE || '</td>'); WRITE_OUTPUT('<td>' || GETDATA_LINE_REC.AMOUNT || '</td>'); WRITE_OUTPUT('<td>' || GETDATA_LINE_REC.FLOW_STATUS_CODE || '</td>'); WRITE_OUTPUT('<td>' || GETDATA_LINE_REC.SHIPPING_METHOD_CODE || '</td>'); WRITE_OUTPUT('</tr>');
END LOOP; WRITE_OUTPUT('<tr></tr>');
END LOOP; WRITE_OUTPUT('</table>'); WRITE_OUTPUT('</body></html>');
--HTML FORMAT end
EXCEPTION
WHEN OTHERS THEN ERRBUF := SQLERRM; RETCODE := SQLCODE;
END MAIN;
BEGIN
NULL;
END CUX_WX_OMRPT01;
2.在EBS应用中注册Report
- 定义可执行并发程序
- 职责:系统管理员(或应用开发者)
- 菜单:并发->程序->可执行

可执行和简称:一般为package名。
应用产品:选择相应的开发环境。
执行方法:选择PL/SQL存储过程。
执行文件名:指定调用package的程序入口,一般是MAIN方法,注意写法。
- 定义并发程序
-
职责:系统管理员(或应用开发者)
-
菜单:并发->程序->定义

程序:一般为报表名称。
简称:一般同可执行的名称。
应用产品:与可执行的设置保持一致。
说明:输入该报表的详细说明。
可执行:选择之前定义好的可执行程序。
格式:报表输出格式设置,选择HTML。
如果报表有输入参数,则点击【参数】按钮进行设置:

序号:参数次序。一般以10为间隔设置,方便以后按次序再添加新的参数。
参数: 一般与报表中的参数名一致。
说明:参数说明信息。
值集:选择合适的值集名称。
提示:参数的显示标签。
变量:必须与package程序入口中的参数的参数名一致。(也可以省略)
3. 将Report运行权限赋给相应的职责
- 查找相应职责的请求组
职责:系统管理员
菜单:安全性->职责->定义

2) 将定义好的Report加入请求组
职责:系统管理员
菜单:安全性->职责->请求

查询出相应的请求组。
如果该请求组包含了Report注册时使用的应用,可以不用专门将Report加入到该请求组;
否则需要将并发程序添加到该请求组。
注意添加应用和并发程序的类型区别。
- 测试Report
切换至相应的职责,选择请求,输入参数后提交。


浙公网安备 33010602011771号