Delphi擅長做數(shù)據(jù)庫系統(tǒng)的開發(fā),其功能強大,開發(fā)快速。但現(xiàn)在大多數(shù)的數(shù)據(jù)庫系統(tǒng)80%的工作都是簡單的增刪改的工作,用數(shù)據(jù)庫系統(tǒng)來實現(xiàn)增刪改,存在錄入不方便,錄入內(nèi)容簡單等問題,尤其對于處理大量的文本和圖片的數(shù)據(jù)庫系統(tǒng)來說更是非常不便。報表輸出還需要利用Delphi中各個版本提供的報表工具或第三方打印控件進行開發(fā)。雖然Delphi中提供的報表工具功能逐漸強大,使用愈加方便,但是如果想充分利用該報表工具開發(fā)強大實用的報表,仍得花費一定的精力去學(xué)習(xí)該報表組件的各個功能。例如Delphi6中提供的Qreport報表工具,對于制作復(fù)雜報表非常麻煩,也許BorLand也注意到了這個問題,所以到了Delphi7時,換成了Rave報表工具,該工具相比Qreport更易于使用,但如果要做出復(fù)雜的報表,仍需對它詳細研究。
在做文字處理的時候,中國的大多數(shù)用戶還是習(xí)慣于使用Office,而Office中最常用的莫過于Word。因此大多數(shù)用戶對于Word的操作應(yīng)該說非常熟悉,而Word在數(shù)據(jù)錄入方面功能之強大確實是無與倫比,在Word中無論簡單的文本、表格還是圖片等都能很輕松的錄入,利用Word本身的打印功能還可以將其作為報表輸出的工具。
Delphi+Word的數(shù)據(jù)庫系統(tǒng)設(shè)計思路
結(jié)合Delphi和Word本身的特點,數(shù)據(jù)庫系統(tǒng)可以采用這樣的設(shè)計思路:以Word作為數(shù)據(jù)錄入界面,錄入完畢后,數(shù)據(jù)庫系統(tǒng)自動從Word中提取數(shù)據(jù),并將提取的各要素存儲于數(shù)據(jù)表中,以便利用數(shù)據(jù)庫系統(tǒng)的強大的數(shù)據(jù)處理功能對數(shù)據(jù)表內(nèi)容進行維護、檢索、統(tǒng)計等,并將Word作為報表輸出的工具。
Delphi中從Delphi5開始恰恰提供了與Word的接口—TwordApplication,利用該接口可以實現(xiàn)Word的打開、關(guān)閉、保存以及對文檔內(nèi)容作相應(yīng)的處理。采用以上的系統(tǒng)設(shè)計思想以及Delphi提供的與Word的數(shù)據(jù)接口,筆者開發(fā)了一套成果管理系統(tǒng)。該成果管理系統(tǒng)主要內(nèi)容是管理最終成果文檔的內(nèi)容,包括詳細內(nèi)容、文字圖片、成果的儲備情況、經(jīng)費情況、獲獎情況等,為了便于統(tǒng)計分析及保證成果內(nèi)容的一致性,系統(tǒng)將各要素統(tǒng)一存放于數(shù)據(jù)表相應(yīng)的字段中。下面詳細闡述系統(tǒng)的設(shè)計思路,參見圖1。
圖1 系統(tǒng)設(shè)計思路流程圖
首先篩選必要的成果要素利用Word作一個錄入模板。Word模板較常見的有兩種做法:一種是在Word文檔相應(yīng)的位置插入書簽;另一種是在Word文檔的相應(yīng)位置插入特殊符號。插入書簽的具體做法是:選中要插入書簽的區(qū)域,在Word的插入菜單中選擇書簽,填寫書簽名稱,點擊添加即可。在Word文檔中插入特殊符號的思路是:將需要提取的內(nèi)容用特殊字符包起來,系統(tǒng)利用特殊字符識別要導(dǎo)入的內(nèi)容,例如#中國#,表示中國是要提取的內(nèi)容。但是利用以上兩種模板制作方法都有缺陷,尤其是將模板既作為輸出界面,也將其作為錄入界面時。首先對于利用書簽的模板方法,用戶在實際錄入數(shù)據(jù)的過程中,很容易將書簽誤刪除。插入特殊符號的方法無疑增加了用戶錄入時的負擔,且界面也不美觀,沒有保持文檔原貌。但這兩種方法的基本思路都一樣,即創(chuàng)造要提取要素的特征符號。
借鑒以上兩種模板設(shè)計方法的成功經(jīng)驗,筆者提出的模版設(shè)計思路是:成果的所有要素分門別類存儲在Word文檔的不同表格中,采用Word表格的具體要素—單元格作為文檔內(nèi)容的識別依據(jù),系統(tǒng)根據(jù)Word表格中單元格的索引進行提取。但是這種設(shè)計思路必須能處理兩種情況:一種是每個Word表格對應(yīng)數(shù)據(jù)表中的一條記錄即單元格數(shù)固定的情況;另一種是一個Word表格對應(yīng)數(shù)據(jù)表中多行記錄即單元格數(shù)可變的情況?,F(xiàn)筆者開發(fā)的系統(tǒng)已完全能自如處理這兩種情況。
其次是成果文檔的導(dǎo)入。導(dǎo)入時,一般存在兩種情況:一是導(dǎo)入單個成果文檔,二是同時導(dǎo)入多個成果文檔即文件夾的方式。成果文檔的導(dǎo)入實際上是Word文檔內(nèi)容的提取問題,提取的關(guān)鍵是成果文檔中圖片的提取以及成果詳細內(nèi)容的提取,在該系統(tǒng)中圖片格式只能為BMP格式。對于成果詳細內(nèi)容,由于內(nèi)容中有可能包括文本框、表格、圖片等要素,因此采用了SQL Server中的Ntext類型字段。對于圖片和詳細內(nèi)容的提取,都采用了剪貼板作為Word數(shù)據(jù)和數(shù)據(jù)表數(shù)據(jù)交換的媒介。導(dǎo)入時的另一個問題是單元格內(nèi)容的判定,即如何判定當前單元格內(nèi)容是數(shù)據(jù)表字段所需要的。
對于單元格數(shù)固定的表格,Word表格的單元格和數(shù)據(jù)表中的一條記錄中的字段是一一對應(yīng)的,但對于單元格數(shù)可變的情況,必須增加單元格內(nèi)容判定的功能。同時導(dǎo)入多個文檔時,存在要導(dǎo)入的文檔或文件夾中含有其它Word文檔的情況,因此必須對欲導(dǎo)入的文檔進行身份識別。對應(yīng)前面的模板設(shè)計方法,一般的識別方法是識別書簽或者識別在文檔的某個位置加上的特殊字符。但是這兩種識別方法的缺陷也是顯而易見的,識別標志容易誤刪除。
但文檔識別的基本思路是利用文檔模板區(qū)別于其他文檔的特征加以識別。借鑒已有的識別方法的成功經(jīng)驗,筆者提出的文檔識別方法是:從成果模板本身的特征出發(fā),用三個限制條件進行判斷。一是成果文檔中共有三個表格,二是成果文檔的第一個表格共兩行,三是成果文檔的第三個表格共兩行。以上三個限制條件足以保證成果文檔的正確識別。當然不同的成果模板可以根據(jù)其具體特征進行具體分析,這是文檔識別的基本思路。
再次是成果文檔的導(dǎo)出。導(dǎo)出時,依然以Word中的單元格作為識別單位。導(dǎo)出時的最常見問題是,對于多記錄情況,Word表格應(yīng)該能根據(jù)記錄數(shù)的多少自動調(diào)整行數(shù),且進行單元格的合并和拆分。在筆者開發(fā)的系統(tǒng)中,該問題也已成功解決。另外,從用戶角度考慮,系統(tǒng)還實現(xiàn)了導(dǎo)出時將導(dǎo)出文檔合一的功能即將多個文檔導(dǎo)出為一個文檔,大大方便了用戶的瀏覽和編輯。
為了充分發(fā)揮Delphi強大的數(shù)據(jù)管理功能,系統(tǒng)中同時提供了手工維護功能,即以傳統(tǒng)的系統(tǒng)界面進行成果的增刪改的功能,這樣保證了修改內(nèi)容和導(dǎo)出成果文檔的一致性,同時又便于查詢和統(tǒng)計。
結(jié)論
Delphi+Word的數(shù)據(jù)處理方式,可以實現(xiàn)系統(tǒng)的脫機使用,符合系統(tǒng)分布式布署的思想,同時又便于用戶熟練掌握,符合系統(tǒng)集成的思想。這種全新的數(shù)據(jù)處理方式在筆者的系統(tǒng)中得到了較好的驗證和使用,為以后的數(shù)據(jù)庫系統(tǒng)開發(fā)提供了一條新的解決思路。采用Word作為數(shù)據(jù)錄入和輸出的前端工具的系統(tǒng)設(shè)計思路,同樣適用于其他語言的數(shù)據(jù)庫系統(tǒng)開發(fā),尤其適用于大量的數(shù)據(jù)處理的數(shù)據(jù)庫系統(tǒng)。
在做文字處理的時候,中國的大多數(shù)用戶還是習(xí)慣于使用Office,而Office中最常用的莫過于Word。因此大多數(shù)用戶對于Word的操作應(yīng)該說非常熟悉,而Word在數(shù)據(jù)錄入方面功能之強大確實是無與倫比,在Word中無論簡單的文本、表格還是圖片等都能很輕松的錄入,利用Word本身的打印功能還可以將其作為報表輸出的工具。
Delphi+Word的數(shù)據(jù)庫系統(tǒng)設(shè)計思路
結(jié)合Delphi和Word本身的特點,數(shù)據(jù)庫系統(tǒng)可以采用這樣的設(shè)計思路:以Word作為數(shù)據(jù)錄入界面,錄入完畢后,數(shù)據(jù)庫系統(tǒng)自動從Word中提取數(shù)據(jù),并將提取的各要素存儲于數(shù)據(jù)表中,以便利用數(shù)據(jù)庫系統(tǒng)的強大的數(shù)據(jù)處理功能對數(shù)據(jù)表內(nèi)容進行維護、檢索、統(tǒng)計等,并將Word作為報表輸出的工具。
Delphi中從Delphi5開始恰恰提供了與Word的接口—TwordApplication,利用該接口可以實現(xiàn)Word的打開、關(guān)閉、保存以及對文檔內(nèi)容作相應(yīng)的處理。采用以上的系統(tǒng)設(shè)計思想以及Delphi提供的與Word的數(shù)據(jù)接口,筆者開發(fā)了一套成果管理系統(tǒng)。該成果管理系統(tǒng)主要內(nèi)容是管理最終成果文檔的內(nèi)容,包括詳細內(nèi)容、文字圖片、成果的儲備情況、經(jīng)費情況、獲獎情況等,為了便于統(tǒng)計分析及保證成果內(nèi)容的一致性,系統(tǒng)將各要素統(tǒng)一存放于數(shù)據(jù)表相應(yīng)的字段中。下面詳細闡述系統(tǒng)的設(shè)計思路,參見圖1。
圖1 系統(tǒng)設(shè)計思路流程圖
首先篩選必要的成果要素利用Word作一個錄入模板。Word模板較常見的有兩種做法:一種是在Word文檔相應(yīng)的位置插入書簽;另一種是在Word文檔的相應(yīng)位置插入特殊符號。插入書簽的具體做法是:選中要插入書簽的區(qū)域,在Word的插入菜單中選擇書簽,填寫書簽名稱,點擊添加即可。在Word文檔中插入特殊符號的思路是:將需要提取的內(nèi)容用特殊字符包起來,系統(tǒng)利用特殊字符識別要導(dǎo)入的內(nèi)容,例如#中國#,表示中國是要提取的內(nèi)容。但是利用以上兩種模板制作方法都有缺陷,尤其是將模板既作為輸出界面,也將其作為錄入界面時。首先對于利用書簽的模板方法,用戶在實際錄入數(shù)據(jù)的過程中,很容易將書簽誤刪除。插入特殊符號的方法無疑增加了用戶錄入時的負擔,且界面也不美觀,沒有保持文檔原貌。但這兩種方法的基本思路都一樣,即創(chuàng)造要提取要素的特征符號。
借鑒以上兩種模板設(shè)計方法的成功經(jīng)驗,筆者提出的模版設(shè)計思路是:成果的所有要素分門別類存儲在Word文檔的不同表格中,采用Word表格的具體要素—單元格作為文檔內(nèi)容的識別依據(jù),系統(tǒng)根據(jù)Word表格中單元格的索引進行提取。但是這種設(shè)計思路必須能處理兩種情況:一種是每個Word表格對應(yīng)數(shù)據(jù)表中的一條記錄即單元格數(shù)固定的情況;另一種是一個Word表格對應(yīng)數(shù)據(jù)表中多行記錄即單元格數(shù)可變的情況?,F(xiàn)筆者開發(fā)的系統(tǒng)已完全能自如處理這兩種情況。
其次是成果文檔的導(dǎo)入。導(dǎo)入時,一般存在兩種情況:一是導(dǎo)入單個成果文檔,二是同時導(dǎo)入多個成果文檔即文件夾的方式。成果文檔的導(dǎo)入實際上是Word文檔內(nèi)容的提取問題,提取的關(guān)鍵是成果文檔中圖片的提取以及成果詳細內(nèi)容的提取,在該系統(tǒng)中圖片格式只能為BMP格式。對于成果詳細內(nèi)容,由于內(nèi)容中有可能包括文本框、表格、圖片等要素,因此采用了SQL Server中的Ntext類型字段。對于圖片和詳細內(nèi)容的提取,都采用了剪貼板作為Word數(shù)據(jù)和數(shù)據(jù)表數(shù)據(jù)交換的媒介。導(dǎo)入時的另一個問題是單元格內(nèi)容的判定,即如何判定當前單元格內(nèi)容是數(shù)據(jù)表字段所需要的。
對于單元格數(shù)固定的表格,Word表格的單元格和數(shù)據(jù)表中的一條記錄中的字段是一一對應(yīng)的,但對于單元格數(shù)可變的情況,必須增加單元格內(nèi)容判定的功能。同時導(dǎo)入多個文檔時,存在要導(dǎo)入的文檔或文件夾中含有其它Word文檔的情況,因此必須對欲導(dǎo)入的文檔進行身份識別。對應(yīng)前面的模板設(shè)計方法,一般的識別方法是識別書簽或者識別在文檔的某個位置加上的特殊字符。但是這兩種識別方法的缺陷也是顯而易見的,識別標志容易誤刪除。
但文檔識別的基本思路是利用文檔模板區(qū)別于其他文檔的特征加以識別。借鑒已有的識別方法的成功經(jīng)驗,筆者提出的文檔識別方法是:從成果模板本身的特征出發(fā),用三個限制條件進行判斷。一是成果文檔中共有三個表格,二是成果文檔的第一個表格共兩行,三是成果文檔的第三個表格共兩行。以上三個限制條件足以保證成果文檔的正確識別。當然不同的成果模板可以根據(jù)其具體特征進行具體分析,這是文檔識別的基本思路。
再次是成果文檔的導(dǎo)出。導(dǎo)出時,依然以Word中的單元格作為識別單位。導(dǎo)出時的最常見問題是,對于多記錄情況,Word表格應(yīng)該能根據(jù)記錄數(shù)的多少自動調(diào)整行數(shù),且進行單元格的合并和拆分。在筆者開發(fā)的系統(tǒng)中,該問題也已成功解決。另外,從用戶角度考慮,系統(tǒng)還實現(xiàn)了導(dǎo)出時將導(dǎo)出文檔合一的功能即將多個文檔導(dǎo)出為一個文檔,大大方便了用戶的瀏覽和編輯。
為了充分發(fā)揮Delphi強大的數(shù)據(jù)管理功能,系統(tǒng)中同時提供了手工維護功能,即以傳統(tǒng)的系統(tǒng)界面進行成果的增刪改的功能,這樣保證了修改內(nèi)容和導(dǎo)出成果文檔的一致性,同時又便于查詢和統(tǒng)計。
結(jié)論
Delphi+Word的數(shù)據(jù)處理方式,可以實現(xiàn)系統(tǒng)的脫機使用,符合系統(tǒng)分布式布署的思想,同時又便于用戶熟練掌握,符合系統(tǒng)集成的思想。這種全新的數(shù)據(jù)處理方式在筆者的系統(tǒng)中得到了較好的驗證和使用,為以后的數(shù)據(jù)庫系統(tǒng)開發(fā)提供了一條新的解決思路。采用Word作為數(shù)據(jù)錄入和輸出的前端工具的系統(tǒng)設(shè)計思路,同樣適用于其他語言的數(shù)據(jù)庫系統(tǒng)開發(fā),尤其適用于大量的數(shù)據(jù)處理的數(shù)據(jù)庫系統(tǒng)。