對於數據庫類型的的項目,有很多的功能是重復的。
比如,采購系統中的是物料申請,到了加班系統中是加班申請。對用戶而言,區別很大。對於程序員而言,區別幾乎是零。只是換了個表或者換了一些字段,其余的基本都是面向數據庫表的CRUD的開發。
總結一下這些系統的共同點和我認為可以深入挖掘的地方
1 基本的數據輸入,修改和刪除。
例如,下面的數據輸入表格
這個功能是必備的,具備這樣的輸入功能的程序才可以稱作為系統。如果發現數據有問題,還可以修改。如果有錯誤,可以刪除錯誤的數據。也有的系統,只允許輸入,不允許刪除,即使刪除,通常也是把數據disable或hidden,沒有真正意義的文件系統中刪除。
2 報表查詢,導入導出
既然輸入了數據,可以隨時查詢到自己輸入過的數據。如果登陸系統不方便,還應該支持把系統中的數據導出。導出的數據方式要支持常見的格式:CSV,EXCEL,PDF等。如果在上系統之前是用EXCEL作為數據存儲方案,大量的用戶一時間無法接受和習慣系統的數據輸入方式,還應該支持把EXCEL的數據導入到系統中,引導用戶逐漸熟悉和接受系統。
3 高級功能
這個比較多,每個小功都要能體現軟件的簡單方便好用。以我的理解,還需要下面的幾個功能
拷貝:數據可以直接在系統中進行拷貝。選中一行數據,點擊Copy,就產生了一條新記錄,它的值和原來的數據一模一樣(需要適當改變一些字段的值,比如LastUpdateTime就不應該拷貝舊有的數據)。
有了這個功能,系統的數據輸入能力大大增強。原來一天只能輸入40張采購申請單的,現在可以把效率提高幾倍。有了這個功能後,EXCEL的優勢(COPY功能)就被比下去了,接受系統的人也逐漸增多。
有個小技巧,使用SQL查分析器,可以幫助我們快速寫這類的腳本。
比如,選中相應的表,點擊右鍵,選擇Script Object to New Windows As
它還有幾個子菜單,選擇子菜單Insert生成Insert語句,選擇子菜單Select生成SELECT語句,然後拼在一起,就寫好的數據的拷貝功能的SQL腳本,如下的腳本所示
INSERT INTO [Quotation].[dbo].[dtproperties]([id], [objectid], [property], [value],
[uvalue], [lvalue], [version])
SELECT [id], [objectid], [property], [value], [uvalue], [lvalue], [version]
FROM [Quotation].[dbo].[dtproperties] WHERE ID=1
版本:當面對大量的數據時,有很多數據是重復的。比如,一個報價系統,輸入一張報價單,經過老板批准後把價格報給客戶,客戶不滿意,需要重新報價。或者客戶認為你的報價過高,把原來打算給你做的訂單減少一部分,讓你重新根據新的訂單來報價;又比如采購系統,開發部申請購買10部電腦,每台電腦的報價是4000RMB,老板覺得報價過高,需要你重新報價。這時,你需要重新填寫采購申請單,一級一級的讓部門經理批准,讓財務經理審批,最後給老板審批。這樣,同時會產生兩筆同樣的數據,如果每次都需要重新輸入,用戶肯定會覺得你的系統不專業。他的想法就是,直接把原來的數據調出來,重新提交給上司審批。作為系統,你需要把兩次的數據關聯起來,前一次的版本是A,以後依此遞增。這樣,老板看到A版本的報價過高,在審批B版本的報價時,它會去參考A版本的報價。采購系統和報價系統對版本的要求比較高。對於采購系統,老板每次審批價格時,他都想看一下,以前買這個物料是花多少錢,現在又需要花多少。當然,價格肯定更便宜老板才行,你要是B版本的報價比A版本的報價還要貴,老板肯定拒絕購買。
報價系統也一樣,同一個part會反反復復報幾次價,直到客戶滿意為止。
數據轉換:數據可以在系統裡,經過一定的流程後,轉換為另一種類型的數據。比如,采購申請單經過老板批准後,可以直接轉換為采購定單;當生產部門領用倉庫的物料時,可以由采購訂單直接轉換為生產領料單;經過客戶確認的客戶的報價單,可以直接歸結到當月的生產成本中。通常對於這類的數據轉換,可以節省用戶很多寶貴時間。
自定義字段:通常一個窗體的數據輸入量是有限的,過長的輸入會加重用戶的工作量。有時候用戶不願意輸入數據,或者他認為他要輸入的數據字段你沒有提供,於是會要求以附件的形式輸入數據。剛逃脫了EXCEL的牽制,現在又要帶上一個EXCEL的附件,讓人覺得又回到了EXCEL的時代。這種需求也比較常見,比如采購系統,老板在審批物料采購申請前想要看看待購買的產品的圖片,而看圖片這個需求對於大部分物料采購申請而言是不需要的。
增加用戶上傳附件的功能,在附件中放上老板想看的圖片是一種解決辦法。
還有一種辦法就是這裡提到的,增加自定義字段。以滿足用戶的擴展字段的需求。
比如,大家默認的報價系統的貨幣單位是美金,現在有面向日本客戶的保價,只能用日元報價。為了區別,需要增加一個貨幣字段,標明報價時所用的貨幣。也可以運用自定義字段的方式實現這個功能。
做ASP.NET的朋友都知道aspnetdb這個數據,他支持在不改變表結構的情況下,擴展字段信息。
比如,我想加一個國籍字段,在不改變表結構的情況下實現這個功能,可以存儲用戶的國籍信息。
下面是aspnet_Profile表結構的SQL語句
CREATE TABLE [aspnet_Profile] (
[UserId] [uniqueidentifier] NOT NULL ,
[PropertyNames] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,
[PropertyValuesString] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,
[PropertyValuesBinary] [image] NOT NULL ,
[LastUpdatedDate] [datetime] NOT NULL ,
PRIMARY KEY CLUSTERED
(
[UserId]
) ON [PRIMARY] ,
FOREIGN KEY
(
[UserId]
) REFERENCES [aspnet_Users] (
[UserId]
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
如果您的機器中沒有這個數據,請打開Visual Studio 2008 Command Prompt,輸入aspnet_regsql,按照向導的步驟創建這個數據庫。
看上面的SQL腳本,PropertyNames是屬性名,PropertyValuesBinary是屬性值。這是個對應關系。如果屬性名中有一個字段是Country,那麼對應的PropertyValuesBinary會存儲它的值,程序中會將對象的值以進二進制序列化方式寫入到數據庫中。
這個技巧我以前用過,不過我是用xml格式,設計一個足夠長的字符串字段,把自定義的值以xml格式序列化的方式寫入。如果數據庫是SQL Server 2005,可以直接用xml作為字段類型。二進制的序列化的效率比xml方式要好,但不支持sql謂詞操作。
能力有限,做過的系統也有限,只想到了這麼多。歡迎大家補充。