線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2126
推到 Plurk!
推到 Facebook!

要如何自動產生編號

答題得分者是:asupeduer
BOSS
中階會員


發表:70
回覆:79
積分:64
註冊:2006-11-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-13 19:03:06 IP:210.85.xxx.xxx 未訂閱
請問各位高手 我想在table寫一個trigger(ms sql) 程式與table做連結時,當我按下新增鈕會自動產生一筆訂單編號 請問要如何寫
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-13 19:10:19 IP:202.39.xxx.xxx 未訂閱
該欄位型態設為自動編號    -- Everything I say is a lie.
BOSS
中階會員


發表:70
回覆:79
積分:64
註冊:2006-11-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-13 19:24:48 IP:210.85.xxx.xxx 未訂閱
那並不是我想要的 我想要的是能產生1001這種編號
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-13 19:39:09 IP:202.39.xxx.xxx 未訂閱
在 OnNewRecord 事件中, 依您的公式指定該自動編號欄位的值    -- Everything I say is a lie.
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-13 20:24:02 IP:163.15.xxx.xxx 未訂閱
頭家你好:    
引言: 在 OnNewRecord 事件中, 依您的公式指定該自動編號欄位的值
用時間來做編號保證不會重複 str:='no' datetimetostr(now()); 除非...系統時間常常變
------
======================
昏睡~
不昏睡~
不由昏睡~
longjibo
一般會員


發表:18
回覆:18
積分:12
註冊:2002-11-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-14 08:20:51 IP:218.16.xxx.xxx 未訂閱
//我想要的是能產生1001這種編號 用一個表專門來存放類型您所說的表的編號 如:TABLE_CODE表(table_name,curcode) PO 0001 DN 0005 在調用TRIGGER時,只需按你目前用的表讀取TABLE╴CODE的CURCODE值 1 即可!
asupeduer
初階會員


發表:36
回覆:49
積分:27
註冊:2002-11-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-14 11:18:39 IP:61.13.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-14 11:30:56 IP:61.13.xxx.xxx 未訂閱
補充說明︰ 因為必須先讓一筆資料插入之後,才能取得流水編號(自動編號)的值 所以你在你要採取自定編號的欄位,應該先行填入一個值,但這個值 又不能是自動編號的型態(必須使用nvarchar(i)),但是我把該欄位訂為索引, 在不能重複值的情況下,我就想了一個辦法︰ 讓那一個欄位的預設值用rand*1000(亂數),讓插入資料時可以順利插入, 等插入後,取得流水編號,再來將你要的編號欄位update... 這方法不錯吧 //------------------------------------------------ 我常在想,寫程式跟爬格子到底有什麼不同呢??????????? //------------------------------------------------
------
//------------------------------------------------
我常在想,寫程式跟爬格子到底有什麼不同呢???????????
//------------------------------------------------
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-12-16 10:20:30 IP:61.219.xxx.xxx 未訂閱
個人看法: 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
系統時間:2024-11-22 20:03:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!