所謂優化Master/Detail就是要讓Master/Detail的架構下能達到最佳效率化的目的,以InfoCommandInfoDataSource所組成的Master/Detail關係下,如果在Client端的Master InfoDataSetPackedRecord設為100時,此時假設每一筆Master相對的Detail筆數為10筆,則在Client端啟動InfoDataSet時會下載Master 100筆與Detail 1000筆的資料到Client端。

這樣在LAN的環境下是沒有感覺的,但如果是在Internet的環境中,那Client的效能將明顯的下降,因此我們要使用另一組獨立InfoCommandServer端)與InfoDatasetClient端)作為一個顯示瀏覽的資料表(以下稱ViewDataSet),再以ViewDataSet獨立向Master取一筆資料與相對的Detail資料,來解決Internet環境下的效能問題。

 

q   設計Server端的View

 

Step1延用S004 Project,從ToolBox中選另一個InfoCommand貼上,命名為ViewName的屬性設為View),將 CommandText屬性設為Select [Purchases] .* from [Purchases](可以用打開SQL Builder來設定SQL語法),再將KeyFields屬性設為PurchaseID

 


4-3-1 設定InfoCommand屬性

 

因為View不需要對資料進行新增更改刪除的操作,所以不需要貼上對應的的UpdateComp。這樣Server端就已經加好ViewInfoCommand

Step2直接Build編譯S004

 

ViewInfoCommandMasterInfoCommand不同在於前者只有單一的Select語句,而Master因有InfoDataSource連接到不同的Detail上,所以除了Select Master的語句外,還會相對下多條Select DetailWhere相對於MasterKeyValue)的語句,有多少筆Master就會下多少條Select Detail語句,因此啟動ViewMaster來得輕省太多了。

q   設計Client端的View

 

Step1打開ClientC004 Project,另外增加一個InfoDataSet和一個InfoBindingSource,分別命名為ViewibsView

4-3-2 新增InfoDataSetInfoBindingSource

 

Step2ViewRemoteName屬性設為S004.View,將Active屬性設為True】,ibsViewDataSource屬性設為ViewDataSet),DataMember屬性設為ViewTable)。

4-3-3 分別設定ViewibsView的屬性

 

再來就是要設定ViewMaster間的關係。因InfoDataSet元件僅為資料的容器,用來容納Table的資料(可以容納多個Table資料),針對資料的操作(如上筆下筆的動作)必須透過InfoBindingSource來進行,因此我們必須設定ibsView這個InfoBindingSource來關連到Master這個InfoDataset,讓每移動一筆View就會使Master這個DataSet重新到Server上抓取相對的一筆資料,達到我們優化的目的。

Step3點擊ibsViewRelations屬性右邊的小按鈕,出現一個InfoRelation Collection Editor的視窗。

4-3-4 進入InfoRelation Collection Editor視窗

 

Step4InfoRelation的視窗中點擊左下的Add按鈕,並選中新增的InfoRelation,將右邊的Active屬性設為True,表示啟動關連功能。再選擇右邊的RelationDataSet的屬性,這個屬性是設定關聯到哪個資料表,這裏選擇Master,代表當View移動時將重新啟動Master這個DataSet

4-3-5 開啟關聯Master功能

 

Step5有了ViewMaster的關係後,再來就是要設定其鍵值欄位關係(KeyFields)。接著按SourceKeyFields右邊的小按鈕,出現InfoKeyField Collection Editor視窗,按下Add按鈕,並選中新增的InfoKeyField,設定FieldNamePurchaseID,代表ViewInfoBindingSource要以PurchaseID去重新啟動Master這個DataSet

注:必要時可以設定多個的關係。


4-3-6 設定鍵值欄位關係

 

Step6接著同樣去設定TargetKeyFields屬性,設定對方的DataSetMaster Table將以哪一個欄位與SourceKeyFields對應,因為MasterViewTable都是同樣為Purchase,所以其KeyFields也都為PurchaseID,在此我們將TargetKeyFields也設為PurchaseID

4-3-7 設定TargetKeyFields對應欄位

 

Step7ibsViewRelationDelay設為True

4-3-8開啟ibsViewRelationDelay功能屬性

這個屬性如果設為True,在User快速移動View的資料時,將不會去關聯(重新啟動)Master的資料,也就是User要停留在View的目前筆一段時間後,才會讓Master去抓取相對資料,這個延遲時間的長短是由DelayInterval屬性來決定的,系統預設為300毫秒(0.3秒)。這是一個人性化的效益設計,目的是為了讓Internet上的User能有較佳的操作資料的效能。

 

Step8為了讓View可以顯示,我們在C004的頁面上貼入一個InfoDataGridView元件,並將原來Master的欄位往右調整(也可以整體複選移動與縮小)。如下圖。

4-3-9 貼入InfoDataGridView元件

 

Step9將新的InfoDataGridViewDataSource屬性為ibsView,並將其設為唯讀模式。(將Adding/Editing/Deleting的勾選去除)。

為了美觀,還可以將InfoDataGridView.SelectionMode設為FullRowSelect

4-3-10 設定InfoDataGridViewDataSource

 

接著只剩下InfoNavigator的調整,因為之前的InfoNavigator的上下筆對象是ibsMaster,但因為有了ibsView之後,其InfoNavigator的操作對象應該改成ibsView了。

Step10因此我們必須在infoNavigator1這個InfoNavigatorViewBindingSource屬性設定為ibsView,但原來的BindingSource還是為ibsMaster

4-3-11 設定InfoDataGridView1ViewBindingSource

這樣的結果會讓InfoNavigator在「查詢/上下筆/首末筆」等移動資料的功能是針對ibsView的,而「新增/編輯/刪除/確定/存檔」等功能還是針對原來的ibsMaster。這也是InfoNavigator的獨特功能。

 

Step11最後必須將MasterInfoDataSet)的Active設為False。否則一開啟表單時,就會讓Master啟動而失去View優化的目的。

* 如果要讓C004表單打開時不下載任何資料,可以連同ViewActive也跟著設為False,這樣系統一進入C004時,就會呈現空的表單(沒有資料),使用者必須使用「查詢」功能後才會有資料顯示在表單上,可再次增加系統的效能。

 

Step12最後編譯C004。執行EEPNetClient.EXE並打開C004,查看結果。如圖,一進入系統時並沒有資料被下載,User必需先按「查詢」,再按OK後才會有資料顯示。而且每移動一筆View的資料,會立即到Server端去下載相對資料。


4-3-12 資料移動

 

最後,我們也可以打開SQL Profiler,來監看SQL語句,瞭解整個ViewMaster/Detail之間的優化關係。

4-3-13 監看SQL語句

 

 

 

 

 

 

 

 

Converted from CHM to HTML with chm2web Pro 2.85 (unicode)