全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1229
推到 Plurk!
推到 Facebook!

DBEdit如何自定資料格式序號

尚未結案
maloneliin
一般會員


發表:3
回覆:10
積分:2
註冊:2003-03-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-28 16:25:42 IP:61.220.xxx.xxx 未訂閱
請問各位大大: 我使用一個DBEdit呈現資料庫的bus_no主鍵,這一個dbedit不讓使用者輸入,序號為資料庫自動產生,他的格式為(系統時間 序號),例今天第一筆為2003032801,第二筆為2003032802,第三筆為2003032803....明天第一筆為2003032901,第二筆為2003032902,第三筆為2003032903....請問各位要如要撰寫...
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-28 16:30:30 IP:61.217.xxx.xxx 未訂閱
1.OnNewRecord時去Select MAX(bus_no).. 2.MAX(bus_no)跟系統日比對是否為同一天,如果同一天就最後兩碼 1,如果不同天,則為系統日期 '01' TRY TRY SEE 發表人 - chih 於 2003/03/28 16:31:55
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-28 16:37:49 IP:61.220.xxx.xxx 未訂閱
你可以寫一個function,參數傳入當日日期 利用此日期去下sql把當日最大的序號找出來 如果沒有 則 (日期+'01') 如果有 則 (最大的序號+1); 下面是我節錄我開發專案內剛好用到的一段 內容你參考看看 如果你可以了解且符合你的需求 稍微修改一下即可 舉例 :(MSSQL)

function TfrmM0AllowType._getRfNo(Bus_date: String): String;
  var
    FakeQ : TQuery ;
begin
  FakeQ := TQuery.Create(nil);
  FakeQ.DatabaseName := 'DB';
  FakeQ.SessionName := DM.Database1.SessionName;
  with FakeQ do
  begin
    Close;
    SQL.Clear;
    SQL.Add(' select max(convert(int,substring(RFNO,9,2))) as myvalue from REFUND_M ');
    SQL.Add(' where substring(RFNO,1,8) = :SKEY');
    ParamByName('SKEY').AsString := Bus_date; //ex: 20030328
    Open;
  end;//with
  if FakeQ.IsEmpty then Result := Bus_date '01'  //<- 第一筆
  else
    Result := Bus_date _AddZero(IntToStr(FakeQ.FieldByName('myvalue').AsInteger 1),2);
end;    
PS: _AddZero 是不足位補0的function 天行健 君子當自強不息~~@.@ 發表人 - t.j.b 於 2003/03/28 17:05:50 發表人 - t.j.b 於 2003/03/28 17:21:34
------
天行健
君子當自強不息~~@.@
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-28 16:40:44 IP:211.21.xxx.xxx 未訂閱
引言: 請問各位大大: 我使用一個DBEdit呈現資料庫的bus_no主鍵,這一個dbedit不讓使用者輸入,序號為資料庫自動產生,他的格式為(系統時間 序號),例今天第一筆為2003032801,第二筆為2003032802,第三筆為2003032803....明天第一筆為2003032901,第二筆為2003032902,第三筆為2003032903....請問各位要如要撰寫...
使用TQuery下SQL語法取得最大號 在存檔鈕或新增鈕(依您的程式而定)寫:
var
  aBus_No: String;//取得目前的編號
