俞佳曦
(永州職業(yè)技術(shù)學(xué)院 網(wǎng)絡(luò)信息中心,湖南 永州 425100)
.NET平臺(tái)下借記系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
俞佳曦
(永州職業(yè)技術(shù)學(xué)院 網(wǎng)絡(luò)信息中心,湖南 永州 425100)
隨著中國(guó)加入WTO后,高效的業(yè)務(wù)管理對(duì)于企業(yè)尤為重要,基于.NET 平臺(tái)下開(kāi)發(fā)的借記系統(tǒng),可以極大提高企業(yè)的工作效率,節(jié)約經(jīng)營(yíng)成本。
.NET;進(jìn)銷(xiāo)存管理系統(tǒng);借記系統(tǒng)
進(jìn)銷(xiāo)存管理系統(tǒng)的出現(xiàn)對(duì)于現(xiàn)代企業(yè)的作用,猶如雪中送炭一般,開(kāi)銷(xiāo)不大,卻大大改善了企業(yè)的運(yùn)作效率。采用進(jìn)銷(xiāo)存管理系統(tǒng)減少了會(huì)計(jì)與業(yè)務(wù)人員的人工投入、降低對(duì)工作人員的要求、加快會(huì)計(jì)工作的速度,并及時(shí)、準(zhǔn)確地提供更多、更全面的管理信息,為企業(yè)在有限資源環(huán)境下進(jìn)一步提高它們的市場(chǎng)競(jìng)爭(zhēng)能力。本文主要介紹了在.NET平臺(tái)下,應(yīng)用C#和SQL Server2000,并運(yùn)用DATAGRID控件、表和視圖進(jìn)行編程,設(shè)計(jì)并實(shí)現(xiàn)進(jìn)銷(xiāo)存管理系統(tǒng)中借記系統(tǒng)的功能。
本項(xiàng)目參與了某公司借記系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)工作。該公司的銷(xiāo)售、營(yíng)銷(xiāo)、客戶(hù)服務(wù)和支持之間等業(yè)務(wù)是分開(kāi)進(jìn)行的,這些前臺(tái)的業(yè)務(wù)領(lǐng)域與后臺(tái)部門(mén)也是分開(kāi)進(jìn)行的,這使得公司各環(huán)節(jié)很難以合作的姿態(tài)對(duì)待客戶(hù),工作效率低下,面對(duì)的客戶(hù)的多元化,業(yè)務(wù)員要處理的業(yè)務(wù)也比較繁雜,常常會(huì)出現(xiàn)員工將大部分精力花費(fèi)在一大堆數(shù)據(jù)表格中。本系統(tǒng)的設(shè)計(jì)應(yīng)用就是為了將員工從數(shù)據(jù)表格中解放出來(lái),讓他們擁有更多的時(shí)間開(kāi)展更先進(jìn)的業(yè)務(wù)方式,為公司發(fā)展?jié)撛诖罂蛻?hù)、留住老客戶(hù)提供一個(gè)信息處理與分析平臺(tái),使公司能準(zhǔn)確地掌握市場(chǎng)動(dòng)態(tài),進(jìn)一步提高公司的市場(chǎng)競(jìng)爭(zhēng)能力。
所有程序均在 Microsoft Windows2000 環(huán)境下進(jìn)行開(kāi)發(fā),運(yùn)行環(huán)境需要 IIS4.0以上,數(shù)據(jù)庫(kù)系統(tǒng)使用的是Microsoft SQL Server2000。開(kāi)發(fā)工具包括:Visual Studio.NET2003,SQL Server2000,Rational Rose2000 Enterprise Edition,Microsoft Visio。開(kāi)發(fā)語(yǔ)言是C#。
首先對(duì)進(jìn)銷(xiāo)存管理系統(tǒng)的流程和結(jié)構(gòu)進(jìn)行分析,并設(shè)計(jì)出七種單據(jù):采購(gòu)入庫(kù)單、銷(xiāo)售出庫(kù)單、借記單、沖借用單、調(diào)撥入庫(kù)單、調(diào)撥出庫(kù)單、領(lǐng)料單。進(jìn)銷(xiāo)存系統(tǒng)分為采購(gòu)(進(jìn)貨)、銷(xiāo)售(出庫(kù))、庫(kù)存管理三部分。采購(gòu)商品入庫(kù)對(duì)應(yīng)有入庫(kù)單輸入各種資料,銷(xiāo)售對(duì)應(yīng)有出庫(kù)單記錄銷(xiāo)售情況,庫(kù)存有借記單反映情況,借記系統(tǒng)屬于代銷(xiāo)借記部分,與借記單密切相關(guān),以此對(duì)借記系統(tǒng)的查詢(xún)和統(tǒng)計(jì)模塊做一個(gè)大概的設(shè)計(jì),將它們分為兩個(gè)Windows窗體,便于以后和其它模塊進(jìn)行整合。
2.1 借記系統(tǒng)的查詢(xún)模塊
查詢(xún)模塊的主窗體如圖1所示。

圖1 借記單查詢(xún)模塊的主界面
該模塊分為四個(gè)小模塊,分別是借記單查詢(xún)類(lèi)型模塊、借記單查詢(xún)條件模塊、客戶(hù)簡(jiǎn)稱(chēng)模糊查詢(xún)模塊、表單模塊。
借記單查詢(xún)類(lèi)型模塊又分為單項(xiàng)查詢(xún)和多項(xiàng)查詢(xún)兩項(xiàng),其中單項(xiàng)查詢(xún)是通過(guò)借記單號(hào)來(lái)查詢(xún)。按照文本提示在單項(xiàng)查詢(xún)的文本框中輸入借記單號(hào),按下文本框右邊有望遠(yuǎn)鏡符號(hào)的按鈕,則右邊的借記單列表框中顯示出查找出來(lái)的對(duì)應(yīng)借記單信息。點(diǎn)擊借記單列表框中的借記單編號(hào),下面的借記單商品列表框中就會(huì)顯示出該張借記單所包含的商品信息。點(diǎn)擊其中的商品型號(hào),其備注信息將顯示列表框下邊的物資商品備注框中。會(huì)將該商品備注顯示出來(lái)。
多項(xiàng)查詢(xún)是通過(guò)商品大類(lèi)和品牌或商品大類(lèi)和型號(hào)的組合來(lái)進(jìn)行查詢(xún)。多項(xiàng)查詢(xún)的選擇方式如圖2所示,要特別說(shuō)明的是單項(xiàng)查詢(xún)和多項(xiàng)查詢(xún)還有兩個(gè)前提約束,就是日期范圍和客戶(hù)選擇。

圖2 多項(xiàng)查詢(xún)的選擇方式
借記單查詢(xún)條件模塊提供了客戶(hù)、日期范圍、商品大類(lèi)、品牌、型號(hào)、借記單號(hào)共六個(gè)查詢(xún)條件。根據(jù)這些條件可以查詢(xún)某時(shí)間內(nèi)的所有借記單,某時(shí)間內(nèi)和某家客戶(hù)交易的借記單,做了某樣商品生意的借記單,做了某品牌生意的借記單,以及做了某品牌里某種商品的借記單。選擇日期范圍,點(diǎn)中后會(huì)彈出一個(gè)時(shí)間選擇框;選擇型號(hào)時(shí),會(huì)彈出商品分類(lèi)窗口,方便使用者的選擇,如圖3所示。

圖3 商品分類(lèi)窗口
商品的大、中、小類(lèi)和品牌還可以從下拉框中選擇,如圖4所示。

圖4 商品分類(lèi)下拉框
這里的查詢(xún)條件也都可以通過(guò)直接輸入的方式來(lái)查詢(xún)。
由于客戶(hù)的數(shù)量很大,使用者很難迅速找到指定的客戶(hù),為了解決這個(gè)問(wèn)題,設(shè)計(jì)一個(gè)客戶(hù)簡(jiǎn)稱(chēng)模糊查詢(xún)模塊。使用者按照提示在客戶(hù)列表框下的客戶(hù)簡(jiǎn)稱(chēng)文本框中輸入客戶(hù)的大概信息,比如說(shuō)我要找某公司的維修服務(wù)中心,我只需要鍵入該公司的名稱(chēng),然后按下按鈕就能輕松地找到了,如圖5所示。

圖5 客戶(hù)簡(jiǎn)稱(chēng)模糊查詢(xún)
表單模塊總共有六章表單,他們是客戶(hù)列表框,物資商品備注框,借記單列表框,借記單列表(商品)框,借記單列表(品牌)框,借記單商品列表框。
借記單列表框、借記單列表(商品)框、借記單列表(品牌)框,顯示的是查詢(xún)出的每張借記單的基本信息;借記單商品列表框,顯示的是某一張借記單所包含的商品信息;物資商品備注框顯示的是物資商品的備注信息。
借記系統(tǒng)的統(tǒng)計(jì)模塊
統(tǒng)計(jì)模塊的主窗體如圖6所示。

圖6 借記單統(tǒng)計(jì)模塊的主界面
該模塊也將分為四個(gè)小模塊,分別是借記單統(tǒng)計(jì)方法模塊、借記單統(tǒng)計(jì)條件模塊、客戶(hù)簡(jiǎn)稱(chēng)模糊查詢(xún)模塊、表單模塊。
借記單統(tǒng)計(jì)方法模塊中,統(tǒng)計(jì)方法的選擇方式及流程如圖7所示。

圖7 統(tǒng)計(jì)方法的選擇方式
圖 7中第四個(gè)統(tǒng)計(jì)方法框中的商品小類(lèi)和品牌的CheckBox選中后,它們各自的下來(lái)框就被激活。同樣,這里的查詢(xún)條件也都可以通過(guò)直接輸入的方式來(lái)查詢(xún)。
借記單統(tǒng)計(jì)條件模塊提供了客戶(hù)、日期范圍、商品大、中、小類(lèi)、品牌、型號(hào)共七個(gè)查詢(xún)條件。根據(jù)這些條件我們可以得到18種統(tǒng)計(jì)方式:按照時(shí)間段統(tǒng)計(jì);按照時(shí)間、客戶(hù)統(tǒng)計(jì);按照時(shí)間、客戶(hù)、商品大類(lèi)統(tǒng)計(jì);按照時(shí)間、客戶(hù)、商品中類(lèi)統(tǒng)計(jì);按照時(shí)間、客戶(hù)、商品小類(lèi)統(tǒng)計(jì);按照時(shí)間、客戶(hù)、品牌統(tǒng)計(jì);按照時(shí)間、供應(yīng)商、商品型號(hào)統(tǒng)計(jì);按照時(shí)間、商品大類(lèi)統(tǒng)計(jì);按照時(shí)間、商品中類(lèi)統(tǒng)計(jì);按照時(shí)間、商品小類(lèi)統(tǒng)計(jì);按照時(shí)間、品牌統(tǒng)計(jì);按照時(shí)間、商品型號(hào)統(tǒng)計(jì);按照時(shí)間、品牌、商品大類(lèi)統(tǒng)計(jì);按照時(shí)間、品牌、商品中類(lèi)統(tǒng)計(jì);按照時(shí)間、品牌、商品小類(lèi)統(tǒng)計(jì);按照時(shí)間、供應(yīng)商、品牌、商品大類(lèi)統(tǒng)計(jì);按照時(shí)間、供應(yīng)商、品牌、商品中類(lèi)統(tǒng)計(jì);按照時(shí)間、客戶(hù)、品牌、商品小類(lèi)統(tǒng)計(jì)。
表單模塊共有六章表單,他們是客戶(hù)列表框,借記單商品列表框,借記單統(tǒng)計(jì)列表(商品大類(lèi))框,借記單統(tǒng)計(jì)列表(商品中類(lèi))框,借記單統(tǒng)計(jì)列表(商品小類(lèi))框,借記單統(tǒng)計(jì)列表(商品型號(hào))框。
借記單商品列表框,顯示的是某一張借記單所包含的商品信息;借記單統(tǒng)計(jì)列表(商品大類(lèi))框、借記單統(tǒng)計(jì)列表(商品中類(lèi))框、借記單統(tǒng)計(jì)列表(商品小類(lèi))框,顯示的是按照商品統(tǒng)計(jì)的結(jié)果;借記單統(tǒng)計(jì)列表(商品型號(hào))框,顯示的是按商品型號(hào)統(tǒng)計(jì)的結(jié)果,統(tǒng)計(jì)出該型號(hào)商品的最低、最高供價(jià),總金額,平均供價(jià)。
在借記系統(tǒng)的兩大模塊的實(shí)現(xiàn)過(guò)程中,關(guān)鍵是對(duì)數(shù)據(jù)庫(kù)的操作,包括運(yùn)用SQL2000建表和視圖,編寫(xiě)SQL語(yǔ)句,在Windows窗體中創(chuàng)建Datagrid控件,通過(guò)Datagrid來(lái)把數(shù)據(jù)庫(kù)和程序聯(lián)系起來(lái)。
ADO.NET DataSet 是數(shù)據(jù)的一種內(nèi)存駐留表示形式,無(wú)論它包含的數(shù)據(jù)來(lái)自什么數(shù)據(jù)源,它都會(huì)提供一致的關(guān)系編程模型。一個(gè) DataSet 表示整個(gè)數(shù)據(jù)集,其中包含對(duì)數(shù)據(jù)進(jìn)行包含、排序和約束的表以及表間的關(guān)系。由于DataSet 獨(dú)立于數(shù)據(jù)源,DataSet 可以包含應(yīng)用程序本地的數(shù)據(jù),也可以包含來(lái)自多個(gè)數(shù)據(jù)源的數(shù)據(jù)。與現(xiàn)有數(shù)據(jù)源的交互通過(guò) DataAdapter 來(lái)控制。
使用 DataSet 的方法有若干種,這些方法可以單獨(dú)應(yīng)用,也可以結(jié)合應(yīng)用:
(1)在 DataSet 中以編程方式創(chuàng)建 DataTables、DataRelations 和 Constraints 并使用數(shù)據(jù)填充這些表。
(2)通過(guò) DataAdapter 用現(xiàn)有關(guān)系數(shù)據(jù)源中的數(shù)據(jù)表填充 DataSet。
(3)使用 XML 加載和保持 DataSet 內(nèi)容。
本文中使用最多的是第二種方法。
隨 .NET 框架提供的每個(gè) .NET 數(shù)據(jù)提供程序都包含一個(gè) DataAdapter 對(duì)象:OLE DB .NET 數(shù)據(jù)提供程序包含一個(gè) OleDbDataAdapter 對(duì)象,而 SQL Server .NET 數(shù)據(jù)提供程序包含一個(gè) SqlDataAdapter 對(duì)象。DataAdapter 對(duì)象用于從數(shù)據(jù)源中檢索數(shù)據(jù)并填充 DataSet 中的表。DataAdapter 還會(huì)將對(duì) DataSet 作出的更改解析回?cái)?shù)據(jù)源。DataAdapter 使用 .NET 數(shù)據(jù)提供程序的 Connection 來(lái)連接到數(shù)據(jù)源,使用 Command 對(duì)象從數(shù)據(jù)源中檢索數(shù)據(jù)并將更改解析回?cái)?shù)據(jù)源。
DataAdapter的 SelectCommand 屬性是一個(gè) Command對(duì)象,它從數(shù)據(jù)源中檢索數(shù)據(jù)。DataAdapter 的 Insert Command、UpdateCommand 和 DeleteCommand 屬性也是Command 對(duì)象,它們按照對(duì) DataSet 中數(shù)據(jù)的修改來(lái)管理對(duì)數(shù)據(jù)源中數(shù)據(jù)的更新。
DataAdapter 的 Fill 方法用于使用 DataAdapter 的SelectCommand 的結(jié)果來(lái)填充 DataSet。Fill 將要填充的DataSet 和 DataTable 對(duì)象(或要使用從 SelectCommand中返回的行來(lái)填充的 DataTable 的名稱(chēng))用作它的參數(shù)。
Fill 方法使用 DataReader 對(duì)象來(lái)隱式地返回用于在DataSet 中創(chuàng)建表的列名稱(chēng)和類(lèi)型以及用來(lái)填充 DataSet中的表行的數(shù)據(jù)。表和列僅在不存在時(shí)才創(chuàng)建;否則,F(xiàn)ill 將使用現(xiàn)有的 DataSet 架構(gòu)。除非數(shù)據(jù)源中存在主鍵并且DataAdapter.MissingSchemaAction 設(shè)置為 MissingSchema Action.AddWithKey,否則不會(huì)創(chuàng)建主鍵。如果 Fill 發(fā)現(xiàn)存在用于某表的主鍵,那么對(duì)于其中的主鍵列值與從數(shù)據(jù)源中返回的行的主鍵值相匹配的行,它將使用數(shù)據(jù)源中的數(shù)據(jù)改寫(xiě) DataSet 中的數(shù)據(jù)。如果未找到任何主鍵,則數(shù)據(jù)將追加到 DataSet 中的表。當(dāng)填充 DataSet 時(shí),F(xiàn)ill 會(huì)使用任何可能存在的 TableMappings。
在選擇商品型號(hào)時(shí),因?yàn)槭菑牧硪粋€(gè)窗口中去取數(shù)據(jù),所以要能把參數(shù)從一個(gè)窗口傳遞到另一個(gè),方法有幾種,本文采用的是設(shè)立公共變量的方法,它比較簡(jiǎn)單。
首先在商品分類(lèi)的窗體代碼中聲明一個(gè)公共變量:
public string Ware_ModelName
創(chuàng)建一個(gè)函數(shù)來(lái)發(fā)送消息:

