本帖最后由 加菲喵 于 2015-9-10 16:36 编辑
1. 问题描述 批量生成字符串类型卡号是指,用户上传了一段位数很长的字符串类型卡号的开头和结尾(如图),然后要求系统自动生成这一段所有的卡号并且成功输出。 用户上传卡号 2. 实现思路 主要从三个方面进行思考:1.对过长的字符串进行截断,使其可以被转化成数字;2.使用公式批量生成;3.输出过程进行拼接;4.对数字0进行标注。 3. 示例
3.1 设计数据表 此处使用Oracle数据库,在数据库中设计以下这样一张数据表,数据类型和属性如下: 3.2 制作上传数据模板 新建一个数据连接,连接至该数据库,新建数据连接的方法详细请参照 数据连接。 新建一张模板,在在模板设计主体页面第二行C单元格添加公式: if(lenA2)==0,"", RANGE(TOINTEGER(RIGHT(LEFT(A2,len(A2)-4),3)), TOINTEGER(RIGHT(LEFT(B2,len(B2)-4),3)))) |
下面对公式做出解释,从用户上传卡号可以看出,1.卡号位数较多;2,卡号位数不固定;3.卡号自带字符串后缀;
针对以上情况作出以下解决方案:1. 通过len(B5)-4)获取卡号位数;2.通过LEFT(B5,len(B5)-4)截断字符串后缀;3.通过RIGHT(LEFT(B5,len(B5)-4),3)获得起始卡号和终止卡号最后三位(注,此处只取了后三位,用户可以根据实际需要取位数);4.通过TOINTEGER(RIGHT()将获取的三位卡号转换成整数型;5.利用RANGE()公式实现卡号后三位的自增长。将C2单元格获取的结果传进D2单元格
对填报内容作出解释:id采用随机数来表示,用UUID(); papername是用来存放产生的卡号尾数,因为此时所有的卡号位数都是采用字符串形式存放在D2单元格里用“,”分开,因此此处采用split公式,将字符串根据“,”分离,split(D2,”,”); basename用来存放卡号前几位left(B2,len(B2)-7),取B2的长度减7然后取左边这几位。 suffix用来存放卡号的后缀right(B2,4); 3.3 保存填报 保存模板,采用填报预览。
点击导入按钮导入Excel表。
导入后效果
可以看到C单元格已经自动生成卡号的后三位,正式报表可以将CD两列隐藏 提交进数据库后数据库保存的数据如下: 3.4 制作查看模板 新建一张模板,添加数据集 select filed||suffix as cardnumber from( SELECT BASENAME||PAPERNAME AS FILED,suffix FROM ( select case when length(papername)=2 then '0'||papername when length(papername)=1 then'00'||papername else papername end aspapername, basename, suffix from CPTZ_PAPERNAME) order by to_number(FILED) ) 注:自增长函数range只能对数字类型实施运算,因此被存进数据库的数字会自动截断首位的0,因此在此处需要对自增长产生的数字位数进行判断,并且根据位数选择填补的0。本例截取的末尾数为三位。
在模板设计主体页面第二行添加一个单元格,并将数据列拖曳至对应单元格中,如下图: 3.5 保存预览
保存模板,查看效果如下: 页面显示
|