问题是这样的,小弟做一个很简单的进销存,里面的一个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 中再切换回来,再输入数据的时候就提示无法为更新定位行,一些值有可能在最后一次读取后己更改。这是怎么回事啊?
有几个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 中再切换回来,再输入数据的时候就提示无法为更新定位行,一些值有可能在最后一次读取后己更改。这是怎么回事啊?
ADOTable1.Cancel;比如:退出窗口,取消按钮等试试看
提示是无法为更新定位行,请问要为操作定位行除了ADOTable1.Locate还有别的方法吗?
方法有两个:
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;
你的话让我受益良多!
我真的是查了N 多资料,试过N 多方法都不行
首先,我设了主键,其次,没有默认值,还有,我搜索到别到论坛上有人说遇到这个问题,用多加Active:=False;,Active:=True可以解决,但是我都试过了还是那个提示啊,怎么办~?有没有可能在别的什么地方出了问题?(对控件的设置非必要我都是按默认的)
UpperCase(PriField) 是什么意思 ?
为什么要把字符类型的全赋 空 而数字类型的全赋 0 ?
不过要是数据量多的时候就不好了
并且让他自动编号应该可以解决这个问题