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

DBGrid如何檢查某一欄位的值是否重覆??

尚未結案
lobi
一般會員


發表:6
回覆:9
積分:3
註冊:2003-01-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-17 22:31:18 IP:219.68.xxx.xxx 未訂閱
請教各位前輩,DBGrid如何檢查某一欄位輸入的值是否重覆?如果輸入的值己經重 覆,如何還原舊值??例DBGrid 有一個欄位'A',資料有五筆,1,2,3,4,5 , 如果使用者將3改為1,我要show出提示訊息,並將值還原為3 . 我的連結方式: ClientDataSet -> DataSource -> DBGrid. 新手上路,請多指教
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-18 08:12:10 IP:218.163.xxx.xxx 未訂閱
引言: 請教各位前輩,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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-18 10:56:02 IP:61.221.xxx.xxx 未訂閱
引言: 由於是ClientDataSet可以在該欄位之onFieldValidate如此做 1. 動態Create另一ClientDataSet(cdtemp)後用原ClientDataSet之CloneCursor取得Data 2. 在cdtemp上lcoate, 找到的話Raise Error
ccchen兄,您提的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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-18 11:26:59 IP:210.61.xxx.xxx 未訂閱
用while not eof會導致client把整個table資料 調到client端, 使效能不好 或許您可以在onFieldValidate地方像ccchen所講的方法 用另一個clientdataset下CommandText 向後端要資料, select top 1 * from table where packinglist_id='3' 然後RecordCount大於0就有資料重覆 如此就可減輕client負擔
lobi
一般會員


發表:6
回覆:9
積分:3
註冊:2003-01-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-18 13:18:44 IP:61.221.xxx.xxx 未訂閱
引言: 用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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-18 16:19:03 IP:218.163.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-18 17:31:48 IP:61.221.xxx.xxx 未訂閱
引言: 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
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的好處,慢慢適應囉.
lobi
一般會員


發表:6
回覆:9
積分:3
註冊:2003-01-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-18 17:50:08 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-18 17:50:31 IP:61.221.xxx.xxx 未訂閱
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;
系統時間:2024-06-27 16:19:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!