使用Crystal Reports 2008中的Oracle功能更新报告以进行筛选

使用Crystal Reports 2008中的Oracle功能更新报告以进行筛选,oracle,crystal-reports,crystal-reports-2008,Oracle,Crystal Reports,Crystal Reports 2008,我有几份报告,每一份都有几张表 假设有3张表,表A、表B和表C。 我想使用以下Oracle函数来过滤同时传递报表参数的结果集: AND function(tableB.field1, tableB.field2, tableB.field3, {?report_parameter}) = 'S' 需要注意的事实: Oracle函数只能用于Crystal Reports中的SQL表达式和/或SQL命令 SQL表达式不能包含报表参数(因此,不是选项) Crystal Reports允许您使用SQ

我有几份报告,每一份都有几张表

假设有3张表,表A、表B和表C。 我想使用以下Oracle函数来过滤同时传递报表参数的结果集:

AND function(tableB.field1, tableB.field2, tableB.field3, {?report_parameter}) = 'S'
需要注意的事实:

  • Oracle函数只能用于Crystal Reports中的SQL表达式和/或SQL命令
  • SQL表达式不能包含报表参数(因此,不是选项)
  • Crystal Reports允许您使用SQL命令替换报表表,但不允许将多个表替换为单个SQL命令
  • 我们不想重新构建所有报告
  • 我们不希望将单个表替换为SQL命令,因为它会影响高级别的性能,因为Crystal在执行报告时不会在单个查询上转换表和SQL命令
  • 此Oracle函数从其他表中选择数据,因此不能在报表自定义函数中重写
  • {?report_参数}是只有应用程序才知道的信息。在将报告导出给用户之前,应用程序将填写该报告

我能做些什么来解决这个问题?

不知道函数需要表和参数的确切原因,我只能给您一些模糊的、未经测试的选项。没有一个选项是理想的:

  • 将Oracle函数重写为“自定义函数”(CF);记录选择公式中的参考CF;读取记录时将应用过滤器(即,该功能不会发送到数据库)
  • 将函数重写为一个存储过程,该过程接受一个参数,但返回一个记录集(Crystal Reports将识别该参数);将其他表连接到存储过程。存储过程需要以支持Crystal Reports数据需求的方式编写()

谢谢你的回答。报告参数是只有应用程序才知道的信息。该参数由应用程序在导出报告之前填写。我会检查存储过程的事情。试图添加一个简单的存储过程到其中一个报告,它看起来像水晶没有识别ref cursor参数。我用数字参数(IN)和ref cursor参数(IN OUT)定义了它。当我试图将其添加到报告中时,crystal仅显示带有number参数的param提示符,单击“确定”后,它给出错误:调用“XYZ”时参数的数量或类型错误。我们使用OraOLEDB.Oracle提供程序,这可能是原因。是的,提供程序似乎就是问题所在()。此外,关于自定义函数选项,它能否以某种方式访问数据库?因为Oracle函数完全基于其他表数据。不,自定义函数只能对传递给它的值进行操作。可惜它也不是一个选项。谢谢。你是想“爆出”报告吗?“爆出报告只不过是一次运行报告并将结果分发给多个用户”。如果这就是你的意思,那么就不要了。运行一次,分发多次,每个收件人都会得到一份个性化的报告副本。这可以通过操纵记录选择公式轻松完成。