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)}
新聞熱點
疑難解答