TEC1401.Report开发技术总结 - 第一章 使用PLSQL开发HTML报表

来源:互联网 发布:淘宝企业店铺入口 编辑:程序博客网 时间:2024/05/29 03:16

 

第一章   使用PLSQL开发HTML报表

使用PLSQL存储过程准备好数据源,并控制输出的逻辑,最后生成带HTML标签的文本输出,再通过在EBS中设置报表的输出格式为HTML

如果熟悉Web前端的设计和开发,我感觉用这种方法很方便。

完全将报表开发转变成Web开发了,报表的灵活行被无限放大了。

 

开发示例:

使用PLSQL开发HTML样式的销售订单报表,并通过javascript将数据导出到Excel

1.     PLSQL代码编写

                       CREATE OR REPLACE PACKAGE CUX_WX_OMRPT01 IS                       -- Author  : ALLEN                       -- Created : 2014/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  : ALLEN                       -- Created : 2014/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" onclick=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)     定义可执行并发程序

l 职责:系统管理员(或应用开发者)

l 菜单:并发->程序->可执行

clip_image002

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

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

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

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

2)     定义并发程序

l 职责:系统管理员(或应用开发者)

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

clip_image004

程序:一般为报表名称。

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

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

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

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

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

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

clip_image006

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

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

说明:参数说明信息。

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

提示:参数的显示标签。

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

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

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

职责:系统管理员

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

clip_image008

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

职责:系统管理员

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

clip_image010

查询出相应的请求组。

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

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

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

3)     测试Report

切换至相应的职责,选择请求,输入参数后提交。

clip_image012

 

0 0
原创粉丝点击