水晶报告是否可以使用存储过程



嗨,我有一个任务来改善加载和运行 CR 所需的时间。 它超过 30 分钟。它与 DB2 服务器背道而驰,所有处理都在 Crystal 中完成。所以我的第一个想法是在服务器上制作一个视图,然后它会更快。但是,该报告有一个开始和日期。

那么,我将需要一个存储过程。 但这意味着,我需要将日期从 CR 传递到服务器上的 SP。

我还没有看到这样做,但也许有技术可以做到这一点?如果没有,我会尝试一个视图,但其中一些表上有大量数据。

如果将尽可能多的

处理推送到主机,您将获得最佳性能。

首先,尝试在主机上使用没有 WHERE 子句的 SQL 视图。 在引用 Crystal Reports 中的视图的 SQL 查询中,添加 WHERE 和 ORDER BY 子句。 系统会将您的客户端 SQL 与主机视图中的 SQL 合并,并提供合并 SQL 的净效果。我认为您不需要存储过程,使用视图更容易、更灵活。

曾经使用过下面的技术来从复杂的SQL视图中挤出一些额外的性能,但它有点复杂,因此如果上面的技术在优化工作后没有产生所需的性能,我不会使用它。

另一种方法是使用 SQL 视图,方法是使用 TABLE 用户定义的函数将报表参数提供给视图,其中 TABLE 函数从临时表中获取参数。

例:

declare global temporary table SESSION.MY_PARMS (FROM_DATE, TO_DATE) as ( 
  values ( CURRENT_DATE - 30 days, CURRENT_DATE ) 
) with data with replace
;
create or replace function MY_SCHEMA.MY_PARMS_UDF( )
  returns table ( FROM_DATE date, TO_DATE date )
  language sql
  specific MY_SCHEMA.MY_PARMS_F
  not deterministic
  disallow parallel
  no external action
  reads SQL data
  called on null input
  not fenced
  set option dbgview   = *source
            ,commit    = *nc
            ,closqlcsr = *endmod
            ,datfmt    = *iso
            ,dftrdbcol = *none
            ,tgtrls    = V7R1M0
return
select FROM_DATE, TO_DATE from SESSION.MY_PARMS
;
create or replace view MY_SCHEMA.MY_REPORT_VIEW for system name MY_REPORTV as (
   select     *
   from       table( MY_PARMS_UDF( ) )
                as MY_PARMS ( FROM_DATE, TO_DATE )
   inner join MY_REPORT_DATA  R
         on   R.MY_REPORT_DATE >= MY_PARMS.FROM_DATE
         and  R.MY_REPORT_DATE <= MY_PARMS.TO_DATE
)
;

在水晶报表中,您需要创建参数表 SESSION。每个作业MY_PARMS(或者,如果您已在报表作业中创建它并且更喜欢更新,则使用 UPDATE 刷新其内容)。自2002年以来,我就没有使用过Crystal Reports,所以我无法有效地帮助完成这一部分。

然后,在 Crystal 报表中,您将能够嵌入如下所示的查询,该查询有效地使用您推送到 Table SESSION 中的报表参数。MY_PARMS。

select * from MY_SCHEMA.MY_REPORT_VIEW
;

由于表 MY_PARMS 是库/架构 QTEMP 中的 SESSION 临时表,因此此设计支持多个用户使用不同的参数同时运行报表(因为每个用户将具有单独的 JOB 和单独的 QTEMP 库)。

系统将后期绑定到表 SESSION。MY_PARMS表 UDF MY_PARMS_UDF,这意味着您甚至可以删除并重新创建该表,并且对 VIEW 和 UDF 的下一个引用将获取表 SESSION 的新副本。MY_PARMS(或新更新的行,如果您只是更新会话中的行。MY_PARMS)。

我认为您很有可能使用 SQL 存储过程,该过程接受您的报告参数作为输入,并将一个或多个结果集返回到报表的 Crystal Reports。 但是,由于我已经很久没有使用Crystal Reports了,我不记得它是否支持对SQL存储过程的调用。如果 Crystal Reports 支持使用参数调用 SQL 存储过程,并从该过程接收一个或多个结果集,那就简单一些了。 如果这样做,请确保在生成结果集的过程中使用面向结果集的 SQL,而不是单行游标处理,以便最大限度地提高性能。

请注意,使用过程比 UDF 和 View 技术更简单,但过程不太灵活,因为必须使用 CALL 调用过程,而 VIEW 可以在查询中引用表的任何位置引用。 出于灵活性的原因,我很少使用 SQL 过程,而是使用 VIEWS 和 UDF。我还建议在大多数情况下使用 TABLE UDF 而不是 SCALAR UDF,因为它们可以在查询中的更多位置引用,并且可以更轻松地将其列内容包含在查询结果集中。

不要通过 sp 发送参数,通过代码传递参数,然后通过数据库获取。 看看这个会很有帮助。.MSDN SP Paramerters

相关内容

  • 没有找到相关文章

最新更新