董 威
(國家稅務(wù)總局蘇州市稅務(wù)局,江蘇 蘇州 215004)
數(shù)據(jù)庫應(yīng)用已深入各個領(lǐng)域,數(shù)據(jù)的存儲、分析都離不開數(shù)據(jù)庫的支撐。將數(shù)據(jù)需求轉(zhuǎn)化為數(shù)據(jù)庫表,是每一個數(shù)據(jù)庫系統(tǒng)初期建設(shè)階段的必要工作。如果把建表所需要素按設(shè)定格式存放在表格中,那么可以用VBA實現(xiàn)一鍵生成建表語句。以下說明具體實現(xiàn)方法。
以O(shè)RACLE數(shù)據(jù)庫為例,將待建數(shù)據(jù)表要素按如表1的格式填寫。
表1 建表基本信息
按表1的信息,需要生成的建表語句如下:
1 create tablet_spkcb(
2 sp_id cha(r6) not nul,
3 spmc varchar2(200) not null,
4 spsl number,
5 lrsj date,
6 lrr cha(r6)
7 );
8 comment on table is'商品庫存表';
9 comment on column spkcb.sp_id is'商品_id';
10 comment on column spkcb.spmc is'商品名稱';
11 comment on column spkcb.spsl is'商品數(shù)量';
12 comment on column spkcb.lrsj is'錄入時間';
13 comment on column spkcb.lrr is'錄入人';
14 alter table t_spkcb add constraint sp_id primary key(sp_id);
其中1~7行為基本建表語句,第8行增加表名備注,第9~13行增加字段備注,第14行為生成主鍵的語句。
1)首先判斷表1使用的行數(shù),據(jù)此確定字段總數(shù);
2)根據(jù)表1中的表名,拼接建表語句第1行;
3)根據(jù)表1中的表名及備注拼接第8行增加備注;
4)循環(huán)提取表1中4~8行信息:拼接9~13行字段備注語句;拼接2~7行建表基本語句,如果是末行加“);”
5)根據(jù)表1中E列的星號*位置,拼接第14行生成主鍵
按照以上思路,VBA腳本如下,其中vbCrLf為換行符,單引號后的楷體字為注釋。
在建表界面插入表單控件按鈕,修改名稱為“Create SQL”,指定宏為CreateTable()。這樣,在建表信息準(zhǔn)備好之后,點擊按鈕,即可生成建表語句。
實際應(yīng)用中,數(shù)據(jù)庫字段常采用中文拼音首字母的縮寫表達。為實現(xiàn)這一功能,首先編寫提取單個漢字拼音首字母的函數(shù)。在GB2312標(biāo)準(zhǔn)字符集中,一級漢字按拼音字母順序排列的,因此可以分段來確定首字母。該字符集的區(qū)位碼經(jīng)過加20H和80H轉(zhuǎn)為內(nèi)碼[3],和VBA中ASC()函數(shù)值相匹配。內(nèi)碼與VBA的ASC()函數(shù)[5]值均以首個一級漢字的對應(yīng)值歸零為基準(zhǔn)進行分段,結(jié)果一致。相關(guān)的轉(zhuǎn)換過程及公式示意如圖1所示。
圖1 漢字編碼轉(zhuǎn)換過程示意圖
提取拼音首字母的函數(shù)腳本如下:
這段代碼以GB2312字符集[2]為依據(jù),可以識別3 755個一級漢字的拼音首字母。如果遇到數(shù)字、字母和下劃線“_”則保持不變,二級漢字及其他字符均不輸出。在此基礎(chǔ)上,如果是多個漢字,則循環(huán)拼接,即可完成多個漢字的首字母拼音轉(zhuǎn)換。腳本如下:
需要說明的是,EXCEL單元格中不顯示的特殊字符有可能影響轉(zhuǎn)換結(jié)果。所以這段代碼進行了去空格和去換行符的處理,如遇到其他字符也需要類似操作。
這種方式下,表1的信息中不再需要填寫a列的字段名,只需要將字段中文名填入c列,a列通過函數(shù)py()自c列獲取,即在CreateTable()腳本里for循環(huán)體中,將第2句:
修改為兩句:
表名也類似,不過增加“t_”以符合表名命名規(guī)則。在CreateTable()腳本中,將第3句:tab_name=Range("a2")
修改為兩句:
這樣,表1只需填寫表中文名、字段中文名、字段數(shù)據(jù)類型、是否為空、主鍵標(biāo)識等信息,然后點擊“Create SQL”,即可快速生成相應(yīng)的SQL語句,同時在a列生成表名和字段名,供進一步確認。
在實際應(yīng)用中,還可能需要的有:不同字段的中文名有可能對應(yīng)相同的字母組合,而數(shù)據(jù)庫不允許重名字段,因此腳本還需要增加檢測和處理功能;為使生成建表語句本格式更加規(guī)范,還可以采用space(n)函數(shù)在適當(dāng)?shù)奈恢锰砑涌崭?;語句的最后一行,還可以加一段拼接select或desc語句的腳本,確認新表創(chuàng)建成功;語句第一行增加drop table語句,以適應(yīng)重復(fù)建表。這些都屬于應(yīng)用中的細節(jié),此處不再贅述。
以上,是利用VBA快速生成建表語句的方法。與此類似,如果需要將數(shù)據(jù)批量插入數(shù)據(jù)表,或者補充大量表及字段備注等語句,也可參照以上思路實現(xiàn)。