1. 帮助中心 >
  2. 博客 >
  3. 函数用法
返回

【函数】如何生成固定格式的流水号?

2015-12-05 标签:函数,流水号,RECNO,MAPX 


表单设计中经常涉及流水号的制作问题,简道云提供了一个递增的函数RECNO()来满足该需求。需要说明的是,RECNO()函数的触发机制是:每一次打开表单,都会累计1。就算是打开表单后什么都没填关闭了,这个数字也是永久性加1的,因此会造成跳号的问题。


所以很多朋友提出了连号的需求,在这里也介绍一种用MAPX()函数实现连续编号的方法,但此法会不可避免地出现一些并发问题:如果数据库中录入了100条数据,下一个序号应该是101,而这时A和B两个人同时打开表单(也许是有先后,或者假设A打开了表单,还没提交,然后B打开了表单),这时候库中仍然只有100条数据,那么这两人的表单上显示的都是101,还是一个101一个102呢?又或者A先打开,而B先提交,那么到底谁录入的是101? 当有大量人员进行填表操作时,将造成极大的不便。后来有用户提出了并发时避免重复编号的方法,大家也可以参考一下。


综合权衡之下,我们推荐用打开表单即跳号的方式。其实绝大多数要求连号的用户,是心中的完美主义让自己这么做的。因为表单数据是可以人为删除的,如果因为工作需要删除了某一条数据,也就是发生跳号了。而还有的用户人为,连号有助于数据统计。在简道云里,数据统计不用那种笨方法,如果想知道目前有多少条数据,直接在表单数据管理或者数据表中查看数据条数就可以了。


下面就分别介绍下这两种编号的实现方法,大家可以根据需要自行选择。


方法1:RECNO()


流水号的格式为:字母-年月日-4位流水号,如JDY-20170316-0034


用到的函数:


RECNO():累加器,从1开始表单每打开一次,累计加1


CONCATENATE(A,B,C):把ABC连接起来


RIGHT('0000'+A,4):将A补足为4位数,如37补足为0037,5432依然不变位5432。补位的0的个数与需要几位数保持一致,如需要补足为6位数,则公式修改为RIGHT('000000'+A,6)


TEXT(TODAY(),'yyyyMMdd'):用文本格式表示今天的日期,如20170316


这个流水号分成3段,第一段是字母,第二段是日期,第三段是递增序列。前两段不多说了,通过前几个案例的学习,相信大家已经完全掌握。重点讲解第三段。


RECNO()产生的序号是1,2,3,4,5,…,9,10,11,…,99,100,101…,这样的数字,为了统一位数为4位流水号,利用RIGHT函数补足,RIGHT('0000'+RECNO(),4)。就是在RECNO()产生的数字前面加4个0,然后取这个生成的字符串的后4位即可。000023变成0023;0000123变成0123,00006789变成6789。 如果需要6位数,公式写成RIGHT('000000'+RECNO(),6)


所以整体函数如下:



2.MAPX()


用到的函数:


CONCATENATE(A,B,C):把ABC连接起来


RIGHT('0000'+A,4):将A补足为4位数,如37补足为0037,5432依然不变位5432。补位的0的个数与需要几位数保持一致,如需要补足为6位数,则公式修改为RIGHT('000000'+A,6)


TEXT(TODAY(),'yyyyMMdd'):用文本格式表示今天的日期,如20170316



MAPX('LAST',A,B,C):在B中检索A的值,并返回对应的最后一个C值


VALUE():将字符串转变为数字格式


(1)新建单行文本字段,命名为“重置条件-按日重置”,设置不可见,表单属性-隐藏控件赋值-始终重新计算,对其写公式:TEXT(TODAY(),"yyyyMMdd")


(2)新建单行文本字段,命名为“编号”,设置不可编辑,勾选不允许重复值,对其写公式,根据当前日期查找该天的上一个编号并在其基础上加1,和“JDY-”及“重置条件-按日重置”合并成新的编号。


取出上一个编号的后四位,转换成数字,再加上1,得到新的号码,然后再补足4位数,并和前面的英文、日期连接起来。


取出上一个编号:MAPX("last",重置条件-按日重置,重置条件-按日重置,编号)


取出上一个编号的最右四位数:RIGHT(MAPX("last",重置条件-按日重置,重置条件-按日重置,编号),4)


取出上一个编号的最右四位数,转换成数字并加1,得到新的号码:VALUE(RIGHT(MAPX("last",重置条件-按日重置,重置条件-按日重置,编号),4))+1


将新的号码补足为4位数:RIGHT("0000"+(VALUE(RIGHT(MAPX("last",重置条件-按日重置,重置条件-按日重置,编号),4))+1),4)


把英文,日期和新的号码连接起来,即最终的公式为:CONCATENATE('JDY-',重置条件-按日重置,'-',RIGHT("0000"+(VALUE(RIGHT(MAPX("last",重置条件-按日重置,重置条件-按日重置,编号),4))+1),4))



(3)并发问题

编号勾选为不允许重复,因为多人同时打开表单时,得到的编号是一样的,如果有一个人提交了,那其他人的数据就无法提交。虽然这样可以避免提交同样的编号,依然对于无法提交的人来说不方便,只能重新打开表单获得新的编号后,再次填写。这里介绍一下一位简道云用户避免并发问题的方法,通过点击一个单选按钮重新获取编号。点击查看用户社区帖子→【关于自动连续编号,按固定时间重置编号,并发问题的解决方法




相关推荐