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内置的更古老。注意一下,XP以上的操作系统,反而倒要使用cror815.zip包中的Win9x.reg来导入注册表,因为从XP开始,C:\Windows而不是C:\WinNT才是Windows的系统目录,如果你把操作系统安装在D盘,请更改相应的reg注册表文件。
  2. 在Oracle中创建CR要调用的procedure,比如下面这个,注意ResultCur为输入输出类型,不能只申明为输出类型,即不能将IN OUT参数改为单单OUT型的,否则随后的CR8会无法显示这样的store procedure:
    procedure OperationStayTime
    create or replace procedure OperationStayTime(Cust      in varchar2,
                                                  StartDT   in varchar2,
                                                  EndDT     in varchar2,
                                                  ResultCur in Out Sys_Refcursor) is
      CURSOR c_OPST IS
        SELECT CO.CONTAINERNAME,
                        CO.CUSTOMERLOTNUMBER,
                        WFSTP.SEQUENCE,
                        OP.OPERATIONNAME,
                        CO.DIERELEASEDATE,
                        CO.TARGETDEVICE,
                        HML1.TXNDATE TransDate,
                        HML2.TXNDATE LastTransDate, -- to be modifyed in procedure
                        HML2.TXNDATE HML2TXNDATE,
                        CU.CUSTOMERNAME,
                        CDODEF.CDONAME,
                        PAK.PACKAGETYPENAME||DI.DIMENSIONNAME||LD.LEADCOUNTNAME PDL,
                        PTL.PRODUCTIONLINENAME,
                        OP.DESCRIPTION,
                        AMKOP.AMKORWWOPERNAME
          FROM CONTAINER       CO,
               HISTORYMAINLINE HML1,
               PRODUCT         PT,
               HISTORYMAINLINE HML2,
               MOVEHISTORY     MH,
               CUSTOMER        CU,
               CDODEFINITION   CDODEF,
               DIMENSION       DI,
               PACKAGETYPE     PAK,
               LEADCOUNT       LD,
               PRODUCTIONLINE  PTL,
               CURRENTSTATUS   CUTSTS,
               OPERATION       OP,
               WORKFLOWSTEP    WFSTP,
               AMKORWWOPER     AMKOP
         WHERE CO.CONTAINERID = HML1.CONTAINERID
           AND CO.PRODUCTID = PT.PRODUCTID
           AND CO.CURRENTSTATUSID = CUTSTS.CURRENTSTATUSID
           AND HML1.CONTAINERID = HML2.CONTAINERID
           AND PT.CUSTOMERID = CU.CUSTOMERID
           AND HML1.TXNTYPE = CDODEF.CDODEFID
           AND PT.DIMENSIONID = DI.DIMENSIONID
           AND PT.PACKAGETYPEID = PAK.PACKAGETYPEID
           AND PT.LEADCOUNTID = LD.LEADCOUNTID
           AND CUTSTS.PRODUCTIONLINEID = PTL.PRODUCTIONLINEID
           AND HML2.OPERATIONID = OP.OPERATIONID
           AND HML2.WORKFLOWSTEPID = WFSTP.WORKFLOWSTEPID
           AND OP.AMKORWWOPERID = AMKOP.AMKORWWOPERID
           AND mh.historymainlineid = hml2.historymainlineid
           AND CDODEF.CDONAME = 'Ship'
           AND HML1.REVERSALSTATUS = 1
           AND HML2.REVERSALSTATUS = 1
           AND HML2.OPERATIONID <> '00060e08000013f1' AND -- Shipping
               HML2.OPERATIONID <> '00060e08000013f0' AND -- FP Packing
               HML2.OPERATIONID <> '00060e08000013ef' AND -- Schedule
               CU.CUSTOMERNAME = Cust
           and hml1.txndate >= to_date(nvl(StartDT, '2006/06/01 01:00:00'),
                                       'yyyy/mm/dd hh24:mi:ss')
           and hml1.txndate <= to_date(nvl(EndDT, '2006/06/01 01:00:00'),
                                       'yyyy/mm/dd hh24:mi:ss')
         ORDER BY CO.CONTAINERNAME, WFSTP.SEQUENCE;

      opst_rec TempOperationStayTime%ROWTYPE;

      l_LastTransDate opst_rec.lasttransdate%type;
    begin
      delete from tempOperationStayTime;

      FOR opst_rec IN c_OPST LOOP
        if l_LastTransDate is not null then
          opst_rec.lasttransdate := l_LastTransDate;
        end if;
        l_LastTransDate := opst_rec.hml2txndate;
      
        if opst_rec.containername is not null then
          INSERT INTO tempOperationStayTime VALUES opst_rec;
        end if;
      
      END LOOP;

      Open ResultCur for
        Select *
          from TempOperationStayTime
         ORDER BY CONTAINERNAME, SEQUENCE;

      return;
    end OperationStayTime;
  3. 在CR的DataExplorer中,选择More Data Sources->Oracle Server节点,在弹出的Oracle SQL对话框中分别输入User ID,Password,Server,这也是关键的一步,不能使用ODBE驱动,否则仍然不能在CR8中成功调用procedure。
  4. 选择刚刚添加的Server,按Options打开选项对话框,选中Show->Stored Procedures才能显示出各个储存过程,如果更改Options后Data Explorer窗口没有刷新(在CR8.0.5版本下,这肯定会发生),先收拢Server节点,再打开,CR就会按新设置刷新列表。
  5. 现在可以通过列表选择CR8需要调用的procedure,单击Add按钮添加要使用Oracle 存储过程。若你的储存过程有输入参数,单击Add后会要求你输入参数值,输入具体参数值,这些参数会成为Crystal Reports的Parameter Field的缺省参数,RESULTCUR是输出的数据表,不必填值。
  6. 完成后已经可以在Field Explorer上已经显示出存储过程返回的字段了,后面的步骤都是常规的CR8使用方法了……

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

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

  1. cmd 调用oracle存储过程,asp.net中调用oracle存储过程的方法

    存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果 ...

  2. oracle中修改多个字段默认值_利用VBA代码在已有的数据表中删除、添加、修改字段...

    大家好,今日继续给大家讲解VBA数据库解决方案的第21讲,如何利用VBA代码在已有的数据表中删除,添加,修改字段.这个内容是操作数据库的一项必修的内容,还望大家在实际工作中多利用,所以这节的知识,对于 ...

  3. oracle恢复drop建的表首次,案例:Oracle dul数据挖掘 没有备份情况下非常规恢复drop删除的数据表...

    天萃荷净 通过Oracle dul工具在没有备份情况下进行非常规恢复,找出drop删除的Oracle数据表中的数据进行恢复 dul对被drop对象进行恢复,需要提供两个信息 1.被删除表所属表空间(非 ...

  4. Java中调用Oracle中的存储过程的单元测试代码

    Oracle中的存储过程: /* 创建一个存储函数,返回指定员工的姓名,薪水和年收入 */ create or replace function queryEmp2(eno in number, em ...

  5. c# oracle存储过程返回结果集,一个简单的实例给大家分享C#中调用oracle的存储过程...

    Oracle方面 1.创建Oracle过程存储 create or replace procedure proce_test(paramin in varchar2,paramout out varc ...

  6. excel中调用python程序_一篇文章带你使用Python搞定对Excel表的读写和处理

    文章目录一.我的需求二.代码三.总结 一.我的需求 我想要excel 的最后1列由列表形式转换为数值类型 ​ 可以看到最后一列有的是列表,有的直接是数值,想要整个列表中的内容都转为数值类型 二.代码 ...

  7. java oracle sql 参数_oracle pl/sql之在java中调用带有输入输出参数的oracle存储过程...

    只需注意一点输出参数是用CallableStatement里面的registerOutParameter方法注册进去 存储过程: import java.sql.CallableStatement; ...

  8. mybatis可以用oracle,使用MyBatis调用oracle函数(基于注释)

    我需要使用注解在MyBatis中调用Oracle函数.使用MyBatis调用oracle函数(基于注释) 我的映射: @Select("{ CALL #{outParam, jdbcType ...

  9. .NET调用Oracle存储过程,使用数组类型的参数(如ArrayList)

    今天一个项目组的朋友问及:如何在.NET中调用Oracle的存储过程,并以数组作为参数输入. Oracle的PL/SQL非常强大,支持定长数组和变长数组,支持任何自定义数据类型.通过阅读ODP的文档, ...

  10. spring+springMvc+mybatis 调用oracle 存储过程

    最近在项目中遇到在mybatis中调用oracle存储过程的问题,网上各种查询,最终解决了问题,在我们项目中我只需要oracle 的存储过程返回一个字符串用来存入数据库作为表数据的主键, 接下来整理代 ...

最新文章

  1. AlexeyAB DarkNet YOLOv3框架解析与应用实践(一)
  2. SVG配电站接线系统绘制
  3. Java静态代理、动态代理与CGLib代理
  4. weblogic安装错误BEA-090870解决方案
  5. python数据库增删改查_python对数据库mysql的操作(增删改查)
  6. python word转pdf图片格式_Python将word转换为PDF格式文件(包括批处理转换),Word,Pdf,包含,批量...
  7. Qt入门(六)——抽奖系统的实现
  8. FPGA测试方法以Mentor工具为例
  9. 科普 | USB4的全面解读
  10. Eclipse使用Ant编译时报错Perhaps JAVA_HOME does not point to the JDK
  11. Mysql常用技巧总结
  12. MySQL 有哪些锁?
  13. HTTP状态码完整介绍
  14. 如何免费将excel表格转换成Word文档?
  15. 为什么要配置环境变量,配置环境变量有什么好处?
  16. Hadoop 大数据生态框架--总述
  17. 【学习教程】全系统各类型工程水土保持方案编制实践技术系列
  18. 擦除Mac上所有内容和设置的最快方法
  19. 封神台-第二章 尤里的复仇
  20. Iocomp Components Full Sources Product

热门文章

  1. vue 第十天 (组件的基本使用)
  2. 大学生计算机网络游戏策划书,【大学校园活动策划方案】_大学生校园活动策划方案参考模板...
  3. Spring源码之ApplicationContext(九)初始化剩余的单例
  4. Lecture 2:马尔可夫决策
  5. 编写一个Linux 64位应用的注册机
  6. Prism发布了第一个版本+Entlib3.1在VS2008下工作的解决方案
  7. 六千字干货文:到底要怎么去学算法?
  8. CentOS云主机安全之新增ssh登录账户、禁止ROOT登陆
  9. [转]vs2008 + OpenCV-2.1.0-win32-vs2008安装
  10. [转]加载纹理与使用glGenTextures时应注意的一点(解决吃内存)