美文网首页
finereport主键自定义自增序列技巧

finereport主键自定义自增序列技巧

作者: 猛犸象和剑齿虎 | 来源:发表于2024-01-19 15:12 被阅读0次

LET(a, LET(beg, CONCATENATE(FORMAT(l4, "yyyyMMdd"), FORMAT(E3, "00")), sql("ccjt", "select max(id) from orders where id like '" + beg + "%'", 1, 1)), b, CONCATENATE(FORMAT(l4, "yyyyMMdd"), FORMAT(E3, "00"), "0000"), if(ISNULL(a), b + 1, a + 1))

函数逻辑:

  1. let函数

LET(变量名,变量值,变量名,变量值,..., 表达式):局部变量赋值函数,参数的个数N必须为奇数, 最后一个是表达式,前面是N-1(偶数)为局部变量赋值对。
变量名: 必须是合法的变量名,以字母开头,可以包括字母,数字和下划线
表达式: 根据前面的N-1个参数赋值后计算出来的结果,这些变量赋值只在这个表达式内部有效
示例:
LET(a, 5,b, 6, a+b)等于11

文字部分等于没说,示例部分比较好理解,把5 赋值给a,b赋值给b,然后a+b。

  1. CONCATENATE

CONCATENATE(text1,text2,...): 将数个字符串合并成一个字符串。
Text1,text2,...:需要合并成单个文本的文本项,可以是字符,数字或是单元格引用。
示例:
CONCATENATE("Average ","Price")等于“Average Price”。
CONCATENATE("1","2")等于12。
字符串拼接函数,这个比较好理解,可以是多个参数拼接。

  1. FORMAT

FORMAT(object,format) : 返回object的format格式。
object 需要被格式化对象,可以是String,数字,Object(常用的有Date, Time)。
format 格式化的样式。
示例
FORMAT(1234.5, "#,##0.00") => 1234.50
FORMAT(1234.5, "#,##0") => 1234
FORMAT(1234.5, "¥#,##0.00") => ¥1234.50
FORMAT(1.5, "0%") => 150%
FORMAT(1.5, "0.000%") => 150.000%
FORMAT(6789, "##0.0E0") => 6.789E3
FORMAT(6789, "0.00E00") => 6.79E03
FORMAT(date(2007,1,1), "EEEEE, MMMMM dd, yyyy") => 星期一,一月 01,2007
FORMAT(date(2007,1,13), "MM/dd/yyyy") => 01/13/2007
FORMAT(date(2007,1,13), "M-d-yy") => 1-13-07
FORMAT(time(16,23,56), "h:mm:ss a") => 4:23:56 下午

格式化函数:这里用到日期转换成20240120这种,将1转换成01。

  1. sql

SQL(connectionName,sql,columnIndex,rowIndex)返回通过sql语句从connectionName中获得数据表的第columnIndex列第rowIndex行所对应的元素。
connectionName:数据库库的名字,字符串形式;
sql:SQL语句,字符串形式;
columnIndex:列序号,整形;
rowIndex:行序号,整形。
备注:行序号可以不写,这样返回值为数据列。
示例:
以我们提供的数据源HSQL为例

SQL("HSQL","SELECT * FROM CUSTOMER",2,2)等于王先生。
和数据库sql差不多,多了第一参数帆软定义的连接名,后面的是列参数,行参数都是数字代表几行几列,当行定义成0时,选择的是多行。


image.png

finereport函数比较坑的地方是不能换行或者空格进行方便查看或者断句,导致嵌套使用时比较难以理解。
单元格I4是日期比如2023-10-10,E3是公司ID比如1。
首先弄明白整体的主键ID会是啥:20231010030005类似这种的,日期+公司+流水号。
参数a到底是啥?
LET(beg, CONCATENATE(FORMAT(l4, "yyyyMMdd"), FORMAT(E3, "00")), sql("ccjt", "select max(id) from orders where id like '" + beg + "%'", 1, 1))
concatenate是拼接了日期+公司,赋值给beg参数,然后用在了sql表达式,取出数据库ID字段中日期+公司+流水号的最大值。
参数b到底是啥?
CONCATENATE(FORMAT(l4, "yyyyMMdd"), FORMAT(E3, "00"), "0000")
日期+公司+0000
最后来个判断
if(ISNULL(a), b + 1, a + 1)
假如a是空值,比如左边是2024012003xxxx值得找不到,也就是说它是今天某一个公司得第一个ID,那么就用b参数日期+公司+0000+1比如是20240120030001这种,只要主键写入库中,那么a参数就成立了,再取值则会形成20240120030002。

相关文章

网友评论

      本文标题:finereport主键自定义自增序列技巧

      本文链接:https://www.haomeiwen.com/subject/sfcjodtx.html