'BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录

秋天之落叶 2018-05-15 04:18:25
又一个异常,查了网上的解决方法,加入计数为0时的控制、IsEmpty数据集为空时的判断、EOF判断、加入.first移动(没数据了移动不了啊)等等,都不行,就是没有试补丁,因为10.2的ADO有补丁吗?
ADO.OPEN查询出数据集全集,edit+post修改数据没有任何问题。
使用
dm1.ADO.Filter := '判卷=条件A';
dm1.ADO.Filtered := True;
时,由于修改A->B后,数据表中就会按照filter重新筛选A,被修改的一条记录就不会再次统计进来,也就是加入有2条A,修改第一个A->B后,条件A的记录会显示剩下的一条记录,问题来了,再修改剩下的一条A->B时,这是A就没有了记录,显示错误:
'BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。

简单说就是:查询出数据集全集,用过滤条件筛除部分记录,修改记录到最后一个时,出现上述错误提示。

有高手遇到过并解决了的吗?
delphi的版本都这么高了,一个低级的BUG还是没有解决?
...全文
1640 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋天之落叶 2018-05-18
  • 打赏
  • 举报
回复
多谢以上诸位,结贴了
LETOsoft 2018-05-18
  • 打赏
  • 举报
回复
// 更新过滤条件字段值 procedure TForm1.Button3Click(Sender: TObject); var ABookmark: string; begin // 开始更新(禁止显示自动刷新) cxGrid1DBTableView1.BeginUpdate; try // 获取位置 ABookmark := qry1.Bookmark; // 关闭过滤 qry1.Filtered := False; // 重新定位 qry1.Bookmark := ABookmark; // 修改数据 qry1.Edit; qry1.FieldByName('CZLX').AsString := '<校-正>'; qry1.Post; finally // 开启过滤 qry1.Filtered := True; // 完成更新 cxGrid1DBTableView1.EndUpdate; end; end;
秋天之落叶 2018-05-18
  • 打赏
  • 举报
回复
引用 15 楼 wenlovequ 的回复:
// 更新过滤条件字段值 procedure TForm1.Button3Click(Sender: TObject); var ABookmark: string; begin // 开始更新(禁止显示自动刷新) cxGrid1DBTableView1.BeginUpdate; try // 获取位置 ABookmark := qry1.Bookmark; // 关闭过滤 qry1.Filtered := False; // 重新定位 qry1.Bookmark := ABookmark; // 修改数据 qry1.Edit; qry1.FieldByName('CZLX').AsString := '<校-正>'; qry1.Post; finally // 开启过滤 qry1.Filtered := True; // 完成更新 cxGrid1DBTableView1.EndUpdate; end; end;
没用过书签,回头试一试
秋天之落叶 2018-05-18
  • 打赏
  • 举报
回复
引用 13 楼 victor_yang 的回复:
建议你不要过滤了,直接做成where条件,修改之后再做查询另外一批数据出来修改
没关系了,反正编译后单独运行没有问题。 在一个封闭的数据集中还是比较方便,要总是查询一批修改一批再查询一批,还是比较麻烦的。
victor_yang 2018-05-18
  • 打赏
  • 举报
回复
我的过滤功能一般用在明细查询,统计表里这类不需要修改的地方
victor_yang 2018-05-18
  • 打赏
  • 举报
回复
建议你不要过滤了,直接做成where条件,修改之后再做查询另外一批数据出来修改
victor_yang 2018-05-17
  • 打赏
  • 举报
回复
你一定要过滤后再操作吗?是否可以考虑用locate呢?
秋天之落叶 2018-05-17
  • 打赏
  • 举报
回复
引用 10 楼 victor_yang 的回复:
你一定要过滤后再操作吗?是否可以考虑用locate呢?
不方便,Locate是查询定位第一条被查询的记录上,不是形成新的数据集,后期还要处理下一条满足记录的数据,几种数据混在一起,不很方便
秋天之落叶 2018-05-17
  • 打赏
  • 举报
回复
引用 10 楼 victor_yang 的回复:
你一定要过滤后再操作吗?是否可以考虑用locate呢?
习惯用过滤了,没想到会这么多问题,不错的建议,尝试一下,看看是不是可以修改一下。
秋天之落叶 2018-05-16
  • 打赏
  • 举报
回复
不过,使用 Run Without Debugging(shift+crel+F9)编译运行或直接使用编译好的EXE运行就不提示错误,用 Run (F9)编译运行就提示错误。 所以最后不影响使用,但也挺腻歪的。
秋天之落叶 2018-05-16
  • 打赏
  • 举报
