壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: ttx2000

关于SQL*PLUS写报表

[复制链接]
发表于 2007/4/17 09:20:52 | 显示全部楼层
原帖由 bike_lu 于 2007-4-16 11:24 发表
我用PL/SQL源码测试,在测package时就会提示:
Compilation errors for PACKAGE BODY APPS.CUX_OTHER01_REPORT
Error: Hint: Parameter 'errbuf' is declared but never used in 'do'
Line: 36
Text: procedu ...


errbuf 和 retcode设定为了out类型的过程接口参数,在过程内部应该给这两个参数赋值
发表于 2007/4/19 17:04:24 | 显示全部楼层
个人感觉用 pl/sql写的报表比report builder要漂亮,因为可以保存到excel中,格式控制也是很不错的
发表于 2007/5/6 16:41:21 | 显示全部楼层
原帖由 bike_lu 于 2007-4-16 11:24 发表
我用PL/SQL源码测试,在测package时就会提示:
Compilation errors for PACKAGE BODY APPS.CUX_OTHER01_REPORT
Error: Hint: Parameter 'errbuf' is declared but never used in 'do'
Line: 36
Text: procedu ...


你看看對應的參數你是否有在該procedure裏用到
发表于 2007/5/6 16:43:04 | 显示全部楼层
原帖由 bike_lu 于 2007-4-16 18:19 发表
如何定义内部参数呀?


内部參數像一般的pkg定義,傳入參數需要挂報表的時候去定義(與report builder寫的報表傳入參數定義一樣)。
发表于 2007/5/6 16:44:41 | 显示全部楼层
原帖由 ttx2000 于 2007-1-12 15:05 发表
感谢纵横四海的例子,用pl/sql写我会,呵呵,我现在是要用SQL*PLUS来写报表,不是pl/sql存储过程,你有好例子或者建议吗


一個pl/sql報表裏面可以包含procedure and function等等。
发表于 2007/5/8 14:00:31 | 显示全部楼层

回复 #20 bike_lu 的帖子

内部参数直接在一段程序里定义就可,例一段触发
发表于 2007/5/8 15:18:50 | 显示全部楼层
plsql写报表的好处是很多的 比用report修改格式方面也要容易得多 。我上传一个格式的存储,大家要用的话可以参考以下采用xx存储格式化输出报表:

v_base_line                  NUMBER := 0;
    BEGIN
        xx.print_title(fnd_global.org_name,3000);

        xx.out('<table cellSpacing=0 width="3000" bgColor=#000000 border=0>');
        xx.out('<tr bgColor=#ffffff>');
        xx.out('<td class="ce" colspan=2>销售统计报表</td>');
        xx.out('</tr>');
        xx.out('<tr bgColor=#ffffff>');
        xx.out('<td class="ce" colspan=2>========================</td>');
        xx.out('</tr>');
        xx.out('<tr bgColor=#ffffff >');
        xx.out('<td width=10% class="lf">发运日期从:'||substr(p_date_from,1,4)||'/'||substr(p_date_from,5,2)||'/'||substr(p_date_from,7,2)||'</td>');
        xx.out('<td width=90% class="lf">到:'||substr(p_date_to,1,4)||'/'||substr(p_date_to,5,2)||'/'||substr(p_date_to,7,2)||'</td>');
        xx.out('</tr>');
        xx.out('</table>');
        xx.out('<table border=1 cellSpacing=0 width="3000" bgColor=#000000 borderColorLight=#000000 borderColorDark=#ffffff >');
        IF p_style = 'Y' THEN
            xx.out('<tr bgColor=#ffffff>');
            xx.out('<td width=2% class="ce">状态</td>');
            xx.out('<td width=4% class="ce">状态分解</td>');
            xx.out('<td width=2% class="ce">性质</td>');
           xx.out('</tr>');
            FOR c_1 IN c_order LOOP
                IF c_1.region = '行业' THEN
                    v_base_line := get_base_line(c_1.item_id);
                ELSIF c_1.region = '区域' THEN
                    v_base_line := get_terr_base_line(c_1.item_id);
                END IF;
                xx.out('<td class="lf">'||c_1.status||'</td>');
                xx.out('<td class="lf">'||c_1.step_status||'</td>');
                xx.out('<td class="lf">'||c_1.region||'</td>');
                xx.out('</tr>');
                v_base_line := 0;
            END LOOP;
