|
最近有个客户的人力资源系统(人事 考勤 工资)要修改
主要增加录入香港同事 及台湾同事的身份证号
之前主要是针对国内的15位及18位身份证号的判断(自动提取出生日期 性别等)
但限制了身份证号的长度,所以台湾及香港的身份证就无法输入了
所以研究了一下台湾身份证及香港身份证
1.香港身份证
香港的身份证是由8位数字或者字母组成的,首位一定是字母,中间的一定是数字的,至于()内的就一般是数字或者字母的,其实很多人都不知道,()内的这个字母或者数字,其实是效验前面的字母或者数字有没有写错,是用首7位的字母跟数字,用一种加权计算的方法出()内的数字或者字母,所以最后一位一般称为"效验数",是用来效验身份证的前面7位的准确性
2.台湾身份证
台湾人的身份证号码共十码
第1码是英文字母,不同的县巿用不同的字母。
每个字母代表两个数字
第2码代表性别(1是男生; 2是女生)
第3码~第9码是顺序码(基本上是越早出生的号码越前面)
第10码是判别码(判别是否为合法的身份证号码)
把前9码所代表的数字列出来,再乘以他的加权数(我记得是10~1)
接下来全部加起来,然后总和以10去除,取余数之后
以10来减那个余数之后得到的那个数字再以10去除取余数之后那个数字就是最后一个判别码
所以最简单的方法是前面9个码依规则乱编,最后一码从0试到9,一定有一个会是对的
3.国内身份证
国内新的二代身份证主要是18位的。旧的是15位的。这里就不详细介绍了。大家搜索一下
对身份证号的判断
Private Sub FIdenCardNo_BeforeUpdate(cancel As Integer)
Dim strPara As String
Dim j As Integer
Dim rs As DAO.Recordset
' 之前是强制 判断是15 或18 位,后来将 这个长度 设置为一个参数保存在参数表中 ,参数值为: 15,18,10
' If Len(Nz(FIdenCardNo)) <> 18 And Len(Nz(FIdenCardNo)) <> 15 Then
' gt_MessageBox "身份证号码必须为18位为15位"
' cancel = True
' Exit Sub
'
'
' End If
If Nz(FIdenCardNo) <> "" And (Nz(FIdenCardNo.OldValue) <> Nz(FIdenCardNo.Value)) Then
Set rs = CurrentDb.OpenRecordset("Select * from tblHrmEmp where FIdenCardNo='" & Me.FIdenCardNo & "' and FEmpStatusId<>'4'")
If rs.RecordCount > 0 Then
gt_MessageBox "此员的身份证号码与在职的另一个员工:" & rs("FEmpCode") & " " & rs("FEmpName") & "重复!" & vbCrLf & "请重新输入!"
cancel = True
End If
rs.Close
Set rs = CurrentDb.OpenRecordset("Select * from tblHrmEmpHist where FIdenCardNo='" & Me.FIdenCardNo & "'")
If rs.RecordCount > 0 Then
If gt_MessageBox("身份证号码与离职库中另一个员工:" & rs("FEmpCode") & " " & rs("FEmpName") & " 有重复 ,是否继续?", 2) = vbNo Then
cancel = True
Exit Sub
End If
End If
rs.Close
End If
If Nz(DLookup("FIdenCardNo", "tblHrmBlacklist", "FIdenCardNo='" & Me.FIdenCardNo & "'")) <> "" Then
MsgBox "此身份证[" & Me.FIdenCardNo.Value & "]与黑名单中一致,不能保存!", vbInformation, "提示"
cancel = True
Exit Sub
End If
' If Nz(Me.FIdenType) = "身份证" Then
strPara = gt_GetSysPara("AllowMaxIdenLen")
'strPara = DLookup("FSysParaValue", "tblZstmParameter", "FSysParaName='AllowMaxIdenLen'")
Dim varPara As Variant
Dim intLen As Integer
Dim blnOk As Boolean
varPara = Split(strPara, ",") ' 取参数值,参数值为: 15,18,10
intLen = Len(FIdenCardNo.Value)
For j = 0 To UBound(varPara)
If intLen = Val(varPara(j)) Then
blnOk = True
Exit For
End If
Next
If blnOk = False Then
gt_MessageBox "身份证号码长度不对"
cancel = True
End If
' End If
End Sub
|
|