嚴永慧
微軟的Office 軟件是世界范圍內用戶最多,使用頻率最高的軟件。 一般用戶對于Office 的理解都定位在文檔編輯,電子表格制作,數據處理方面。 其實,Office 的功能非常強大,特別是MS Access,以其簡易開發,方便部署,成為桌面應用的首選。 我們在這里將從標準程序開發的角度,來討論利用MS Office 解決特定的企業應用開發的問題。
本文將以通用汽車公司的一個實際案例來展現MS Office 開發的優勢,并在之后加入一些問題和討論。
區別于小型Access 應用的界面功能開發模式,我們將討論基于標準的軟件開發流程的MS Office 應用開發,以下將從需求,定義,開發,測試,發布幾個階段來逐步展開。
通用汽車在全球有其汽車備件的獨立售后部門, 獨立售后部門開發設計和經營全品牌全系列車型的備件。 其中,獨立售后部門的產品開發部,每年都會有大量的產品開發需求 (1500個 到 2000 個產品線每年),每條產品線的開發項目都要遵循通用汽車的售后產品開發流程(比較復雜冗長的流程),流程中很多步驟需要不同分工的員工參與,而產品開發部門只有20個員工,本身的人員結構非常精簡,如何讓這20個員工有效的掌握和跟蹤各個項目的情況,如何搭建一個公共的平臺以便員工交互和協同工作,如何構造準確的報告系統來反映各個項目的狀況,這些便是我們將要討論的應用軟件的開發背景。
在了解用戶業務需求的同時,我們也需要了解用戶的系統需求,以選擇合適的軟硬件架構來進行開發,或者判別當前的系統架構能否滿足用戶需求。
對于獨立售后部門產品開發部的項目管理軟件,主要的系統需求如下:
1) 系統使用者為產品開發部員工,用戶數為20人,用戶希望使用的界面為窗口UI,界面語言為英語,用戶期望的報告的格式為Excel 和 PPT。 雖然整個項目管理工作流程步驟較多,但基本屬于線性流程
2) 數據方面,每年有 1500-2000條主記錄,不需要使用記錄鎖,但需要記錄修改日志,記錄改動時間和操作者的用戶ID。
3) 用戶必須登錄才能使用系統,基于不同的用戶組,有只讀和修改記錄的權限差別。
4) 編輯或保存記錄時,系統響應時間需控制在1S以內,運行單張報告時,報告生成時間需要在15S以內,系統對數據的安全性要求高,業務數據邪路后對公司的影響很嚴重。基于開發和軟件使用預算,開發周期考慮,我們決定使用MS Access 2003進行開發,并在內網內運行,讓我們來做一個交叉分析看看是否可以滿足這些主要的系統需求。
1) 程序開放給通用員工,并在內網內運行,可以保證系統使用者僅為產品開發部員工,20個并發用戶也是Access 2003可以滿足的,利用Access的表單來做窗口UI,界面為英語。 利用 ADO 和 Excel對象及PowerPoint對象實現報告格式為Excel 和 PPT。
2) Access2003完全支持每年1500 – 2000 條主記錄的記錄量。 不使用記錄鎖簡便了編程復雜度,可以利用Access 的內建機制控制同時編輯同一條記錄的情況。可以利用VBA編寫代碼實現記錄修改日志功能。 數據備份可以通過Windows Bat進行定時數據庫級備份,恢復時需人工干預。
3) 利用 Access 的work group 概念實現用戶登錄,通過Security.mdw 控制用戶權限。
4) 數據庫建表需要滿足第一,第二和第三范式,保證對于萬條級以下數據訪問時系統響應時間在1S以內,運行報告,15S以內,另外超過 5年的記錄可以考慮歸檔。 Access 本身不具有高的數據安全性,只能通過公司防火墻和文件監控等措施實現數據安全。 另外為避免數據泄露后對公司的影響,程序僅局限在內網運行,公司內部可以通過培訓和保密協議方式防止數據外泄。
根據上述交叉分析的結果,MS Access 是一個合適的實現該項目管理軟件的開發平臺。
用戶需要有一個統一界面包含項目的主要信息,每個Gate和Sub Gate都需要有3個時間參數,Budget Date,規劃時間;Forecast Date ,預測時間;Close Date,Gate 結束時間。
界面需求可以和用戶通過圖表,草稿,白板等方式確定。
用戶期望各種類型的報告以便分析項目的進展狀況以及對售后產品部的全部項目情況有一個了解,通過和用戶溝通,使用圖表,草稿和白板等工具確定報告格式。
本系統基于快速軟件開發和敏捷方法,所以會把主要需求了解后逐步完善其他需求。
定義階段包括需求的文檔化和系統建模。
和標準的軟件開發流程不同,我們的需求文檔化的主要目標是為開發者理清思路,為后續開發和維護者提供文檔參考,所以需求文檔可以精簡并著重于開發人員的理解,所以也不需要用戶簽署和確認需求文檔。 (如果是作為供應商或者是第三方進行開發,還是需要用戶確認需求文檔)
架構建模主要基于系統需求分析。 參考上述的4條系統需求。 架構建模方案如下:
1) 系統運行于局域網,采用 Client Server 結構,對于Access ,即每個用戶使用系統時都可以得到一個客戶端副本。數據庫/ 服務器端放在共享文件夾上。
2) 客戶端和數據庫的采用table link方式連接。
3) 定制 Access Form 作為用戶界面, 使用 VBA 調用Excel Object 和Powerpoint Object 運行報表。
4) 使用Access Workgroup,用戶需登錄才能訪問文件,對于授權用戶,權限分 Data User (Read and Writer) 和Read Only 兩種,用戶初始用戶名同通用汽車的GMID(Unique ID for each user)。
5) 考慮到系統升級能力 (Access 數據庫升級到 SQL Server),所以使用到的Sql 查詢均使用標準Sql 查詢語句。
6) 使用ADO (Advanced Data Object) 對象,所有數據庫對象和VBA對象對用戶隱藏,讓用戶感覺為標準應用程序。
這里講述一些Access 開發經驗,為了保證開發者的開發測試環境不影響用戶的使用,所以通過Windows腳本和文本配置文件實現開發和部署的操作。
創建一個Windows Bat 腳本
腳本范例如下:

使用這種方式可以模擬達到系統發布的效果,開發者只需在服務器上更新最新版客戶端程序,用戶在需要打開客戶端時會自動下載最新更新的程序,省去了每次把更新的客戶端發給每個用戶的麻煩。
基于產品開發流程和界面需求進行數據庫設計,設計主要考慮幾方面,項目主數據:唯一性,一個項目有1條主數據。 時間數據:每個時間節點有3個時間參數,Budget Date, Forecast Date, Closed Date,每個項目有若干時間節點,項目成本/盈利計算。
快速開發的數據庫設計文檔和需求文檔化一樣,要求文檔簡單明了。 這里采用Excel 表作為數據庫設計文檔,文檔中表述了數據類型,字段名,字段長度,主鍵/外鍵,數據范例,備注。
基于產品開發流程和界面需求進行數據庫設計,設計主要考慮幾方面,項目主數據:唯一性,一個項目有1條主數據。 時間數據:每個時間節點有3個時間參數,Budget Date, Forecast Date, Closed Date,每個項目有若干時間節點,項目成本/盈利計算。
快速開發的數據庫設計文檔和需求文檔化一樣,要求文檔簡單明了。 這里采用Excel 表作為數據庫設計文檔,文檔中表述了數據類型,字段名,字段長度,主鍵/外鍵,數據范例,備注。
參照數據庫建模文檔在Access 數據庫中創建表結構。
參照用戶需求文檔及相關資料(草稿,白板畫等),進行界面設計,Access 的窗體設計和VB 的窗體設計類似,包含基本應用程序所用到的控件,考慮到程序移植性和安裝部署的簡單化,不建議加入外部控件。
在某些用戶窗體交互過程或者報告創建過程中,需要發生數據庫查詢存取動作,如架構建模中提到,本應用程序中所有數據庫查詢存取操作均使用 ADO和標準 Sql 語句實現,方便以后的數據庫升級。 由于是Client / Server 結構,查詢過程可以使用Access 自帶的的Query功能實現,以簡化代碼量。
需要注意的是建議將所有的Sql語句放在Access Module中統一定義,方便以后維護,如圖1所示:

圖1 Query 設計窗口
ADO引用,如圖2所示:

圖2 ADO引用窗口
過程中引用:

由架構建模所描述,本應用程序使用 Excel 和PowerPoint作為報告工具,好處是報告易于用戶接受,靈活度高,格式控制方便,缺點是開發復雜度高于一般報告工具,經常需要大量代碼代入。 比較好的經驗是從用戶處取得報告模板,比如手工制成的某個月度報告等,在此基礎上稍加改動完成報告。
報告運行腳本示例:

應用程序是否和其他程序有接口,是否需要定時導出某些特定格式的文本。 在售后產品中心的案例中,有一個每天自動通過Lotus Notes 發出當日Forecast Date Change eport 的需求。
具體實現通過在安裝有 Lotus Notes客戶端的電腦上設置Windows計劃任務,調用Access 里設置好的Marco,該Marco調用一段VBA,完成報告文件生成和發送的動作。
同樣的方法,我們還可以應用于Ftp, SFtp或其他特定的接口環境。
Windows 腳本內容:

其中/x McrAutoMail 是調用 Access 中名為McrAutoMail的宏的語句
McrAutoMail調用 FcstDateChangeCheck() 過程和GenerateEMails() 過程,其中GenerateEMails() 過程還調用NotesMailNewDraft(xx,yy,zz) 函數,可以傳入郵件接收人,郵件主題,抄送人,暗送人,主文本,附件等信息。 這些信息的來源可以是文檔或者是一張Access Table,是郵件發送控制更加靈活和簡單。
VBA調用Notes對象發送郵件的代碼部分略。
我們需要將用戶會接觸到的表單,報告命令,宏等,通過Access 的Switch Board功能組織起來。 并通過Access的一些設置對一些 Access 基本對象如表,查詢,Module等進行保護。
Access 基本對象保護:
將對象設為隱藏,設置該 Access 文件的起始表單為SwitchBoard (如果設置過SwitchBoard該項會自動設置),并在Access程序設置里禁用完整菜單,禁用默認快捷菜單
在功能菜單化和基本Access 對象保護后,用戶打開應用程序就感覺不到是一個Access 的數據庫,而是一個實實在在的應用程序。
在敏捷方法中,每完成一個模塊,開發者都可以通過自測和用戶測試得到該模塊的測試報告,通過持續的再分解來改善代碼質量并使用不與其系統將來的變更的簡單設計,來支持簡單的維護。
界面的設計,報告等,都可以隨時和用戶交互來改變設計方案和方向。
最終得到用戶需要的應用。 需要提出的是在該Access應用設計當中,每個模塊,每個過程或者函數,都需要加入錯誤控制代碼,在出錯時可以反饋出具體位置和錯誤類型。
如:

發布在程序安裝系統需求設計后就會變得簡單很多,開發者只要把自動下載并打開英語的 Windows Bat 文件發給本地用戶,并提醒用戶首次登陸后需要更改用戶密碼即可。之后的版本發布開發人員只需在共享文件夾上更新客戶端程序即可。
本項目管理軟件在通用汽車公司的售后產品部得到了充分的應用,從08年使用至今,經過10次左右新功能發布后趨于完善。
如何讓該軟件能夠適用范圍更廣,以便用于普通的項目管理。 我們可以考慮加入一個數據庫初始化的功能,讓用戶定義自己的項目管理流程,每個節點的名稱,通過用戶的配置生成配置文件,并基于配置文件初始化數據庫的表和一些表單的Sql語句等。
架構和配置方面,由于是Access 客戶端,所以Client/ Server 結構是不可改變的,程序中有訪問到C:Temp 這個文件夾。 可以考慮在 Access 的VBA 里加入讀取Windows注冊表信息功能,找出Office 的安裝路徑,并在C盤沒有Temp文件夾的情況下創建Temp文件夾,在程序退出后刪除此文件夾。
本文可以作為利用快速軟件開發及敏捷方法,設計一款基于特定需求的軟件的參考文件。其中靈活運用了Windows 批處理文件,計劃任務和MS Office 的強大功能,達成以低成本, 快速開發,便于維護為目的并有升級空間的應用開發。同時也給出了MS Office 適合應用的業務場景和一些開發技巧。
[1]劉少英.國外經典教材?計算機科學與技術?軟件開發的形式化工程方法:結構化+面向對象+形式化,[M]清華大學出版社,2008.
[2]科克伯恩.小團隊的敏捷開發方法,[M]清華大學出版社.2006.
[3]巴爾特.Access 2007開發指南,[M]人民郵電出版社.2008.
[4]戴維斯.VBA從入門到精通(第2版),[M]電子工業出版社.2008.
[5]Excel VBA Tutorial Part 8 - Excel Objects [K/OL].http://www.excelfunctions.net/Excel-Objects.html.