DBEdit流水號問題..急 |
答題得分者是:channel
|
maloneliin
一般會員 ![]() ![]() 發表:3 回覆:10 積分:2 註冊:2003-03-26 發送簡訊給我 |
請問各位高手...我要做一ㄍ流水號的程式.bussiness是一ㄍtable.bus_no為主鍵.在這一ㄍ欄位做流水號.我的資料庫為mssql.bus_no型態為char.下列是我寫ㄉ程式碼.可是執行時會當機.請問我哪裡寫錯了... procedure TForm1.Query1NewRecord(DataSet: TDataSet);
var
ss : string;
begin
Query1.Close ;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM business WHERE bus_no = :bus_no ORDER BY bus_no');
Query1.ParamByName('bus_no').AsString := DBEdit2.Text ;
Query1.Open ;
//上面這段程式碼是說 依據你dbedit1.text的值做搜尋 然後依照
//流水號做排序
if Query1.IsEmpty then //如果Query1是空的 代表沒資料
begin Query1.Insert;//進入新增狀態
Query1.FieldByName('bus_no').AsString := '000' IntToStr(1) ;//第一筆流水號為''0001'';
end
else //如果有
begin
Query1.Last ;//到最後一筆
ss := Query1.FieldByName('bus_no').AsString ; // 把目前最大流水號的值給ss
ss := inttostr(strtoint(ss) 1);//轉換型態把ss 1; Query1.insert; //進入新增狀態
if length(ss) = 1 then//判斷ss的長度 前面補0
Query1.FieldByName('bus_no').AsString := '000' ss
else if length(ss) = 2 then
Query1.FieldByName('bus_no').AsString := '00' ss
else if length(ss) = 3 then
Query1.FieldByName('bus_no').AsString := '0' ss
else
Query1.FieldByName('bus_no').AsString := ss;
end;
end;
|
chih
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
maloneliin
一般會員 ![]() ![]() 發表:3 回覆:10 積分:2 註冊:2003-03-26 發送簡訊給我 |
|
chih
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
ko
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
maloneliin你好:
引言: if Query1.IsEmpty then //如果Query1是空的 代表沒資料 begin Query1.Insert;//進入新增狀態 Query1.FieldByName('bus_no').AsString := '000' IntToStr(1) ;//第一筆流水號為''0001''; //改成 Query1.InsertRecord([0001]); end else //如果有 begin Query1.Last ;//到最後一筆 ss := Query1.FieldByName('bus_no').AsString ; // 把目前最大流水號的值給ss ss := inttostr(strtoint(ss) 1);//轉換型態把ss 1; Query1.insert; //進入新增狀態 if length(ss) = 1 then//判斷ss的長度 前面補0 Query1.FieldByName('bus_no').AsString := '000' ss else if length(ss) = 2 then Query1.FieldByName('bus_no').AsString := '00' ss else if length(ss) = 3 then Query1.FieldByName('bus_no').AsString := '0' ss else Query1.FieldByName('bus_no').AsString := ss; //改成 Query1.AppendRecord([SS]); end;發表人 - ko 於 2003/04/02 15:36:26
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
channel
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
引言: 請問各位高手...我要做一ㄍ流水號的程式.bussiness是一ㄍtable.bus_no為主鍵.在這一ㄍ欄位做流水號.我的資料庫為mssql.bus_no型態為char.下列是我寫ㄉ程式碼.可是執行時會當機.請問我哪裡寫錯了... procedure TForm1.Query1NewRecord(DataSet: TDataSet); var ss : string; begin Query1.Close ; Query1.SQL.Clear; Query1.SQL.Add('SELECT * FROM business WHERE bus_no = :bus_no ORDER BY bus_no'); Query1.ParamByName('bus_no').AsString := DBEdit2.Text ; Query1.Open ; //上面這段程式碼是說 依據你dbedit1.text的值做搜尋 然後依照 //流水號做排序 if Query1.IsEmpty then //如果Query1是空的 代表沒資料 begin Query1.Insert;//進入新增狀態 Query1.FieldByName('bus_no').AsString := '000' IntToStr(1) ;//第一筆流水號為''0001''; end else //如果有 begin Query1.Last ;//到最後一筆 ss := Query1.FieldByName('bus_no').AsString ; // 把目前最大流水號的值給ss ss := inttostr(strtoint(ss) 1);//轉換型態把ss 1; Query1.insert; //進入新增狀態 if length(ss) = 1 then//判斷ss的長度 前面補0 Query1.FieldByName('bus_no').AsString := '000' ss else if length(ss) = 2 then Query1.FieldByName('bus_no').AsString := '00' ss else if length(ss) = 3 then Query1.FieldByName('bus_no').AsString := '0' ss else Query1.FieldByName('bus_no').AsString := ss; end; end;您的邏輯怪怪的,怎麼說呢? 因為您將程式寫在Query1NewRecord代表目前已進入增新狀態,而您卻又下Query1.insert;造成無窮迴圈(程式一執行到Query1.insert就會再次進入Query1NewRecord事件),所以您將程式中有Query1.insert刪除掉就沒有問題了,我將您的程式修改如下: procedure TForm1.Query1NewRecord(DataSet: TDataSet); var ss : string; begin Query1.Close ; Query1.SQL.Clear; Query1.SQL.Add('SELECT * FROM business WHERE bus_no = :bus_no ORDER BY bus_no'); Query1.ParamByName('bus_no').AsString := DBEdit2.Text ; Query1.Open ; //上面這段程式碼是說 依據你dbedit1.text的值做搜尋 然後依照 //流水號做排序 if Query1.IsEmpty then //如果Query1是空的 代表沒資料 Query1.FieldByName('bus_no').AsString := '000' IntToStr(1) ;//第一筆流水號為''0001''; else //如果有 begin Query1.Last ;//到最後一筆 ss := Query1.FieldByName('bus_no').AsString ; // 把目前最大流水號的值給ss ss := inttostr(strtoint(ss) 1);//轉換型態把ss 1; //以下您寫了八行,其實可以用一行就可以完成了 //FormatFloat就是幫您作補0的動作 Query1.FieldByName('bus_no').AsString := FormatFloat('0000',ss); { if length(ss) = 1 then//判斷ss的長度 前面補0 Query1.FieldByName('bus_no').AsString := '000' ss else if length(ss) = 2 then Query1.FieldByName('bus_no').AsString := '00' ss else if length(ss) = 3 then Query1.FieldByName('bus_no').AsString := '0' ss else Query1.FieldByName('bus_no').AsString := ss; } end; end;~小弟淺見,參考看看~ 發表人 - channel 於 2003/04/02 16:18:36
------
~小弟淺見,參考看看~ |
maloneliin
一般會員 ![]() ![]() 發表:3 回覆:10 積分:2 註冊:2003-03-26 發送簡訊給我 |
|
channel
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
引言: 謝謝你ㄉ指導..可是我用妳ㄉ程式碼發生下列ㄉerror Query1:Detaset not in edit or insert modeQuery1.Close ; Query1.SQL.Clear; Query1.SQL.Add('SELECT * FROM business WHERE bus_no = :bus_no ORDER BY bus_no'); Query1.ParamByName('bus_no').AsString := DBEdit2.Text ; Query1.Open ; 您將這一段程式用另Query作,或動態宣告一個TQuery,作法如下: procedure TForm1.Query1NewRecord(DataSet: TDataSet); var ss : string; qry : TQuery; begin qry := TQuery.Create(nil); try qry.DatabaseName := Your Alias Name; qry.Close; qry.SQL.Clear; qry.SQL.Add('SELECT * FROM business WHERE bus_no = :bus_no ORDER BY bus_no'); qry.ParamByName('bus_no').AsString := DBEdit2.Text ; qry.Open ; //上面這段程式碼是說 依據你dbedit1.text的值做搜尋 然後依照 //流水號做排序 if qry.IsEmpty then //如果qry是空的 代表沒資料 Query1.FieldByName('bus_no').AsString := '0001';//第一筆流水號為''0001''; else //如果有 begin qry.Last ;//到最後一筆 ss := qry.FieldByName('bus_no').AsString ; // 把目前最大流水號的值給ss ss := inttostr(strtoint(ss) 1);//轉換型態把ss 1; Query1.FieldByName('bus_no').AsString := FormatFloat('0000',ss); end; finally FreeAndNil(qry); end; end;~小弟淺見,參考看看~
------
~小弟淺見,參考看看~ |
maloneliin
一般會員 ![]() ![]() 發表:3 回覆:10 積分:2 註冊:2003-03-26 發送簡訊給我 |
謝謝channelㄉ指導..妳的程式和有一些問題.我幫他更正後.可以成功run
下列是我更正後的結果... procedure TForm1.Query1NewRecord(DataSet: TDataSet);
var ss : string;
qry : TQuery;
begin
qry := TQuery.Create(nil);
try
qry.DatabaseName := 'case';
qry.Close;
qry.SQL.Clear;
qry.SQL.Add('SELECT * FROM business WHERE bus_no = :bus_no ORDER BY bus_no');
qry.ParamByName('bus_no').AsString := DBEdit2.Text ;
qry.Open ;
if qry.IsEmpty then
begin
Query1.FieldByName('bus_no').AsString := '0001';
end
else
begin
qry.Last ;
ss := qry.FieldByName('bus_no').AsString ;
ss := inttostr(strtoint(ss) 1);
if length(ss) = 1 then
Query1.FieldByName('bus_no').AsString := '000' ss
else if length(ss) = 2 then
Query1.FieldByName('bus_no').AsString := '00' ss
else if length(ss) = 3 then
Query1.FieldByName('bus_no').AsString := '0' ss
else
Query1.FieldByName('bus_no').AsString := ss;
end;
finally
FreeAndNil(qry);
end;
end;
|
maloneliin
一般會員 ![]() ![]() 發表:3 回覆:10 積分:2 註冊:2003-03-26 發送簡訊給我 |
引言: 謝謝channelㄉ指導..妳的程式和有一些問題.我幫他更正後.可以成功run 下列是我更正後的結果... procedure TForm1.Query1NewRecord(DataSet: TDataSet); var ss : string; qry : TQuery; begin qry := TQuery.Create(nil); try qry.DatabaseName := 'case'; qry.Close; qry.SQL.Clear; qry.SQL.Add('SELECT * FROM business WHERE bus_no = :bus_no ORDER BY bus_no'); qry.ParamByName('bus_no').AsString := DBEdit2.Text ; qry.Open ; if qry.IsEmpty then begin Query1.FieldByName('bus_no').AsString := '0001'; end else begin qry.Last ; ss := qry.FieldByName('bus_no').AsString ; ss := inttostr(strtoint(ss) 1); if length(ss) = 1 then Query1.FieldByName('bus_no').AsString := '000' ss else if length(ss) = 2 then Query1.FieldByName('bus_no').AsString := '00' ss else if length(ss) = 3 then Query1.FieldByName('bus_no').AsString := '0' ss else Query1.FieldByName('bus_no').AsString := ss; end; finally FreeAndNil(qry); end; end;可是會有一個問題..假如我把程式從開之後.他還是會從00001開始.不會在資料庫最後一筆開始抓..請大家幫我一下... |
channel
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
引言:程式再幫您修改一下:引言: 謝謝channelㄉ指導..妳的程式和有一些問題.我幫他更正後.可以成功run 下列是我更正後的結果... procedure TForm1.Query1NewRecord(DataSet: TDataSet); var ss : string; qry : TQuery; begin qry := TQuery.Create(nil); try qry.DatabaseName := 'case'; qry.Close; qry.SQL.Clear; qry.SQL.Add('SELECT * FROM business WHERE bus_no = :bus_no ORDER BY bus_no'); qry.ParamByName('bus_no').AsString := DBEdit2.Text ; qry.Open ; if qry.IsEmpty then begin Query1.FieldByName('bus_no').AsString := '0001'; end else begin qry.Last ; ss := qry.FieldByName('bus_no').AsString ; ss := inttostr(strtoint(ss) 1); if length(ss) = 1 then Query1.FieldByName('bus_no').AsString := '000' ss else if length(ss) = 2 then Query1.FieldByName('bus_no').AsString := '00' ss else if length(ss) = 3 then Query1.FieldByName('bus_no').AsString := '0' ss else Query1.FieldByName('bus_no').AsString := ss; end; finally FreeAndNil(qry); end; end;可是會有一個問題..假如我把程式從開之後.他還是會從00001開始.不會在資料庫最後一筆開始抓..請大家幫我一下... procedure TForm1.Query1NewRecord(DataSet: TDataSet); var ss : string; qry : TQuery; begin qry := TQuery.Create(nil); try qry.DatabaseName := 'case'; qry.Close; qry.SQL.Clear; qry.SQL.Add('SELECT * FROM business ORDER by bus_no'); qry.Open ; if qry.IsEmpty then Query1.FieldByName('bus_no').AsString := '0001'; else begin qry.Last; ss := qry.FieldByName('bus_no').AsString ; Query1.FieldByName('bus_no').AsString := FormatFloat('0000',strtoint(ss) 1); end; finally FreeAndNil(qry); end; end;這樣應該就沒有問題囉! ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~ |
maloneliin
一般會員 ![]() ![]() 發表:3 回覆:10 積分:2 註冊:2003-03-26 發送簡訊給我 |
|
channel
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
引言: 更正後還會出現error 訊息如下 Parameter 'bus_no' not foud錯誤是指找到不bus_no這個參數,可是程式已經將bus_no這個參數拿掉了呀!
------
~小弟淺見,參考看看~ |
maloneliin
一般會員 ![]() ![]() 發表:3 回覆:10 積分:2 註冊:2003-03-26 發送簡訊給我 |
|
channel
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
|
maloneliin
一般會員 ![]() ![]() 發表:3 回覆:10 積分:2 註冊:2003-03-26 發送簡訊給我 |
引言:嗯..DBNavigator的DataSource我的有設定.現在只有"新增"刪除"存檔"取消"有作用之外..."上一筆"下一筆"第一筆"最末筆"..按下去無功用..真是奇怪.>"<引言: 謝謝channel我問題已經解決了..可是現在我發現一ㄍ問題,就是我使用DBNavigator要用"上一筆"下一筆"第一筆"最末筆"無法使用..請問有方法可以解決ㄇ....無法使用是指按DBNavigator的上一筆"下一筆"第一筆"最末筆都沒有作用嗎? 檢查一下您的DBNavigator屬性中的DataSource有沒有設定。 只要有設DataSource應該沒有問題,可否詳細說明您的情況… ~小弟淺見,參考看看~ |
channel
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |