DBGrid如何檢查某一欄位的值是否重覆?? |
尚未結案
|
lobi
一般會員 發表:6 回覆:9 積分:3 註冊:2003-01-28 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
引言: 請教各位前輩,DBGrid如何檢查某一欄位輸入的值是否重覆?如果輸入的值己經重 覆,如何還原舊值??例DBGrid 有一個欄位'A',資料有五筆,1,2,3,4,5 , 如果使用者將3改為1,我要show出提示訊息,並將值還原為3 . 我的連結方式: ClientDataSet -> DataSource -> DBGrid. 新手上路,請多指教由於是ClientDataSet可以在該欄位之onFieldValidate如此做 1. 動態Create另一ClientDataSet(cdtemp)後用原ClientDataSet之CloneCursor取得Data 2. 在cdtemp上lcoate, 找到的話Raise Error |
lobi
一般會員 發表:6 回覆:9 積分:3 註冊:2003-01-28 發送簡訊給我 |
引言: 由於是ClientDataSet可以在該欄位之onFieldValidate如此做 1. 動態Create另一ClientDataSet(cdtemp)後用原ClientDataSet之CloneCursor取得Data 2. 在cdtemp上lcoate, 找到的話Raise Errorccchen兄,您提的clonecursor,我還沒用過,待會我再查查資料.lcoate有試了一下,並不符需求,因為會檢查到當筆的資料.不知是不是我不會用 剛剛測試時,是有測成功,不過總覺得我的寫法怪怪的.將我程式碼貼出來,麻煩您給我一些建議. 有兩個clientdataset,分別是cdlist,cdlistT procedure TForm1.pbInsertItemClick(Sender: TObject);//新增明細 begin if trim(combobox1.Text) = '' then begin showmessage('請先選擇外箱規格編號'); combobox1.SetFocus; exit; end; cdlist.Append ; packinglistid := packinglistid 1; cdlist.fieldbyname('packinglist_id').asstring:=inttostr((packinglistid)); cdlist.fieldbyname('carton_id').asstring:=trim(combobox1.text); cdlist.fieldbyname('descp').AsString :=edcartondescp.text ; cdlist.fieldbyname('gw').AsFloat := strtofloat(edcartongw.text); cdlist.post; end; procedure TForm1.cdListcarton_numValidate(Sender: TField); begin if cdlist.State=dsBrowse then exit;//如果瀏覽狀態就不判斷 cdlistt.First; while not cdlistT.eof do begin if cdlistt.FieldByName('packinglist_id').AsString <> cdlistpackinglist_id.AsString then begin if cdlistt.FieldByName('carton_num').AsString =cdlistcarton_num.AsString then begin showmessage('資料重覆'); abort; end; end; cdlistt.Next; end; end; procedure TForm1.DBGrid1ColExit(Sender: TObject); begin if cdlist.State=dsBrowse then exit; cdlistT.Data:=cdlist.Data; //這一段要下在這嗎? end;< >< > |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
lobi
一般會員 發表:6 回覆:9 積分:3 註冊:2003-01-28 發送簡訊給我 |
引言: 用while not eof會導致client把整個table資料 調到client端, 使效能不好 或許您可以在onFieldValidate地方像ccchen所講的方法 用另一個clientdataset下CommandText 向後端要資料, select top 1 * from table where packinglist_id='3' 然後RecordCount大於0就有資料重覆 如此就可減輕client負擔pedro兄您好,因為我儲存的動作是按save才做,所以user一次可以打多筆資料, 但我要幫user檢查此次打的carton_no不能重覆,packinglist_id原本是save才要 給值,因為要判斷打的是那一筆,所以新增明細時,才會先暫時給值,save時會重新捉packinglist_id最新值. 麻煩各位大大囉 |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
1. 因為會檢查到當筆的資料當然須排除當筆資料 2. 看一下你的程式, Insert 不是以DataAware方式, 而是直接寫, 那就不須在onValidate了, 在append之前檢查就可
var cdTemp:TClientDataSet; begin cdTemp := TClientDataSet.Create(nil); try cdTemp.CloneCursor(cdlist, True); cdTemp.indexfieldname:='packinglist_id'; if cdTemp.locate('packinglist_id',packinglistid,[]) then raise Exception.create('資料重覆') else begin cdlist.Append ; packinglistid := packinglistid 1; cdlist.fieldbyname('packinglist_id').asstring:=inttostr((packinglistid)); cdlist.fieldbyname('carton_id').asstring:=trim(combobox1.text); cdlist.fieldbyname('descp').AsString :=edcartondescp.text ; cdlist.fieldbyname('gw').AsFloat := strtofloat(edcartongw.text); cdlist.post; end; finally cdTemp.free; end; end;其實Clone另一個clientdataSet是為了不改變目前dataSet之指標位置而已, 你未用DataAware元件, 原DataSet如何改變並不影響顯示, 故也不用cloneCursor了, 直接在原DataSet上先locate再append也可 Demo一下CloneDataSet之用法, 很抱歉只是想法給你參考, 未測試程式. ClientDataSet很方便, 可隨時改變index, Recno也是正確的 為何不用DataAware 順便提醒一下 cdlist.fieldbyname('gw').AsFloat := strtofloat(edcartongw.text); 也可以 cdlist.fieldbyname('gw').AsString := edcartongw.text; 發表人 - ccchen 於 2003/11/18 16:22:03 |
lobi
一般會員 發表:6 回覆:9 積分:3 註冊:2003-01-28 發送簡訊給我 |
引言: 1. 因為會檢查到當筆的資料當然須排除當筆資料 2. 看一下你的程式, Insert 不是以DataAware方式, 而是直接寫, 那就不須在onValidate了, 在append之前檢查就可ccchen兄,我的DBGrid有些資料是append時就加進去,而packinglist_id本來是要 save時才捉值,因為要判斷時,我要去除當筆資料,不得己才先放值,基本上packinglist_id是不可能會重覆,而user在DBGRID中只有carton_num可以更改, 所以當user在DBGrid的carton_num輸入時,我要在cdlist檢查有沒有重覆. 而我檢查的方式是:"packinglist_id不能相等,而且carton_num相等,則秀出錯誤 訊息". 為何不用DataAware? 可能是習慣,我習慣所有語法都自己透過sql取得,包括insert,update ,delete. 也不知為什麼,我就是不習慣用DataAware,可能是剛接觸Delphi,還不清楚DataAware的好處,慢慢適應囉.var cdTemp:TClientDataSet; begin cdTemp := TClientDataSet.Create(nil); try cdTemp.CloneCursor(cdlist, True); cdTemp.indexfieldname:='packinglist_id'; if cdTemp.locate('packinglist_id',packinglistid,[]) then raise Exception.create('資料重覆') else begin cdlist.Append ; packinglistid := packinglistid 1; cdlist.fieldbyname('packinglist_id').asstring:=inttostr((packinglistid)); cdlist.fieldbyname('carton_id').asstring:=trim(combobox1.text); cdlist.fieldbyname('descp').AsString :=edcartondescp.text ; cdlist.fieldbyname('gw').AsFloat := strtofloat(edcartongw.text); cdlist.post; end; finally cdTemp.free; end; end;其實Clone另一個clientdataSet是為了不改變目前dataSet之指標位置而已, 你未用DataAware元件, 原DataSet如何改變並不影響顯示, 故也不用cloneCursor了, 直接在原DataSet上先locate再append也可 Demo一下CloneDataSet之用法, 很抱歉只是想法給你參考, 未測試程式. ClientDataSet很方便, 可隨時改變index, Recno也是正確的 為何不用DataAware 順便提醒一下 cdlist.fieldbyname('gw').AsFloat := strtofloat(edcartongw.text); 也可以 cdlist.fieldbyname('gw').AsString := edcartongw.text; 發表人 - ccchen 於 2003/11/18 16:22:03 |
lobi
一般會員 發表:6 回覆:9 積分:3 註冊:2003-01-28 發送簡訊給我 |
ccchen 兄,程式己可執行,謝謝您
< class="code">
procedure TForm1.cdListcarton_numValidate(Sender: TField);
var cdTemp:TClientDataSet;
begin
cdTemp := TClientDataSet.Create(nil);
try
cdTemp.CloneCursor(cdlist, True);
cdTemp.indexfieldnames :='packinglist_id';
cdtemp.First;
while not cdtemp.eof do begin
if cdtemp.FieldByName('packinglist_id').AsString <> cdlistpackinglist_id.AsString then
begin
if cdtemp.FieldByName('carton_num').AsString =cdlistcarton_num.AsString then
begin
showmessage('資料重覆');
abort;
end;
end;
cdtemp.Next;
end;
finally
cdTemp.free;
end;
|
lobi
一般會員 發表:6 回覆:9 積分:3 註冊:2003-01-28 發送簡訊給我 |
ccchen 兄,程式己可執行,謝謝您
< class="code">
procedure TForm1.cdListcarton_numValidate(Sender: TField);
var cdTemp:TClientDataSet;
begin
cdTemp := TClientDataSet.Create(nil);
try
cdTemp.CloneCursor(cdlist, True);
cdTemp.indexfieldnames :='packinglist_id';
cdtemp.First;
while not cdtemp.eof do begin
if cdtemp.FieldByName('packinglist_id').AsString <> cdlistpackinglist_id.AsString then
begin
if cdtemp.FieldByName('carton_num').AsString =cdlistcarton_num.AsString then
begin
showmessage('資料重覆');
abort;
end;
end;
cdtemp.Next;
end;
finally
cdTemp.free;
end;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |