第5章EEP 2019基礎設計(中)第5章EEP 2019基礎設計(中)\5-1自動編號(AutoNumber)

5-1自動編號AutoNumber

自動編號在應用軟體中扮演著非常重要的角色,主要是企業透過Internet建立單據的同時,勢必要維持單據編號的唯一性,是不可能由User自行來編,因此就需要使用AutoNumber元件在後端自動編出唯一的單據號碼;而自動序號AutoSeq元件則是使用在Client端中,讓User可以在Client端編出項次的序號,一般都應用在Master/Detail中的Detail GridView元件中。

 

 

q   設計一個新的Master/Detail

 

由於我們要設計一個自動編號的Master/Detail單據表單,因為Orders這個TableOrderID使用Identify自動遞增的方式與我們AutoNumber元件是衝突的,因此我們在Northwind這個資料庫中再新增另一組獨立Master/Detail Table來達到展示AutoNumber元件的目的。我們將建立PurchasesPurchases Details這兩個新Table,其結構如下:請用SQL Query Analyzer建立Table Schema

 

CREATE TABLE [Purchases] (

     [PurchaseID] [nchar] (10) NOT NULL ,

     [SupplierID] [int] NULL ,

     [EmployeeID] [int] NULL ,

     [PurchaseDate] [datetime] NULL ,

     [TotalAmount] [money] NULL ,

     [RequiredDate] [datetime] NULL ,

     [ShippedDate] [datetime] NULL ,

     [ShipVia] [int] NULL ,

     [Freight] [money] NULLCONSTRAINT [DF_Purchases_Freight] DEFAULT (0),

     [ShipName] [nvarchar] (40)  NULL ,

     [ShipAddress] [nvarchar] (60) NULL ,

     [ShipCity] [nvarchar] (15)  NULL ,

     [ShipRegion] [nvarchar] (15)  NULL ,

     [ShipPostalCode] [nvarchar] (10)  NULL ,

     [ShipCountry] [nvarchar] (15) NULL ,

     CONSTRAINT [PK_Purchases] PRIMARYKEYCLUSTERED

     (

            [PurchaseID]

     )  ON [PRIMARY] ,

) ON [PRIMARY]

GO

 

CREATETABLE [Purchase Details] (

     [PurchaseID] [nchar] (10) NOTNULL ,

     [ProductID] [int] NOTNULL ,

     [Seq] [nchar] (3) NOTNULL,

     [UnitPrice] [money] NOTNULLCONSTRAINT [DF_Purchase_Details_UnitPrice] DEFAULT (0),

     [Quantity] [smallint] NOTNULLCONSTRAINT [DF_Purchase_Details_Quantity] DEFAULT (1),

     [Discount] [real] NOTNULLCONSTRAINT [DF_Purchase_Details_Discount] DEFAULT (0),

     CONSTRAINT [PK_Purchase_Details] PRIMARYKEYCLUSTERED

     (

            [PurchaseID],

            [ProductID]

     )  ON [PRIMARY] ,

) ON [PRIMARY]

GO

 

Step1請進入EEPManager.EXEData Dictionary中,去設定PurchasesPurchase Detail這兩個Table的資料字典。


5-1-1設定PurchasesPurchase Orders的資料字典

Step2執行桌面上的Solution1.slnVS2019,在目錄EEPServer增加一個新ProjectSMasterDetail為範本。新增一個ProjectName命名為S004Location設為C:\ProgramFiles\InfoLight\EEP2019\Solution

5-1-2設定ServerProject的名稱與路徑

Step3點兩下Component.cs,叫出設計畫面,先將infoConnection ConnectionString設為ERPS

5-1-3設定infoConnection ConnectionString


Step4再分別將MasterDetailInfoCommandCommandText設定為PurchasesPurchase DetailsSQL Command


5-1-4設定PurchasesSQL語句

5-1-5設定PurchasesDetail SQL語句

 

Step5設定idsRelationinfoDataSourceMasterDetailPurchaseID關聯起來。

 

Step6編譯S004。並將S004.dll加入到EEPNetServerPackage Manager中。

5-1-6加入EEPNetServerPackage Manager

Step7在目錄EEPClient增加一個新Project,範本用CMasterDetailName命名為C004Location設為C:\ProgramFiles\InfoLight\EEP2019\Soultion1

 

Step8點兩下Form1.cs叫出設計頁面。

Œ    先設定MasterInfoDataSetRemoteNameS004.Master再把Active設為True

    接著將ibsMasterInfoBindingSource)的DataMember設為Master Table

Ž  再將ibsDetailInfoBindingSource)的DataMember設為Relation1(就是DetailRelation Table)。

[訊光提示]

步驟Step1~Step8詳細設置方式,請參照《EEP2019快速入門(下)》。

 

Step9點兩下Master,先在OptionsHorizontal Columns設為2,再把ShipName以前的欄位都拉到Form上,再將InfoDataGridView1InfoDataGridView)的DataSource設定為ibsDetailInfoBindingSource)。

 

5-1-7/1欄位拖位至FORM

5-1-7/2 設定InfoDataGridView1 DataSourcer

 

Step10請編譯C004,並在EEPManager.EXE中,執行System->Security Manager->Menu Utility中,增加此C004.dllMENU當中。

5-1-8添加C004.dll

 

 

