今天翻出一個原來寫的軟件,主要目的是測試數據錄入質量的。尤其是×××號碼準確性的,一直想發給基層使用,由於種種原因而沒有實現。今天終於有一個區的姐姐拷走了。呵呵,我的虛榮心終於得到滿足了!下面是我整個程序的日誌。拿出來曬一下吧。程序是用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文本格式的功能。具體代碼參考程序,此處略。