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

  1. 定义可执行并发程序
  • 职责:系统管理员(或应用开发者)
  • 菜单:并发->程序->可执行

    可执行和简称:一般为package名。

应用产品:选择相应的开发环境。

执行方法:选择PL/SQL存储过程。

执行文件名:指定调用package的程序入口,一般是MAIN方法,注意写法。

  1. 定义并发程序
  • 职责:系统管理员(或应用开发者)

  • 菜单:并发->程序->定义

程序:一般为报表名称。

简称:一般同可执行的名称。

应用产品:与可执行的设置保持一致。

说明:输入该报表的详细说明。

可执行:选择之前定义好的可执行程序。

格式:报表输出格式设置,选择HTML。

如果报表有输入参数,则点击【参数】按钮进行设置:

序号:参数次序。一般以10为间隔设置,方便以后按次序再添加新的参数。

参数: 一般与报表中的参数名一致。

说明:参数说明信息。

值集:选择合适的值集名称。

提示:参数的显示标签。

变量:必须与package程序入口中的参数的参数名一致。(也可以省略)

3. 将Report运行权限赋给相应的职责

  1. 查找相应职责的请求组

职责:系统管理员

菜单:安全性->职责->定义

2) 将定义好的Report加入请求组

职责:系统管理员

菜单:安全性->职责->请求

查询出相应的请求组。

如果该请求组包含了Report注册时使用的应用,可以不用专门将Report加入到该请求组;

否则需要将并发程序添加到该请求组。

注意添加应用和并发程序的类型区别。

  1. 测试Report
    切换至相应的职责,选择请求,输入参数后提交。
posted @ 2023-03-30 17:01  胖大海527  阅读(526)  评论(0)    收藏  举报