第4章EEP 2019基礎設計(上)第4章EEP 2019基礎設計(上)\4-3一對多的基礎設計

4-3對多的基礎設計

這個單元將介紹一對多的檔案設計中,針對運算式的運用與加總功能的實現,及關連設計的開發與使用。我們將使用快速入門裡的範例來往下設計,如果還沒研讀過快速設計的使用者,請先行參閱。

 

q   Detail明細檔的完善設計

 

Step1打開在《EEP2019快速入門(下)》中設計的Project C002。選中Detail明細檔infoDataGridView1InfoDataGridView,按滑鼠右鍵,選擇Edit Columns。出現畫面如下:

4-3-1進入infoDataGridView1 Edit Columns對話框

Step2點擊Add按鈕,加一個Unbound Column非資料綁定的欄位

Name設定為Amount

HeadText則設定為金額

ColumnType請選InfoDataGridViewExpressionColumn,這是一個特殊的運算式的欄位型態,為EEP2019特有的ColumnStyle特殊欄位型態

最後按下Add新增後,再關閉此視窗。

4-3-2添加一個Unbound Column

 

Step3再來設定其Amount欄位的Expression屬性。因為要顯示金額內容,所以在此設定為UnitPrice*Quantity可以設定括號與+-*/等運算元符號。也可將此Column往上或往下移動來調整次序。我們讓它排在Discount前,顯示在UnitPriceQuantity下面。

4-3-3設定Amount欄位Expression

 

Step4為了讓金額可以靠右顯示,在金額的DefaultCellStyle中設定其顯示的格式。DefaultCellStyle有自己的屬性編輯窗,將Alignment設定為MiddleRight。代表欄位上下靠中,左右靠右顯示。

 


4-3-4設定Amount欄位顯示位置

Step5再來就是設定GridTotal功能。有如下列屬性,將其一一設定。

 

F   TotalActiveTrue(設定是否要顯示Total)。

F   TotalCaption=總計(TotalTitle,顯示在GridView的資料前頭)。

F   TotalBackColorTotalCaptionFontTotalFont分別為背景顏色,Title字體及Total字體,可自行設定。這裏不作設定,使用預設值。注:TotalFont的字型一定要設,否則將無法顯示出加總值

4-3-5設定GridTotal功能屬性

 

Step6點擊TotalClumns右邊的小按鈕,並點Add按鈕,選擇所要加總的欄位名稱,將其ColumnName設為剛才新增的Amount運算式欄位,在此可以設定多個代表要加總多個欄位。設定其他屬性,如:

ShowTotal設為true,代表要顯示加總值;

TotalModesum可選擇sum/count/max/min/averageTotalAlignMent設為right,代表加總值要靠右。

4-3-6設定Amount其他屬性

 

Step7編譯C002並執行。如下圖中,可以看到加總的效果。

4-3-7Amount加總效果

 

每一筆主檔所相對的Detail資料都會有一個加總值,並顯示在GridView的最後一個Row,可以試著去更改數量與單價可以對金額直接改變金額與Total的加總值。要對離開目前更改的那筆才會反應出加總值

 

 

 

q   多檔關連設計

接著就是要將Master的資料表使用Left JoinSQL語法來做關連,讓範例中的訂單主檔可以顯示出相對客戶的資料。

 

Step1打開ServerS002。點擊MasterinfoCommandCommandText右邊的小按鈕,點擊Tables下方的Add,加入所要的Customers表。

4-3-8加入所要的Customers

 

Step2選中Customers及右邊的CompanyName,點擊右邊的Add按鈕,出現一個設定Left Join的視窗。如果要多個欄位,請使用Shift+Mouse左鍵來複選。左邊設定為Orders.CustomerID,右邊設定為Customers.CustomerID,在下面選擇Left JoinLeft Outer Join,點擊OK即可。

注:也可以直接在編輯框中輸入對應Lef JoinSql語法。

4-3-9設定Left Join關係

 

因為CompanyName欄位是Left Join進來的,如果這時前端的U/I如果有對對方關連資料作更改並存檔到後端資料庫中時,就會出現錯誤關連欄位不需要可以更改

 

Step3因此,選中Master對應的ucMasterUpdateComp元件,將ucMaster的屬性ExceptJoin設為True,系統會自動分析CommandTextSql語句,將Left Join的欄位自動加入到FieldAttrs中,並且會將UpdateEnable設為False即使前端U/I有更改此欄位,也會排除在Update語法之外

4-3-10開啟ucMasterUpdateComp元件

 

Step4同樣方式設定DetailinfoCommandLeft Join,將其Products』及『ProductName拖拉進來,並以[OrderDetail].[ProductId]關連到[Products].[ProductID]Left Join進來,同樣將ucDetailExceptJoin也設為True。請重新編譯BuildS002項目。

 