END IF;
        xx.out('</table>');
        xx.print_footer;


以下为xx存储:

CREATE OR REPLACE PACKAGE BODY xx AS
    PROCEDURE print_title(p_title VARCHAR2,p_page_width NUMBER) IS
    BEGIN
        fnd_file.put_line(fnd_file.output,'<html>');
        fnd_file.put_line(fnd_file.output,'<head>');
        fnd_file.put_line(fnd_file.output,'<title>'||p_title||'</title>');
        fnd_file.put_line(fnd_file.output,'<META http-equiv=Content-Type content="text/html; charset=gb2312">');
        fnd_file.put_line(fnd_file.output,'<STYLE>P {');
        fnd_file.put_line(fnd_file.output,'PAGE-BREAK-BEFORE: always');
        fnd_file.put_line(fnd_file.output,'}');
        fnd_file.put_line(fnd_file.output,'</STYLE>');
        fnd_file.put_line(fnd_file.output,'<style type= text/css >');
        fnd_file.put_line(fnd_file.output,'td,p,li,input,select {font-size:12px;}');
        fnd_file.put_line(fnd_file.output,'td.FormYellowTd{');
        fnd_file.put_line(fnd_file.output,'background-color :#8Be3fF;}');
        fnd_file.put_line(fnd_file.output,'td.rt{text-align: right;}');
        fnd_file.put_line(fnd_file.output,'td.lf{text-align: left;}');
        fnd_file.put_line(fnd_file.output,'td.ce{text-align: center;}');
        fnd_file.put_line(fnd_file.output,'</style>');

        fnd_file.put_line(fnd_file.output,'</head>');
        fnd_file.put_line(fnd_file.output,'<body>');

        fnd_file.put_line(fnd_file.output,'<table cellSpacing=0 width='||p_page_width||' bgColor=#000000 border=0>');
        fnd_file.put_line(fnd_file.output,'<tr width=100% bgColor=#ffffff >');
        fnd_file.put_line(fnd_file.output,'<td align=middle><font size=3><STRONG>'||p_title||'</STRONG></font></td>');
        fnd_file.put_line(fnd_file.output,'</tr>');
        fnd_file.put_line(fnd_file.output,'</table>');

        fnd_file.put_line(fnd_file.output,'<br>');
        fnd_file.put_line(fnd_file.output,'<br>');
    END print_title;

    PROCEDURE print_title(p_title VARCHAR2) IS
    BEGIN
        fnd_file.put_line(fnd_file.output,'<html>');
        fnd_file.put_line(fnd_file.output,'<head>');
        fnd_file.put_line(fnd_file.output,'<title>'||p_title||'</title>');
        fnd_file.put_line(fnd_file.output,'<META http-equiv=Content-Type content="text/html; charset=gb2312">');
        fnd_file.put_line(fnd_file.output,'<STYLE>P {');
        fnd_file.put_line(fnd_file.output,'PAGE-BREAK-BEFORE: always');
        fnd_file.put_line(fnd_file.output,'}');
        fnd_file.put_line(fnd_file.output,'</STYLE>');
        fnd_file.put_line(fnd_file.output,'<style type= text/css >');
        fnd_file.put_line(fnd_file.output,'td,p,li,input,select {font-size:12px;}');
        fnd_file.put_line(fnd_file.output,'td.FormYellowTd{');
        fnd_file.put_line(fnd_file.output,'background-color :#8Be3fF;}');
        fnd_file.put_line(fnd_file.output,'td.rt{text-align: right;}');
        fnd_file.put_line(fnd_file.output,'td.lf{text-align: left;}');
        fnd_file.put_line(fnd_file.output,'td.ce{text-align: center;}');
        fnd_file.put_line(fnd_file.output,'</style>');
        fnd_file.put_line(fnd_file.output,'</head>');
        fnd_file.put_line(fnd_file.output,'<body>');
    END print_title;
    PROCEDURE print_footer IS
    BEGIN
        fnd_file.put_line(fnd_file.output,'</body>');
        fnd_file.put_line(fnd_file.output,'</html>');
    END print_footer;

    PROCEDURE out(p_out VARCHAR2) IS
    BEGIN
        fnd_file.put_line(fnd_file.output,p_out);
        -- <td class="lf" >&nbsp</td>
        -- <td class="rt" ></td>
        -- <td class="ce" >&nbsp</td>
    END out;

    PROCEDURE log(p_log VARCHAR2) IS
    BEGIN
        fnd_file.put_line(fnd_file.log,p_log);
    END log;


    PROCEDURE print_title_htp(p_title VARCHAR2) IS
    BEGIN
        htp.p('<html>');
        htp.p('<head>');
        htp.p('<title>'||p_title||'</title>');
        htp.p('<META http-equiv=Content-Type content="text/html; charset=gb2312">');
        htp.p('<STYLE>P {');
        htp.p('PAGE-BREAK-BEFORE: always');
        htp.p('}');
        htp.p('</STYLE>');
        htp.p('<style type= text/css >');
        htp.p('td,p,li,input,select {font-size:12px;}');
        htp.p('td.FormYellowTd{');
        htp.p('background-color :#8Be3fF;}');
        htp.p('td.rt{text-align: right;}');
        htp.p('td.lf{text-align: left;}');
        htp.p('td.ce{text-align: center;}');
        htp.p('</style>');
        htp.p('</head>');
        htp.p('<body>');

    END print_title_htp;

    PROCEDURE print_footer_htp IS
    BEGIN
        htp.p('</body>');
        htp.p('</html>');
    END print_footer_htp;

    PROCEDURE out_htp(p_out VARCHAR2) IS
    BEGIN
        htp.p(p_out);
        -- <td class="lf" >&nbsp</td>
        -- <td class="rt" >&nbsp</td>
        -- <td class="ce" >&nbsp</td>
    END out_htp;
