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

DBEdit流水號問題..急

答題得分者是:channel
maloneliin
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-02 14:17:22 IP:61.220.xxx.xxx 未訂閱
請問各位高手...我要做一ㄍ流水號的程式.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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-02 14:40:00 IP:211.74.xxx.xxx 未訂閱
請問一下你有沒有先DeBug看停在那一行ㄋ??
maloneliin
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-02 14:45:14 IP:61.220.xxx.xxx 未訂閱
引言: 請問一下你有沒有先DeBug看停在那一行ㄋ??
程式會一直找sql沒有bug....
chih
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-02 14:53:46 IP:211.74.xxx.xxx 未訂閱
原程式Query1NewRecord裡面有Query1.insert,造成迴圈,你在Form上增加一個按鈕叫做"新增",將你在NewRecord的Code全部搬到Button裡面Run看看.. TRY TYR SEE
ko
資深會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-02 15:34:56 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-02 16:16:25 IP:211.21.xxx.xxx 未訂閱
引言: 請問各位高手...我要做一ㄍ流水號的程式.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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-02 17:08:07 IP:61.220.xxx.xxx 未訂閱
謝謝你ㄉ指導..可是我用妳ㄉ程式碼發生下列ㄉerror Query1:Detaset not in edit or insert mode
channel
尊榮會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-02 17:24:52 IP:211.21.xxx.xxx 未訂閱
引言: 謝謝你ㄉ指導..可是我用妳ㄉ程式碼發生下列ㄉerror Query1:Detaset not in edit or insert mode
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 ; 您將這一段程式用另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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-02 17:52:44 IP:61.220.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-02 18:02:59 IP:61.220.xxx.xxx 未訂閱
引言: 謝謝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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-02 18:42:29 IP:211.21.xxx.xxx 未訂閱
引言:
引言: 謝謝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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-02 19:03:30 IP:61.220.xxx.xxx 未訂閱
更正後還會出現error 訊息如下 Parameter 'bus_no' not foud
channel
尊榮會員


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-04-03 09:34:26 IP:211.21.xxx.xxx 未訂閱
引言: 更正後還會出現error 訊息如下 Parameter 'bus_no' not foud
錯誤是指找到不bus_no這個參數,可是程式已經將bus_no這個參數拿掉了呀! <>檢查一下您的程式是否還有執行> < class="code"> 原本取得編號的程式 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 ; ..... finally FreeAndNil(qry); end; 應改成如此: qry := TQuery.Create(nil); try qry.DatabaseName := 'case'; qry.Close; qry.SQL.Clear; qry.SQL.Add('SELECT * FROM business WHERE ORDER BY bus_no'); 要將qry.ParamByName('bus_no').AsString := DBEdit2.Text;刪除掉,檢查您的程式是否還有這一行 qry.Open ; ..... finally FreeAndNil(qry); end; ~小弟淺見,參考看看~ 發表人 - channel 於 2003/04/03 09:37:05
------
~小弟淺見,參考看看~
maloneliin
一般會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-04-03 10:50:24 IP:61.220.xxx.xxx 未訂閱
謝謝channel我問題已經解決了..可是現在我發現一ㄍ問題,就是我使用DBNavigator要用"上一筆"下一筆"第一筆"最末筆"無法使用..請問有方法可以解決ㄇ....
channel
尊榮會員


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-04-03 11:07:40 IP:211.21.xxx.xxx 未訂閱
引言: 謝謝channel我問題已經解決了..可是現在我發現一ㄍ問題,就是我使用DBNavigator要用"上一筆"下一筆"第一筆"最末筆"無法使用..請問有方法可以解決ㄇ....
無法使用是指按DBNavigator的上一筆"下一筆"第一筆"最末筆都沒有作用嗎? 檢查一下您的DBNavigator屬性中的DataSource有沒有設定。 只要有設DataSource應該沒有問題,可否詳細說明您的情況… ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
maloneliin
一般會員


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-04-03 11:16:44 IP:61.220.xxx.xxx 未訂閱
引言:
引言: 謝謝channel我問題已經解決了..可是現在我發現一ㄍ問題,就是我使用DBNavigator要用"上一筆"下一筆"第一筆"最末筆"無法使用..請問有方法可以解決ㄇ....
無法使用是指按DBNavigator的上一筆"下一筆"第一筆"最末筆都沒有作用嗎? 檢查一下您的DBNavigator屬性中的DataSource有沒有設定。 只要有設DataSource應該沒有問題,可否詳細說明您的情況… ~小弟淺見,參考看看~
嗯..DBNavigator的DataSource我的有設定.現在只有"新增"刪除"存檔"取消"有作用之外..."上一筆"下一筆"第一筆"最末筆"..按下去無功用..真是奇怪.>"<
channel
尊榮會員


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-04-03 11:21:05 IP:211.21.xxx.xxx 未訂閱
引言: 嗯..DBNavigator的DataSource我的有設定.現在只有"新增"刪除"存檔"取消"有作用之外..."上一筆"下一筆"第一筆"最末筆"..按下去無功用..真是奇怪.>"<
您在測試一下 當程式重新執行時,您先不要按"新增"刪除"存檔"取消",直接按"上一筆"下一筆"第一筆"最末筆",看這樣行不行? ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
系統時間:2024-06-26 23:18:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!