要如何自動產生編號 |
答題得分者是:asupeduer
|
BOSS
中階會員 發表:70 回覆:79 積分:64 註冊:2006-11-01 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
BOSS
中階會員 發表:70 回覆:79 積分:64 註冊:2006-11-01 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
|
longjibo
一般會員 發表:18 回覆:18 積分:12 註冊:2002-11-08 發送簡訊給我 |
|
asupeduer
初階會員 發表:36 回覆:49 積分:27 註冊:2002-11-08 發送簡訊給我 |
HI BOSS
我以前也試過在前端寫自動編號,但是後來還是覺得寫在trigger是最好的方法,
一般除了編號一欄,應該還要有一欄紀錄流水編號(請採用自動編號),這樣的處理方式會比較有條理
例如:
法人客戶P,自然人客戶C
男性為1,女性為0
客戶等級A,B,C,D......
如一男性自然人A級客戶加入會員時間為2003/1/2
而加入時,流水編號(自動編號欄位)已經跳到12089
就要編成
C1A12089-0301
法人,男性,A級客戶,流水編號12089,-,西元03年01月 當然,要怎麼編是你的自由,僅把寫過的兩個trigger分享給你 一個是客戶編號,一個是訂單編號
--@@@@@@@@@@@@@@@@@@@@@@@
--客戶編號觸發程序
--登記使用CursL(使用cursor的原因是因為如果一次插入才不會產生錯誤)
--測試完畢2002/11/3
--@@@@@@@@@@@@@@@@@@@@@@@ CREATE TRIGGER [Customer_AssignNumber] ON dbo.Customer
After Insert
AS Print '資料表Orders巢狀觸發程序Auto_assign_number(自動編號)'
Declare CursL Cursor For Select PorC,Sexs,NumIdnt,EnterDate From Inserted
Declare @PorC bit,
@Sexs bit ,
@NumIdnt int,
@EnterDate datetime,
@Month char(2),
@NSexs char(1),
@NPorC char(1)
Open CursL Fetch Next From CursL Into @PorC,@Sexs,@NumIdnt,@EnterDate While @@Fetch_Status = 0
BEGIN--While迴圈
--判斷月份是否為雙位數,
IF (Datepart (month,(@EnterDate)) < 10)
Begin
SET @Month='0' Cast(Datepart (Month,(@EnterDate)) as char(1))--單月份改為雙碼
End
ELSE
Begin
SET @Month=Cast(Datepart (Month,(@EnterDate)) as char(2))--雙月份
End
--判斷公司或法人
IF @PorC=0
Begin
SET @NPorC='P'---------自然人
End
ELSE
Begin
SET @NPorC='C'---------法人
End
--判斷性別
IF @Sexs=1
Begin
SET @NSexs='1'---------男生
End
ELSE
Begin
SET @NSexs='2'---------女生
End --開始重新編號
Update Customer
Set Customer_Number=@NPorC @NSexs Cast(@NumIdnt as nvarchar(6)) Cast(Right(Datepart (Year,@EnterDate),2) as char(2)) @Month
Where NumIdnt=@NumIdnt
--下一筆
Fetch Next From CursL Into @PorC,@Sexs,@NumIdnt,@EnterDate
End--While迴圈
Close CursL
Deallocate CursL --@@@@@@@@@@@@@@@@@@@@@@@
--依據訂單種類產生編號的觸發程序
--登記使用CursK
--測試完畢2002/11/3
--@@@@@@@@@@@@@@@@@@@@@@@ CREATE TRIGGER [Auto_assign_number] ON dbo.Orders
After Insert
AS
Print '資料表Orders巢狀觸發程序Auto_assign_number(自動編號)'
Declare CursK Cursor For Select Serial_Number,OrderDate,Products_Kind From Inserted
Declare @Serial_Number Bigint,
@OrderDate DateTime ,
@Products_Kind tinyint,
@Month char(2),
@BOP char(1)
Open CursK Fetch Next From CursK Into @Serial_Number,@OrderDate,@Products_Kind While @@Fetch_Status = 0
BEGIN--While迴圈
--判斷月份是否為雙位數,
IF (Datepart (month,(@OrderDate)) < 10)
Begin
SET @Month='0' Cast(Datepart (Month,(@OrderDate)) as char(1))
End
ELSE
Begin
SET @Month=Cast(Datepart (Month,(@OrderDate)) as char(2))
End
--判斷作品或期刊
IF @Products_Kind=1
Begin
SET @BOP='B'----------------------------------------------
End
ELSE IF @Products_Kind=2
Begin
SET @BOP='I'----------------------------------------------
End
ELSE IF @Products_Kind=3
Begin
SET @BOP='T'----------------------------------------------
End
ELSE IF @Products_Kind=4
Begin
SET @BOP='P'----------------------------------------------
End
ELSE IF @Products_Kind=5
Begin
SET @BOP='H'----------------------------------------------
End
ELSE IF @Products_Kind=6
Begin
SET @BOP='O'----------------------------------------------
End
ELSE
Begin
SET @BOP='S'----------------------------------------------
End
--開始重新編號
Update Orders
Set Order_ID=@BOP Cast(@Serial_Number as nvarchar(9)) '-' Cast(Right(Datepart (Year,@OrderDate),2) as char(2)) @Month
Where Serial_Number=@Serial_Number
--下一筆
Fetch Next From CursK Into @Serial_Number,@OrderDate,@Products_Kind
End--While迴圈
Close CursK
Deallocate CursK //------------------------------------------------
我常在想,寫程式跟爬格子到底有什麼不同呢???????????
//------------------------------------------------
------
//------------------------------------------------ 我常在想,寫程式跟爬格子到底有什麼不同呢??????????? //------------------------------------------------ |
asupeduer
初階會員 發表:36 回覆:49 積分:27 註冊:2002-11-08 發送簡訊給我 |
補充說明︰ 因為必須先讓一筆資料插入之後,才能取得流水編號(自動編號)的值
所以你在你要採取自定編號的欄位,應該先行填入一個值,但這個值
又不能是自動編號的型態(必須使用nvarchar(i)),但是我把該欄位訂為索引,
在不能重複值的情況下,我就想了一個辦法︰
讓那一個欄位的預設值用rand*1000(亂數),讓插入資料時可以順利插入,
等插入後,取得流水編號,再來將你要的編號欄位update... 這方法不錯吧 //------------------------------------------------
我常在想,寫程式跟爬格子到底有什麼不同呢???????????
//------------------------------------------------
------
//------------------------------------------------ 我常在想,寫程式跟爬格子到底有什麼不同呢??????????? //------------------------------------------------ |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
個人看法:
Trigger Object 較適合 Implement,如 :
● Master/Detail 結構,位於 Master之"總計"欄
● 資料關聯(如訂單之客戶代號必須存在於客戶基本檔)
也就是說'純'於 DataBase Server 處理 針對自動編號, 因須與 Client Transaction (新單號),建議用
Store Procedure 較為明確, 做法程序如下:
1. Create 自動編號 Store Procedure with 新單號 output parameter.
2. OnNewRecord Event on dataset 時呼叫該 Store Procedure ,取得新單號,
馬上 Append/Post 再呼叫 Dataset.Edit Method
(避免 Multi User 可能造成單號重複)
如果 Client 可以接受新增編輯時,不顯示單號,用 Trigger Implement
也是不錯的選擇(因為可'純'於 DataBase Server 處理) 發表人 - Mickey 於 2002/12/16 10:38:31
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |