自增值欄位(identity選項)在資料庫中有廣泛的應用,也就是當User在對Table新增資料時,資料庫後端可以對某個特定欄位做自動編號的處理,編出一個正整數的序號,來達到唯一鍵值的目的(因為自增值是不可能重號的)。自增值因為是在後端由資料庫系統負責編出來的號碼,因此在User的前端是看不到號碼的,所以在EEP 2019中,可以透過ServerModify與ServerModifyGetMax來取得最大值並傳回Client中,讓User即時可以看到自增值的內容,甚至可以應用在Master和Detail的架構中,讓Master也能使用自增值,以下就是我們實際的實例。
Step1>點兩下S002
專案的Component.cs,就會打開S002的Component.cs的設計畫面,此專案中有[Orders]與[Order Details]組成的Master/Detail關聯表,我們點選ucMaster(Order的UpdateComp)。
在UpdateComp有以下幾個屬性需要說明一下:
F ServerModify:這是與Client端的InfoDataSet的ServerModify屬性是互動的,也就是說兩者都必須設為True,才會讓Client端真正可以立即更新資料(當然InfoBindingSource的AutoApply也必須為True)。在UpdateComp的ServerModify會讓系統Insert資料後,會自動重新下達InfoCommand的SQL語法重新抓取目前Insert的這筆資料並傳回到Client中。此即用在Server端有自動編號與自增值欄位等情況。
F ServerModifyColumns:為了在ServerModify中能重新讀取最新Insert的那筆資料,可以定義一個或多個Columns來抓取剛剛Insert的資料,因此本屬性所定義的Column是足可以用來抓取剛才新增資料的唯一Where條件,不定義會預設為InfoCommand的KeyFields做為抓取ServerModify的鍵值條件,因此也可以不定義,如果遇到AutoNumber元件所編出來的資料,就可以用AutoNumber的欄位來取出ServerModify的資料。
F ServerModifyGetMax:同ServerModifyColumns,但此為了自增值所特殊設定的方式,就是自動取抓最大值(剛剛新增的資料其排序為最大之號碼)。因此在ServerModify重取資料時,會使用Max()的方式取出該自增值最大號碼來做為取出資料的Where條件。
Step2>將ucMaster的『ServerModify』設為【True】,『ServerModifyColumns』屬性【不必設定】。因為在此OrderID為自增值的欄位,因此必須使用設定『ServerModifyGetMax』為【True】,用來取出最大的OrderID。
圖
Step3>重新編譯S002項目。
Step4>打開C002的Form1設計畫面,確定以下幾個控制項的屬性:Master(InfoDataSet)的『ServerModify』應設為【True】,以使資料存檔成功後從Server端傳回資料並更新。
圖
Step5>另外檢查ibsMaster(InfoBindingSource)的『AutoApply』必須要【True】(一筆存檔一次)等。
圖
Step6>另外,為了在Master輸入完畢進入Detail輸入前就能對Master事先存檔,因此我們必須對ibsDetail(Detail的InfoBindingSource)的『AutoApplyMaster』設為【True】。
圖
這是因為如果讓Master/Detail一起存檔,由於Detail在Client端沒經過自增值的處理,就輸入Detail 資料是會讓Detail一起存入後端時成為孤兒或發生錯誤(OrderNo為空),因此必須在Detail輸入前讓Master先存檔,並以ServerModify取得OrderID後,再設定給Detail往下輸入。這是面臨Master/Detail中,為Master鍵值採用自增值的最好方案,否則無法讓User在輸入單據的過程中立即取得號碼。
Step7>把OrderID對應的InfoTextBox的『ReadOnly』屬性設為【True】。
圖
Step8>從ToolBox把一個DefaultValidate加入Form1,把『BindingSource』屬性設為【ibsMaster】,『DefaultActive』屬性設為【True】,『ValidActive』屬性設為【True】。
圖
Step9>點下FieldItems的,點下【Add】。『FieldName』設為【OrderID】,『CheckNull』設為【True】,『DefaultValue』設為【0】。
圖
設定此預設值為0,表示在新增一筆資料時,OrderID的預設為0。這是因為在Order資料表中,OrderID項目設定是不可為空值。所以我們新增前先給0,新增後OrderID項目自動會變成此項目的最大值,因為OrderID也有設定為“識別”,且識別值種子為1,識別值增量也為1。
下圖是用Enterprise Manager檢視資料表設計視窗:
圖
Step10>先重新建置C002專案,然後在EEPNetClient.EXE中打開C002表單。表單出現以後,我們按下「新增」按鈕,你會發現OrderID為ReadOnly,且預設為0。
圖
輸入完CustomerID與EmplyeeID,然後在Detail的InfoDataGridView中輸入資料。瞬間,因為Detail有設AutoApplyMaster,所以會觸發Master的Apply動作,並會在前後端發生ServerModify的反應,將此OrderID的號碼顯示在Client上,因此你在輸入Detail時,就可以看到最新的號碼已經在Detail中預設出來。
圖
在上例的Master自動存檔到A/P Server時,我們透過SQL Profiler來查看如圖中紅線內完成了一筆存檔。也可以看ServerModify與ServerModifyGetMax所另外下出來的SQL語法,請看下圖:
圖圖
圖
Related Topics