使用ADOTABLE很奇怪的问题

秋天之落叶 2018-05-28 12:23:39
dm1.ADOTable出题.Close;
dm1.ADOTable出题.TableName := '题库表';
dm1.ADOTable出题.Open;

dm1.ADOTable出题.Filter := cx; // ‘选题标志=A’ 假如表记录50条,选出A=10条
dm1.ADOTable出题.Filtered := True;

----以上是查询键动作
----以下是修改键动作

dm1.ADOTable出题.First;

问题1--> while not dm1.ADOTable出题.Eof do //使用这个循环+dm1.ADOTable出题.next,记录只修改一半(5条),因为选题标志=‘’后,会在DBGRIDEH表中消失,NEXT后隔一条记录;如果不使用Next,则死循环

问题2--> for i := 0 to dm1.ADOTable出题.RecordCount - 1 do //使用这个循环,不管用不用next,10条记录都能全部修改成功。
begin
dm1.ADOTable出题.Edit;
dm1.ADOTable出题.FieldByName('选题标志').AsString := '';
dm1.ADOTable出题.Post;

dm1.ADOTable出题.next; //似乎这个next在for循环中没有什么作用?
end;

以前没用过ADOtable,这是第一次用,你们也是这么用吗?怎么解决while这个问题?
...全文
701 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋天之落叶 2018-05-28
  • 打赏
  • 举报
回复
感觉使用过滤查询后,修改了使用过滤条件的字段值后,包括删除、修改等都存在这个问题。
秋天之落叶 2018-05-28
  • 打赏
  • 举报
回复
有了: 查询时,设置: ado.locktype:=ltbatchoptimistic; for循环修改后: ado.filtered:=false; ado.filtergroup:=fgpendingrecords; ado.filtered:=true; ado.updatebatch(arall); 哈哈,效果不错。
秋天之落叶 2018-05-28
  • 打赏
  • 举报
回复
引用 8 楼 jjpweb 的回复:
在过滤条件下数据集循环里更改这个数据集,这写法就会出问题 post之后,符合条件的数据已经不在过滤条件范围内了
嗯,你有什么好的方法吗?
jjpweb 2018-05-28
  • 打赏
  • 举报
回复
在过滤条件下数据集循环里更改这个数据集,这写法就会出问题 post之后,符合条件的数据已经不在过滤条件范围内了
秋天之落叶 2018-05-28
  • 打赏
  • 举报
回复
我想要的效果是,在dbgrideh表中按照条件过滤查询显示了10条记录,修改某一字段后(该字段可能是过滤条件之一),该10条记录还在表中,且被修改的字段显示被修改后的状态。
秋天之落叶 2018-05-28
  • 打赏
  • 举报
回复
引用 5 楼 victor_yang 的回复:
[quote=引用 4 楼 leavesguth 的回复:] [quote=引用 2 楼 victor_yang 的回复:] 要看你的过滤条件了,可能是你修改了记录后,这条记录被过滤了,当前记录又跑到第一条了,所以成死循环
确定没有ADOTABLE事件和datasource事件,修改的就是过滤条件之一,是不是按照过滤条件查出数据集后,不管在什么情况下,过滤条件一直在起作用? 我去加一个disablecontrols试一试,或者使用DBGRIDEH数据集试一试。[/quote] 你修改之后的记录是不是不符合过滤条件了?如果被过滤掉了,那table会跑到第一行的[/quote] 是啊,修改的字段就是过滤条件之一,修改后肯定不符合记录了,看来过滤条件会一直起作用的,除非false。 我想知道遇到这样的情况,你们也是用for循环吗,还是有其他的处理方法?
秋天之落叶 2018-05-28
  • 打赏
  • 举报
回复
测试了一下,不管用那个数据集,只要用while+next就会出现修改一半记录的情况,也就是会跳跃修改。 用for循环,加不加next都不影响,都会全部修改。 这是循序逐条记录修改和集合全集总数修改的区别? 你们怎么处理这种情况?我想知道还有其他的方式处理吗?
victor_yang 2018-05-28
  • 打赏
  • 举报
回复
引用 4 楼 leavesguth 的回复:
[quote=引用 2 楼 victor_yang 的回复:] 要看你的过滤条件了,可能是你修改了记录后,这条记录被过滤了,当前记录又跑到第一条了,所以成死循环
确定没有ADOTABLE事件和datasource事件,修改的就是过滤条件之一,是不是按照过滤条件查出数据集后,不管在什么情况下,过滤条件一直在起作用? 我去加一个disablecontrols试一试,或者使用DBGRIDEH数据集试一试。[/quote] 你修改之后的记录是不是不符合过滤条件了?如果被过滤掉了,那table会跑到第一行的
秋天之落叶 2018-05-28
  • 打赏
  • 举报
回复
引用 2 楼 victor_yang 的回复:
要看你的过滤条件了,可能是你修改了记录后,这条记录被过滤了,当前记录又跑到第一条了,所以成死循环
确定没有ADOTABLE事件和datasource事件,修改的就是过滤条件之一,是不是按照过滤条件查出数据集后,不管在什么情况下,过滤条件一直在起作用? 我去加一个disablecontrols试一试,或者使用DBGRIDEH数据集试一试。
victor_yang 2018-05-28
  • 打赏
  • 举报
回复
你的table有没有其它事件?比如afterscroll,afterpost之类的?
victor_yang 2018-05-28
  • 打赏
  • 举报
回复
要看你的过滤条件了,可能是你修改了记录后,这条记录被过滤了,当前记录又跑到第一条了,所以成死循环

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