本帖最后由 pobopo 于 2011-2-26 23:40 编辑
有关身份证号码处理的一个实例介绍:
在此实例中,手工输入性别、身份证号码,若身份证号码长度为15位,则计算生成18位号码后存入另一字段,同时校验:所输入的号码的长度是否为15位或18位,其中月日范围、性别码(是否与手工输入的性别一致)、所输入的18位号码的校验码。
1. 该实例涉及表单内字段:
输入身份证号码(文本型,最大长度:18),
校验身份证号码(文本型,最大长度:18),
性别(下拉列表型:男、女。默认值:男)。“性别”字段的值是手工输入。
2. 计算公式
编辑计算公式的字段:校验身份证号码
有关身份证的计算方法,参考了该网址:http://hometown.scau.edu.cn/bBS/viewthread.php?tid=78199
关于计算公式的说明:
只能针对1900-1999年期间的出生日期,作补足计算。
若字段“输入身份证号码”为空时,则赋空值到本字段(”校验身份证号码“);
否则,若字段“输入身份证号码”输入长度为18位时,则直接赋值到本字段;
否则,视为长度为15位身份证号码处理,先补足为17位后计算身份证校验码,再补足为18位身份证号码赋值到本字段。
---------
请注意计算公式中的round()函数。如果不用,则因其计算结果有小数而得不出想要的正确结果。
---------
编辑计算公式:
if(MFISNULL($MF(输入身份证号码)$),"",if(len($MF(输入身份证号码)$)=18,$MF(输入身份证号码)$,MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15)&if(round(mod((12-MOD((VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),1,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),2,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),3,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),4,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),5,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),6,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),7,1))*2+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),8,1))*1+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),9,1))*6+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),10,1))*3+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),11,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),12,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),13,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),14,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),15,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),16,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),17,1))*2),11)),11),0)=10,"X",mid(round(mod(12-MOD((VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),1,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),2,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),3,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),4,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),5,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),6,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),7,1))*2+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),8,1))*1+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),9,1))*6+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),10,1))*3+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),11,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),12,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),13,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),14,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),15,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),16,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),17,1))*2),11),11),0),1,1))))
3. 编写校验用的回写公式如下:
(1)公式名称:校验输入身份证号码0
公式描述:“输入身份证号码”的长度校验。
触发类型:修改记录(新增记录的校验用回写公式与此相同)
执行时机:操作前
编辑执行条件公式:
if(MFISNULL($MF(输入身份证号码)$),true,or(len($MF(输入身份证号码)$)=15,len($MF(输入身份证号码)$)=18))
是否提交后重新计算:勾选√
不满足条件则终止:勾选√
编辑提示信息:"所输入的号码长度有误!"&MFNEWLINE()&"应为15位或18位。"
(2)公式名称:校验输入身份证号码1
公式描述:“输入身份证号码”的月日的范围校验。
触发类型:修改记录(新增记录的校验用回写公式与此相同)
执行时机:操作前
编辑执行条件公式:
关于公式的说明:
若字段“输入身份证号码”为空时,则设条件值为true,即校验通过,允许继续执行;
否则,若字段“输入身份证号码”输入长度为18位时,提取出月份字符并转换为数值检查其是否在1至12之间,提取出日(天)字符并转换为数值检查其是否在1至31之间;
否则,视为长度为15位身份证号码处理,校验月日范围。
if(MFISNULL($MF(输入身份证号码)$),true,if(len($MF(输入身份证号码)$)=18,and(and(value(mid($MF(输入身份证号码)$,11,2))>=1,value(mid($MF(输入身份证号码)$,11,2))<=12),and(value(mid($MF(输入身份证号码)$,13,2))>=1,value(mid($MF(输入身份证号码)$,13,2))<=31)),and(and(value(mid($MF(输入身份证号码)$,9,2))>=1,value(mid($MF(输入身份证号码)$,9,2))<=12),and(value(mid($MF(输入身份证号码)$,11,2))>=1,value(mid($MF(输入身份证号码)$,11,2))<=31))))
是否提交后重新计算:勾选√
不满足条件则终止:勾选√
编辑提示信息:
"月份或日期不对!请分别检查!"&MFNEWLINE()&"18位身份证号码的第11位或第13位起的2个数字,分别对应月、日。"&MFNEWLINE()&"15位身份证号码的第9位或第11位起的2个数字,分别对应月、日。"
(3)公式名称:校验输入身份证号码2
公式描述:与“性别”字段值的比较校验
触发类型:修改记录(新增记录的校验用回写公式与此相同)
执行时机:操作前
编辑执行条件公式:
and(if(MFISNULL($MF(输入身份证号码)$),true,or(and(if(len($MF(输入身份证号码)$)=15,mod(value(right($MF(输入身份证号码)$,1)),2)=0,mod(value(left(right($MF(输入身份证号码)$,2),1)),2)=0),$MF(性别)$="女"),and(if(len($MF(输入身份证号码)$)=15,mod(value(right($MF(输入身份证号码)$,1)),2)<>0,mod(value(left(right($MF(输入身份证号码)$,2),1)),2)<>0),$MF(性别)$="男"))))
编辑提示信息:
"与‘性别’字段值不符!请检查输入的身份证号码。"&MFNEWLINE()&"15位号码的倒数第一位数字、18位号码的倒数第二位数字:男应为单数,女应为双数。"
(4)公式名称:校验18位身份证号码的校验码3
公式描述:
触发类型:修改记录(新增记录的校验用回写公式与此相同)
执行时机:操作前
编辑执行条件公式:
if(MFISNULL($MF(输入身份证号码)$),true,if(len($MF(输入身份证号码)$)=18,right($MF(输入身份证号码)$,1)=if(round(mod((12-MOD((VALUE(MID($MF(输入身份证号码)$,1,1))*7+VALUE(MID($MF(输入身份证号码)$,2,1))*9+VALUE(MID($MF(输入身份证号码)$,3,1))*10+VALUE(MID($MF(输入身份证号码)$,4,1))*5+VALUE(MID($MF(输入身份证号码)$,5,1))*8+VALUE(MID($MF(输入身份证号码)$,6,1))*4+VALUE(MID($MF(输入身份证号码)$,7,1))*2+VALUE(MID($MF(输入身份证号码)$,8,1))*1+VALUE(MID($MF(输入身份证号码)$,9,1))*6+VALUE(MID($MF(输入身份证号码)$,10,1))*3+VALUE(MID($MF(输入身份证号码)$,11,1))*7+VALUE(MID($MF(输入身份证号码)$,12,1))*9+VALUE(MID($MF(输入身份证号码)$,13,1))*10+VALUE(MID($MF(输入身份证号码)$,14,1))*5+VALUE(MID($MF(输入身份证号码)$,15,1))*8+VALUE(MID($MF(输入身份证号码)$,16,1))*4+VALUE(MID($MF(输入身份证号码)$,17,1))*2),11)),11),0)=10,"X",mid(round(mod(12-MOD((VALUE(MID($MF(输入身份证号码)$,1,1))*7+VALUE(MID($MF(输入身份证号码)$,2,1))*9+VALUE(MID($MF(输入身份证号码)$,3,1))*10+VALUE(MID($MF(输入身份证号码)$,4,1))*5+VALUE(MID($MF(输入身份证号码)$,5,1))*8+VALUE(MID($MF(输入身份证号码)$,6,1))*4+VALUE(MID($MF(输入身份证号码)$,7,1))*2+VALUE(MID($MF(输入身份证号码)$,8,1))*1+VALUE(MID($MF(输入身份证号码)$,9,1))*6+VALUE(MID($MF(输入身份证号码)$,10,1))*3+VALUE(MID($MF(输入身份证号码)$,11,1))*7+VALUE(MID($MF(输入身份证号码)$,12,1))*9+VALUE(MID($MF(输入身份证号码)$,13,1))*10+VALUE(MID($MF(输入身份证号码)$,14,1))*5+VALUE(MID($MF(输入身份证号码)$,15,1))*8+VALUE(MID($MF(输入身份证号码)$,16,1))*4+VALUE(MID($MF(输入身份证号码)$,17,1))*2),11),11),0),1,1)),true))
编辑提示信息:
"18位身份证号码的末位校验码不正确!"&MFNEWLINE()&"可以改为输入旧的15位号码,点击‘重算公式’按钮生成18位的身份证号码。"
--------------- |