在Crystal Report 8中调用Oracle的procedure储存过程,并取得返回的类型为Sys_Refcursor数据表...

Crystal Report 8非常易入门,通常只需要鼠标就可以完成报表的创建,但随着实习中对SQL语言和底层数据库的熟悉,我越来越对Crystal的“指指点点”的创建报表方式感到失望,对于存在大量表连接查询创建,SQL语言比CR(Crystal Report)的GUI界面要方便得多。

但Crystal Report 8中调用Oracle的存储过程从而直接取得数据表,并不像直接使用CR的GUI界面创建报表那样步骤明显,接下来将介绍如何在Crystal Report 8中调用Oracle Procedure的步骤,希望能对相关CR报表开发人员起到一点参考作用。

其实详细步骤在Bussiness Object的“Using Oracle Stored Procedures in Crystal Reports ”技术论文中已经有了,但我发现,对于Crystal Report 8和Oracle 9.2,并且在Oracle中程序员没有创建Package权限的情况下,具体做法仍旧有些差异:

  1. 从BI网站下载更新的CR到Oracle的数据库驱动,其实这个驱动也老的不行啦,不过恐怕CR 8内置的更古老15.gif。注意一下,XP以上的操作系统,反而倒要使用cror815.zip包中的Win9x.reg来导入注册表,因为从XP开始,C:\Windows而不是C:\WinNT才是Windows的系统目录,如果你把操作系统安装在D盘,请更改相应的reg注册表文件。
  2. 在Oracle中创建CR要调用的procedure,比如下面这个,注意ResultCur为输入输出类型,不能只申明为输出类型,即不能将IN OUT参数改为单单OUT型的,否则随后的CR8会无法显示这样的store procedure:
    ContractedBlock.gif ExpandedBlockStart.gif procedure OperationStayTime
    None.gifcreate or replace procedure OperationStayTime(Cust      in varchar2,
    None.gif                                              StartDT   
    in varchar2,
    None.gif                                              EndDT     
    in varchar2,
    None.gif                                              ResultCur 
    in Out Sys_Refcursor) is
    None.gif  
    CURSOR c_OPST IS
    None.gif    
    SELECT CO.CONTAINERNAME,
    None.gif                    CO.CUSTOMERLOTNUMBER,
    None.gif                    WFSTP.SEQUENCE,
    None.gif                    OP.OPERATIONNAME,
    None.gif                    CO.DIERELEASEDATE,
    None.gif                    CO.TARGETDEVICE,
    None.gif                    HML1.TXNDATE TransDate,
    None.gif                    HML2.TXNDATE LastTransDate, 
    -- to be modifyed in procedure
    None.gif
                        HML2.TXNDATE HML2TXNDATE,
    None.gif                    CU.CUSTOMERNAME,
    None.gif                    CDODEF.CDONAME,
    None.gif                    PAK.PACKAGETYPENAME
    ||DI.DIMENSIONNAME||LD.LEADCOUNTNAME PDL,
    None.gif                    PTL.PRODUCTIONLINENAME,
    None.gif                    OP.DESCRIPTION,
    None.gif                    AMKOP.AMKORWWOPERNAME
    None.gif      
    FROM CONTAINER       CO,
    None.gif           HISTORYMAINLINE HML1,
    None.gif           PRODUCT         PT,
    None.gif           HISTORYMAINLINE HML2,
    None.gif           MOVEHISTORY     MH,
    None.gif           CUSTOMER        CU,
    None.gif           CDODEFINITION   CDODEF,
    None.gif           DIMENSION       DI,
    None.gif           PACKAGETYPE     PAK,
    None.gif           LEADCOUNT       LD,
    None.gif           PRODUCTIONLINE  PTL,
    None.gif           CURRENTSTATUS   CUTSTS,
    None.gif           OPERATION       OP,
    None.gif           WORKFLOWSTEP    WFSTP,
    None.gif           AMKORWWOPER     AMKOP
    None.gif     
    WHERE CO.CONTAINERID = HML1.CONTAINERID
    None.gif       
    AND CO.PRODUCTID = PT.PRODUCTID
    None.gif       
    AND CO.CURRENTSTATUSID = CUTSTS.CURRENTSTATUSID
    None.gif       
    AND HML1.CONTAINERID = HML2.CONTAINERID
    None.gif       
    AND PT.CUSTOMERID = CU.CUSTOMERID
    None.gif       
    AND HML1.TXNTYPE = CDODEF.CDODEFID
    None.gif       
    AND PT.DIMENSIONID = DI.DIMENSIONID
    None.gif       
    AND PT.PACKAGETYPEID = PAK.PACKAGETYPEID
    None.gif       
    AND PT.LEADCOUNTID = LD.LEADCOUNTID
    None.gif       
    AND CUTSTS.PRODUCTIONLINEID = PTL.PRODUCTIONLINEID
    None.gif       
    AND HML2.OPERATIONID = OP.OPERATIONID
    None.gif       
    AND HML2.WORKFLOWSTEPID = WFSTP.WORKFLOWSTEPID
    None.gif       
    AND OP.AMKORWWOPERID = AMKOP.AMKORWWOPERID
    None.gif       
    AND mh.historymainlineid = hml2.historymainlineid
    None.gif       
    AND CDODEF.CDONAME = 'Ship'
    None.gif       
    AND HML1.REVERSALSTATUS = 1
    None.gif       
    AND HML2.REVERSALSTATUS = 1
    None.gif       
    AND HML2.OPERATIONID <> '00060e08000013f1' AND -- Shipping
    None.gif
               HML2.OPERATIONID <> '00060e08000013f0' AND -- FP Packing
    None.gif
               HML2.OPERATIONID <> '00060e08000013ef' AND -- Schedule
    None.gif
               CU.CUSTOMERNAME = Cust
    None.gif       
    and hml1.txndate >= to_date(nvl(StartDT, '2006/06/01 01:00:00'),
    None.gif                                   
    'yyyy/mm/dd hh24:mi:ss')
    None.gif       
    and hml1.txndate <= to_date(nvl(EndDT, '2006/06/01 01:00:00'),
    None.gif                                   
    'yyyy/mm/dd hh24:mi:ss')
    None.gif     
    ORDER BY CO.CONTAINERNAME, WFSTP.SEQUENCE;
    None.gif
    None.gif  opst_rec TempOperationStayTime
    %ROWTYPE;
    None.gif
    None.gif  l_LastTransDate opst_rec.lasttransdate
    %type;
    None.gif
    begin
    None.gif  
    delete from tempOperationStayTime;
    None.gif
    None.gif  
    FOR opst_rec IN c_OPST LOOP
    None.gif    
    if l_LastTransDate is not null then
    None.gif      opst_rec.lasttransdate :
    = l_LastTransDate;
    None.gif    
    end if;
    None.gif    l_LastTransDate :
    = opst_rec.hml2txndate;
    None.gif  
    None.gif    
    if opst_rec.containername is not null then
    None.gif      
    INSERT INTO tempOperationStayTime VALUES opst_rec;
    None.gif    
    end if;
    None.gif  
    None.gif  
    END LOOP;
    None.gif
    None.gif  
    Open ResultCur for
    None.gif    
    Select *
    None.gif      
    from TempOperationStayTime
    None.gif     
    ORDER BY CONTAINERNAME, SEQUENCE;
    None.gif
    None.gif  
    return;
    None.gif
    end OperationStayTime;
    None.gif
  3. 在CR的DataExplorer中,选择More Data Sources->Oracle Server节点,在弹出的Oracle SQL对话框中分别输入User ID,Password,Server,这也是关键的一步,不能使用ODBE驱动,否则仍然不能在CR8中成功调用procedure。
    o_CR_DataExplorer1.gif
  4. 选择刚刚添加的Server,按Options打开选项对话框,选中Show->Stored Procedures才能显示出各个储存过程,如果更改Options后Data Explorer窗口没有刷新(在CR8.0.5版本下,这肯定会发生),先收拢Server节点,再打开,CR就会按新设置刷新列表。
    o_CR_DataExplorer2.gif
  5. 现在可以通过列表选择CR8需要调用的procedure,单击Add按钮添加要使用Oracle 存储过程。若你的储存过程有输入参数,单击Add后会要求你输入参数值,输入具体参数值,这些参数会成为Crystal Reports的Parameter Field的缺省参数,RESULTCUR是输出的数据表,不必填值。
    o_CR_DataExplorer3.gif
  6. 完成后已经可以在Field Explorer上已经显示出存储过程返回的字段了,后面的步骤都是常规的CR8使用方法了……

 

转载于:https://www.cnblogs.com/ericguo/archive/2007/02/02/Using_Oracle_Procedure_in_Crystal_Report_8.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值