我需要在一个checkbox里写段程序,来控制数据的更新。
程序如下:
if checkbox3.Checked=true then begin
   if messagebox(0,确定添加?','提示',MB_YESNO+MB_ICONQUESTION+MB_DEFBUTTON2)=IDYES then
      begin
        dm.DQ1.Edit;
        dm.DQ1.FieldByName('receive').AsString:='T';
        dm.DQ1.FieldByName('r_date').AsDateTime:=now;
        dm.DQ1.Post;
      end
   else checkbox3.State:=cbunchecked;
end
else begin if messagebox(0,确定取消?','提示',MB_YESNO+MB_ICONQUESTION+MB_DEFBUTTON2)=IDYES then
              begin
              dm.DQ1.Edit;
              dm.DQ1.FieldByName('receive').AsString:='F';
              dm.DQ1.FieldByName('r_date').Clear;
              dm.DQ1.Post;
              end
           else  checkbox3.State:=cbchecked;
end;单独运行dm.DQ1.FieldByName('r_date').Clear;的时候正常,如果先执行其他程序再执行这条就报错,提示“无法更新定位行,一些值可能已在最后一次读取后已更改”。
有没有高手知道这是为什么?问题就出在dm.DQ1.FieldByName('r_date').Clear;这一句上,把这一句屏蔽就正常了。可是怎么看,这一句也没有问题啊?

解决方案 »

  1.   

    根据经验有两个可能性:
    1、你的表格中没有设置主键、索引之类。所以不能唯一标识一条数据。
    2、日期的格式为空时系统默认生成1990-01-01。而你用了clear的属性,所以造成了错误。
      

  2.   

    注意主键和标识
    dm.DQ1.FieldByName('r_date').asdatetime:='';最好用这一句,也可不要,
    你是空字段,在数据insert中可以不断.
      

  3.   

    用过了dm.DQ1.FieldByName('r_date').asdatetime:='',还是不行
    我是需要把已经存了值的r_date清空
      

  4.   

    dm.DQ1.FieldByName('r_date').asdatetime:=''
    改为dm.DQ1.FieldByName('r_date').asString:=''试试
      

  5.   

    都没有啊,那是我新加的字段,一开始就是空值,只有执行这个操作的时候才会被赋值
    我试过了,如果把clear改称具体的时间就可以,但问题是我要让它赋值为空值啊,郁闷
      

  6.   

    dm.DQ1.FieldByName('r_date').AsString=""
      

  7.   

    不知道你是什么原因,反正我是用类似dm.DQ1.FieldByName('r_date').AsString=""的语句可以让日期显示出来是一个空的,而不是1900-01-01或1899-12-31
      

  8.   

    我的当然是日期型,你确定你用的是ASSTRING:=""?这里一定要用asstring的,asdatetime是不可以的。
      

  9.   

    用SQL语言把'r_date'清空,记不得是用null还是别的??自己测试一下把
      

  10.   

    哭死了,我当然确定用的是ASSTRING:=""啦
    问题是第一次运行到这里不会死机,但第二次运行到这里就卡壳了,说什么数据已经更新过了cg2003() :就是不想用sql来清空,因为要找关键字太麻烦了
      

  11.   

    在每次操作(修改,添加,删除)表时,可以试试:dm.DQ1.close;
                                             dm.DQ1.open.
      

  12.   

    试试这个看!                    begin
                  dm.DQ1.Isert;
                  dm.DQ1.FieldByName('receive').AsString:='F';
                  dm.DQ1.FieldByName('r_date').asString='';
                  dm.DQ1.Post;
                  end
      

  13.   

    单独运行dm.DQ1.FieldByName('r_date').Clear;的时候正常,如果先执行其他程序再执行这条就报错,提示“无法更新定位行,一些值可能已在最后一次读取后已更改”。
    有没有高手知道这是为什么?问题就出在dm.DQ1.FieldByName('r_date').Clear;这一句上,把这一句屏蔽就正常了。可是怎么看,这一句也没有问题啊?-------咨询一下,在程序执行这些操作以前,还执行什么操作了??操作涉及到这个表没有??
    ------可以告诉这些东西吗?
      

  14.   

    因为这是一个判断checkbox的程序,所以你点击次checkbox就会触发几次
    第一次点checkbox没问题,可以顺利执行,但第二次点checkbox运行到这一句就会报错