回复
引用 7 楼 doloopcn 的回复:
DELPHI 没有BUG,这是规则 对数据集进行处理的时候,最好是 if not DataSet.Active then Exit; if DataSet.RecordCount<1 then Exit; //然后才写入你的代码 尽量避免用BOF函数
在此错误下所有的条件好像都不能正确判断,也不起作用。 procedure TForm1.DBEditEh4KeyPress(Sender: TObject; var Key: Char); var i: Integer; begin if (Key = #13) then begin Key := #0; if dm1.ADO判卷.IsEmpty then Exit; if DBEditEh3.Text < DBEditEh4.Text then //实际得分<标准分 Exit; i := dm1.ADO判卷.RecordCount; if i < 1 then Exit; DBEditEh4Exit(Sender); // edit+post修改问题的标志、结果、判题人、判题方式等 if i = dm1.ADO判卷.RecordCount then // 如果判题后继续满足过滤条件,下移一行,否则因过滤掉一条记录,行次默认首行,防止跳行。【跟踪程序错误提示在此】 if (dm1.ADO判卷.Eof = False) then dm1.ADO判卷.next; DBEditEh4.SetFocus; DBEditEh4.SelectAll; end; end;
doloopcn 2018-05-16
  • 打赏
  • 举报
回复
DELPHI 没有BUG,这是规则 对数据集进行处理的时候,最好是 if not DataSet.Active then Exit; if DataSet.RecordCount<1 then Exit; //然后才写入你的代码 尽量避免用BOF函数
秋天之落叶 2018-05-16
  • 打赏
  • 举报
回复
引用 3 楼 wenlovequ 的回复:
Filtered=True时修改会触发过滤,所以Post时提示异常。 如果非要纠结这个Debug的警告提示,简单处理下: 1. 关闭过滤(dm1.ADO.Filtered := False;); 2. 编辑保存(dm1.ADO.Edit; ... dm1.ADO.Post;); 3. 启用过滤(dm1.ADO.Filtered := True;)。
关键是不提交TRUE,过滤不出需要的记录,我的考试系统是先过滤出没有被机器自动判卷的答题,然后人工判卷,判到最后一个记录时,出错,而且使用各种判断条件均不起作用,出错行在判断条件之后出现。
秋天之落叶 2018-05-16
  • 打赏
  • 举报
回复
引用 4 楼 lyhoo163 的回复:
数据集为空时。不能对集进行读写、浏览操作。 通常回避数据集为空的代码是: if XXADO.RecordCount>0 then
试过这个条件,出错行在这个条件之后出现。
lyhoo163 2018-05-16
  • 打赏
  • 举报
回复
数据集为空时。不能对集进行读写、浏览操作。 通常回避数据集为空的代码是: if XXADO.RecordCount>0 then
LETOsoft 2018-05-16
  • 打赏
  • 举报
回复
Filtered=True时修改会触发过滤,所以Post时提示异常。 如果非要纠结这个Debug的警告提示,简单处理下: 1. 关闭过滤(dm1.ADO.Filtered := False;); 2. 编辑保存(dm1.ADO.Edit; ... dm1.ADO.Post;); 3. 启用过滤(dm1.ADO.Filtered := True;)。
xiaocongzhi 2018-05-15
  • 打赏
  • 举报
回复
这个提示就是你查询的数据集为空,你要对为空作处理
秋天之落叶 2018-05-15
  • 打赏
  • 举报
回复
哎呀,又出现奇怪现象了,不用RUN编译运行,直接运行EXE文件,竟然不提示上述错误,还以为自行修复了,再次运行RUN错误依旧,再次运行EXE没有错误。 没有修改任何代码,看来是直接运行EXE文件时 if (dm1.ADO判卷.RecordCount > 0) then条件起作用了,RUN的时候,错误在这个条件之后产生? 这都是哪跟哪啊? 一脸懵逼啊!
SQL语法大全 SQL语法大全 1. ASP与Access数据库连接: 2. ASP与SQL数据库连接: 建立记录集对象: set rs=server.createobject("adodb.recordset") rs.open SQL语句,conn,3,2 3. SQL常用命令使用方法: (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]" sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 in (\'值1\',\'值2\',\'值3\')" sql="select * from 数据表 where 字段名 between 值1 and 值2" (2) 更新数据记录: sql="update 数据表 set 字段名=字段值 where 条件表达式" sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" (3) 删除数据记录: sql="delete from 数据表 where 条件表达式" sql="delete from 数据表" (将数据表所有记录删除) (4) 添加数据记录: sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)" sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) (5) 数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法: sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" set rs=conn.excute(sql) 用 rs("别名") 获取统的计值,其它函数运用同上。 (5) 数据表的建立和删除: CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) 例:CREATE TABLE tab01(name varchar(50),datetime default now()) DROP TABLE 数据表名称 (永久性删除一个数据表) 4. 记录集对象的方法: rs.movenext 将记录指针从当前的位置向下移一行 rs.moveprevious 将记录指针从当前的位置向上移一行 rs.movefirst 将记录指针移到数据表第一行 rs.movelast 将记录指针移到数据表最后一行 rs.absoluteposition=N 将记录指针移到数据表第N行 rs.absolutepage=N 将记录指针移到第N页的第一行 rs.pagesize=N 设置每页为N条记录 rs.pagecount 根据 pagesize 的设置返回总页数 rs.recordcount 返回记录总数 rs.bof

2,496

社区成员

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

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