q   AutoNumber的設計

 

打開剛才做的S004項目,從Toolbox中選擇AutoNumber元件並貼入Component.cs的設計頁面中。

Step1首先,要確認Active屬性為True,這樣自動編號元件才被開啟。然後透過下拉方式選擇UpdateComp,即代表要配合那一個UpdateCompInsert時來執行AutoNumber動作,在這裏選擇ucMaster。這時,就可以透過下拉方式來選擇TargetColumn的自動編號欄位名稱,我們選欄位PurchaseID

5-1-9開啟AutoNumber元件

 

注 意:

自動編號欄位只能是字串型態。

 

Step2接著設定AutoNumber的各屬性,如下:

Œ   AutoNoID屬性:這是給自動編號機制命名。也就是說自動編號是會與SysAutoNum這個系統資料表配合使用,所有的單據號碼編到幾號都會記錄到SysAutoNum這個表中,因此AutoNumber這個元件就會以AutoNoID的屬性來對SysAutoNum個別隔離的編號處理。在此我們命名為Purchase ID

   GetFixed屬性:則是自動編號設定前置碼。這裏可以直接用字串,也可以通過輸入函數名稱加括弧的方式來取得其他欄位做為動態前置碼,我們將其填入MyFixed(),代表要呼叫MyFixed()這個程式來取得前置碼。

Ž   NumDig屬性:用來是設置自動編號的位數。如果數值的位元不足時,系統會自動在前面補零,這裏設為3,會從001編到999

   StartValue屬性:是設置自動編號的起始值,即從幾開始編號。這裏設為1代表從1開始。

   Step屬性:每次編號時增加多少號,預設為1。則每次加1,如果設為2,則可以編出1357…等等。

‘   OverFlow屬性:是設定是否要處理溢位的情況。如果為True】,就會在編到999NumDig3)時,自動會編A00..A99B00…,編到Z時又會從a編到z”。因此會NumDig=3時,可以編出999+2600+2600=6199個編號。

’   Description屬性:給這項自動編號機制寫一些比較明確的說明。自動編號是會與SysAutoNum這個系統資料表配合使用,所有的單據號碼編到幾號都會記錄到SysAutoNum這個系統資料表中,而Description屬性的內容也會記錄在SysAutoNum這個系統資料表相對應的Description欄位。

5-1-10設定AutoNumber元件各屬性

 

接著,我們來設定MyFixed()的程式。

 

Step3打開程式編輯視窗(在Server頁面上按右鍵選<View Code>功能),在Disposebool disposing)下面與Component Designer generated code間,寫入程式。圖示如下:

5-1-11設定MyFixed()的程式

 

此段程式代表將取得“P”加上系統的日期做為前置碼,日期格式yyMMdd代表為西元年的年月日6碼,加上前面的“P”共有7碼前置碼,就是單據會以“P”加上日期來編號,相同日期就會續號,不同日期又會從1開始編號。

 

Step4為了讓User可以在新增時立即可看到此自動編號,必須在Server端告訴系統Insert後必須要重新將資料Select出來,並傳回Client端讓User得以看見。因此,我們必須將ucMasterUpdateComponent)『ServerModify設為True

 

5-1-12開啟ServerModify

ServerModify不僅是Server端的設定,在Client端也是必須設定的,也就是說當User將資料InsertServer端並重新Select傳回Client端後,Client也必須定義重新顯示Select的資料,此並不是重新讓InfoDataSet重新Active一次,因為這樣將會下載多餘的資料造成效能上的問題,因此ServerModify只會更換目前輸入的這筆資料。

 

Step5打開ClientC004.From1.cs設計頁面。將MasterInfoDataSetServerModify屬性設為True

5-1-12開啟Master(InfoDataSet)ServerModify

 

另一個與ServerModify有關的元件就是InfoBindingSourceAutoApply屬性。因為AutoApply=True時,系統一次只送一筆Master與相對的Detail資料到Server端中,才能與後端ServerModify重新Select一筆Master的資料相對應,如果AutoApply=False,會一次新增多筆MasterDetail資料,就無法符合ServerModify的精神了,因此ServerModify必須搭配AutoApply=True才會生效。

 

Step6因此,將ibsMasterAutoApply設為True

5-1-13開啟ibsMasterAutoApply

 

Step7為了讓自動編號(訂單號碼)不讓User輸入,並且讓User瞭解這個欄位是自動編號。

因此我們對「訂單號碼」的InfoTextBox設定ReadOnly設為True;在ToolBoxs中選擇貼入DefaultValidate元件,設定BindingSourceibsMasterDefaultActive設為True;在FieldItems中設定PurchaseID欄位的預設值為自動編號,好讓User瞭解該欄位為自動編號欄位。訂單號碼



5-1-14設置「訂單號碼」欄位為自動編號欄位

 

Step8請編譯Server端的S004Client端的C004兩個項目。

 

Step9執行EEPNetClient.EXE,打開此C004表單。我們在Navigator上按下新增的功能,此時「訂單號碼」會出現自動編號的預設值,在「廠商號碼」與「員工號碼」中各輸入1的內容,按下存檔功能,即會存檔到後端中,並將新的編號透過ServerModify顯示在Client的表單上。如圖所示:

5-1-15自動產生訂單編號



 

 

Top of Page