用的是ado+access,用edit输入,用户点击新增,加一空记录,点击保存,则提交入库,但是有一问题,如果点击两次保存按钮,则会出现主键重复报错,我想在adoquery中beforepost事件中写检测,但是程序根本走不到那
procedure TForm4.ADOQuery1BeforePost(DataSet: TDataSet);
var
str1,str2,str3,str4:string; i,j:integer;
begin
  with adoquery1 do
  begin
  close;
  sql.clear;
  sql.add('select ch,jcsj from sbclxx order by sbxh asc');
  open;
  last;
  end;
  str1:=adoquery1.FieldByName('ch').AsString;
  str2:=edit1.text;
  i:=comparestr(str1,str2);
  str3:=adoquery1.fieldbyname('jcsj').AsString;
  str4:=maskedit1.Text;
  j:=comparestr(str3,str4);
  if i=0  then//想让i=0 and j=0则报错,不知为什么
  begin
  showmessage('输入的编号已存在!请重新输入');
  abort;
  exit;
  end;
end;
还请各位大哥指教!
还有个小问题,字符串换行时,该如何写

解决方案 »

  1.   

    'select ch,jcsj from sbclxx order by sbxh asc'你的这个语句只是按照一个字段排序的
    ch这个字段就不能保证是最大的了吧
    我建议你还是利用条件查许来实现吧
    sql.add('select Count(*) as Totalfrom sbclxx order by sbxh asc where ch=:ch and jcsj=:jcsj');
    parameters.parambyname('ch').value:=tirm(edit1.text);
    parameters.ParambyName('jcsj').value:=Trim(maskedit1.Text);
    Open;
    If FieldByName('Total').AsInteger>0 then
    begin
    showmessage('输入的编号已存在!请重新输入');
      abort;
    end;
      

  2.   

    字符串换行时用#10,#13就可以了
    比如'kdkkfdk+kdk+#10+#13+uereruei+kdfk'
      

  3.   

    不行吧,afterpost好像也走不到那,为什么会这样呢
    execsql后就直接提交了
    各位大哥,帮帮忙啊
      

  4.   

    你在按钮点击事件里try一下其实就可以了;procedure Tform1.button1.click(sender: Tobject);
    begin
     try
       post;
     except showmessage('主建重复');
     end; 
    end;
      

  5.   

    你在不能重复的字段中设主键,然后在提交的代吗社样写
      try
      //insert.....
      except
      begin
        shomessage('error');
        exit;
      end
        showmessage('ok');这是主要的代码,你要改成你所要的就行了,测试时是先编译一次,然后打开项目文件夹,运行可执行文件.EXE