END xx;
发表于 2007/5/12 10:01:13 | 显示全部楼层
這個寫的好處就是不用調格式,REPORT有時調格式太麻煩了,而且還不易控制
发表于 2007/5/16 20:14:15 | 显示全部楼层
而且覺得PL/SQL寫的簡單明了呢
发表于 2007/9/1 21:17:33 | 显示全部楼层

回复 6楼 的帖子

;P
这个好啊,最需要这样的针对问题的解答,受益匪浅阿
发表于 2007/9/2 17:54:23 | 显示全部楼层
给你一个例子:

set linesize 400
set pagesize 5000
set heading on
set feed off

COLUMN 物料编码 FORMAT A12
COLUMN 物料描述 FORMAT A100
COLUMN 工序序号 FORMAT 99999999
COLUMN 部门代码 FORMAT A10
COLUMN 部门描述 FORMAT A50
COLUMN 有效日期 FORMAT A30
COLUMN 单位         FORMAT A10
COLUMN 单位使用量 FORMAT 9999999.9999
COLUMN 基准 FORMAT A10
COLUMN 资源代码 FORMAT A15
COLUMN 资源描述 FORMAT A50



select  MSI.SEGMENT1              物料编码
       ,MSI.DESCRIPTION           物料描述
       ,BOS.OPERATION_SEQ_NUM     工序序号
       ,BD.DEPARTMENT_CODE         部门代码
       ,BD.DEPARTMENT_CLASS_CODE   部门描述
       ,BD.DESCRIPTION             部门描述
       ,BOS.EFFECTIVITY_DATE       有效日期
       ,BR.UNIT_OF_MEASURE          单位
       ,BOSS.USAGE_RATE_OR_AMOUNT  单位使用量
       ,DECODE(BOSS.BASIS_TYPE,1,'物料',2,'批次','其它')  基准
       ,BR.RESOURCE_CODE            资源代码
       ,BR.DESCRIPTION              资源描述
