目前网上关于水晶报表比较多的是.NET下的讨论,而在JAVA下的讨论相对较少,这次一个项目中购买了水晶报表(CE,CR)来实现报表部分。我们的平台是WebLogic+HP Unix+Oracle9i,开发平台是Weblogic+WindowXP+oracle9i,对于普通报表是布署到CE上,从前台应用中直接调用即可,而报表的数据生成是每天定时调用存储过程从生产系统库上挖掘数据到统计数据库,但是对于实时报表部分CE就无能为力,因为需要直接从生产系统抓数据,所以我采用了JRC10(Java Report Component来实现的,下面是在开发调试过程中的一些问题及解决办法。
一、在开发平台上向报表传递参数时,一直出现""Some parameters are missing values"。
  JRC的Sample有问题,正确的参数传递应该是这样的:(来自http://support.businessobjects.com/library/kbase/articles/c2015264.asp)
 ParameterField paramField = new ParameterField(); 
 paramField.setReportName(""); 
... 
而它的例子中是没有上面红色的这一句。
二、ORACLE中处理
   1、因为需要返回动态结果集,在Oracle中存储过程无法做到,所以定义一个Package来实现,Package是这样定义的
CREATE OR REPLACE PACKAGE Reportrealtimedataset
AS
/******************************************************************************
   NAME:       ReportRealTimeDataSet
   PURPOSE:    营业分类帐实时报表生成Package定义部分
 
   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2005-02-20    goubo         1. Created this package.
******************************************************************************/
/* 定义ref cursor类型
    不加return类型,为弱类型,允许动态sql查询,
    否则为强类型,无法使用动态sql查询;
*/
   TYPE myrctype IS REF CURSOR;
   
   PROCEDURE getTestResultSet(staffid INTEGER,p_rc IN OUT myrctype);
   
   /*
   自定义过程
   根据输入条件生成查询结果分类帐
   @param condition 查询条件(f.handlestaff in (6004,6005) ..etc)
   @s_date 查询条件,起始日期
   @e_date 查询条件, 结束日期
   */
   PROCEDURE getdataset (condition VARCHAR2, s_date DATE, e_date DATE);
 
   /*
   自定义过程
   根据输入条件生成查询结果受理量
   @param condition 查询条件(f.handlestaff in (6004,6005) ..etc)
   @s_date 查询条件,起始日期
   @e_date 查询条件, 结束日期
   */
   PROCEDURE getdatasetnum (condition VARCHAR2, s_date DATE, e_date DATE);
 
  /*
    取营业帐分类清单结果集
    @param s_date:统计起始日期
    @param e_date:统计结束日期
    @param staff: 统计对象(个人),workgroup 班组 department 部门
    
   */    
   PROCEDURE getchargedetail (
      s_date                DATE,
      e_date                DATE,
      department            VARCHAR2,
      WORKGROUP             VARCHAR2,
      STAFF                 VARCHAR2,
      p_rc         IN OUT   myrctype
   );
  /*
    取个人营业帐分类结果集
    @param s_date:统计起始日期
    @param e_date:统计结束日期
    @param staff: 统计对象(个人)
    @param business: 业务
   */
   PROCEDURE getstaffproc (
      s_date              DATE,
      e_date              DATE,
      STAFF               VARCHAR2,
      BUSINESS            VARCHAR2,
      p_rc       IN OUT   myrctype
   );
    /*
    取营业受理量结果集清单
    @param s_date:统计起始日期
    @param e_date:统计结束日期
    @param staff: 统计对象(个人),department 受理部门 workgroup:受理班组?    @param business: 业务
   */
   PROCEDURE getacceptdetail (
      s_date                DATE,
      e_date                DATE,
      department            VARCHAR2,
      WORKGROUP             VARCHAR2,
      STAFF                 VARCHAR2,
      p_rc         IN OUT   myrctype
   );
 
   /*
    取个人营业受理量结果集
    @param s_date:统计起始日期
    @param e_date:统计结束日期
    @param staff: 统计对象(个人)
    @param business: 业务
   */
   PROCEDURE getstaffprocnum (
      s_date              DATE,
      e_date              DATE,
      STAFF               VARCHAR2,
      BUSINESS            VARCHAR2,
      p_rc       IN OUT   myrctype
   );
   
  
   /*
    取班组营业帐分类结果集
    @param s_date:统计起始日期
    @param e_date:统计结束日期
    @param workgroup: 统计对象(班组)
    @param business: 业务
   */
   PROCEDURE getworkgroupproc (
      s_date               DATE,
      e_date               DATE,
      WORKGROUP            VARCHAR2,
      BUSINESS             VARCHAR2,
      p_rc        IN OUT   myrctype
   );
 
   /*
    取班组营业受理量结果集
    @param s_date:统计起始日期
    @param e_date:统计结束日期
    @param workgroup: 统计对象(班组)
    @param business: 业务
   */
   PROCEDURE getworkgroupprocnum (
      s_date               DATE,
      e_date               DATE,
      WORKGROUP            VARCHAR2,
      BUSINESS             VARCHAR2,
      p_rc        IN OUT   myrctype
   );
 
   /*
     取班组营业帐分类部门结果集
     @param s_date:统计起始日期
     @param e_date:统计结束日期
     @param workgroup: 统计对象(部门)
     @param business: 业务
    */
   PROCEDURE getdepartproc (
      s_date                DATE,
      e_date                DATE,
      department            VARCHAR2,
      BUSINESS              VARCHAR2,
      p_rc         IN OUT   myrctype
   );
 
   /*
     取班组营业受理量结果集
     @param s_date:统计起始日期
     @param e_date:统计结束日期
     @param workgroup: 统计对象(部门)
     @param business: 业务
    */
   PROCEDURE getdepartprocnum (
      s_date                DATE,
      e_date                DATE,
      department            VARCHAR2,
      BUSINESS              VARCHAR2,
      p_rc         IN OUT   myrctype
   );
 
   /*
    自定义函数,根据instr,生成相应的条件输出
   @param instr='6004/6005/6006' or 'null'
   @return 'in (6004,6005,6006)' or ''
   */
   FUNCTION gencondition (INSTR VARCHAR2)
      RETURN VARCHAR2;
END Reportrealtimedataset;
/
  2、在Oracle中定义一个会话型的全局临时表(Create Global Temporary table rp_yy_business_accept () 
ON COMMIT PRESERVE ROWS,在每个方法中直接使用这个临时表返回数据即可。(注意为了减少Redo,需要将Oracle9i补丁打到9.2.0.5,参见http://blog.csdn.net/eygle/archive/2004/07/04/33499.aspx)
三、布署到生产系统(weblogic+hp ux时的问题)时出现“Unable to connect to an X11 window server using ":0.0" as DISPLAY variable value”而在开发系统无此问题。
  需要在启动weblogic时指定启动项 Djava.awt.headless=true ,参见http://support.businessobjects.com/library/kbase/articles/c2016832.asp
四、布署到生产系统(Unix)时老出 ""Some parameters are missing values"而在开发系统(windows)无此问题
  rpt的文件名不能是中文。必须是英文才能正确识别。