天天看點

參數為空取全部資料的幾種做法

潤乾報表中支援使用者通過參數對資料過濾,而當多個條件聯合查詢時,如果某個條件沒有輸入值,使用者會希望該條件失效,也就是條件為空則視為沒有這個條件,取出所有滿足其它條件的資料。

例如,按照地區查詢,參數值輸入東北,則報表展示如下:

參數為空取全部資料的幾種做法

如該參數為空,則結果如下:

參數為空取全部資料的幾種做法

下面通過一個訂單資訊表來看下該需求的實作過程。

首先在報表設計器中制作一個網格式報表,如圖:

參數為空取全部資料的幾種做法

并在該報表的基礎上增加兩個參數用于資料過濾:

參數為空取全部資料的幾種做法

area:用于接收參數對地區進行過濾

amount:接收參數對訂單金額過濾

接下來更改資料集,增加參數過濾,如圖:

參數為空取全部資料的幾種做法
參數為空取全部資料的幾種做法

在 sql 語句中,條件寫法為:(貨主地區 =? or ? is null),在對應的參數表達式中寫上兩個相同的參數名(area),表示如果 area 參數有值,則用貨主地區 =area 條件過濾資料,否則執行 or 參數 is null,這樣參數為空時後邊條件成立,取出所有資料。

注意:

1、 參數表達式中内容和 sql 語句中的問号要一一對應,此處可以寫重複名稱。

2、 如果有多個條件過濾資料,則用括号将每組條件括起來。

通過上述操作,可以實作使用者的需求。在實際使用中,使用者希望貨主地區能夠傳遞多個地區,一次查詢出多個地區資料,比如要同時查詢華北和東北地區資料,對于此種方式,需要将對應參數類型更改為數組方式,并且更改 sql 語句中的條件寫法。

将 area 參數類型更改成字元串組,并更改 sql 語句中文法為:

參數為空取全部資料的幾種做法

如多選方式,sql 中要用 in (?) 方式。

現在預覽報表,如果 area 參數為空,則取出所有地區資料,如下圖:

參數為空取全部資料的幾種做法

但是當 area 參數多選時會報錯,如下圖:

參數為空取全部資料的幾種做法

主要原因:如參數類型是數組方式,參數值是多個時,sql 中的問号會自動根據值的個數解析出多個,這樣 or 後邊多個問号會出現文法錯誤。

解決辦法:将 or 後對應的參數用 string 函數強制轉換成字元串格式即可,如:

參數為空取全部資料的幾種做法

再次預覽報表即能取出正确結果。

一:當資料為 db2 時,使用 or ? is null 會出錯,此時需要更改 sql 語句為 cast(? as varchar(10)) is null) 把這個 varchar 改成資料庫中的類型即可, 需要對參數進行類型轉換 。

二:當參數類型為數組形式,按照上邊做法使用 string()函數轉換時,有可能數組值太多導緻 sql 報錯,此時可改成:where ( 貨主地區 in (?) or ? =’!EOF’),在參數表達式中寫入 if(@area==” OR @area==null ,’!EOF’),此種做法是如果參數為空則給對應的問号處傳回!EOF,這樣就取出所有資料了,同理,DB2 問題也可以用此種方式實作。

可以看到,資料集的參數表達式處不僅能夠直接寫參數,而且還可以寫潤乾的函數對參數值先行處理,将處理後的結果再傳遞到 sql 中進行過濾。回顧一下,我們首先解決的了單一參數值為空時,忽略該條件的問題;然後通過數組類型解決了參數中同時傳遞多個值的問題;最後通過分析,利用潤乾報表可以在參數表達式中寫函數的方式,徹底解決了傳遞多個參數值可能會遇到的問題。

作者:gxy

連結:

http://c.raqsoft.com.cn/article/1543386793666?r=IBelieve

來源:乾學院

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。