带有参数的Crystal Reports XI和MySQL存储过程

时间:2009-07-08 21:03:45

标签: mysql stored-procedures crystal-reports report

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

  1. 返回错误的参数的空值
  2. 参数未按指定工作
  3. 然后,如果参数为空,我创建了一个存储过程来返回数据,这将使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;
    

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

3 个答案:

答案 0 :(得分:2)

如果我正确读取你的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))

答案 1 :(得分:1)

我对mySQL部分无能为力,但我对SQL Server和Oracle做了类似的事情。我没有使用涵盖null / not null参数的每个可能组合的一系列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)

它涵盖了null和非null参数的任意组合,不会随着参数数量的增加而指数地增加IF语句的数量。

这是我的完整猜测,但在Oracle中,您需要将游标声明为SP的IN OUT参数以与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...

答案 2 :(得分:0)

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