2009-07-08 60 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,'%%') 
相關問題