自增值欄位(identity選項)在資料庫中有廣泛的應用,也就是當User在對Table新增資料時,資料庫後端可以對某個特定欄位做自動編號的處理,編出一個正整數的序號,來達到唯一鍵值的目的(因為自增值是不可能重號的)。自增值因為是在後端由資料庫系統負責編出來的號碼,因此在User的前端是看不到號碼的,所以在EEP 2010中,可以透過ServerModifyServerModifyGetMax來取得最大值並傳回Client中,讓User即時可以看到自增值的內容,甚至可以應用在MasterDetail的架構中,讓Master也能使用自增值,以下就是我們實際的實例。

 

Step1點兩下S002 專案的Component.cs,就會打開S002Component.cs的設計畫面,此專案中有[Orders][Order Details]組成的Master/Detail關聯表,我們點選ucMasterOrderUpdateComp)。

UpdateComp有以下幾個屬性需要說明一下:

F  ServerModify:這是與Client端的InfoDataSetServerModify屬性是互動的,也就是說兩者都必須設為True,才會讓Client端真正可以立即更新資料(當然InfoBindingSourceAutoApply也必須為True)。在UpdateCompServerModify會讓系統Insert資料後,會自動重新下達InfoCommandSQL語法重新抓取目前Insert的這筆資料並傳回到Client中。此即用在Server端有自動編號與自增值欄位等情況。

F  ServerModifyColumns:為了在ServerModify中能重新讀取最新Insert的那筆資料,可以定義一個或多個Columns來抓取剛剛Insert的資料,因此本屬性所定義的Column是足可以用來抓取剛才新增資料的唯一Where條件,不定義會預設為InfoCommandKeyFields做為抓取ServerModify的鍵值條件,因此也可以不定義,如果遇到AutoNumber元件所編出來的資料,就可以用AutoNumber的欄位來取出ServerModify的資料。

F  ServerModifyGetMax:同ServerModifyColumns,但此為了自增值所特殊設定的方式,就是自動取抓最大值(剛剛新增的資料其排序為最大之號碼)。因此在ServerModify重取資料時,會使用Max()的方式取出該自增值最大號碼來做為取出資料的Where條件。

 

Step2ucMasterServerModify設為TrueServerModifyColumns屬性不必設定。因為在此OrderID為自增值的欄位,因此必須使用設定ServerModifyGetMaxTrue,用來取出最大的OrderID


5-3-1 設定ucMaster屬性

 

Step3重新編譯S002項目。

 

Step4打開C002Form1設計畫面,確定以下幾個控制項的屬性:MasterInfoDataSet)的ServerModify應設為True,以使資料存檔成功後從Server端傳回資料並更新。

5-3-2 開啟Master.InfoDataSetServerModify屬性

 

Step5另外檢查ibsMasterInfoBindingSource)的AutoApply必須要True(一筆存檔一次)等。

5-3-3 開啟ibsMaster.InfoBindingSourceAutoApply屬性

 

Step6另外,為了在Master輸入完畢進入Detail輸入前就能對Master事先存檔,因此我們必須對ibsDetailDetailInfoBindingSource)的AutoApplyMaster設為True

5-3-3 開啟ibsDetailAutoApplyMaster屬性

 

這是因為如果讓Master/Detail一起存檔由於DetailClient端沒經過自增值的處理,就輸入Detail 資料是會讓Detail一起存入後端時成為孤兒或發生錯誤(OrderNo為空),因此必須在Detail輸入前讓Master先存檔,並以ServerModify取得OrderID後,再設定給Detail往下輸入。這是面臨Master/Detail中,為Master鍵值採用自增值的最好方案,否則無法讓User在輸入單據的過程中立即取得號碼。

 

Step7OrderID對應的InfoTextBoxReadOnly屬性設為True


5-3-4 開啟InfoTextBox ReadOnly屬性

Step8ToolBox把一個DefaultValidate加入Form1,把BindingSource屬性設為ibsMasterDefaultActive屬性設為TrueValidActive屬性設為True

5-3-5 設定DefaultValidate元件屬性

 

Step9點下FieldItems,點下AddFieldName設為OrderIDCheckNull設為TrueDefaultValue設為0

5-3-6 添加一個FieldItemOrderID

設定此預設值為0,表示在新增一筆資料時,OrderID的預設為0。這是因為在Order資料表中,OrderID項目設定是不可為空值。所以我們新增前先給0,新增後OrderID項目自動會變成此項目的最大值,因為OrderID也有設定為識別”,且識別值種子為1,識別值增量也為1

下圖是用Enterprise Manager檢視資料表設計視窗:

5-3-7 檢視資料表

 

Step10重新建置C002專案,然後在EEPNetClient.EXE中打開C002表單。表單出現以後,我們按下「新增」按鈕,你會發現OrderIDReadOnly,且預設為0

5-3-8 OrderID預設為0

 

輸入完CustomerIDEmplyeeID,然後在DetailInfoDataGridView中輸入資料。瞬間,因為Detail有設AutoApplyMaster,所以會觸發MasterApply動作,並會在前後端發生ServerModify的反應,將此OrderID的號碼顯示在Client上,因此你在輸入Detail時,就可以看到最新的號碼已經在Detail中預設出來。

5-3-9 Detail自動預設

在上例的Master自動存檔到A/P Server時,我們透過SQL Profiler來查看如圖中紅線內完成了一筆存檔。也可以看Server ModifyServerModifyGetMax所另外下出來的SQL語法,請看下圖:

5-3-10 查看存檔SQL語句

5-3-11 查看Modify SQL語句

 

 

 

 

 

 

 

 

 

 

 

 

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