標籤:
感謝大家捧場,這裡繼續分享關於SQL編輯框的一些文法心得總結,因為資料集定義的面板,也是FineReport報表中最常用的模組之一。
1.我理解的執行過程。
這裡其實是產生一個字串,FineReport將這個字串通過設定的資料連線傳遞到報表中執行。在這個過程中報表應該是先把報表規則的東西,替換成大家都認得的字串後,對應的資料庫執行完,會反饋值,有可能返回報錯資訊,也有可能返回資料集。這個報錯資訊應該是對應的資料庫給的。所以說同樣的sql語句,不同的資料庫用不同的sql文法來執行有可能是不同的結果。比如select ‘sdf‘在access和sqlserver正常顯示,在oracle就拋錯。用select version()或者show status或者show tables能在mysql的資料集定義裡正常執行,其他則不行。
sql中的and和or要和公式區別開,有人可能在公式裡面把&&用成and。還有公式裡面的或||在oracle中是字串的串連符。
2.sql中調用公式
報表通過公式和參數實現與sql語句的互動。
公式放在架構${}中。於是${"select* from t1"}其實就等價於select *from t1。
資料集中用公式的痛點在於拼接起來比較繁瑣。
我想很多人接觸到的第一個例子應該是協助文檔上參數為空白返回全部的sql語句:SELECT *FROM 訂單 where 1=1${if(len(area) == 0,"","and 貨主地區 = ‘" + area + "‘")} ${if(len(province) ==0,"","and 貨主省份 = ‘" + province + "‘")}
下面舉個調用FR中format的例子:
select${"‘"+format(p1,"yyyy-MM-dd")+"‘"} from aa
如果漏掉format函數前後的單引號,就會得到錯誤的結果。其實有的時候可以通過一些方法簡化處理的,比如再聲明一個變數p2,引用這個變數的定義是format(p1,"yyyy-MM-dd"),這時候上面的sql就變成了select ‘${p2}‘ from aa 【當然如果沒有加引號的話那p2就被解析為一個欄位名了,這是動態欄位的實現方法了】
對於預存程序,資料集定義這地方其實是支援call和exec的調用方法的。
3.sql中調用sql函數
前面說到,sql語句其實是字串。其實是可以從資料庫調用字串作為一個sql語句進行操作的。這個要用到sql函數了,說例子:
=sql("FRDemo",sql("FRDemo","selecttesttext from test where id=2",1,1),1,1)
test這個表裡面的第二條資料的testtext欄位就是字串 select top 1 地區 from 銷量
可以把這個字串用在sql公式中作為sql語句執行
資料集定義那邊這麼寫是可以的 ${sql("FRDemo","select testtext from test where id =2",1,1)}
java報表工具FineReport的SQL編輯框的文法簡介