寫一個生成永不重復的單號的函數? |
答題得分者是:Justmade
|
hua2000
中階會員 ![]() ![]() ![]() 發表:102 回覆:200 積分:65 註冊:2006-11-04 發送簡訊給我 |
|
wnhoo
高階會員 ![]() ![]() ![]() ![]() 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
你可以这样实现:
2个EDIT1中字符+datettimetostr(当前的日期、时间)+不重复的字符代码 其中前2个都好实现,关键是第三个;我们可以取当前机器的MAC等方式地址
下面我给你个取MAC的函数。 function GetPhysicalAddress: string;
Var
NCB : TNCB;
ADAPTER : TADAPTERSTATUS;
LANAENUM : TLANAENUM;
intIdx : Integer;
re : Char;
buf : String;
mm:string[20]; begin
Try
// Reset adapter
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[0];//important
re := NetBios(@NCB);
If Ord(re)<>0 Then
begin
Result := '';
exit;
end;
// Get adapter address
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[0];////bowman
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER.adapter_address[0];
NCB.ncb_length := SizeOf(ADAPTER);
re := NetBios(@NCB);
If Ord(re)<>0 Then
exit;
buf := '';
For intIdx := 0 To 5 Do
buf := buf + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);
mm := copy(buf,0,length(buf));
finally
// freemem(@NCB,SizeOf(NCB)); result:=mm;
end;
end; 风花雪月 e梦情缘
------
风花雪月 e梦情缘 |
cmj
高階會員 ![]() ![]() ![]() ![]() 發表:15 回覆:242 積分:226 註冊:2002-06-12 發送簡訊給我 |
|
Justmade
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
其實日期時間不一定要以標準的年月日時分秒來表達,直接以數值來處理可節省位數和加強精準度 例如以數值來表達 time 部份 : 可用
Format('%5.5d',[Round(Frac(Now) * 100000)])
這樣就可節省一個位 (由六位變五位) 及使精準度提升到 0.86 秒 (每0.86秒數值加一)。 若想進一步提升精準度,可以加一位 :
Format('%6.6d',[Round(Frac(Now) * 1000000)]);
這樣使用與hhnnss同一位數但精準度提升到 0.086 秒,重覆的機率比用 hhnnss 改善 11.6 偣。 若日期也可接受類似方法,可進一步淢少位數,用5 個位可使用27年 (如 2003 到 2030)若使用6 個位則可使用 270 年。但由於不能直接看出日期,所以使用 yymmdd (6 個位可使用 99 年)仍是不錯的選擇。 不過無論精準多高也是有可能重覆的,所以要安全的方法還是到數據庫伺服器取碼的好。
|
Mickey
版主 ![]() ![]() ![]() ![]() ![]() 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
除上面幾位前輩所提供的方法外,
如果是 MSSQL 或 Sybase 也可考慮運用 "Timestamp" 資料型別 :
timestamp 是顯露自動產生的二位元數字的資料型別,它保證在資料庫中為唯一的。timestamp 通常用於版本戳記資料表資料列的機制。儲存大小為 8 位元組。 一個資料表只可以有一個 timestamp 資料行。每次插入或更新包含 timestamp 資料行的資料列時,便會更新 timestamp 資料行中的值。此特性使 timestamp 資料行不適合作為索引鍵,尤其是作為主索引鍵。任何對資料列的更新都會變更 timestamp 值,然後變更索引鍵值。
|
hua2000
中階會員 ![]() ![]() ![]() 發表:102 回覆:200 積分:65 註冊:2006-11-04 發送簡訊給我 |
引言: 其實日期時間不一定要以標準的年月日時分秒來表達,直接以數值來處理可節省位數和加強精準度 例如以數值來表達 time 部份 : 可用 Format('%5.5d',[Round(Frac(Now) * 100000)]) 這樣就可節省一個位 (由六位變五位) 及使精準度提升到 0.86 秒 (每0.86秒數值加一)。 若想進一步提升精準度,可以加一位 : Format('%6.6d',[Round(Frac(Now) * 1000000)]); 這樣使用與hhnnss同一位數但精準度提升到 0.086 秒,重覆的機率比用 hhnnss 改善 11.6 偣。 若日期也可接受類似方法,可進一步淢少位數,用5 個位可使用27年 (如 2003 到 2030)若使用6 個位則可使用 270 年。但由於不能直接看出日期,所以使用 yymmdd (6 個位可使用 99 年)仍是不錯的選擇。 不過無論精準多高也是有可能重覆的,所以要安全的方法還是到數據庫伺服器取碼的好。如果想得到永不重復的單號的話,如何向數據庫何去何從服器取碼并產生新號呀? 想通過一個按鈕”新單“來APPEND主從表數據的同時,產生一個不重復的單號顯示在dbtext1中。現在的我用的方法有點兒象Justmade上面的方法,但總是會有重復的機會的。且此一個程式是給好些人用的,好些人都要用它要開單且打印。 IMPROVE FOREVER |
hua2000
中階會員 ![]() ![]() ![]() 發表:102 回覆:200 積分:65 註冊:2006-11-04 發送簡訊給我 |
引言:IMPROVE FOREVER引言: 其實日期時間不一定要以標準的年月日時分秒來表達,直接以數值來處理可節省位數和加強精準度 例如以數值來表達 time 部份 : 可用 Format('%5.5d',[Round(Frac(Now) * 100000)]) 這樣就可節省一個位 (由六位變五位) 及使精準度提升到 0.86 秒 (每0.86秒數值加一)。 若想進一步提升精準度,可以加一位 : Format('%6.6d',[Round(Frac(Now) * 1000000)]); 這樣使用與hhnnss同一位數但精準度提升到 0.086 秒,重覆的機率比用 hhnnss 改善 11.6 偣。 若日期也可接受類似方法,可進一步淢少位數,用5 個位可使用27年 (如 2003 到 2030)若使用6 個位則可使用 270 年。但由於不能直接看出日期,所以使用 yymmdd (6 個位可使用 99 年)仍是不錯的選擇。 不過無論精準多高也是有可能重覆的,所以要安全的方法還是到數據庫伺服器取碼的好。如果想得到永不重復的單號的話,如何向數據庫何去何從服器取碼并產生新號呀?能不能給我一些關鍵的代碼呀?(我通過Tadodataset來連接Tadoconnect來存入或獲取數據的) 想通過一個按鈕”新單“來APPEND主從表數據的同時,產生一個不重復的單號顯示在dbtext1中。現在的我用的方法有點兒象Justmade上面的方法,但總是會有重復的機會的。且此一個程式是給好些人用的,好些人都要用它要開單且打印。 IMPROVE FOREVER |
hua2000
中階會員 ![]() ![]() ![]() 發表:102 回覆:200 積分:65 註冊:2006-11-04 發送簡訊給我 |
引言: 除上面幾位前輩所提供的方法外, 如果是 MSSQL 或 Sybase 也可考慮運用 "Timestamp" 資料型別 : timestamp 是顯露自動產生的二位元數字的資料型別,它保證在資料庫中為唯一的。timestamp 通常用於版本戳記資料表資料列的機制。儲存大小為 8 位元組。 一個資料表只可以有一個 timestamp 資料行。每次插入或更新包含 timestamp 資料行的資料列時,便會更新 timestamp 資料行中的值。此特性使 timestamp 資料行不適合作為索引鍵,尤其是作為主索引鍵。任何對資料列的更新都會變更 timestamp 值,然後變更索引鍵值。我試了一下這個timestamp,發現我設它為非空字段,不輸入任何數據,仍能向其它字段加入數據,真是好用,但我想查看其數據,為什麼看不到呀? 它能作為我的detail表中的detail表與主表的關聯字段嗎?(ORACLE有沒有這個特征呀?) IMPROVE FOREVER |
Justmade
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
Mickey
版主 ![]() ![]() ![]() ![]() ![]() 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
Oracle 有類似的隱含欄位 ROWID, 節錄其說明文件 : rowids,ROWID pseudocolumn and ROWID datatype Every row in a nonclustered table of an Oracle database is assigned
a unique rowid that corresponds to the physical address of a row’s
row piece (or the initial row piece if the row is chained among
multiple row pieces). Each table in an Oracle database has an internal pseudo-column
named ROWID. This pseudocolumn is not evident when listing the
structure of a table by executing a SELECT statement, or a
DESCRIBE statement using SQL*Plus, but can be retrieved with a
SQL query using the reserved word ROWID as a column name. rowids use a binary representation of the physical address for each
row selected. A rowid’s VARCHAR2 hexadecimal representation is
divided into three pieces: block.slot.file. Here, block is the data
block within a file that contains the row, relative to its datafile; row
is the row in the block; and file is the datafile that contains the row.
A row’s assigned ROWID remains unchanged usually. Exceptions
occur when the row is exported and imported (using the Import
and Export utilities). When a row is deleted from a table (and the
encompassing transaction is committed), the deleted row’s
associated ROWID can be assigned to a row inserted in a
subsequent transaction.
|
cmj
高階會員 ![]() ![]() ![]() ![]() 發表:15 回覆:242 積分:226 註冊:2002-06-12 發送簡訊給我 |
系統提供多人同時使用,在同時新增時如何自動產生不重覆單號,這應該是你的訴求,這是一個觀念問題. 我提供個人經驗參考看看. 1.假設單號格式YYYYMMDD999 西元年月日 3碼流水號如 20030501001 2.如何產生不重覆單號,應是在存檔前取輸入日期的最大單號加一,再存入這樣就 不會有單號重覆問題,所以單號不是在新增帑存檔前知道,而是在存檔後才知道 3.若有主檔,明細檔結構,先新增存入主檔以產生單號也就是主檔已有記錄,再編 輯明細檔. 4.至於單號可以是一個欄位 OR 分日期,序號兩個欄位. |
longsanglin
初階會員 ![]() ![]() 發表:10 回覆:57 積分:43 註冊:2002-04-23 發送簡訊給我 |
|
hua2000
中階會員 ![]() ![]() ![]() 發表:102 回覆:200 積分:65 註冊:2006-11-04 發送簡訊給我 |
|
Mickey
版主 ![]() ![]() ![]() ![]() ![]() 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
hua2000
中階會員 ![]() ![]() ![]() 發表:102 回覆:200 積分:65 註冊:2006-11-04 發送簡訊給我 |
|
wnhoo
高階會員 ![]() ![]() ![]() ![]() 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
var
I:double;
isok:boolean;
begin
isok:=true;
Randomize;
while isok do
begin
try
i:=round(Random*strtofloat(formatdatetime('yyyymmdd',now)));
adodataset1.Edit ;
adodataset1.Append ;
adodataset1.FieldByName('bianhao').AsString :=floattostr(i)+FormatDateTime('YYYY:MM:DD_HH:MM',Now);
adodataset1.Post ;
isok:=false;
except
adodataset1.Cancel ;
isok:=true;
end; end;
end; 风花雪月 e梦情缘
------
风花雪月 e梦情缘 |
hua2000
中階會員 ![]() ![]() ![]() 發表:102 回覆:200 積分:65 註冊:2006-11-04 發送簡訊給我 |
引言: var I:double; isok:boolean; begin isok:=true; Randomize; while isok do begin try i:=round(Random*strtofloat(formatdatetime('yyyymmdd',now))); adodataset1.Edit ; adodataset1.Append ; adodataset1.FieldByName('bianhao').AsString :=floattostr(i) FormatDateTime('YYYY:MM:DD_HH:MM',Now); adodataset1.Post ; isok:=false; except adodataset1.Cancel ; isok:=true; end; end; end; 风花雪月 e梦情缘在網上也看了一些關于隨機數的例子,聽它們講,它的重復的機會好高的喲! |
Terran_sigh
一般會員 ![]() ![]() 發表:1 回覆:1 積分:0 註冊:2003-05-10 發送簡訊給我 |
|
japhenchen
高階會員 ![]() ![]() ![]() ![]() 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |