高手我快崩溃了,以下代码一直出现record cannot be located for updating since it was last read &nb

  • 主题发起人 主题发起人 monkey_cn
  • 开始时间 开始时间
M

monkey_cn

Unregistered / Unconfirmed
GUEST, unregistred user!
高手我快崩溃了,以下代码一直出现record cannot be located for updating since it was last read 错误,能否帮忙解决一下? ( 积分: 200 )<br />高手我快崩溃了,以下代码一直出现record cannot be located for updating since it was last read 错误,
能否帮忙解决一下?

for i:=1 to NullItemCount do
begin
IdCan:=MatList[NullList].MatID;
if DM.T_ForPscDetail.Locate('原料ID',IdCan,[]) then
begin
if DM.T_ForPscDetail.State&amp;lt;&amp;gt;dsEdit then
DM.T_ForPscDetail.edit;
DM.T_ForPscDetail.FieldByName('需要量').AsFloat:=x;
DM.T_ForPscDetail.Post;
end;
end;
if FItemCount&amp;gt;0 then //只有有填充物时候,才执行
begin
IdCan:=FMatList[FNullList[1]].MatID;
if DM.T_ForPscDetail.Locate('原料ID',IdCan,[]) then
begin
if DM.T_ForPscDetail.State&amp;lt;&amp;gt;dsEdit then
DM.T_ForPscDetail.edit;
DM.T_ForPscDetail.FieldByName('需要量').AsFloat:=fx;
DM.T_ForPscDetail.Post;
end;
end;
 
高手我快崩溃了,以下代码一直出现record cannot be located for updating since it was last read 错误,
能否帮忙解决一下?

for i:=1 to NullItemCount do
begin
IdCan:=MatList[NullList].MatID;
if DM.T_ForPscDetail.Locate('原料ID',IdCan,[]) then
begin
if DM.T_ForPscDetail.State&amp;lt;&amp;gt;dsEdit then
DM.T_ForPscDetail.edit;
DM.T_ForPscDetail.FieldByName('需要量').AsFloat:=x;
DM.T_ForPscDetail.Post;
end;
end;
if FItemCount&amp;gt;0 then //只有有填充物时候,才执行
begin
IdCan:=FMatList[FNullList[1]].MatID;
if DM.T_ForPscDetail.Locate('原料ID',IdCan,[]) then
begin
if DM.T_ForPscDetail.State&amp;lt;&amp;gt;dsEdit then
DM.T_ForPscDetail.edit;
DM.T_ForPscDetail.FieldByName('需要量').AsFloat:=fx;
DM.T_ForPscDetail.Post;
end;
end;
 
我不是高手不过我不喜欢频繁的用locate,一般你的表要有主键才能正确定位,你可以试着用adocommand运行sql语句解决,而且有时候一个数据库被独占方式打开后是不允许修改的
例如更新就使用update set 语句
 
记录更新时不允许located呀,你还要这样做,赶快改一下你的程序吧
 
如果 DM.T_ForPscDetail 是临时表,我觉得这样写没错。如果直接与数据库关联的,且post就commit了,这样写就有问题了;我认为应该打开后先统一在本地做post再一次性commit
 
还是该用ADOQuery
 
看样子,是表DM.T_ForPscDetail的状态有问题.建议从下面几个方面去解决:
1.不要在一段代码中连续两次post,不管怎么讲,频繁的post会大大降低程序效率.可考虑
所有更新完成后,统一再作post.
2.如果非要两次post,可试在每次post后,将DM.T_ForPscDetail先Close再Open一次,确保表状态正常.不过这样代码看起来很笨拙.
3.不知你采用什么样的数据库,尽量把这类Locate的操作写在数据库里吧,效率会快很多.
 
更新与LOCATE操作冲突,换一种写法试试。[:)]
 
这个问题很常见,D7中的提示是 record cannot be located for updating since it was last read
早期版本中的提示是 Record changed by another user!
产生的原因很多:
1.符点数精度(日期字段)
2.默认值
3.Null字段
4.触发器
造成前台Post的时候找不到后台的记录。最好的解决方案是用缓存更新,Query接一个Tupdatesql,用updatesql产生的Sql语句去修改数据库记录(where条件只包含Key字段)
你可以用sql跟踪器查看Post的时候它生成的Sql语句就明白事件的来龙去脉了。
 
你可能用的市D5,这是D5的BUG,到官方网站下一个ADO的补丁和sp1(可能都要下,好久没有些程序了),我以前遇到过,如果网站上下部到,给我发电邮。
 
赞成vMao说法,具体情况还要具体分析。
你可以先把Query改为缓存更新,试一试在所有可能的post之后在updatebatch.
好好检查一下触发器,看是否有任何地方对数据集所连的表有修改。
 
后退
顶部