然后在主窗口代碼中新建商品分類(lèi)窗體的對(duì)象:

注意這里的Form_Sort(TextBox_Ware),它把TextBox _Ware作為一個(gè)參數(shù)傳到了商品分類(lèi)窗體中,上面的df1就是TextBox_Ware在商品分類(lèi)窗體中的替身。如此以來(lái),我們就輕松完成了兩個(gè)窗體的參數(shù)傳遞。
在調(diào)試程序的過(guò)程中發(fā)現(xiàn),在一天之內(nèi)完成的進(jìn)銷(xiāo)存,借記系統(tǒng)的查詢(xún)和統(tǒng)計(jì)模塊都沒(méi)有涉及到,后來(lái)研究發(fā)現(xiàn)程序的開(kāi)始時(shí)間和結(jié)束時(shí)間沒(méi)有具體到某時(shí)某刻。于是對(duì)時(shí)間函數(shù)做了以下修改,變?yōu)椋?/p>
this.beginDateTimePicker.Value=DateTime.Today.AddM onths(-1);//設(shè)置開(kāi)始時(shí)間
this.endDateTimePicker.Value=DateTime.Today.AddHou rs(23);//設(shè)置結(jié)束時(shí)間
把某一天的時(shí)間差設(shè)置在23小時(shí)。這樣就能夠?qū)σ惶靸?nèi)發(fā)生的進(jìn)銷(xiāo)存數(shù)據(jù)進(jìn)行查詢(xún)和統(tǒng)計(jì)了。
在程序調(diào)試中有一個(gè)問(wèn)題是由于數(shù)據(jù)庫(kù)的連接造成的,因?yàn)樵诔绦虍?dāng)中有一個(gè) oleDbConnection,它指示了當(dāng)前的服務(wù)器連接。由于做好的軟件將會(huì)被安裝在不同的機(jī)器上,而服務(wù)器的連接只能在源程序中改,對(duì)于用戶(hù)而言是不可能的,暫時(shí)還沒(méi)有找到一個(gè)能自動(dòng)改連接字符串的更好方法來(lái)替代,所以就采取從外部文件中讀取連接字符串的方法,在制作源程序的安裝文件時(shí),將這個(gè)外部文件添加到Setup文件包中。這樣用戶(hù)在安裝好軟件后,只需修改安裝目錄下的這個(gè)文件中的對(duì)應(yīng)連接字符串就可以完成正確連接了。這個(gè)方法的函數(shù)如下:

