1. 概述
1.1 版本
报表服务器版本 | 功能变动 |
---|---|
11.0.1 | 语法报错优化 公式编辑框增加「输入提示」和「关闭前检查」选项 |
11.0.3 | 对于多sheet、多报表块的模板公式报错时,公式报错具体到单元格所在sheet/报表块 设计器报错日志支持点击定位错误位置 |
1.2 应用场景
函数计算格式 已经说明了在报表中使用函数的计算组成以及基础的计算语法,但有时用户也会遇到书写公式报错的问题,可根据提示完成公式的正确书写。
FineReport11.0 对公式的校验规则和报错提示进行了优化。
1.3 功能简介
本文将详细介绍运算符和表达式的语法,帮助用户了解公式校验方案,正确有效的写出需要的函数。
注1:FineReport11.0.2 以及之后的版本中,进行公式合法性检测时,如果公式中存在回车(\n)、tab (\t),则无法精准返回错误位置,如果您点击了查看报错,则光标默认回到公式首位(0位)。
注2:非官方指定用法公式虽然提示公式合法,但无法保证准确性。
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/报表块,如下图所示:
如果报错模板未打开则打开模板并跳转。