with Query1 do
begin
  Close;
  SQL.Clear;
  SQL.Add('Select Max(Bus_No) MaxNo From TalbeName Where Bus_No like ' #39 FormatDateTime('YYYYMMDD',Date) '%' #39);
  Open;
  if FieldByName('MaxNo').AsString <> '' then
    aBus_No := FormatDateTime('YYYYMMDD',Date) FormatFloat('00',StrToInt(Copy(FieldByName('MaxNo').AsString,9,2)) 1)
  else
    aBus_No := FormatDateTime('YYYYMMDD',Date) '01';
end;
這樣應該就可以了! ~小弟淺見,參考看看~ 發表人 - channel 於 2003/03/28 16:43:48
------
~小弟淺見,參考看看~
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-28 21:40:50 IP:61.221.xxx.xxx 未訂閱
引言: 我使用一個DBEdit呈現資料庫的bus_no主鍵,這一個dbedit不讓使用者輸入,序號為資料庫自動產生,他的格式為(系統時間 序號),例今天第一筆為2003032801,第二筆為2003032802,第三筆為2003032803....明天第一筆為2003032901,第二筆為2003032902,第三筆為2003032903....請問各位要如要撰寫...
假設你的table name 為 table1 你可以使用以下語法取得序號: (以MSSQL語法為例)
若 bus_no 為 varchar(10)
select 
case 
  when left(max(bus_no),8) = convert(varchar, getdate(), 112) then convert(varchar, convert( int, max(bus_no)) + 1)
  else  convert(varchar, getdate(), 112) + '01' 
end
from table1    修改你的 UpdateSQL component 中的 insert 為:    insert into table1
(bus_no, v1, v2, v3)
values
(
select 
case 
  when left(max(bus_no),8) = convert(varchar, getdate(), 112) then convert(varchar, convert( int, max(bus_no)) + 1)
  else  convert(varchar, getdate(), 112) + '01' 
end
from table1,
:v1, :v2, :v3
)
若 bus_no 為 int 時, 則使用:
select 
case 
  when left(convert(varchar,max(bus_no)),8) = convert(varchar, getdate(), 112) then max(bus_no) + 1
  else  convert(int, convert(varchar, getdate(), 112) + '01' )
end
from table1
修改 UpdateSQL 的方式相同..
發表人 - timhuang 於 2003/03/28 21:49:15
maloneliin
一般會員


發表:3
回覆:10
積分:2
註冊:2003-03-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-31 11:53:04 IP:61.220.xxx.xxx 未訂閱
請問這一段程式是寫在哪一個元件的Event中...
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-31 11:57:14 IP:211.21.xxx.xxx 未訂閱
引言: 請問這一段程式是寫在哪一個元件的Event中...
依照您的需求而定,一般是寫在 TQuery(TTable)的OnNewRecord事件或BeforePost事件 ~小弟淺見,參考看看~ 發表人 - channel 於 2003/03/31 13:10:47
------
~小弟淺見,參考看看~
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-31 12:20:38 IP:211.76.xxx.xxx 未訂閱
引言: 請問這一段程式是寫在哪一個元件的Event中...
看你的程式結構而定. 若是你是使用 BDE 的 TQuery 搭配 TUpdateSQL 來 使用的話, 你可以在 UpdateSQL 元件中的 insertSQL 中的 command 來進行修改即可. 不須考慮 event. 不過若是自行下 command 至 database 時, 則要看你的 需求而定了.
maloneliin
一般會員


發表:3
回覆:10
積分:2
註冊:2003-03-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-31 18:40:48 IP:61.220.xxx.xxx 未訂閱
謝謝版主的回覆 : 我有一個疑問就是此段function該寫在哪?? 我的TABLE名稱為business,需要改哪裡呢?? 我是初學者這段程式看不太懂...=.= 麻煩妳可以註明一下嗎??謝謝...    
引言: 你可以寫一個function,參數傳入當日日期 利用此日期去下sql把當日最大的序號找出來 如果沒有 則 (日期 '01') 如果有 則 (最大的序號 1); 下面是我節錄我開發專案內剛好用到的一段 內容你參考看看 如果你可以了解且符合你的需求 稍微修改一下即可 舉例 :(MSSQL)

function TfrmM0AllowType._getRfNo(Bus_date: String): String;
  var
    FakeQ : TQuery ;
begin
  FakeQ := TQuery.Create(nil);
  FakeQ.DatabaseName := 'DB';
  FakeQ.SessionName := DM.Database1.SessionName;
  with FakeQ do
  begin
    Close;
    SQL.Clear;
    SQL.Add(' select max(convert(int,substring(RFNO,9,2))) as myvalue from REFUND_M ');
    SQL.Add(' where substring(RFNO,1,8) = :SKEY');
    ParamByName('SKEY').AsString := Bus_date; //ex: 20030328
    Open;
  end;//with
  if FakeQ.IsEmpty then Result := Bus_date '01'  //<- 第一筆
  else
    Result := Bus_date _AddZero(IntToStr(FakeQ.FieldByName('myvalue').AsInteger 1),2);
end;    
PS: _AddZero 是不足位補0的function 天行健 君子當自強不息~~@.@ 發表人 - t.j.b 於 2003/03/28 17:05:50 發表人 - t.j.b 於 2003/03/28 17:21:34
系統時間:2024-06-29 4:25:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!