【问题标题】:Crystal Reports XI and MySQL Stored Procedure with ParametersCrystal Reports XI 和带参数的 MySQL 存储过程
【发布时间】:2009-08-05 03:25:11
【问题描述】:

我在使用显示 MySQL 表中数据的 Crystal Report 时遇到问题。我目前直接从表中收集数据,但是当用户尝试输入参数时,会出现以下问题:

  1. 返回错误的参数为空值
  2. 参数未按规定工作

然后我创建了一个存储过程以在参数为空时返回数据,并使 MySQL 服务器而不是 Crystal Reports 服务器完成工作。

但是 Crystal Reports 似乎无法识别这一点,我在显示该过程的结果时遇到了一些问题。

这是我正在使用的程序的副本:

Create Procedure sp_report
(IN @param1 varchar(64),
 IN @param2 varchar(64),
 IN @param3 int )

Begin

IF @param1 is null AND @param2 is null AND @param3 is null Then
  Select * from tblData
ELSE IF @param1 is null AND @param2 is not null AND @param3 is not null then 
  Select * from tblData where field3 = @param3 and field2 = @param2
ELSE IF @param1 is not null AND @param2 is not null AND @param3 is  null then 
  Select * from tblData where field2 = @param2 and field1 = @param1
ELSE IF @param1 is not null AND @param2 is null AND @param3 is not null then 
  Select * from tblData where field3 = @param3  and field1 = @param1 
ELSE IF @param1 is not null AND @param2 is null AND @param3 is null then 
  Select * from tblData where field1 = @param1
ELSE IF @param1 is  null AND @param2 is not null AND @param3 is  null then 
  Select * from tblData where  field2 = @param2
ELSE IF @param1 is null AND @param2 is null AND @param3 is not null then
  Select * from tblData where field3 = @param3
ELSE IF @param1 is not null AND @param2 is not null AND @param3 is not null then 
  Select * from tblData where field3 = @param3 and field2 = @param2 and field1 = @param1
END;

有没有更简单的方法可以做到这一点,还是我做错了什么?任何建议将不胜感激。

【问题讨论】:

  • 水晶报表无法识别存储过程?我不使用 mysql,但可能使用不同的数据库驱动程序。

标签: mysql stored-procedures crystal-reports report


【解决方案1】:

如果我正确读取了您的 IF 树,我认为您可以这样做(我是 T-SQL 专家,所以我无法确认这是否会在 MySQL 中运行):

SELECT *
  FROM tblData
 WHERE ((field1=@param1) OR (@param1 is null))
   AND ((field2=@param2) OR (@param2 is null))
   AND ((field3=@param3) OR (@param3 is null))

【讨论】:

  • 谢谢!我们已将程序更新为此,并且可以正常工作。现在问题出在 Crystal Reports.... SELECT * FROM tblData WHERE (field1 = @param1 OR @param1 is null) AND (field2 = @param2 OR @param2 is null) AND (field3 = @param3 OR @param3 is null );
【解决方案2】:

我对 mySQL 部分无能为力,但我对 SQL Server 和 Oracle 做了一些非常相似的事情。我没有使用一系列 IF 语句来覆盖 null/not null 参数的所有可能组合,而是这样做:

select * from tblData where (field1 = @param1 or @param1 is null) and
(field2 = @param2 or @param2 is null) and
(field3 = @param3 or @param3 is null)

这涵盖了空参数和非空参数的任何混合,而不会随着参数数量的增加而指数增加 IF 语句的数量。

这完全是我的猜测,但在 Oracle 中,您需要将游标声明为 IN OUT 参数,以便 SP 使用 Crystal。 mySQL 可以有同样的要求吗?以下是 Oracle SP 的示例:

create or replace PROCEDURE      SomeProcedure
(
    param1               IN         VARCHAR2 DEFAULT null,
    param2               IN         VARCHAR2 DEFAULT null,
    REPORT_CURSOR        IN OUT     CrystalPkg.CrystalCursor
)
AS
BEGIN

    OPEN REPORT_CURSOR FOR
    SELECT blahblah from blah...

【讨论】:

  • 谢谢!该过程已更新,当前为: SELECT * FROM tblData WHERE (field1 = @param1 OR @param1 is null) AND (field2 = @param2 OR @param2 is null) AND (field3 = @param3 OR @param3 is null);由于水晶报表仍有问题,我们正在调查光标建议。
【解决方案3】:
select * 
from tblData 
where field1 like isnull(@param1,'%%' 
and field2 like isnull(@param2,'%%')
and field3 like isnull(@param3,'%%')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多