1. 程式人生 > >引數為空取全部資料的幾種做法

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

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

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

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

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

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

並在該報表的基礎上增加兩個引數用於資料過濾:

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
來源:乾學院
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。