專利名稱:一種對多行數(shù)值列存儲成一行的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種計算機應(yīng)用技術(shù),是一種數(shù)據(jù)存儲類程序技術(shù),可以提高計 算機應(yīng)用程序的檢索效率、減少數(shù)據(jù)庫占用空間。
背景技術(shù):
通常我們在設(shè)計有關(guān)有序數(shù)值列的數(shù)據(jù)結(jié)構(gòu)時,是將字段定義為數(shù)值型,例如
Numeric,按行存儲數(shù)據(jù),在數(shù)據(jù)庫中表現(xiàn)為一行一行的多條記錄。
但是這樣會在數(shù)據(jù)庫中形成大量的數(shù)據(jù)行,影響査詢效率,且占用較大存儲空間。
發(fā)明內(nèi)容
本發(fā)明的目的就是解決現(xiàn)有技術(shù)存在不足,提供一種可以實現(xiàn)多行數(shù)值列存儲 成一行方法,提高査詢效率、減少數(shù)據(jù)庫存儲空間。
本發(fā)明的目的是按以下方式實現(xiàn)的將存儲數(shù)值列的字段數(shù)據(jù)結(jié)構(gòu)定義為
varchar或text非數(shù)值型類型,然后通過程序解析為用"-"和","連接數(shù)值的 表意串存儲在數(shù)據(jù)庫中。
本發(fā)明具有功能和有益效果
多行數(shù)值合并為一行;
提高檢索效率;
減少數(shù)據(jù)存儲空間。
使應(yīng)用程序顯示數(shù)據(jù)時更直觀, 一目了然。
圖l是連續(xù)的f(值,轉(zhuǎn)換示意圖2是不連續(xù)的數(shù)值,轉(zhuǎn)換示意圖。
具體實施例方式
參照附圖對本發(fā)明的方法做以下詳細的說明
將有序數(shù)值列按照一定的規(guī)則解析為表意數(shù)值串,例如有10個連續(xù)的數(shù)值,
從1到10,則解析后的表意串為1-10;當然也可以是不連續(xù)的數(shù)值串,如從l到
5,再從9到13,這時表意串則為1-5,9-13。即"-"代表連續(xù)的數(shù)值;","代 表不連續(xù)的數(shù)值。在數(shù)據(jù)庫中存儲解析后的表意串。實施例
本發(fā)明所述方法適用于多行數(shù)值列存儲為一行記錄的存儲技術(shù)。例如制藥行 業(yè)中對藥品批號的箱號管理,制藥廠為防止串貨、批號跟蹤等管理,通常需要對
一批生產(chǎn)的藥品進行箱號管理, 一般一個批號下的箱號為連續(xù)的數(shù)值,1、 2、 3等 有序數(shù)值。這就需要建立表來存儲這些箱號信息,現(xiàn)在多數(shù)軟件都是按照形如圖1 中左側(cè)的樣式按行進行存儲,這中方式會在數(shù)據(jù)庫中形成多行記錄,占用空間較 大,在就是査詢效率會很受影響,且給用戶的界面顯示不直觀。本發(fā)明就是借用 數(shù)據(jù)庫豐富的字段類型定'義,將圖1中左側(cè)的多行數(shù)值存儲為右側(cè)的一行。 以下為詳細的實施說明
A) 將存儲數(shù)值列的字段數(shù)據(jù)結(jié)構(gòu)定義為非數(shù)值型,例如varchar或text類型,這 是關(guān)鍵
B) 然后通過程序解析為用"_"和","連接數(shù)值的表意串存儲在數(shù)據(jù)庫中。
將多行數(shù)值表生成解析為一行表意串主要程序組件如下
String vsstr,vsstr2 Long vlrowl, vlrow2, vlrow, vli, vl j, vlnum, vljhl, vl jh2, vlm, vln Long vlrowcount vlrowcount = dw—1. RowCount0 IF vlr。wcount = 1 THEN
vljhl = dw—1. GetltemNumber (1,"f一wcjh")
mle—l.Text = String (vljhl)
RETURN 1 END IF
FOR vli 二 1 TO vlrowcount
vljhl 二 dw」.GetltemNumber (vli, "f—wcjh")
vln = 0
vim = vli + 1
FOR vlj 二 vim TO vlrowcount vln = vln + 1
vljh2 = dw—1. GetltemNumber(vlj ,"f—wcjh")
IF vljh2 〈> (vljhl + vln ) AND vln > 1 THEN 〃處理開始是連續(xù)號的情況 vsstr 二 vsstr + String (vljhl)+,-, 十String (vljhl + vln - 1) +,,, GOTO a .. 〃跳出循環(huán)再次開始
ELSEIF vljh2 〈〉 (vljhl + vln ) AND vln 二 1 THEN〃處理開始是斷號的情況 vsstr 二 vsstr +String(vljhl)+,,, * GOTO a
ELSEIF vljh2 = (vljhl + vln) AND vln. >= 1 AND vlj 二 vlrowcount THEN vli = vlj
vsstr = vsstr +String(vljhl)+,-,十String(vljh2)+,,, END IF NEXT
3:
4vli = vlj IF vli = vlrowcount THEN
vljh2 = dw一l. GetItemNumber(vli,"f—wcjh") vsstr = vsstr + String (vljh2) +,,, ELSE〃第一次循環(huán)沒有結(jié)束,則繼續(xù)處理后續(xù)數(shù)據(jù),同時開始點調(diào)整為vlj - 1 vli = vlj - 1 END IF NEXT
本發(fā)明的方法已經(jīng)成功用于浪潮集團的PS管理管理軟件制藥版的藥品箱號管 理模塊,提高了程序的運行效率及界面直觀化,取得了良好效果。
權(quán)利要求
1、一種對多行數(shù)值列存儲成一行的方法,其特征在于,將存儲數(shù)值列的字段數(shù)據(jù)結(jié)構(gòu)定義為varchar或text非數(shù)值型類型,然后通過程序解析為用“-”和“,”連接數(shù)值的表意串存儲在數(shù)據(jù)庫中,將多行數(shù)值表生成解析為一行表意串的主要程序組件如下 String vsstr,vsstr2 Long vlrow1,vlrow2,vlrow,vli,vlj,vlnum,vljh1,vljh2,vlm,vln Long vlrowcountvlrowcount=dw_1.RowCount()IF vlrowcount=1THEN vljh1=dw_1.GetItemNumber(1,″f_wcjh″) mle_1.Text=String(vljh1) RETURN 1END IFFOR vli=1TO vlrowcountvljh1=dw_1.GetItemNumber(vli,″f_wcjh″)vln=0vlm=vli+1 FOR vlj=vlm TO vlrowcount vln=vln+1 vljh2=dw_1.GetItemNumber(vlj,″f_wcjh″) IF vljh2<>(vljh1+vln)AND vln>1THEN//處理開始是連續(xù)號的情況 vsstr=vsstr+String(vljh1)+’-’+String(vljh1+vln-1)+’,’ GOTO a //跳出循環(huán)再次開始 ELSEIF vljh2<>(vljh1+vln)AND vln=1THEN//處理開始是斷號的情況 vsstr=vsstr+String(vljh1)+’,’ GOTO a ELSEIF vljh2=(vljh1+vln)AND vln>=1 AND vlj=vlrowcount THEN vli=vlj vsstr=vsstr+String(vljh1)+’-’+String(vljh2)+’,’ END IF NEXTa:vli=vljIF vli=vlrowcount THEN vljh2=dw_1.GetItemNumber(vli,″f_wcjh″) vsstr=vsstr+String(vljh2)+’,’ELSE//第一次循環(huán)沒有結(jié)束,則繼續(xù)處理后續(xù)數(shù)據(jù),同時開始點調(diào)整為vlj-1 vli=vlj-1END IFNEXT。
全文摘要
本發(fā)明提供一種對多行數(shù)值列存儲成一行的方法,該方法是將存儲數(shù)值列的字段數(shù)據(jù)結(jié)構(gòu)定義為varchar或text非數(shù)值型類型,然后通過程序解析為用“-”和“,”連接數(shù)值的表意串存儲在數(shù)據(jù)庫中。
文檔編號G06F17/30GK101645076SQ20091001862
公開日2010年2月10日 申請日期2009年9月7日 優(yōu)先權(quán)日2009年9月7日
發(fā)明者波 王 申請人:浪潮集團山東通用軟件有限公司