要实现一个判断添加的一个字段docid和表中的字段docid的值重复问题,重复了,提示重复,就不要添加。
 但是我这样子写了,有信息提示,但是还是可以添加进去
  因为都是dbedit控件和每个字段关联了。数据集控件用adodataset,请问大家,在哪里判断写错了呢?procedure TForm1.btn2Click(Sender: TObject);
var
  i :Integer;
  aa,bb,cc :string;
begin
  aa :=Trim(dbedtDocID.Text);
  with qry2 do
  begin
    Close;
    SQL.Clear;
    sql.Add('select docid from login ' );
    Open;
   end;
    qry2.First;
    for i:=1 to qry2.RecordCount -1 do
    begin
      bb :=Trim(qry2.fieldbyname('docid').AsString);
      if bb=aa then
      begin
       ShowMessage('docid 数据重复,不能添加,请修改');
       exit;
      end
      else
      begin
        qry1.edit;
        qry1.Post;
      end  ;
     qry2.Next;
    end;

解决方案 »

  1.   

    方法有几种问题出现在dbedit身上,当你录入ID时 数据集其实已经处于edit状态,Showmessage后失去焦点,qry就会post了。 if bb=aa then
     begin
       if qry1.state= dsinsert then
         qry1.Cancel;
       ShowMessage('docid 数据重复,不能添加,请修改');
     end;
      

  2.   

    其实 还有其他更好解决方法
    1:关系型数据库设唯一字段2:qry1.beforepost事件里,判断是否重复 如果重复则撤销。  这样的话可以控制全局
      

  3.   

    你在DBEdit控件中修改数据的时候,数据集已经处于Edit状态,点这个按钮的时候,DBEdit失去焦点,post已经完成,所以,不管你这个事件中写什么代码,数据的修改或者添加都会完成的。如果你一定要用数据集控件去实现添加和修改,那么,代码写到qry2的BeforePost事件里吧  
    procedure TCustomQueryForm. qry1BeforePost(DataSet: TDataSet);
    var
      AStr:string;
    begin
      inherited;
      AStr :=  qry1.fieldbyname('docid').AsString;
      AStr := 'select docid from login where docid='+quotedstr(AStr);  qry2.close;
      qry2.sql.text := AStr;
      qry2.open;  if qry2.recordcount > 0 then
         begin
           qry1.state= dsinsert then
           qry1.abort;
           ShowMessage('docid 数据重复,不能添加,请修改');
         end;
    end;
      

  4.   

    procedure TCustomQueryForm.qry1BeforePost(DataSet: TDataSet);
    var
      AStr:string;
    begin
      AStr := qry1.fieldbyname('docid').AsString;
      AStr := 'select docid from login where docid='+quotedstr(AStr);  qry2.close;
      qry2.sql.text := AStr;
      qry2.open;  if qry2.recordcount > 0 then
      begin
        qry1.abort;
        ShowMessage('docid 数据重复,不能添加,请修改');
      end;
    end;