FR模塊的語法匯總
FR模塊的語法匯總
1. 公式編輯框
FR用到公式的地方非常多,單元格(以=開頭的便被解析為公式),條件顯示,數據字典,報表填報屬性值定義,圖表標題,軸定義,頁眉頁腳,甚至單元格的其他屬性中的鼠標懸浮提示內容都可以寫公式,雖然那個編輯框非常不像。
1. 語句語法剛接觸感覺比較奇怪,if(條件式子,值1,值2),if可以嵌套,if(條件式子1,值1,if(條件式子2,值2,值3))。
2. switch語句。詳細請查看:
Switch函數
3. 對於判斷用單等號和雙等號都行。
4. 對於字符串用單引號和雙引號都行。
(1)bool只有true或者false。與邏輯還是&&或邏輯還是||。
(2)判斷為空的話用isnull()或len($$$)=0。
(3)format公式。format公式比較靈活。format($$$,"0.00")可以把當前單元格的數字轉換成兩位小數的形式,也可以用format(12,"預算值:0.00萬元")把12變成預算值:12.00萬元,這個是不是和自定義顯示數據字典神馬的有異曲同工之妙啊。有一點要注意的是,滿位數年月日的話樣式是"yyyy-MM-dd",而不是"yyyy-mm-dd",小寫的mm的意思是分鍾(minute)。
5. 公式中取單元格的話直接用A1這種或者b2,跨sheet取值的語法是sheet1!A1。
6. sql函數,直接調用數據庫的方法。詳情請查看:
SQL函數
7. 數據集公式。
數據集公式是公式直接調用數據集的方法。詳情請查看:
ds1.select()和ds1.group()函數
比如有個模板數據集ds1,其字段為地區、銷售員、銷量,則可以用ds1.group(地區)獲取ds1的地區字段,group是分組,從而容易知道select是列表,ds1.select(銷售員)便是列表形式獲取銷售員字段,可以加上限制條件,比如ds1.select(銷售員,銷量=111)就是獲取銷售量為111的銷售員集合。跟數據集相關的幾個函數有colcount、colname、row、rowcount 等。
8. 層次坐標。詳情請查看:
層次坐標函數
層次坐標是公式里面比較難點的,“可玩性”非常強,東西比較多,只能記住最常用的幾個,能解決各種各樣BT的需求。較為常用的一個就是排名公式了=count(B3[!0]{B3 > $B3})+1。自己看吧。
9. 過濾公式。詳情請查看:
過濾
過濾有兩個條件類型,其一是公式條件。這個公式有一點點不同的是,可以直接寫當前單元格的字段所在數據集的任何字段,相對於普通公式要靈活很多。還拿自帶的銷量表為例,給地區字段所在單元格過濾,公式條件可以直接寫:銷量==111。
10.條件屬性。詳情請查看:
條件屬性
簡單說:條件屬性面板,上面是屬性,下面是條件。當下面的條件滿足,也就是返回值是true的時候,執行上面的屬性設置。
2. sql編輯框
數據集定義的面板,也是報表中最常用的模塊之一。
2.1 執行過程
這里其實是生成一個字符串,FR將這個字符串通過設置的數據連接傳遞到報表中執行。在這個過程中報表應該是先把報表規則的東西(比如現在的規則是${}中放參數),替換成大家都認得的字符串后,對應的數據庫執行完,會反饋值,有可能返回報錯信息,也有可能返回數據集。這個報錯信息應該是對應的數據庫給的。所以說同樣的sql語句,不同的數據庫用不同的sql語法來執行有可能是不同的結果。比如select 'sdf'在access和sqlserver正常顯示,在oracle就拋錯。用select version()或者show status或者show tables能在mysql的數據集定義里正常執行,其他則不行。sql中的and和or要和公式區別開,可能有人在公式里面把&&用成and。還有公式里面的或||在oracle中是字符串的連接符。
2.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
2.3 sql中調用sql函數
前面說到,sql語句其實是字符串。其實是可以從數據庫調用字符串作為一個sql語句進行操作的。這個要用到sql函數了,說例子:
=sql("FRDemo",sql("FRDemo","select testtext 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)}
3. js編輯框
3.1 FR的js
作為一款BS產品,browser端的JavaScript是必不可少的。FR中的js是已經調用了finereport.js的。
預覽報表時,報表servlet會將cpt模板轉為html,在這個html的head頭部中會引入FR的js,這個finereport.js中包含了許多內置的function以及一些公有的屬性,不管在模板中還是其他網頁中,只要引入了finereport.js,就能夠通過FR.xxx的形式調用公有的屬性與方法。
3.2 區別
js大致有兩種,頁面相關狀態的事件還有就是按鈕相關的事件。按鈕有三類,一類是工具欄的,一類是參數面板或者決策報表模式的,還有一類是填報頁面的。不同按鈕的某些語句稍微有些區別的。
決策報表是form,填報是write,以獲取控件並給控件賦值為例
- this.options.write.getWidgetByName("p1").setValue("aaa");//填報
- this.options.form.getWidgetByName("p1").setValue("aaa");//決策報表,參數界面
- contentPane.getWidgetByName("p1").setValue("aaa");//對於工具欄的按鈕,和單元格中的不在同一個框架或者容器,不能簡單套用
3.3 js編輯框調用公式
公式放在框架"${}"中。
比如var v1="${len('sdf')}";那么v1就為3.
這個跟數據集定義和公式交互可以比較一下。js中""下面的就是字符串,sql其實就是字符串,sql定義的地方是${}里面的是公式,JS編輯框中"${}"就是公式。
4. URL地址欄
首先是op參數。詳情請參考:
op參數的說明
報表在默認情況下的預覽方式是分頁預覽,當op參數為write時為填報預覽,op=view是數據分析,op=form是決策報表模式
其他op參數的類型:
op=fs,數據決策系統
op=excel_submit,后台excel導入填報
op=auth_login,登錄的中間頁面,需要fine_username和fine_password參數
其他的參數:
__bypagesize__ :控制是否分頁
__pi__ :是否顯示參數界面
__filename__ :控制導出文件名,沒有的話默認用模板名
注:下划線是兩條橫線