1. 概述
1.1 版本
報表伺服器版本 | 功能變動 |
---|---|
11.0.1 | 文法報錯優化 公式編輯框增加「輸入提示」和「關閉前檢查」選項 |
11.0.3 | 對於多sheet、多報表塊的範本公式報錯時,公式報錯具體到儲存格所在sheet/報表塊 設計器報錯日誌支援點選定位錯誤位置 |
1.2 應用場景
函式計算組成和文法 已經說明了在報表中使用函式的計算組成以及基礎的計算文法,但有時使用者也會遇到書寫公式報錯的問題,可根據提示完成公式的正確書寫。
FineReport11.0 對公式的校驗規則和報錯提示進行了優化。
1.3 功能簡介
本文將詳細介紹運算子和表式的文法,幫助使用者瞭解公式校驗方案,正確有效的寫出需要的函式。
注:FineReport11.0.2 以及之後的版本中,進行公式合法性檢查時,如果公式中存在回車(\n)、tab (\t),則無法精準傳回錯誤位置,如果您點選了查看報錯,則游標預設回到公式首位(0位)。
2. 報錯優先說明
報表中報錯優先為:
文法錯誤
缺少字元、缺少符號、無法識別字元、無法識別符號
注:除了以上四種型別文法報錯,其他文法報錯均顯示為公式不合法。
函式錯誤
函式參數型別錯誤
函式參數個數錯誤
3. 文法報錯提示
例如,在輸入公式count(A1{len(A1) != 0})統計 A1 儲存格擴展出來的資料中不為空的個數後,由於輸入成了count(A1{len(A1) != 0},缺少了一個),點選「檢查合法性」進行校驗,發現提示「缺少匹配的:閉合符號」,點選「檢視錯誤」,游標自動定位到報錯的位置,如下圖所示:
4. 函式不合法提示
4.1 正文函式
函式 / 公式名 | 合法性說明 | 結果型別 | 不合法提示 |
---|---|---|---|
CHAR | 一個在[1-65535](閉區間)範圍內的數值參數 | 正文 | CHAR不符合 (一個[1-65535]的數值) 的參數要求 |
CODE | 一個正文參數 | 數值 | CODE不符合 (正文) 的參數要求 |
CONCATENATE | 多個任意型別參數 | 正文 | -- |
STARTWITH | 兩個任意型別參數 | bool | STARTWITH不符合 (任意型別,任意型別) 的參數要求 |
ENDWITH | 兩個任意型別參數 | bool | ENDWITH不符合 (任意型別,任意型別) 的參數要求 |
EXACT | 兩個任意型別參數 | bool | EXACT不符合 (任意型別,任意型別) 的參數要求 |
FIND | 第一個參數任意型別 第二個參數任意型別 第三個預設參數數值 即:有2/3個參數均合法,3個參數時第三個參數必須為數值型別 | 數值 | FIND不符合 (任意型別,任意型別) 或 (任意型別,任意型別,數值) 的參數要求 |
FORMAT | 第一個參數為日期/數值/正文,第二個參數為正文 | 正文 | FORMAT不符合 (日期/數值/正文,正文) 的參數要求 |
INDEXOF | 兩個參數,第一個為任意型別,第二個為數值 | 正文 | INDEXOF不符合 (任意型別,數值) 的參數要求 |
LEFT | 兩個參數,第一個為任意型別,第二個為大於0的數值,可預設 | 正文 | LEFT不符合(任意型別) 或 (任意型別,數值) 的參數要求 |
RIGHT | 兩個參數,第一個為任意型別,第二個為大於0的數值,可預設 | 正文 | RIGHT不符合(任意型別) 或 (任意型別,數值) 的參數要求 |
LOWER | 單正文參數 | 正文 | LOWER不符合 (正文) 的參數要求 |
MID | 第一個參數為任意型別,第二個,第三個為數值 | 正文 | MID不符合 (任意型別,數值,數值) 的參數要求 |
REGEXP | 兩個參數或三個參數 兩個參數時: 兩個參數為正文 三個參數時: 前兩個參數為正文,第三個參數為數值 | BOOL | REGEXP不符合 (正文,正文)或(正文,正文,數值) 的參數要求 |
REPEAT | 兩個參數,第一個為任意型別,第二個為數值 | 正文 | REPEAT不符合 (任意型別,數值) 的參數要求 |
REPLACE | 三個參數都是任意型別 四個參數,第一個是任意型別,第二個第三個是數值,第四個是任意型別 | 正文 | REPLACE不符合 (任意型別,任意型別,任意型別) 或 (任意型別,數值,數值,任意型別) 的參數要求 |
TODOUBLE | 單任意型別參數 | 數值 | TODOUBLE不符合 (任意型別) 的參數要求 |
TOINTEGER | 單任意型別參數 | 數值 | TOINTEGER不符合 (任意型別) 的參數要求 |
TOSTRING | 單任意型別參數 | 正文 | TOSTRING不符合 (任意型別) 的參數要求 |
TRIM | 單正文參數 | 正文 | TRIM不符合 (正文) 的參數要求 |
UPPER | 單正文參數 | 正文 | UPPER不符合 (正文) 的參數要求 |
LEN | 一個[正文、數字、陣列]中任意單一型別參數 | 數值 | LEN不符合 (任意型別) 的參數要求 LEN不符合(一個[正文、數字、陣列]中任意單一型別)的參數要求 |
SPLIT | 兩個任意型別的參數 | 陣列 | SPLIT不符合 (任意型別,任意型別)的參數要求 |
4.2 日期函式
函式 / 公式名 | 合法性說明 | 結果型別 | 不合法提示 |
---|---|---|---|
DATE | 三個數值參數 | 日期 | DATE不符合(數值,數值,數值)的參數要求 |
DATEDELTA | 兩個參數 第一個日期或正文型別參數 第二個為數值型別參數 | 日期 | #函式名#不符合(日期/正文,數值)的參數要求 |
MONTHDELTA | 兩個參數 第一個日期或正文型別參數 第二個參數為數值 | 時間 | |
YEARDELTA | 兩個參數 第一個日期或正文型別參數 第二個參數為數值 | 日期 | |
DATEDIF | 三個或四個參數 三個參數時: 第一、二個日期或正文型別參數 第三個正文 四個參數時: 第一,二個日期或正文型別參數 第三個是正文 第四個是數值 | 數值 | DATEDIF不符合(日期/正文,日期/正文,正文)或(日期/正文,日期/正文,正文,數值)的參數要求 |
DATESUBDATE | 三個參數 第一、二個日期或正文型別參數 第三個是正文 | 數值 | DATESUBDATE不符合(日期/正文,日期/正文,正文)的參數要求 |
DATETONUMBER | 一個日期或正文型別參數 | 數值 | DATETONUMBER不符合(日期/正文)的參數要求 |
DAYVALUE | 一個日期或正文型別參數 | 數值 | DAYVALUE不符合(日期/正文)的參數要求 |
DAYSOFMONTH | 一個日期或正文型別參數 | 數值 | #函式名#不符合(日期/正文/數值)的參數要求 |
DAYSOFQUARTER | 一個日期或正文型別參數 | 數值 | |
DAYSOFYEAR | 一個日期或正文型別參數 | 數值 | |
YEAR | 無參或者一個參數或者兩個參數 一個預設日期、數值、正文型別參數 兩個參數時為兩個正文型別參數 | 數值 | #函式名#不符合(無參) 或 (日期/數值/正文)或(日期/正文,正文)的參數要求 |
WEEK | 一、二、三、四個參數均可 一個參數時(日期/數值/正文) 二個參數時為(日期/正文,正文) 三個參數時為(日期/正文,正文,正文) 四個參數時為(日期/正文,正文,正文,正文) | 數值 | #函式名#不符合(無參) 或 (日期/數值/正文)的參數要求 |
DAY | 無參或者一個參數或者兩個參數 一個預設日期、數值、正文型別參數 兩個參數時為兩個正文型別參數 | 數值 | #函式名#不符合(無參) 或 (日期/數值/正文)或(日期/正文,正文)的參數要求 |
HOUR | 無參或者一個參數或者兩個參數 一個預設日期、數值、正文型別參數 兩個參數時為兩個正文型別參數 | 數值 | #函式名#不符合(無參) 或 (日期/數值/正文)或(日期/正文,正文)的參數要求 |
MINUTE | 無參或者一個參數或者兩個參數 一個預設日期、數值、正文型別參數 兩個參數時為兩個正文型別參數 | 數值 | #函式名#不符合(無參) 或 (日期/數值/正文)或(日期/正文,正文)的參數要求 |
MONTH | 無參或者一個參數或者兩個參數 一個預設日期、數值、正文型別參數 兩個參數時為兩個正文型別參數 | 數值 | #函式名#不符合(無參) 或 (日期/數值/正文)或(日期/正文,正文)的參數要求 |
SECOND | 無參或者一個參數或者兩個參數 一個預設日期、數值、正文型別參數 兩個參數時為兩個正文型別參數 | 數值 | #函式名#不符合(無參) 或 (日期/數值/正文)或(日期/正文,正文)的參數要求 |
TIME | 三個數值參數 | 時間 | #函式名#不符合 (數值,數值,數值)的參數要求 |
TODATE | 單參,參數為數值或日期或者正文 兩個參數全是正文 兩個參數全是正文 | 時間 | TODATE不符合(日期/數值/正文) 或 (正文,正文)或 (正文,正文,正文)的參數要求 |
NOW | 無參 | 時間 | NOW不符合(無參)的參數要求 |
TODAY | 無參 | TODAY不符合(無參)的參數要求 | |
WEEKDATE | 四個數值參數 | 時間 | WEEKDATE不符合(數值,數值,數值,數值)的參數要求 |
WEEKDAY | 一個日期或正文型別參數 | 數值 | WEEKDAY不符合(日期/正文)的參數要求 |
4.3 數學和三角函式
函式 / 公式名 | 合法性說明 | 傳回型別 | 公式不合法提示 |
---|---|---|---|
PI | 一個數值型別參數,可預設 | 數值 | PI不符合(數值)或(空)的參數要求 |
CEILING | 單數值參數 | 數值 | #函式名#不符合(數值)的參數要求 |
Floor | |||
INT | |||
SQRT | |||
LN | |||
SQRT | |||
ABS | |||
ACOS | |||
ASIN | |||
ATAN | |||
LOG10 | |||
SIN | |||
TAN | |||
COS | |||
EXP | |||
DEGREES | |||
SIGN | |||
RADIANS | |||
RAND | 無參 | 數值 | RAND不符合(無參)的參數要求 |
RANGE | 1-3個數值參數 合法規則為0<參數個數< 3且參數為數值型別 | 陣列 | RANGE不符合(數值,數值,數值)的參數要求 |
SUM | 無參數個數限制,任意型別 | 數值 | |
COUNT | 無參數個數限制,任意型別 | 數值 | |
MIN | 大於0個數值參數 | 數值 | #函式名# 不符合所有參數為相同型別的要求 |
MAX | |||
RANDBETWEEN | 兩個數值參數 | 數值 | #函式名#不符合(數值,數值)的參數要求 |
MOD | 兩個數值參數 | 數值 | #函式名#不符合(數值,數值)的參數要求 |
POWER | 兩個數值參數 | 數值 | #函式名#不符合(數值,數值)的參數要求 |
ROUND | 兩個數值參數 三個參數:前兩個數值,第三個布爾 | 數值 | #函式名#不符合(數值,數值)或(數值,數值,布爾)的參數要求 |
ATAN2 | 兩個數值參數 | 數值 | #函式名#不符合(數值,數值)的參數要求 |
PROMOTION | 兩個數值參數 | 數值 | #函式名#不符合(數值,數值)的參數要求 |
LOG | 第一個參數數值,第二個預設數值 | 數值 | #函式名#不符合(數值,數值)或(數值)的參數要求 |
TRUNC |
4.4 邏輯函式
注: 報表公式中沒有數值與bool型別之間的轉換,所以當前公式僅支援 bool 型別參數,不支援數字與 bool 型別的轉換。
函式 / 公式名 | 合法性說明 | 結果型別 | 不合法提示 |
---|---|---|---|
AND | 參數為bool型別或數值型別 | bool | AND的參數型別必須為布林型別或數值型別 |
OR | 參數為bool型別或數值型別 | bool | OR的參數型別必須為布林型別為bool型別或數值型別 |
IF | IF,三個參數,第二個和第三個參數為數值或正文型別,第一個為為bool型別(此處bool型別不包括數字) | 傳回結果參數中第一個非空的參數型別(第二個和第三個參數為傳回值參數) | 第一個參數不為bool型別時提示:IF表式的第一個參數不符合布林型別為bool型別 IF表式第二、三個參數不為數值或正文型別時提示:IF表式的結果型別必須為正文或數值型別 不滿足三個參數個數時提示:IF表式不滿足3個參數的參數個數要求 |
SWITCH | 參數個數至少3個,且結果參數型別一致 | 傳回結果參數中第一個非空的參數型別(switch函式,第2n+1個參數是傳回參數n>0) | SWITCH表式中的結果型別必須相同 |
REVERSE | 一個bool型別參數(只能是true或者false,不能用0/1代替) | bool | REVERSE不符合(bool型別)的參數要求 |
||,&& | 參數為bool型別或數值型別 | bool | #符號#只能連結兩個布林型別為bool型別或數值型別的表式 |
4.5 資料集函式
函式/公式名 | 合法性說明 | 結果型別 | 不合法提示 |
---|---|---|---|
SQL | 三個或四個參 數前兩個參數為字元型別,後兩個為整數型態,後兩個參數可僅寫一個 | 任意型別 | #函式名#不符合(字元,字元,整數型態,整數型態)的參數要求 |
ROW | 無參數 | 數字 | #函式名#不符合ROW(無參)要求 |
MAP | 四個參數:前兩個參數是任意型別,第三、四個參數為數字或正文 | 任意型別 | #函式名#不符合(任意型別,任意型別,數字/正文,數字/正文)的參數要求 |
4.6 其他函式
函式 / 公式名 | 合法性說明 | 結果型別 | 不合法提示 |
---|---|---|---|
ISNULL | 無參或單個任意型別參數 | bool | ISNULL不符合(無參)或(任意型別)的參數要求 |
NVL | 不限個數不限型別 | 任意型別 | NVL不符合所有參數為相同型別的要求 |
INDEX | 不限參數型別和個數 | 整數數值 | |
EVAL | 不限型別 | 數值 | |
SEQ | 不限型別 | 數值 | |
UUID | 單個數值參數,可預設 | 正文 | UUID不符合(無參) 或 (數值)的參數要求 |
4.7 陣列函式
函式 / 公式名 | 合法性說明 | 結果型別 | 不合法提示 |
---|---|---|---|
ARRAY | 不限型別不限個數 | 陣列 | |
INARRAY | 兩個參數,第一個參數為任意型別,第二個參數為陣列型別 | 數值 | INARRAY不符合 (任意型別,陣列)的參數要求 |
JOINARRAY | 兩個參數,第一個參數為陣列型別,第二個參數為任意型別 | 陣列 | JOINARRAY不符合 (陣列,任意型別)的參數要求 |
INDEXOFARRAY | 兩個參數,第一個參數為陣列型別,第二個參數為數值型別 | 任意型別 | INDEXOFARRAY不符合 (陣列,數值)的參數要求 |
||,&& | 參數為bool型別或數值型別 | bool | #符號#只能連結兩個布林型別為bool型別或數值型別的表式 |
5. 快速定位錯誤公式位置
FineReport 11.0.3 支援當多sheet、多報表塊的範本公式報錯時,公式報錯具體到儲存格所在sheet/報表塊。
例如 cpt 範本「橫向擴展後某列資料佔比」sheet2 C1 儲存格只有=沒有其他內容,如下圖所示:
此時預覽範本,會出現如下報錯,公式報錯內容包括所在範本、sheet以及儲存格:
注:多 sheet 範本顯示公式報錯所在 sheet 為阿拉伯數字,從 0 開始;如果是 frm 範本,則顯示公式所在報表塊;如果是FVS視覺化看板,則顯示公式所在表格。
更多報錯說明如下所示:
公式 | 日期格式錯誤導致計算中止 | 錯誤代碼:11300301 日期格式有誤,公式計算中止 |
儲存格等號後公式內容為空 | 錯誤代碼:11300302 儲存格等號後公式內容為空 | |
公式中除數為零 | 錯誤代碼:11300303 公式中除數為零:XX(具體儲存格) | |
公式計算錯誤 | 錯誤代碼:11300310 公式計算錯誤:XX(具體儲存格),出錯內容:YY(具體原公式) |
注:填報屬性內的公式、元件內的公式等在暫時不支援定位。
FineReport 11.0.3 設計器報錯日誌支援點選定位錯誤位置
為了更方便使用者快速定位到報錯儲存格,日誌面板中公式錯誤位置將「超連結樣式」顯示,點選後,如果報錯範本處於開啟狀態,將直接定位至超連結儲存格,多sheet及多報表塊範本將跳轉到對應sheet/報表塊,如下圖所示:
如果報錯範本未開啟則開啟範本並跳轉。