统一社会信用代码校验
本文以「统一社会信用代码校验」为例,配合模板阅读效果更佳。点击安装模板
统一社会信用代码相当于让法人和其他组织拥有了一个全国统一的“身份证号”,这类社会信用代码是可以根据固定的公式来判断是否正确。
使用场景
- 收集与公司合作的经销商公司信息,比如公司名称、法人代表、统一社会信用代码等,因为社会信用代码有18位,经常会有写错的情况,所以需要校验填写的信用代码是否是正确的。
- 开发票,填写公司名称和税号,税号长,易出错,用校验来验证信用代码的正确性,避免一些不必要的麻烦。
- 查询企业信息,用信用代码来查询对应企业的基本信息。
检验规则
国家发布了强制性国家标准GB32100—2015《法人和其他组织统一社会信用代码编码规则》,其中第18位校验算法如下:
信用代码总共是 18 位,需要对信用代码的第 1~17 位进行上面的公式计算得出第18位的数值,再与填写的信用代码第18位进行比较,若是一致,则信用代码正确,反之则不正确。
统一社会信用代码由数字和英文字母组合成的 18 位字符,每位代码字符对应代码字符数值如下图:
设计思路
将信用代码的 1~18 位字符分别取出,并分别得出对应的字符数值 Ci,对每一位的字符数值计算加权因子 Wi(3i-1 和 31 相除取余),计算得出Ci*Wi所有的数值之和后,与31相除取余数,再用 31 减去余数之后得出第 18 位的数值,将最后得出的数值与一开始取出的信用代码进行相比较,相符信用代码正确,否则信用代码不正确。
实现步骤
1.建立两张表单:信用代码总表、信用代码输入表
信用代码输入表使用外链:访问外链
2.信用代码总表:
代码字符:单行文本,代码字符数值:数字字段。将信用代码字符和信用代码数值分别导入对应的数据。
3.信用代码输入表
(1)信用代码:单行文本,不做任何设置
(2)Ci:子表单。
(3)取第1位:单行文本,取出信用代码的对应位数的字符,MID(信用代码,1,1) (取第1位、取第2位…取第18位字段都是一样的逻辑,分别取出对应位置的字符)
(4)设置联动
Ci子表单中的1~18:数字字段,设置数据联动,联动表单信用代码总表,条件是取第1位=代码字符,联动出对应的代码数值(1、2、3…18字段都是一样的逻辑,数据联动出对应的代码数值)
(5)Wi:子表单
(6)Wi子表单中的1~17:数字字段,计算3的幂次方3i-1,i代表的是信用代码的第几位字符,i不断累加,i-1是从0开始,用POWER函数,然后与31计算出余数,公式:MOD(POWER(3,0),31)
(7)校验码字符数值:数字字段,将Ci和Wi对应的位数都相乘之后相加,然后与31相除得出余数,再用31减去该余数得出校验码字符数值,公式设置为:
IF(31-MOD(SUMPRODUCT([Ci.1,Ci.2,Ci.3,Ci.4,Ci.5,Ci.6,Ci.7,Ci.8,Ci.9,Ci.10,Ci.11,Ci.12,Ci.13,Ci.14,
Ci.15,Ci.16,Ci.17],[Wi.1,Wi.2,Wi.3,Wi.4,Wi.5,Wi.6,Wi.7,Wi.8,Wi.9,Wi.10,Wi.11,Wi.12,Wi.13,Wi.14,
Wi.15,Wi.16,Wi.17]),31)==31,0,31-MOD(SUMPRODUCT([Ci.1,Ci.2,Ci.3,Ci.4,Ci.5,Ci.6,Ci.7,Ci.8,Ci.9,
Ci.10,Ci.11,Ci.12,Ci.13,Ci.14,Ci.15,Ci.16,Ci.17],[Wi.1,Wi.2,Wi.3,Wi.4,Wi.5,Wi.6,Wi.7,Wi.8,Wi.9,
Wi.10,Wi.11,Wi.12,Wi.13,Wi.14,Wi.15,Wi.16,Wi.17]),31))
(8)判断信用代码是否正确:单行文本,公式:IF(Ci.18==校验码字符数值,‘统一社会信用代码格式正确’,‘统一社会信用代码格式不正确’)
(9)设置表单校验,公式:判断信用代码是否正确==‘统一社会信用代码格式正确’