问题是这样的,小弟做一个很简单的进销存,里面的一个Button1Click里有这样的功能:
有几个DBEdit1,点击Button1的时候就判断一个表(用来显示这个表的DBGrid在别的窗口A中)是否有这个规格的这个物品,有的话修改它的数量,我用的是
if ADOTable1.Locate('Cname;Cnorm',VarArrayOf([DBEdit1.Text,DBEdit3.Text]),[])  的方法。
修改该物品数量用的是
ADOTable1['Ccount']:=IntToStr(StrToInt(ADOTable1['Ccount'])+StrToInt(DBEdit2.Text));
ADOTable1.Post;
但是出现了个很奇怪的问题,如果连续的输入是没问题的,但是我如果切换到刚才说的窗口A 中再切换回来,再输入数据的时候就提示无法为更新定位行,一些值有可能在最后一次读取后己更改。这是怎么回事啊?

解决方案 »

  1.   

    在必要的地方加上
    ADOTable1.Cancel;比如:退出窗口,取消按钮等试试看
      

  2.   

    好像不行,请问加上 ADOTable1.Cancel;有什么用?
    提示是无法为更新定位行,请问要为操作定位行除了ADOTable1.Locate还有别的方法吗?
      

  3.   

    表里设置了默认值,而ADO又是静态游标,其在生成SQL语句时,是以表里所有字段为条件的.当你刚保存,又重新进行修改后,它在生成UPDATE语句时,其更新条件是以以前SELECT时取数据时的条件,而此时你的表数据已经改变(因为你刚新增),所以此时无法进行更新.
    方法有两个:
    1、表里字段不能设置默认值;
    2、提供一个过程给你,在APPEND之后调用,为所有字段赋初值:(好好看一下,对你很有帮助)
    procedure TDataModuleMain.SetDefault(DataSet: TADODataSet; PriField: string);
    Var i:Integer;
    begin
      For i:=0 to DataSet.Fields.Count-1 do
        begin
        if UpperCase(DataSet.Fields.Fields[i].FieldName)=UpperCase(PriField) then Continue;
        Case DataSet.Fields.Fields[i].DataType of
          ftString,ftFixedChar, ftWideString :
            DataSet.Fields.Fields[i].Value:='';
          ftLargeint,ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD :
            DataSet.Fields.Fields[i].Value:=0;
        end;
        end;
    end;
      

  4.   

    多谢各位,问题以及解决,特别是chenylin(陈SIR) 
    你的话让我受益良多!
      

  5.   

    现在真的晕了,昨晚测试不全面,现在发现这个问题并没有解决
    我真的是查了N 多资料,试过N  多方法都不行
    首先,我设了主键,其次,没有默认值,还有,我搜索到别到论坛上有人说遇到这个问题,用多加Active:=False;,Active:=True可以解决,但是我都试过了还是那个提示啊,怎么办~?有没有可能在别的什么地方出了问题?(对控件的设置非必要我都是按默认的)
      

  6.   

    还有 请问下chenylin(陈SIR) 
    UpperCase(PriField) 是什么意思 ?
    为什么要把字符类型的全赋 空 而数字类型的全赋 0  ?
      

  7.   

    晕了,太粗心了我,Active:=False;,Active:=True加错地方了,用这个方法是可以的
    不过要是数据量多的时候就不好了
      

  8.   

    在数据库里加个ID  INT 4
    并且让他自动编号应该可以解决这个问题
      

  9.   

    恩,就是 XINGXIMU(田天)说的那样,不过每次修改一个记录就关闭再打开,如果在数据量大的话估计运行是很慢的,不过算了,应付一下毕业设计先,哈哈,以后有时间再慢慢想别的方法,多谢各位捧场,结贴