全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5143
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

當輸入相同資料時, 跳出一個警告視窗 ?

尚未結案
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#32 引用回覆 回覆 發表時間:2003-10-20 08:45:38 IP:210.243.xxx.xxx 未訂閱
救人喔,連程式碼都key給你看了, 堅持要用adotable,那 1.編輯模式下當然會找到重複的資料,以你的程式碼來看會讓使用者不能夠編輯現有資料. 2.要尋找前記得把adotabel2 close 再 open,為什麼要這麼做,自己想一想. 3.如果你是要交作業,寫得出來可以run就可以了,如果是要拿來實際運作的系統 唉... 發表人 - hahalin 於 2003/10/20 08:48:32 發表人 - hahalin 於 2003/10/20 10:08:53
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#33 引用回覆 回覆 發表時間:2003-10-20 15:30:24 IP:61.13.xxx.xxx 未訂閱
Sorry hahalin大大 小弟因為太心急的緣故 所以沒有注意看你的程式碼 我以為 如果加入tadoquery 後 所有的 上一頁 下一頁 新增 刪除 儲存 都要改成sql的語法 小弟仔細看了後 才知道 原來只要多加個tadoquery 並按照步驟 在adotable1的beforepost 內key入指令 就好了 現在已ok了 但是 只能在 新增模式下判斷 能不能讓它可以在修改下也能判斷啊?
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#34 引用回覆 回覆 發表時間:2003-10-20 16:24:31 IP:210.243.xxx.xxx 未訂閱
      if adotable1.state=dsedit then begin
     ...
  end;    
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#35 引用回覆 回覆 發表時間:2003-10-20 16:45:18 IP:61.13.xxx.xxx 未訂閱
我有試過了不行啊?    procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet); var dt:tadoquery; begin   //只在新增模式判斷   if ADOTable1.State in [dsInsert, dsEdit] then begin     dt:=tadoquery.create(self);     dt.connection:=ADOConnection1;     dt.sql.text:='select count(車牌號碼) from moto where 車牌號碼='+quotedstr(adotable1.fieldbyname('車牌號碼').asstring);     dt.open;     if dt.fields[0].value > 0 then begin        showmessage ('已有此車牌號碼');        DBEdit1.SetFocus;        abort;     end;     dt.free;   end; end;
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#36 引用回覆 回覆 發表時間:2003-10-20 17:03:07 IP:218.163.xxx.xxx 未訂閱
jasonchen613 大大,加油~ < src="http://delphi.ktop.com.tw/download/upload\33223_qoo.gif">網海無涯,學無止境! 發表人 - qoo1234 於 2003/10/20 17:06:12
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#37 引用回覆 回覆 發表時間:2003-10-20 17:07:55 IP:61.222.xxx.xxx 未訂閱
看到大家討論這麼熱烈,小弟忍不住也要發表一下: 一筆資料是否重複輸入,這件事情原則上應由資料庫來判斷才對,也就是說,如果使用者輸入的資料重複的話,應該是資料庫回應錯誤訊息,然後Delphi再將該訊息轉成使用者可以看得懂的說明即可.為什麼非得要在使用者輸入之前先檢查呢?尤其如果你的程式是網路版時,如果有另一個人也輸入同一筆資料時,你的程式要怎麼處理?所以最好的方法,應是補捉資料庫回傳的錯誤訊息. Database1.StartTransaction; try Query1.Close; Query1.SQL.Text:='INSERT INTO TABLE ......'; //新增一筆資料的SQL指令 Query1.Prepare; Query1.ExecSQL; Database1.Commit; except on E:Exception do begin DataBase.Rollback; if Pos('Attempt to insert duplicate key row',E.Message)>0 then //假設當資料重複時資料庫回傳的錯誤訊有以上字串.... raise Exception.Create('新增的資料已經存在') else raise Exception.Create('資料儲存失敗,錯誤訊息如下:'#13 E.message); end; end;
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#38 引用回覆 回覆 發表時間:2003-10-20 17:24:24 IP:61.13.xxx.xxx 未訂閱
Sorry change.jian大大 我看不太懂你的指令耶 Database1.StartTransaction; //我沒有使用Database1的元件 是不是要多加個Database1的元件啊? PS(我所使用的元件有ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; ADOQuery1: TADOQuery;) 另外 如果多加一個dsedit 且把if dt.fields[0].value > 0 then begin 改成 if dt.fields[0].value > 1 then begin 這樣可以嗎?
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#39 引用回覆 回覆 發表時間:2003-10-20 17:30:27 IP:210.243.xxx.xxx 未訂閱
good,這樣是終極之道... 不過我先代替jasonchen613大大回答好了 他會跟你說他用adotable,目前不想改變架構... 其次,回應一下jasonchen613大大的問題 請把dsinsert,dsedit分開兩個if...then來做.. 到此為止,小弟不再對這篇post發言, 請各為仁人志士拔刀相助... 小弟能力低下,無力解決jasonchen613大大的問題 自當回少林寺面壁思過為是... 就讓青燈古佛長伴老衲終此餘生吧
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#40 引用回覆 回覆 發表時間:2003-10-20 20:27:15 IP:61.229.xxx.xxx 未訂閱
引言: Sorry change.jian大大 我看不太懂你的指令耶 Database1.StartTransaction; //我沒有使用Database1的元件 是不是要多加個Database1的元件啊? PS(我所使用的元件有ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; ADOQuery1: TADOQuery;) 另外 如果多加一個dsedit 且把if dt.fields[0].value > 0 then begin 改成 if dt.fields[0].value > 1 then begin 這樣可以嗎?
Database1為BDE的資料庫元件,如果你用ADO的話,那麼就是ADOConnection1.BeginTrans替代Database1.StartTransaction、ADOConnection1.CommitTrans替代Database1.Commit、 ADOConnection1.RollbackTrans替代Database1.Rollback 用什麼元件並不重要,重要的是利用tyr-except-end來抓取錯誤訊息,至於update到後端資料庫的方法,不一定是要以SQL指令來執行,你也可以直接在ADOQuery裡去update資料.....
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#41 引用回覆 回覆 發表時間:2003-10-20 22:06:21 IP:61.16.xxx.xxx 未訂閱
恩 請問change.jian大大 以下的指令是不是key在ADOTable1BeforePost下    程式碼如下: procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet); begin ADOConnection1.BeginTrans; try ADOQuery1.Close; ADOQuery1.SQL.Text:='INSERT INTO TABLE ......'; ADOQuery1.Prepare;//這一行它偵測出有誤耶 ADOQuery1.ExecSQL; ADOConnection1.CommitTrans; except on E:Exception do begin ADOConnection1.RollbackTrans; if Pos('Attempt to insert duplicate key row',E.Message)>0 then raise Exception.Create('新增的資料已經存在') else raise Exception.Create('資料儲存失敗,錯誤訊息如下:'#13+E.message); end; end;    另外 我原本試的方法 現在以剩下一個錯誤 就是  當我 只是 單純的按修改 它可以檢驗出資料(車證號碼)有無重複  不會有問題 另外 如果單純的按新增 在案儲存  它也可以檢驗出資料(車牌號碼)有無重複 且也是沒有問題 但是 如果我先(1)新增完一筆資料 (2)按儲存完後 (3)在按修改 之後 (4)在儲存 它就有問題 問題如圖所示    以下是我在ADOTable1BeforePost下的程式碼:    procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet); var dt:tadoquery; begin   //只在新增模式判斷   if ADOTable1.State = dsInsert then begin     dt:=tadoquery.create(self);     dt.connection:=ADOConnection1;     dt.sql.text:='select count(車牌號碼) from moto where 車牌號碼='+quotedstr(adotable1.fieldbyname('車牌號碼').asstring);     dt.open;     if dt.fields[0].value > 0 then begin        showmessage ('已有此車牌號碼');        DBEdit1.SetFocus;        abort;     end;     dt.free;   end;      if ADOTable1.State = dsEdit then begin     dt:=tadoquery.create(self);     dt.connection:=ADOConnection1;     dt.sql.text:='select count(車牌號碼) from moto where 車牌號碼='+quotedstr(adotable1.fieldbyname('車牌號碼').asstring);     dt.open;     if dt.fields[0].value > 1 then begin        showmessage ('已有此車牌號碼');        DBEdit1.SetFocus;        abort;     end;     dt.free;   end;    end;   
kevin622
一般會員


發表:0
回覆:22
積分:9
註冊:2003-10-16

發送簡訊給我
#42 引用回覆 回覆 發表時間:2003-10-25 13:24:58 IP:210.64.xxx.xxx 未訂閱
我發現一個問題:就是你這個 table 的 key 沒有說明是那個欄位,如果是車牌號碼,那它就一定要有值了。至於欄位是否有值的驗證可以在你的 ADOTable 的 BeforePost 時做判斷。身分證字號的驗證可以在該欄位的 OnValidate 事件中利用另一個 ADOQuery 下 sql 語法去 select 看看有無此身分證字號存在(當然要排除你目前所編輯的這筆資料)。應該就可以解決你的問題了。
[<<] [1] [2] [>>]
系統時間:2024-03-29 21:49:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!