利用.NET平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)的借記系統(tǒng),具有穩(wěn)定、兼容性好等優(yōu)點(diǎn),該系統(tǒng)使公司員工從繁雜的數(shù)據(jù)表格中解放出來(lái),極大提升了公司運(yùn)作效率,從而為客戶(hù)提供更優(yōu)質(zhì)、優(yōu)先、優(yōu)惠得服務(wù),進(jìn)一步提高了公司的市場(chǎng)競(jìng)爭(zhēng)能力。
[1]張志學(xué)..NET框架開(kāi)發(fā)人員參考手冊(cè) 數(shù)據(jù)庫(kù)分冊(cè)[M].北京:清華大學(xué)出版社,2001.
[2]吉尙戎..NET框架程序員參考手冊(cè) 用戶(hù)界面篇[M].北京:國(guó)防工業(yè)出版社,2002.
[3]Jeff Ferguson.C#寶典[M].北京:電子工業(yè)出版社,2002.
[4]Gayle Coffman.SQL Serve 7 參考手冊(cè)[M].北京:北京希望電子產(chǎn)品出版社,1999.
[5]Patrick O’Neil.數(shù)據(jù)庫(kù)原理、編程與性能(原書(shū)第2版)[M].北京:機(jī)械工業(yè)出版社,2007.
(責(zé)任編校:何俊華)
TP393
A
1673-2219(2010)12-0080-04
2010-09-26
俞佳曦(1980-),男,浙江海寧人,助教,現(xiàn)工作于永州職業(yè)技術(shù)學(xué)院網(wǎng)絡(luò)信息中心。