Step5打開ClientC002Form1。將MasterInfoDataSet重新Active】。(注:先設False再設Ture,此目的是為了讓InfoDataSet能重新抓取InfoCommand所新增的欄位。雙擊MasterInfoDataSet,將剛才增加的欄位CompanyName拉到Form1中適當的位置。

 

4-3-11CompanyName欄位拉Form1

 

Step5點擊infoDataGridView1右上的三角型圖示,打開Edit Columns後,增加一個ProductNameColumn調整一下上下位置,讓其位於ProductID下面。

注:如果沒有出現ProductName,可將MasterInfoDataSet重新Active

 

4-3-12增加一個ProductNameColumn

 

Step6編譯C002並執行。即可看到如圖的效果

4-3-13 ProductName顯示效果

 

q   使用關連選單

前面介紹過使用Left Join方式來關連Table間的關係,但針對User資料輸入的部份,我們在此將使用EEP2019另一個強大的InfoRefVal元件來實現開窗選單的功能。InfoRefVal功能很多,為了操作的簡便性,在此簡單說明其基本使用方式,在於進階文件說明更深入的使用方法。

 

Client端中開啟C002來設計使用InfoRefValInfoRefVal可以直接使用Select Command來設定選單的資料源,也可以另外使用InfoCommand來定義資料源的sql語句,差別的是前者很簡單直接使用InfoRefVal即可,而後者則要從Server端貼InfoCommand一直到Client端貼InfoDataSetInfoBindingSource才能與InfoRefVal動作,程序繁瑣很多。

 

Step1ToolBox中選InfoRefVal貼入,取名為rvCustomers,接著設定其SelectAlias資料庫別名,(Alias定義在EEPNetServerDB Manage中,此僅在設計模式中用來設計SelectCommand與選擇欄位所使用,與執行模式的資料庫Alias無關,在此選擇ERPS,代表DBAlias。設定SelectCommand,可以在右邊的按鈕使用SQL Builder來設定之,或直接填入Select [Customers].* from [Customers]SQL語句也可以。

 

4-3-14設定選單資料庫別名與SQL語句

 

Step2因為是使用SelectAliasSelectCommand的方式,所以不必設定DataSource的屬性,可以直接對選擇DisplayMember的欄位DisplayMember代表要顯示的關連欄位名稱,下拉選擇CompanyName欄位做為DisplayMember;接著設定ValueMember下拉選擇CustomerID欄位ValueMember代表關連資料表的鍵值欄位,以此欄位去尋找相對應的內容最後就是設定Caption屬性為客戶選單用來設定選單的視窗抬頭。

4-3-15設定選單各欄位屬性

 

Step3接著就是將CustomerID以及所對應的InfoTextBox刪除。點兩下MasterInfoDataSet,選取CustomerID這個項目,下拉選單中選取InfoRefValBox,把CustomerID這個項目拉到原本CustomerID的所在位置。

4-3-16添加CustomerIDInfoRefValBox

Step4設定InfoRefvalBox1RefVal屬性為rvCustomers。這樣在執行時就可以讓User輸入CustomerID可以去找Company Name的內容,也可以直接按InfoRefvalBox,查詢Customer表的資料。

4-3-17設定RefVal屬性為rvCustomers

 

Step5依步驟step1~step4,貼入另一個InfoRefVal改名rvProducts

4-3-18設定另一個InfoRefValrvProducts

Step6如上圖,將SelectAlias選擇為ERPS

SelectCommand設定為Select [products].* From [products]DisplayMember設為ProductName

ValueMember設為ProductID

Caption設為產品選單等。

 

由於GirdViewColumn有自己獨特的ColumnStyle,所以我們要在DetailInfoGirdView中按下右上角的三角型圖示,並對Edit Columns進行設定。

 

Step7選擇ProductID作為要與rvProducts這個RefVal進行關連選單。先在ColumnTypeInfoDataGridViewRefValColumns這個Type,如圖才會出現RefVal這個屬性可以選擇,選了rvProducts之後,即可完成GirdViewRefVal設定。

 

4-3-19設定GirdView.Edit Columns

 

接著因為要將Products.UnitPrice欄位內容帶入DetailUnitPrice欄位中,也就是當User使用rvProducts關連選單的同時,除了將產品名稱傳回到DisplayMember中以外,尚可以利用InfoRefvalColumnMatch來設定傳回其他的欄位,此例即將產品的單價傳回採購單的UnitPrice

 

Step8請在rvProducts設定ColumnMatch按下Add,新增一個Match Column,選擇DestFieldUnitPriceSrcField也為UnitPrice恰巧兩個Table的欄位是一樣的如果SrcField無法以單一欄位傳回時,可以用SrcGetValue屬性以呼叫另一個程式的方式傳回欄位內容。

注:ColumnMatch可以設定多個欄位,一次同時傳回多個欄位。

 


4-3-20新增ColumnMatch

 

以上除了InfoRefValBoxInfoDataGridView可以使用InfoRefVal元件外,也可以讓InfoComboBox代替InfoRefVal元件。

Step9如下圖可以雙擊Master,選中CustomerID欄位並點擊欄位右邊下拉選單,選擇InfoComboBox這樣在Form表單所產生的元件就會以InfoComboBox為主。

4-3-21使用InfoComboBox元件

 

InfoComboBox的使用方式與InfoRefValBox是一樣的方式,差別在InfoRefVal須要與其它顯示元件配合,而InfoComboBox則可獨立使用。再者InfoRefVal多了WhereItemColumnMatch等強大功能,InfoComboBox就沒有這麼多功能了。我們將在進階課程中來說明InfoComboBox的應用。

 

Step10編譯C002,並執行。請檢視CustomerID右方的,即可呼叫出客戶選單的視窗,並可用Double Click確定鈕傳回結果。

F   更新則是用來重新抓取最新的資料。

F   查詢則可以在選單中二次輸入其他的條件來重新進行查
詢等功能

 

4-3-22呼叫出客戶選單的視窗

 

Step11DataGridView中,會自動將所有ProductID顯示出,除了輸入產品號碼並選表外,也可以透過ColumnMatch功能將其單價傳回GridView中。

4-3-23呼叫出產品選單的視窗

 

 

=================EEP 2019基礎設() ============

 

 

下章預告:

Chapter 5EEP 2019基礎設()

 

 

Top of Page