from BOM.BOM_OPERATION_SEQUENCES BOS
     ,BOM.BOM_OPERATIONAL_ROUTINGS BOR
     ,INV.MTL_SYSTEM_ITEMS_B       MSI
     ,BOM.BOM_DEPARTMENTS          BD
     ,BOM.BOM_OPERATION_RESOURCES  BOSS
     ,BOM.BOM_RESOURCES            BR
WHERE BOS.ROUTING_SEQUENCE_ID = BOR.ROUTING_SEQUENCE_ID
  AND MSI.ORGANIZATION_ID = &1
  AND MSI.ORGANIZATION_ID =    BOR.ORGANIZATION_ID
  AND MSI.INVENTORY_ITEM_ID =  BOR.ASSEMBLY_ITEM_ID
  AND BD.DEPARTMENT_ID =       BOS.DEPARTMENT_ID
  AND BD.ORGANIZATION_ID =     BOR.ORGANIZATION_ID
  AND BOS.OPERATION_SEQUENCE_ID = BOSS.OPERATION_SEQUENCE_ID
  AND BR.RESOURCE_ID            =  BOSS.RESOURCE_ID
  AND BR.ORGANIZATION_ID        = MSI.ORGANIZATION_ID
  AND NVL(BOS.DISABLE_DATE,SYSDATE+1) > SYSDATE
  AND NVL(BR.DISABLE_DATE,SYSDATE+1)  > SYSDATE  
  And msi.segment1 Between nvl('&2',msi.segment1) And nvl('&3',msi.segment1)
  --AND MSI.SEGMENT1 = '2160420001'
  ORDER BY MSI.SEGMENT1
;
发表于 2007/9/7 17:46:44 | 显示全部楼层
恩 不错 收下了 谢谢分享
发表于 2007/9/7 19:01:59 | 显示全部楼层
???bu xi guan
发表于 2007/9/7 19:07:00 | 显示全部楼层
晕死...每次都要先回复
发表于 2007/9/11 10:12:11 | 显示全部楼层
写SQL,导入report builder, 输出为XML,就可以形成PDF或excel的格式化报表
发表于 2007/9/11 10:13:14 | 显示全部楼层
当然你得先用word把报表模板画好
发表于 2008/5/16 11:56:40 | 显示全部楼层
我也刚开始学习 谢谢了,建议以后多发写这样地帖子。
发表于 2008/6/3 09:28:28 | 显示全部楼层
你的意思  sql plus執行結果直接匯出?
发表于 2008/6/3 10:14:06 | 显示全部楼层
给个例子你
SET wrap OFF
SET linesize 2000
SET feedback OFF
SET pagesize 0
SET verify OFF
SET trimspool ON
SET termout OFF

SELECT 'Sales Order List'  FROM dual
/

SELECT 'Order Number  : ' ||'&&1' FROM dual
/

SELECT ' ' FROM dual
/

SELECT 'Order Number,Line number,Item Number' FROM dual
/

SELECT '"'||oeh.order_number||'","'||oel.LINE_NUMBER||'.'||oel.SHIPMENT_NUMBER||'","'||msi.segment1||'"'
FROM oe_order_headers_all oeh
, oe_order_lines_all oel
, mtl_system_items_b msi
WHERE oeh.ORDER_NUMBER= '&&1'
AND oel.header_id=oeh.header_id
AND oel.INVENTORY_ITEM_ID = msi.inventory_item_id
AND oel.SHIP_FROM_ORG_ID= msi.organization_id
/

SELECT '  ' FROM dual
/

SELECT '************* end of report ******************' FROM dual
/
发表于 2008/6/4 11:49:43 | 显示全部楼层
都是开发高手啊,
佩服佩服!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 00:48 , Processed in 0.025519 second(s), 13 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表