430 likes | 558 Views
第十六章 Borland Database Engine. 16-1 Form Wizard 16-2 Table 與連繫物件 16-3 Table 屬性與方法 16-4 Query 16-5 資料庫與統計圖. 16-1 Form Wizard. Form Wizard 是一種精靈的方式,一步一步指導使用者建立輸出入表單,請看以下範例說明。. 範例 16-1a. 請使用 Form Wizard 建立一個 fri.db 的輸出入表單。. 16-2 Table 與連繫物件.
E N D
第十六章 Borland Database Engine • 16-1 Form Wizard • 16-2 Table與連繫物件 • 16-3 Table屬性與方法 • 16-4 Query • 16-5 資料庫與統計圖
16-1 Form Wizard • Form Wizard是一種精靈的方式,一步一步指導使用者建立輸出入表單,請看以下範例說明。
範例 16-1a • 請使用Form Wizard建立一個fri.db的輸出入表單。
16-2 Table與連繫物件 • 在資料庫程式設計裡,常見的資料存取方式是透過本單元的連繫物件,逐一巡覽、編輯資料庫,利用此一方式存取資料可不用寫任何程式,即可完成資料編輯任務,其缺點是只能逐筆由使用者目視搜尋。 • 另一種資料存取方式是自己寫程式進行資料編輯,這種方式比較彈性,您可以自己下達指令進行記錄的新增、或搜尋後修改、刪除等任務,請看16-3節。
資料連繫物件 • Delphi的資料連繫元件,如下圖所示,這些元件可以配合各種資料源物件(例如BDE 、ADO 、dbExpress或InterBase)來展示資料表的記錄,讓程式設計者不用任何程式即可完成資料的編輯動作 。 • Delphi的資料連繫物件有二維表格的DBGrid(請看範例16-2a),個別欄位的連繫物件則有DBText、DBEdit、DBMemo、DBImage,讓程式設計者不用寫任何程式即可逐筆瀏覽、新增、修改、刪除含有文字(Alpha)、備註(Memo)及圖形(Graphic)等型態的欄位,請看範例16-2b。
範例 16-2a • 示範以Table物件配合二維表格連繫物件DBGrid存取fri.db的內容 補充說明: • 1.以上Table、DataSource、DBGrid、DBNavigator元件關係,此即為Borland公司軟體IC的概念。也就是寫程式也像是組合數位IC一樣,是由已完成的模組繼續擴張功能,而不是從零開發,此種軟體IC的觀念方能縮短程式設計師開發軟體的時間。 • 2.以上使用DBGrid作為資料連繫物件,其優點為步驟簡單,但尚無法輸入Graphic類型的欄位(本例為Pic欄),且輸入資料方式親和性不足,下一個範例將使用DBEdit、DBMemo、DBImage及DBRadioGroup等元件展示資料表的內容 • 3.使用連繫物件展示資料庫的內容均只要設定DataSource屬性指向DataSource物件,再將DataField屬性指向欲展示的欄位即可
範例 16-2b • 示範個別欄位連繫物件的使用。
欄位編輯器 • 以上都是透過人工的方式連繫資料庫,Delphi另有一種資料連繫方式,稱為欄位編輯器,也可以縮短應用程式的開發。 • 它的優點是程式設計者可以將欄位編輯器的欄位物件直接拖曳到表單,即可完成輸出入表單的製作。 • 此外,欄位編輯器另有兩種特殊欄位,分別是計算欄位與查閱欄位。
計算欄位 • 依據資料庫正規化的規則,可計算而得的欄位不能放入資料庫。所以,若某一欄位可由同一資料庫的某些資料表的某些欄位計算而得,則稱此欄位為計算欄位,則此欄位不能存入資料庫。例如,若某一資料表已有國文、英文與數學成績,則此三科的平均,並不能儲存入資料庫,往後若要求其平均,均要自行計算。 • 為了減輕程式設計師的負擔,Delphi便提供“計算欄位”供程式設計師使用。關於計算欄位的使用,請看範例16-2d。
查閱欄位 • 依據資料正規化的規則,為求欄位內容的單一性,任何欄位均只能同在一資料庫出現一次。所以,若某一欄位需要在不同的欄位重覆引用,則應將此欄位先以代碼表示,然後任一資料表需引用此欄位時,均以代碼表示。例如,學校的成績處理系統,學生的名字已存在學生基本資料表,則每次在輸入成績資料時,便不能再輸入學生姓名,只能以學生代碼與成績的方式輸入,以免造成資料的重覆性。 • 所以在學生成績資料表中就沒有學生姓名,若要取得學生姓名,則可透過欄位編輯器的查閱欄位至學生基本資料表查閱而得, 請看範例16-2e。
範例 16-2c • 請以欄位編輯器展示stugrd.db的內容。
範例 16-2d • 同上範例,但增加“平均”欄位,計算國、英及數三科的平均。
範例 16-2e • 同上範例,但增加查閱欄位,印出學生姓名 補充說明: • 欲關聯的欄位均需事先索引才能順利取得關聯,如本例stugrd.db的id欄及stuname的id欄均須事先製作索引。
主要/次要明細(Master/Detail) • 於學生資料表中,通常一個學生含有許多次的考試成績,或於客戶資料表中,每一個客戶通常都有好幾筆交易,這就是一種一對多的關係,例如stuname.db是學生基本資料表,stugrd.db是每位學生的每次考試成績資料表, • 以下範例將介紹如何於觀看學生基本資料表(stuname.db)時,能同時顯示指定學生的全部成績,此即為“主要/次要明細”的功能。
範例 16-2f • 以Table示範主要/次要明細表。
16-3 Table屬性與方法 • 上一節使用資料庫連繫物件,所以不用任何程式即可瀏覽與編輯資料庫內容。其優點是省時省事,但這些功能對實務的進銷存等問題,還是不足,本章要說明的是Table屬性與方法如下:
資料項屬性 自行使用Table方法,可以使用上一節連繫物件存取資料項,若不使用連繫物件,則可以使用以下資料項屬性存取資料項。 Table.FieldValue [‘欄位名稱 ’]; Table [‘欄位名稱 ’]; Table.FieldByName (‘欄位名稱 ’).型態轉換函數; Table.Fields [欄位引索].型態轉換函數;
上式型態轉換函式可為 AsVariant、AsString、AsInteger、AsFloat、AsCurrency、AsDateTime、AsBoolean,其目的是將原始資料轉為與目的物件相同的資料型態。而以下式子均可取得gradl.db的Name欄位。 Edit.Text:=Table.FieldValues[‘ Name ’]; Edit.Text:=Table[‘ Name ’]; Edit.Text:=Table.FieldByName(‘ Name ’).AsString; Edit.Text:=Table.Fields[0].AsString; • 若已將欄位物件(TField)加入欄位編輯器,則可使用欄位物件名稱,代表某一項資料項,如下式是代表存取Name欄位的內容。 Table1Name.Value Table1Name.AsString
記錄指標 • 每一個資料集均有一個記錄指標。此記錄指標的功能即為指向記錄編輯對象,也就是往後資料表的新增、修改與刪除對象均是此記錄指標所指的記錄。
開啟或關閉資料表 Table物件開啟或關閉資料表的方法如下表:
範例 16-3a • 示範各種記錄項屬性的用法與指標的移動
增加或刪除記錄 增加或刪除一筆記錄的方法如下表:
編輯(Edit)或寫入(Post)狀態 編輯或寫入狀態的設定方法如下表:
循序查詢(不用索引檔) 不用索引檔的資料查詢方法如下表:
索引查詢 使用索引查詢將可縮短查詢時間, 索引查詢方法如下表:
範例 16-3b 示範Locate查詢,並修改記錄內容。 程式說明: • 1. Locate的語法如下: Locate(“欲搜尋的欄名”、“欲搜尋的字串”,搜尋參數) • 2. 搜尋參數的型態是TLocateOptions,如下式: type TLocateOption = (loCaseInsensitive, loPartialKey); TLocateOptions = set of TLocateOption; • loCaseInsensitive:不分大小寫均符合。 • loPartialKey:部份字元符合即可。例如輸入“學樂”,若有“學樂出版社”或 “學樂出版股份有限公司”,均符合搜尋條件。
範例 16-3c • 示範Lookup查詢。 程式說明: • Lookup僅傳回所要的欄位值,記錄指標並沒有移動。
範例 16-3d • 示範Gotokey,並修改記錄內容。 補充說明: • 1. 要先關閉Table,才能設定索引欄。 • 2. 若是要找接近的值,則可將Gotokey改為GotoNearest。 • 3. 本例已示範如何取記錄的原值、修改並存回,此方法可應用於銷貨管理中,將原庫存減去銷貨數量。
範例 16-3e • 示範Findkey,並修改記錄內容。 程式說明: • GotoKey和FindKey均應事先將欲搜尋的欄位索引,才能使用。
範例 16-3f • 示範記錄的新增與刪除。
16-4 Query • 前面的Table物件是一種程序式的語言,你必須一步一步的告知編繹器你要怎麼作,例如你必須一步一步的移動記錄,然後更正資料,但本節的Query物件即可以下達SQL敘述,SQL敘述的優點為它是非程序性語言,例如你要從fri.db中取身高大於160的記錄,只要下達以下SQL敘述: Select * From fri Where Height>160 //身高的欄位為Height • 至於編繹器取資料的過程如何,你都可以不必了解。SQL敘述的另一優點是提升執行速度,因為SQL敘述可以在眾多資料表中只取合乎條件的部份欄位出來,不像Table物件會將牽涉到的資料表全部提出,所以只要資料庫系統慢慢龐大之後,使用Table物件所撰寫的程式都會造成網路及硬碟很大的負載。使用SQL敘述的第三優點為SQL是一種資料庫廠商標準語言,只要學一次SQL敘述,下次你換一種程式語言,都不用重新學習,即可以將SQL敘述,套上新的語言。對於SQL敘述不熟的讀者請看第十八章。 • Query物件可於設計階段與執行階段下達SQL敘述,以下我們將分別於設計階段與執行階段說明Query物件的使用。
範例 16-4a • 如何於設計階段執行SQL敘述。(本例欲連結別名為horng的資料庫,資料表為stugrd.db) 補充說明: • 若要讓DBGrid能修改記錄,請將Query物件的RequestLive屬性點選True。
範例 16-4b • 同上範例,但於執行階段執行SQL敘述。 程式說明: • 1. 執行SQL敘述的步驟如下: 關閉Query物件。 清除SQL敘述。 加入SQL敘述。 執行SQL敘述。
範例 16-4c • 同上範例,但加上參數的傳遞。 程式說明: • 本例共示範三種資料型態的參數傳遞,分別是數值、字串及日期型態,其中字串及日期均應於資料兩旁加字串符號('),但SQL語法又規定,凡字串內須再存有字串者,須用雙引號(")代替,所以字串及日期的物件變數兩旁要加雙引號(")。
範例 16-4d • 示範如何關聯多個資料表。 程式說明: • 1. SQL敘述內資料表名稱與欄位名稱之間要加點(.)運算子。 • 2. SQL敘述內字與字之間一定要空一格,若要將字串分開時,也要考慮空白,如本例的from與where前均應加空白。
範例 16-4e • 如何新增、刪除及更正資料。 程式說明: • 1. Insert、Delete及Update因為不傳回資料集,所以應使用ExecSQL,而非Select的Open。 • 2. Select可一次至多個資料表抓取所需的欄位,但Insert、Delete及Update僅能至一個資料表修正記錄。 • 3. Insert、Delete及Update不能使用集合性函式,如SUM及AVG等。 • 4. 若要一次更動多個資料表應使用UpdateSQL物件。
範例 16-4f • 如何由使用者於執行階段下達SQL敘述。
範例 16-4g • 同上範例,但設計一個更具親和性的搜尋資料介面。
16-5 資料庫與統計圖 • 我們於10-16節已介紹Chart元件的用法,其功能為繪製各種統計圖,本節則要介紹資料庫的繪圖元件DBChart,DBChart是繼承Chart的元件,所以其用法大致與Chart相同,只是多了連繫屬性DataSouce與ValueSource,以下將示範如何將grade.db的內容以DBChart表現,grade.db內容如下:
範例 16-5a • 如何將grade.db的內容以DBChart表現。 補充說明: • 只有特殊的統計圖才需要XValues,如Fast Line才需要設定XValues。
習題 1. 假設有以下的統計資料: 請規劃一個資料表儲存以上資料。 可任意輸入某年某月而得該月份銷售王。 可任意輸入某年某月而得各業務員的銷售長條圖。 可任意輸入某一時間區間而得該區間銷售王,例如輸入8701~8702而得該區間銷售王。 同4,可得該區間所有業務員的銷售長條圖。
2. 請實際觀察任一家保齡球館,並寫程式完成其計分功能;若同一球道可同時2至4人擊球,則其程式設計又如何?2. 請實際觀察任一家保齡球館,並寫程式完成其計分功能;若同一球道可同時2至4人擊球,則其程式設計又如何? • 3.請設計一個樂透對獎程式,其要求如下: • 可事先輸入已購買的獎卷號碼。 • 可輸入中獎號碼,並核對資料表中各組號碼的中獎情形。 • 4.請設計一個樂透程式,其要求如下: • 可自動產生一個10000~20000的亂數,此亂數即代表本期彩卷的銷售數量。 • 根據以上的銷售數量,自動產生以上各組彩卷的號碼,並儲存在資料表中。 • 電腦自動開獎。 • 電腦列出各獎項的人數。例如,頭獎1人,二獎5人,三獎202人,四獎1221人,五獎6123 人