你的逻辑有问题:
一个表如果有BeforePoso事件,那么,他肯定已经是打开的表了。此时,理论上不能再对databasename、tablename赋值。刷新数据,也可能产生一个cancel(或者post)消息。
setkey、gotokey,也会产生记录移动,而记录移动,在Insert、Edit状态下,会产生Post消息。因此,这些操作,是不能在这里进行的。
要实现同样效果,应该在非编辑或者插入状态下进行,然句使用检查数据
...
插入数据
Table1.Insert;
Table.FieldByName('..').AsString :=  '......';
...
Table.Post
这样,就不会出现错误了。

解决方案 »

  1.   

    检查重复的关键值错误不应放在这里,应该在TABLE的POSTERROR事件中捕捉错误:
    这是我的代码,见笑了:
     IF (E IS EDBENGINEERROR) THEN
        BEGIN
           IDBLERROR:=(E as eDBENGineError).Errors[0].Errorcode;
           case iDBlError of
                eRequiredFieldMissing:
                begin
                    messagedlg('有些字段长度不能为0,请输入空格!',mtwarning,[mbok],0);
                    abort;
                end;
                eKeyViol:
                begin
                    messagedlg('该报告编号已经被使用!请更换一个吧!',
                               mtwarning,[mbok],0);
                    abort;
                end;
           end;
       end;
      

  2.   

    easypaper很对。
    检查时用query吧