


[摘 要] 本文通過分析動態表單的實現原理和運行機制,采用MVC架構,利用ASP.net技術,研究基于Web的貴州省中藥現代化產業報表制度統計系統動態表單統計,滿足貴州省中藥現代化產業主管單位對貴州省中藥現代化報表制度統計系統中統計指標頻繁變化的需求。
[關鍵詞] 中藥現代化產業報表制度; 統計; 動態表單; ASP.net
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2013 . 16. 047
[中圖分類號] TP399 [文獻標識碼] A [文章編號] 1673 - 0194(2013)16- 0074- 03
0 引 言
在開發基于Web的數據統計系統時,經常會遇到對各種各樣統計指標輸入表單的處理。通常設計者都會根據用戶的統計指標需求設計輸入界面,但隨著社會和經濟的發展,很多指標是動態變化的,這就導致以前設計的統計指標錄入界面不能滿足用戶的需求。這種情況在中藥材統計中較為明顯,比如貴州省中藥現代化產業統計中“典型藥品批發和零售企業主要經濟指標”這一統計表單下有統計指標主營業務成本、主營業務稅金及附加、主營業務利潤、其他業務利潤、營業費用、管理費用、財務費用、營業利潤、利潤總額等28個。隨著社會、經濟和科技的發展,每年各單位都會對統計指標進行修改,這導致每年的統計指標不同。比如當要在“典型藥品批發和零售企業主要經濟指標”這一統計表單下增加工業生產總值、中成藥工業生產總值、中成藥主營業務利潤等指標或刪減其中的一些統計指標時,會導致系統的數據庫、業務邏輯、界面顯示等發生變化,要讓系統適應新的統計指標要求,需要專業的軟件人員進行修改,將會消耗很大的人力、物力、財力來對系統進行修改。從長遠來看不是一個切實可行的辦法。如何設計一個動態表單頁面,使其能隨著統計指標的變化而變化成為當前統計系統要解決的首要問題。動態表單技術可以通過Web頁面方便地對表單進行管理,通過一次配置即可生成表單,數據庫表以及動態查詢頁面。并且可以在后臺管理這些表單,進行必要的修改和刪除操作。
通過認真分析和中藥現代化產業統計工作的實際,作者發現,這些動態變化的統計指標完全可以用 .net和數據庫來實現,在數據庫中采用一個分類表來對每年所涉及的統計表進行分類并記錄統計表所使用的字段信息,相當于建一個二級數據庫,.net通過讀取分類表中表的字段,根據所選擇的數據表的字段自動生成統計表 .aspx文件和處理 .aspx表單的CS文件。
1 相關技術
1.1 ASP.net技術
ASP.net是一種動態網頁技術,ASP.net很多程序都是在服務器端執行,通常返回給用戶一個HTML文本,因此,客戶端只要有瀏覽器就可以瀏覽。利用ASP.net技術,動態信息由擴展名為.aspx的頁面表現,業務邏輯可由VisualMicrosoftC++、 Visual MicrosoftVB、C#等開發語言實現。
1.2 MVC設計模式
MVC是一種設計模式,它由模型(Mode1)、視圖(View)和控制器(Controller) 3部分組成。MVC模式把數據處理、程序輸入輸出控制以及數據表示分離開來,并且描述了不同部分的對象之間的通信方式,使它們不必卷入彼此的數據模型和方法中,使程序結構變得清晰而靈活。MVC架構是一種廣泛使用的交互式應用程序的架構方式,它將之前和現在所涉及的數據對象按功能劃分,以盡量減少對象之間的耦合度。MVC體系結構將傳統應用任務(輸入、處理和輸出)轉化為圖形化用戶交互模型,已逐漸應用于基于Web的多層次企業應用領域。
2 動態表單的設計
動態表單編輯器能夠根據用戶的需要,隨意設計出想要的表單結構,包括表單的樣式排版及標簽的增減和更改,并能通過設計好的動態表單,實現采集信息的功能、數據處理等簡單功能。根據貴州省中藥現代化產業統計工作的實際需要,本文設計了一個動態表單的實現過程及其實現原理,如圖1所示,其方法步驟為:
第一步:將信息對象進行歸類,對于系統中沒有的分類,建立分類;
第二步:建立分類后,在該分類下定義數據表字段信息;
第三步:依據定義好的數據表字段信息,創建數據庫表;
第四步:根據分類和數據庫定義的字段內容,打開動態表單編輯器,繪制所需的表單數據;
第五步:根據動態表單的Form控件標簽對應的字段信息,保存表單內容信息至數據庫中,并結合Script技術生成 .aspx文件;
第六步:戶在設計好的表單中錄入編輯信息,并保存入庫。
總之,動態表單的設計首先根據對象信息的屬性設計好數據庫表,然后把對象信息的屬性描述為表單屬性,最后表單把某一類對象的信息存入相應的數據庫表中。
3 設計與實現
3.1 數據庫設計
在數據庫中,設計二級數據庫表,名稱為Two_DataBase,字段包括Table_Name(表名)、Field_Name(字段名),Field_Type(字段類型)、Field_Size(字段寬度)、Y_N_Prime_Key(是否為主鍵)、Decimal_Number(小數位數)、Table_Use_Year(表的使用年份)、Y_N_I horizontal(是否為橫向)、Default_Value(默認值)、Fields_Control_Type(字段所使用的控件類型)、Chinese_Notes(中文注釋)。
3.2 統計表字段信息錄入
當用戶對要創建的統計表進行字段輸入,系統根據輸入的內容,在.net中采用SQL中的Insert命令把統計表的字段信息錄入數據庫表Two_DataBase。創建表的界面如圖2所示。.Net中錄入統計指標字段信息的語句如下:
Insertinto Two_DataBase(Table_Name,
Field_Name,Field_Type,Field_Size,
Y_N_Prime_Key,Decimal_Numbler,Fields_Control_Type,Chinese_Notes,Table_User_year)value(
this.Table_Name.Text.ToString().Trim(),
this.Field_Name.Text.ToString().Trim(),
this.Field_Type.Text.ToString().Trim(),
this.Field_Size.Text.ToString().Trim(),
this.Y_N_Prime_Key.Text.ToString().Trim(),
this.Decimal_Number.Text.ToString().Trim(),
this.Fields_Control_Type.ToString().Trim(),
this.Chinese_Notes.Text.ToString().Trim(),
this.Table_Use_Year.Text.ToString().Trim())
3.3 統計表的創建
根據Two_DataBase中的內容,創建統計指標數據表,假設要創建的統計表名為Statiscs_Table1,創建表的部分核心代碼如下。
StringBuilder strSql=new StringBuilder();
strSql.Append(\"select Field_Name,Field_Type,
Field_Size,Y_N_Prime_Key,Decimal_Numbler,
Fields_Control_Type,Chinese_Notes from Two_DataBase \");
strSql.Append(\" where Table_Name =@Table_Name \");
SqlParameter[] parameters = {
New SqlParameter(\"@Table_Name\", SqlDbType.VarChar, 255)};
parameters[0].Value =” Statistics_Table1”;
DataSet ds=DbHelperSQL.Query(strSql.ToString(),
parameters);
Int i= ds.Tables[0].Rows.Count;
String[][] arr=new String[i][7];
For(int j=0;j< ds.Tables[0].Rows.Count;j++)
{For(k=0;k<7;k++)
{Arr[j][k]=””}}
For(int j=0;j< ds.Tables[0].Rows.Count;j++)
For(k=0;k<7;k++)
{
Arr[j][k]= ds.Tables[0].Rows[j][k].ToString().Trim();
}}
String str=”create ”+ ds.Tables[0].Rows[0]. Table_Name+”(”;
For(int i=0; i< ds.Tables[0].Rows.Count;i++)
{
Str=str+ ds.Tables[0].Rows[i]. Field_Name+” ”+ds.Tables[0].Rows[i].Field_Type;
If (ds.Tables[0].Rows[i]. Field_Size>0)
If(ds.Tables[0].Rows[i]. Decimal_Numbler>0)
Str=str+”(“+ ds.Tables[0].Rows[i]. Field_Size +”,”+ ds.Tables[0].Rows[i]. Decimal_Numbler+”)”;
Else
Str=str+”(“+ ds.Tables[0].Rows[i]. Field_Size+”)”;
If(Y_N_Prime_Key=.T.)
Str=str+” primary key”;
Str=str+”,”+ ds.Tables[0].Rows[i]. Fields_Control_Type;
Str=str+”,”+ ds.Tables[0].Rows[i]. Chinese_Notes+”)”;
}
SqlCommand cmd = New SqlCommand(Str);
cmd.ExecuteNonQuery();
3.4 動態統計表單的設計
由于動態表單的設計基于B/S結構的,所以不提倡安裝插件的形式,而且其應用也會受到很大限制。.Net的頁面表單是通過標記聲明的,其中包含文本框、密碼框、隱藏域、多行文本框、復選框、單選框、下拉選擇等屬性標簽。系統在用戶對表統計指標進行輸入時,把用戶對該指標要求顯示的控件類型進行選擇,把用戶對每一個指標的詳細信息存入分類數據庫中,當用戶點擊創建表單時,系統根據用戶要求創建的表名信息,在數據庫中讀出每個指標的詳細信息,利用C#開發工具對指標信息進行分析,根據指標信息創建數構建表單創建語句。系統設計平臺主要采用 .net,設計語言使用C#,網頁腳本使用Script。當系統把統計指標信息讀取出來后,每一個統計指標的在數據庫中的字值作為該指標所對應控件的ID值和Name值的一部分。根據C#的語法特點構造表單創建字符串,最后采用C#的輸入語言以Script的形式在網頁上輸出該構造字符串,即是統計指標的表單控件。
以單行文本和下拉框(input和select)為例,找到相應的 .aspx文件并做一定的修改,系統創建的統計表單界面截圖如圖3所示。統計表部分代碼片段如下:
String Table_Name=ds.Tables[0].Rows[i].Table_Name;
For(int i=0; i< ds.Tables[0].Rows.Count;i++)
{
Label_name= ds.Tables[0].Rows[i]. Field_Name+”_label”;
Label_id= ds.Tables[0].Rows[i]. Field_Name+”_label”;
Label_title= ds.Tables[0].Rows[i].Chinese_Notes+”:”;
text_name= ds.Tables[0].Rows[i]. Field_Name+”_text”;
text_id= ds.Tables[0].Rows[i]. Field_Name+”_text”;
Response.Write(\"
if(ds.Tables[0].Rows[i]. Fields_Control_Type=1)
Response.Write(\"
else
if(ds.Tables[0].Rows[i]. Fields_Control_Type=2)
Response.Write(\"
}
3.5 動態統計表單數據元素的讀取及存儲
String[] Fields_Name=new String[i];
String[] Fields_Name_Value=new String[i];
For(int i=0; i< ds.Tables[0].Rows.Count;i++)
{
String text_fields_name= ds.Tables[0].Rows[i]. Field_Name+”_text”;
Fields_Name_Value[i]=Request.Form[text_fields_name].ToString();
Fields_Name[i]= ds.Tables[0].Rows[i]. Field_Name;
}
String str_fields_name= Fields_Name[0];
String str_fields_name_value= Fields_Name_Value[0];
For(int i=1; i< ds.Tables[0].Rows.Count;i++)
{
str_fields_name= str_fields_name+”,”+ Fields_Name[i];
str_fields_name_value= str_fields_name_value+”,”+ Fields_Name_Value[i];
}
String Sql_str=”Insert into “+Table_Name+”(”+ str_fields_name+”) Value(”+ str_fields_name_value+”)”;
SqlCommand cmd = New SqlCommand(Sql_str);
cmd.ExecuteNonQuery();
4 結 語
動態表單方式可以用于特定功能的統計系統配置。一般用于功能比較單一的統計系統,極大地方便了開發人員和維護人員的操作,大大降低了軟件開發者的工作強度。雖然此系統有以上諸多優點,但是它還有一些不足和待改進之處。與其他模塊有復雜的業務交叉的功能雖然也可以通過此系統實現配置。但是實際運行中將很難對數據庫進行優化,數據的交叉檢索難度較大,在運行中性能將很難令人滿意。此系統設計思想可以作為一個原型系統開發原理來研究,通過不斷的摸索與實踐,可以逐步管理更多關于數據庫的內容,比如建立索引、生成存儲過程和建立外鍵關聯等功能。不斷改進之后,最終可將這個系統定位成中小統計系統的生產系統。
主要參考文獻
[1] 任中方,張華,閆明松,等. MVC模式研究的綜述[J]. 計算機應用研究,2004,21(10):1-3.
[2] 寇毅,吳力文. 基于MVC設計模式的Struts框架的應用方法[J]. 計算機應用,2003,23(11):91-92.
[3] 程永敬. ASP數據訪問高級編程[M]. 董啟雄,譯. 北京:機械工業出版社,2001.
[4] 譚天舒,王俊柳,李偉,等. 實現對ASP程序訪問控制的幾種方法[J].計算機工程與科學,2002,24(6).
[5] 鄭源,王加陽. 基于ASP技術的Web數據庫遠程維護[J]. 計算機工程與應用,2002(11).
[6] 劉友生,陳一平,胡浪. 基于數據表的動態表單處理技術[J]. 計算機工程與應用,2004(34):199-211.
[7] [美]Andrew Troelsen. C#與.NET4高級程序設計[M]. 第5版. 朱曄,譯. 北京:人民郵電出版社,2011.
[8] 劉京華. Java Web 整合開發王者歸來[M]. 北京:清華大學出版社,2010.
[9] 鄭齊心,房大偉,劉云峰,等. ASP.NET項目開發案例全程實錄[M]. 第2版. 北京:清華大學出版社,2011.
[10] P A Zhilin. Dynamic Forms of Equilibrium of a Bar Com—pressed by a Dead Force[C] // Control of Oscillations and Chaos,1997.