今天翻出一个原来写的软件,主要目的是测试数据录入质量的。尤其是×××号码准确性的,一直想发给基层使用,由于种种原因而没有实现。今天终于有一个区的姐姐拷走了。呵呵,我的虚荣心终于得到满足了!下面是我整个程序的日志。拿出来晒一下吧。程序是用VB6.0写的。很多资料都是网上搜的,只能算个应用吧。诸位笑话了。
本软件为监测乡镇版WIS软件录入×××号码的准确性。
事件绝大部分写在command2_click()中实现
1、软件编写思路:
(1)打开乡镇版WIS数据库保存路径:app.path+”\tjylfn\XZDATAS\xz.dbc”
引用“Microsoft ActiveX Data Objects 2.8 Library”,连接数据库(Visual Foxpro 6.0)
Set myConn = New ADODB.Connection
myConn.Open "Driver={Microsoft Visual FoxPro Driver};" & _
"SourceType=DBC;" & _
"SourceDB=" + Text1.Text + ";" & _
"Exclusive=No;"
注:text1.text为数据库保存路径。
(2)根据选择,判断是对“育龄妇女”,还是对其“其配偶”录入的×××号码进行监测。
添加控件:Option1:验证育龄妇女×××号码
Option2:验证丈夫×××号码
默认情况:Option1.Value=True
(3)判断育龄妇女×××号码准确性(丈夫×××号码同理)
①首先对基本情况(jbqk)库进行查询,查询录入×××号码为18位的育龄妇女信息。
mySql = "select fnbm,fnxm,fncsrq,fnsfhm from jbqk where len(allt(fnsfhm))=18"
myRec.Open mySql, myConn, adOpenDynamic, adLockOptimistic
②根据查询结果,设置循环,逐个判断×××号码的准确性
For Row = 0 To myRec.RecordCount - 1
myRecTemp = myRec.Fields("fnsfhm").Value
……
Next
③×××号码的判断,根据ISO 7064:1983,MOD 11-2校验码,判断校验位是否正确。
具体算法如下:
根据18位×××号码的前17位,每一位与其对应的系数相乘,系数表如下:
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
7
|
9
|
10
|
5
|
8
|
4
|
2
|
1
|
6
|
3
|
7
|
9
|
10
|
5
|
8
|
4
|
2
|
然后,把相乘之后的结果相加,对11取模,得到一个0-10的数字,根据尾数对应表
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
1
|
0
|
X
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
加上前17位+尾数,得出18位×××号码。
代码如下所示:
intTemp = (Val(Left(Trim(myRecTemp), 1)) * 7 + _
Val(Mid(Trim(myRecTemp), 2, 1)) * 9 + _
Val(Mid(Trim(myRecTemp), 3, 1)) * 10 + _
Val(Mid(Trim(myRecTemp), 4, 1)) * 5 + _
Val(Mid(Trim(myRecTemp), 5, 1)) * 8 + _
Val(Mid(Trim(myRecTemp), 6, 1)) * 4 + _
Val(Mid(Trim(myRecTemp), 7, 1)) * 2 + _
Val(Mid(Trim(myRecTemp), 8, 1)) * 1 + _
Val(Mid(Trim(myRecTemp), 9, 1)) * 6 + _
Val(Mid(Trim(myRecTemp), 10, 1)) * 3 + _
Val(Mid(Trim(myRecTemp), 11, 1)) * 7 + _
Val(Mid(Trim(myRecTemp), 12, 1)) * 9 + _
Val(Mid(Trim(myRecTemp), 13, 1)) * 10 + _
Val(Mid(Trim(myRecTemp), 14, 1)) * 5 + _
Val(Mid(Trim(myRecTemp), 15, 1)) * 8 + _
Val(Mid(Trim(myRecTemp), 16, 1)) * 4 + _
Val(Mid(Trim(myRecTemp), 17, 1)) * 2) Mod 11
Select Case intTemp
Case 0
lastTemp = "1"
Case 1
lastTemp = "0"
Case 2
lastTemp = "X"
Case 3
lastTemp = "9"
Case 4
lastTemp = "8"
Case 5
lastTemp = "7"
Case 6
lastTemp = "6"
Case 7
lastTemp = "5"
Case 8
lastTemp = "4"
Case 9
lastTemp = "3"
Case 10
lastTemp = "2"
End Select
④根据算法得到的最后一位,和原有的最后一位进行判断。
如果最后一位是X,还要增加大小写转换功能。
同时将其他字段数据赋值给变量,并写入新的数据库(db1.mdb)数据表(temp_fnsfhm)。
If Trim(lastTemp) <> "X" Then
If (Left(Trim(myRecTemp), 17) & lastTemp) <> Trim(myRecTemp) Then
myRec2.AddNew
myRec2.Fields("fnbm").Value = myRecTemp1
myRec2.Fields("fnxm").Value = myRecTemp2
myRec2.Fields("fncsrq").Value = myRecTemp3
myRec2.Fields("fnsfhm").Value = myRecTemp
myRec2.Update
Counter = Counter + 1
End If
Else
If (Left(Trim(myRecTemp), 17) & "x") <> Trim(myRecTemp) And (Left(Trim(myRecTemp), 17) & "X") <> Trim(myRecTemp) Then
myRec2.AddNew
myRec2.Fields("fnbm").Value = myRecTemp1
myRec2.Fields("fnxm").Value = myRecTemp2
myRec2.Fields("fncsrq").Value = myRecTemp3
myRec2.Fields("fnsfhm").Value = myRecTemp
myRec2.Update
Counter = Counter + 1
End If
End If
⑤显示在datagrid控件上。
Set DataGrid1.DataSource = myRec2
DataGrid1.Refresh
(4)增加数据导出功能,生成.txt文本格式的功能。具体代码参考程序,此处略。