自動編號在應用軟體中扮演著非常重要的角色,主要是企業透過Internet建立單據的同時,勢必要維持單據編號的唯一性,是不可能由User自行來編,因此就需要使用AutoNumber元件在後端自動編出唯一的單據號碼;而自動序號AutoSeq元件則是使用在Client端中,讓User可以在Client端編出項次的序號,一般都應用在Master/Detail中的Detail GridView元件中。
q
設計一個新的Master/Detail
由於我們要設計一個自動編號的Master/Detail單據表單,因為Orders這個Table的OrderID使用Identify(自動遞增)的方式與我們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] 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.EXE的Data Dictionary中,去設定Purchases與Purchase Detail這兩個Table的資料字典。
圖
Step2>執行桌面上的『Solution1.sln』進入VS2019,在目錄EEPServer增加一個新Project,選SMasterDetail為範本。新增一個Project,『Name』命名為【S004】,『Location』設為【C:\ProgramFiles\InfoLight\EEP2019\Solution
圖
Step3>點兩下Component.cs,叫出設計畫面,先將infoConnection
的『ConnectionString』設為【ERPS】。
圖
Step4>再分別將Master和Detail(InfoCommand)的CommandText設定為Purchases和Purchase Details的SQL Command。
圖
圖
Step5>設定idsRelation(infoDataSource)將Master與Detail以PurchaseID關聯起來。
Step6>編譯S004。並將S004.dll加入到EEPNetServer的Package Manager中。
圖
Step7>在目錄EEPClient增加一個新Project,範本用CMasterDetail。『Name』命名為【C004】,『Location』設為【C:\ProgramFiles\InfoLight\EEP2019\Soultion1】。
Step8>點兩下Form1.cs叫出設計頁面。
先設定Master(InfoDataSet)的『RemoteName』為【S004.Master】,再把『Active』設為【True】,
接著將ibsMaster(InfoBindingSource)的『DataMember』設為【Master
Table】;
再將ibsDetail(InfoBindingSource)的『DataMember』設為【Relation1】(就是Detail的Relation Table)。
[訊光提示]
步驟Step1~Step8詳細設置方式,請參照《EEP2019快速入門(下)》。
Step9>點兩下Master,先在Options把『Horizontal
Columns』設為【2】,再把ShipName以前的欄位都拉到Form上,再將InfoDataGridView1(InfoDataGridView)的『DataSource』設定為【ibsDetail】(InfoBindingSource)。
圖
圖
Step10>請編譯C004,並在EEPManager.EXE中,執行『System』->『Security Manager』->『Menu Utility』中,增加此C004.dll於MENU當中。
圖
q
AutoNumber的設計
打開剛才做的S004項目,從Toolbox中選擇AutoNumber元件並貼入Component.cs的設計頁面中。
Step1>首先,要確認Active屬性為【True】,這樣自動編號元件才被開啟。然後透過下拉方式選擇UpdateComp,即代表要配合那一個UpdateComp在Insert時來執行AutoNumber動作,在這裏選擇【ucMaster】。這時,就可以透過下拉方式來選擇TargetColumn的自動編號欄位名稱,我們選欄位【PurchaseID】。
圖
注 意: 自動編號欄位只能是字串型態。 |
Step2>接著設定AutoNumber的各屬性,如下:
『AutoNoID』屬性:這是給自動編號機制命名。也就是說自動編號是會與SysAutoNum這個系統資料表配合使用,所有的單據號碼編到幾號都會記錄到SysAutoNum這個表中,因此AutoNumber這個元件就會以AutoNoID的屬性來對SysAutoNum個別隔離的編號處理。在此我們命名為【Purchase ID】。
『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>功能),在Dispose(bool disposing)下面與Component Designer generated code間,寫入程式。圖示如下:
圖
此段程式代表將取得“P”加上系統的日期做為前置碼,日期格式yyMMdd代表為西元年的年月日6碼,加上前面的“P”共有7碼前置碼,就是單據會以“P”加上日期來編號,相同日期就會續號,不同日期又會從1開始編號。
Step4>為了讓User可以在新增時立即可看到此自動編號,必須在Server端告訴系統Insert後必須要重新將資料Select出來,並傳回Client端讓User得以看見。因此,我們必須將ucMaster(UpdateComponent)『ServerModify』設為【True】。
圖
ServerModify不僅是Server端的設定,在Client端也是必須設定的,也就是說當User將資料Insert到Server端並重新Select傳回Client端後,Client也必須定義重新顯示Select的資料,此並不是重新讓InfoDataSet重新Active一次,因為這樣將會下載多餘的資料造成效能上的問題,因此ServerModify只會更換目前輸入的這筆資料。
Step5>打開Client端C004.From1.cs設計頁面。將Master(InfoDataSet)的『ServerModify』屬性設為【True】。
圖
另一個與ServerModify有關的元件就是InfoBindingSource的AutoApply屬性。因為AutoApply=True時,系統一次只送一筆Master與相對的Detail資料到Server端中,才能與後端ServerModify重新Select一筆Master的資料相對應,如果AutoApply=False,會一次新增多筆Master與Detail資料,就無法符合ServerModify的精神了,因此ServerModify必須搭配AutoApply=True才會生效。
Step6>因此,將ibsMaster的『AutoApply』設為【True】。
圖
Step7>為了讓自動編號(訂單號碼)不讓User輸入,並且讓User瞭解這個欄位是自動編號。
因此我們對「訂單號碼」的InfoTextBox設定『ReadOnly』設為【True】;在ToolBoxs中選擇貼入DefaultValidate元件,設定『BindingSource』為【ibsMaster】,『DefaultActive』設為【True】;在FieldItems中設定PurchaseID欄位的預設值為【自動編號】,好讓User瞭解該欄位為自動編號欄位。訂單號碼
圖
Step8>請編譯Server端的S004與Client端的C004兩個項目。
Step9>執行EEPNetClient.EXE,打開此C004表單。我們在Navigator上按下【新增】的功能,此時「訂單號碼」會出現【自動編號】的預設值,在「廠商號碼」與「員工號碼」中各輸入【1】的內容,按下【存檔】功能,即會存檔到後端中,並將新的編號透過ServerModify顯示在Client的表單上。如圖所示:
圖
Related Topics