2009-07-08 136 views
2

我在显示来自MySQL表的数据的Crystal Report中遇到问题。我目前直接从表收集数据,但是,当用户尝试输入参数,出现问题如:带有参数的Crystal Reports XI和MySQL存储过程

  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; 

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

+0

水晶报表无法识别该存储过程?我不使用mysql,但也许使用不同的数据库驱动程序。 – dotjoe 2009-07-14 20:35:25

回答

2

如果我在读你的IF树正确,我认为你可以做到这一点,而不是(我是一个T-SQL的家伙,所以我无法证实这是否会在MySQL运行):

SELECT * 
    FROM tblData 
WHERE (([email protected]) OR (@param1 is null)) 
    AND (([email protected]) OR (@param2 is null)) 
    AND (([email protected]) OR (@param3 is null)) 
+0

谢谢!我们已经更新了这个程序,它工作。现在的问题在于使用Crystal Reports .... SELECT * FROM tblData WHERE(字段1 = @参数1 OR @参数1是空) AND(场2 = @参数2 OR @参数2为空) AND(场= @ param3 OR @ param3为空); – Brent 2009-07-08 22:45:40

1

我不能帮助mySQL部分,但我做了与SQL Server和Oracle非常相似的事情。取而代之的是一系列IF语句覆盖的空/不为空参数每一个可能的组合,我做这样的事情:

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... 
+0

谢谢!该程序已被更新,目前是: SELECT * FROM tblData WHERE(字段1 = @参数1 OR @参数1是空) AND(场2 = @参数2 OR @参数2为空) AND(场= @参数3 OR @ param3为空); 我们正在研究光标建议,因为我们仍然对Crystal Report有问题。 – Brent 2009-07-08 22:46:17

0
select * 
from tblData 
where field1 like isnull(@param1,'%%' 
and field2 like isnull(@param2,'%%') 
and field3 like isnull(@param3,'%%')