摘要
個人信息庫是醫療保險信息管理系統中最為重要的基礎數據庫之一,數據初次錄入計算機後,會有許多差錯,一般地要花費數月的時間和大量的人力物力來整理。本文介紹了一種采用"軟件"排錯的方法,該方法效果特別明顯。
類似如醫療保險信息管理系統的應用系統,有非常大的數據量,采用的是Oracle之類的大型數據庫。個人信息庫是醫療保險信息管理系統中最為重要的基礎數據庫之一,它記錄了每個參保人員與參加醫療保險有關的信息,如"姓名"、"性別"、"社保編號"、"人員分類"……等幾十個字段,一般都有數以萬計、十萬計的參保人員。將這樣大量的數據初次錄入計算機後,會有許多差錯,而軟件商提供的醫療保險信息管理系統皆沒有提供數據庫信息的排錯功能,為此現有的各醫療保險信息管理系統軟件的用戶們都花費了數月的時間和大量的人力物力來整理個人信息數據庫。
為了解決個人信息數據庫的排錯的問題,加快排錯的進度和准確性,四川省南充市醫保中心采用"軟件"排錯的方法,其效果特別明顯。
其步驟如下:
一、從Oracle數據庫中得到某單位"9999"的個人信息存入文本格式文件out.txt
啟動sql*plus
設置環境變量:
set heading off
set pagesize 0
set feedback off
set trimspool on
set echo off
設置輸出:
spool d:\out.txt
輸出單位"9999"的所有人員的姓名、性別、社保編號、人員分類等字段(以","分隔)到d:\out.txt:
select xm||','||xb||','||sbbh||','||ryfl||',' from shbx_nc.grxxk where dwid=9999;
關閉輸出,將緩沖寫入d:\out.txt:
spool off
重復
spool d:\out8888.txt
select xm||','||xb||','||sbbh||','||ryfl||',' from shbx_nc.grxxk where dwid=8888;
spool off
可從Oracle數據庫中獲取某單位"8888"的個人信息。
二、打開FoxPro,建立兩個數據庫
1.數據庫D:\DBF\LYC1.DBF 結構表:
FIEld FIEld Name Type Width 1 XH Integer 4 序號 2 XM Character 10 姓名 3 XB Character 4 性別 4 SBBH Character 40 社保編號 5 RYFL Character 10 人員分類 6 BJ Character 2 標記 7 DB Character 20 對比 ** Total ** 91
2.數據庫D:\DBF\LYC1_1.DBF結構表
FIEld FIEld Name Type Width 1 XH Integer 4 序號 2 XM Character 10 姓名 3 XB Character 4 性別 4 SBBH Character 40 社保編號 5 ZGZ Integer 4 在職工資 6 TGZ Integer 4 退休工資 7 BJ Character 2 標記 8 DB Character 20 對比 ** Total ** 89
三、加數據到兩個數據庫
1.將out.txt 導入到lyc1.dbf
sele 1
USE d:\dbf\lyc1.dbf IN 0 EXCLUSIVE
dele all
pack
append from d:\dbf\out.txt fIElds xm,xb,sbbh,ryfl delimited with ","
brow
2.將out1.txt 導入到lyc1.dbf (out1.txt來自與醫保個人帳戶電子文檔,分單位,包含個人的姓名、性別、社保編號、在職工資、退休工資等信息)
sele 2
USE d:\dbf\lyc1_1.dbf IN 0 EXCLUSIVE
dele all
pack
append from d:\dbf\out1.txt fIElds xh,xm,sbbh,zgz,tgz delimited with ","
brow
四、比較兩個數據庫的個人信息,設標記
do 1
1.prg
SET DEFAULT TO d:\dbf
SET PATH TO d:\dbf
select 1
use lyc1
select 2
use lyc1_1
do while not eof()
select 1
go 1
locate for xm = lyc1_1 -> xm
do while not eof()
if sbbh = lyc1_1 -> sbbh 如果姓名相同,社保編號也相同,設標記為y
replace xh with lyc1_1 -> xh
replace bj with "y"
replace lyc1_1 -> bj with "y"
if ryfl="在職" and lyc1_1 -> tgz > 0 如果有退休工資,不能是在職
replace ryfl with "在職?"
endif
if ryfl="退休" and lyc1_1 -> zgz > 0
replace ryfl with "退休?"
endif
if ryfl=" " and lyc1_1 -> tgz > 0
replace ryfl with "?退休"
endif
if ryfl=" " and lyc1_1 -> zgz > 0
replace ryfl with "?在職"
endif
exit
else
if bj<>"y" 如果標記沒設為y
replace xh with lyc1_1 -> xh
replace bj with "n" 姓名相同,社保編號不同,設標記為n
endif
continue
endif
enddo
select 2
skip 1
enddo
sele 1
use
sele 2
use
五、為標記為"n"和" "的記錄尋找"對比"信息
do 2
2.prg
SET DEFAULT TO d:\dbf
SET PATH TO d:\dbf
select 1
use lyc1
select 2
use lyc1_1
select 1
go 1
do while not eof()
if bj="n"
select 2
go 1
locate for xm = lyc1 -> xm
if not eof()
replace db with lyc1 -> sbbh 姓名相同,對比社保編號
replace lyc1 -> db with sbbh
endif
endif
select 1
if bj=" "
select 2
go 1
locate for sbbh = lyc1 -> sbbh
if not eof()
replace db with lyc1 -> xm 社保編號相同,對比姓名
replace lyc1 -> db with xm
endif
endif
select 1
skip 1
enddo
sele 1
use
sele 2
use
六、打印排錯信息
do p3
p3.prg
clear
set print on
set device to print
set default to d:\dbf
set path to d:\dbf
select 1
use lyc1
i=2
@1,10 say " 醫保數據庫 錯誤記錄:"
@2,10 say '序號 '+'姓名 '+'性別'+' 社保編號 '+' 人員分類 '+'對比提示'
locate for bj="n"
do while not eof()
i=i+1
if i>76
@1,10 say " 醫保數據庫 錯誤記錄:"
@2,10 say '序號 '+'姓名 '+'性別'+' 社保編號 '+' 人員分類 '+'對比提示'
i=3
endif
@i,10 say str(xh,4,0)+" "+xm+xb+" "+substr(sbbh,1,30)+ryfl+" "+db
continue
enddo
go 1
i=2
@1,10 say "****************醫保數據庫 無對應記錄:******************"
@2,10 say '序號 '+'姓名 '+'性別'+' 社保編號 '+'人員分類 '+'對比提示'
locate for bj=" "
do while not eof()
i=i+1
if i>76
@1,10 say "****************醫保數據庫 無對應記錄:****************"
@2,10 say '序號 '+'姓名 '+'性別'+' 社保編號 '+'人員分類 '+'對比提示'
i=3
endif
@i,10 say str(xh,4,0)+" "+xm+xb+" "+substr(sbbh,1,30)+ryfl+" "+db
continue
enddo
go 1
i=i+1
@i,10 say "****************醫保數據庫 分類有問題:****************"
i=i+1
@i,10 say '序號 '+'姓名 '+'性別'+' 社保編號 '+'人員分類 '+'對比提示'
locate for at('?',ryfl)>0
do while not eof()
i=i+1
if i>76
@1,10 say "****************醫保數據庫 分類有問題:****************"
@2,10 say '序號 '+'姓名 '+'性別'+' 社保編號 '+'人員分類 '+'對比提示'
i=3
endif
@i,10 say str(xh,4,0)+" "+xm+xb+" "+substr(sbbh,1,30)+ryfl+" "+db
continue
enddo
count all to t
count all for bj="y" to s
count all for ryfl="在職" to zs
count all for ryfl="退休" to tx
@i+1,10 say "****醫保數據庫 正確記錄數:"+str(s,4,0)+"/"+str(t,4,0)+"/在職"+str(zs,4,0)+"/退休"+str(tx,4,0)
select 2
use lyc1_1
i=2
@1,10 say "===============校對文稿 無對應記錄:==============="
@2,10 say '序號 '+'姓名 '+'性別'+' 社保編號 '+'對比提示'
locate for bj=" "
do while not eof()
i=i+1
if i>76
@1,10 say "===============校對文稿 無對應記錄:==============="
@2,10 say '序號 '+'姓名 '+'性別'+' 社保編號 '+'對比提示'
i=3
endif
@i,10 say str(xh,4,0)+" "+xm+xb+" "+substr(sbbh,1,30)+" "+db
continue
enddo
count all to t
count all for bj="y" to s
count all for zgz > 0 to zs
count all for tgz > 0 to tx
@i+1,10 say "========校對文稿 校對正確記錄數:"+str(s,4,0)+"/"+str(t,4,0)+"/在職"+str(zs,4,0)+"/退休"+str(tx,4,0)
eject
sele 1
use
sele 2
use
set print off
set device to screen
輸出結果
1.醫保數據庫 錯誤記錄:
醫保數據庫中與校對文稿中姓名相同而社保編號不同的列入此列,同時輸出兩個社保編號提供對比
2.醫保數據庫 無對應記錄:
(1)醫保數據庫中與校對文稿中社保編號相同而姓名不同的列入此列,同時輸出兩個姓名提供對比
(2)醫保數據庫中與校對文稿中姓名、社保編號都對應的列入此列,對比欄為空
3.醫保數據庫 分類有問題:
在職和退休分類錯的
4.校對文稿 無對應記錄:
(1)醫保數據庫中與校對文稿中姓名相同而社保編號不同的,同時輸出兩個社保編號提供對比
(2)醫保數據庫中與校對文稿中社保編號相同而姓名不同的,同時輸出兩個姓名提供對比
(3)醫保數據庫中與校對文稿中姓名、社保編號都不對應的,對比欄為空