自動編號在應用軟體中扮演著非常重要的角色,主要是企業透過Internet建立單據的同時,勢必要維持單據編號的唯一性,是不可能由User自行來編,因此就需要使用AutoNumber元件在後端自動編出唯一的單據號碼;而自動序號RWDAutoSeq元件則是使用在Client端中,讓User可以在Client端編出項次的序號,一般都應用在Master/Detail中的Detail DataGrid元件中。
q
設計一個新的Master/Detail
由於我們要設計一個自動編號的Master/Detail單據表單,因為Orders這個Table的OrderID使用Identity(自動遞增)的方式與我們AutoNumber元件是衝突的,因此我們在Northwind這個資料庫中再新增另一組獨立Master/Detail Table來達到展示AutoNumber元件的目的。我們將建立Purchases與Purchases 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] NULL
CONSTRAINT [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] PRIMARY KEY CLUSTERED
(
[PurchaseID]
) ON [PRIMARY] ,
) ON [PRIMARY]
GO
CREATE TABLE
[Purchase Details] (
[PurchaseID] [nchar] (10) NOT NULL ,
[ProductID] [int] NOT
NULL ,
[Seq] [nchar] (3) NOT
NULL,
[UnitPrice] [money] NOT
NULL CONSTRAINT
[DF_Purchase_Details_UnitPrice] DEFAULT (0),
[Quantity] [smallint] NOT NULL CONSTRAINT
[DF_Purchase_Details_Quantity] DEFAULT (1),
[Discount] [real] NOT
NULL CONSTRAINT
[DF_Purchase_Details_Discount] DEFAULT (0),
CONSTRAINT
[PK_Purchase_Details] PRIMARY KEY CLUSTERED
(
[PurchaseID],
[ProductID]
) ON [PRIMARY] ,
) ON [PRIMARY]
GO
首先在EEP中使用Wizard產生一個採購表的Server端(Model),sPurchases為模組名稱(會被Build成sPurchases.DLL)。
q AutoNumber的設計
打開剛才做的sPurchases項目,從Toolbox中選擇AutoNumber元件並貼入Component.cs的設計頁面中。
Step1> 首先,要確認Active屬性為【True】,這樣自動編號元件才被開啟。然後透過下拉方式選擇UpdateComp,即代表要配合那一個UpdateComp在Insert時來執行AutoNumber動作,在這裡選擇【ucPurchases】。這時,就可以透過下拉方式來選擇TargetColumn的自動編號欄位名稱,我們選欄位【PurchaseID】。
Step2> 接著設定AutoNumber的各屬性,如下:
『AutoNoID』屬性:這是給自動編號機制命名。也就是說自動編號是會與SysAutoNum這個系統資料表配合使用,所有的單據號碼編到幾號都會記錄到SysAutoNum這個表中,因此AutoNumber這個元件就會以AutoNoID的屬性來對SysAutoNum個別隔離的編號處理。在此我們命名為【PurchaseID】。
『GetFixed』屬性:則是自動編號設定前置碼。這裡可以直接用字串,也可以通過輸入函數名稱加括弧的方式來取得其他欄位做為動態前置碼,我們將其填入【MyFixed()】,代表要呼叫MyFixed()這個程式來取得前置碼。
『NumDig』屬性:用來是設置自動編號的位數。如果數值的位元不足時,系統會自動在前面補零,這裡設為【3】,會從“
『StartValue』屬性:是設置自動編號的起始值,即從幾開始編號。這裡設為【1】代表從1開始。
『Step』屬性:每次編號時增加多少號,預設為【1】。則每次加1,如果設為2,則可以編出1,3,5,7…等等。
『OverFlow』屬性:是設定是否要處理溢位的情況。如果為【True】,就會在編到999(NumDig=3)時,自動會編A00..A99,B00…,編到“Z”時又會從“a”編到“z”。因此會NumDig=3時,可以編出999+2600+2600=6199個編號。
『Description』屬性:給這項自動編號機制寫一些比較明確的說明。自動編號是會與SysAutoNum這個系統資料表配合使用,所有的單據號碼編到幾號都會記錄到SysAutoNum這個系統資料表中,而Description屬性的內容也會記錄在SysAutoNum這個系統資料表相對應的Description欄位。
接著,我們來設定MyFixed()的程式。
Step3> 打開程式編輯視窗(在Server頁面上按右鍵選<View Code>檢視程式碼功能),在下面位置中,寫入程式。圖示如下:
此段程式代表將取得“P”加上系統的日期做為前置碼,日期格式yyMMdd代表為西元年的年月日6碼,加上前面的“P”共有7碼前置碼,就是單據會以“P”加上日期來編號,相同日期就會續號,不同日期又會從1開始編號。
Step4> 通過Wizard重新製作一個rPurchases的畫面。
Step5> 將dfMaster元件拖拉至RWDTabItem1中、dgDetail元件拖拉至RWDTabItem2中。
Step6> 從工具箱裡拖拉一個RWDDefault元件至RWDTabItem1中。
Step7>設定BindingObjectID屬性為dfMaster(若下拉選不到可以用手打的方式,因為被包在Tab元件中導致無法讀取)。點擊Columns屬性,添加一個PurchaseID欄位的預設值,DefaultType為Constant(固定值),DefaultValue為自動編號。
Step8> 在EEPManager上添加Purchase的選單項並設定權限。
最後,運行一下畫面,新增一筆資料。
Related Topics