BOF或EOF中有一个是“真”,或者当前的记录被删除

mylajilaji 2008-09-11 06:03:23
test数据库中有个表,sheet1的内容如下,三个字段:分类、项目、2007年报

分类 项目 2007年报
经营资产 应收账款 259323054
经营资产 预付款项 55169003
经营资产 其他应收款 16965952
经营资产 存货 866076352
经营资产 长期股权投资 17763628
经营资产 固定资产 1547259191
经营资产 在建工程 660651564
经营资产 无形资产 175945907
经营资产合计 经营资产合计
我的意图:利用ADO求分类是“经营资产”的“2007年报”的和
Private Sub Form_click()
Dim mycon As New ADODB.Connection
Dim mystr As String
Dim myrst1 As New ADODB.Recordset


Dim s As Variant

mycon.Provider = "Microsoft.Jet.OLEDB.4.0"
mycon.Open "Data Source = C:\test.mdb"
myrst1.Open "select * from sheet1", mycon, adOpenDynamic, adLockOptimistic

With myrst1
Do While Not .EOF
.Find "分类='经营资产'"
s = s + .Fields("2007年报").Value
.MoveNext
Loop
End With
myrst1.Close
End Sub
出现错误:BOF或EOF中有一个是“真”,或者当前的记录被删除
我怎么也查不出错误,请赐教。
...全文
1074 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
mylajilaji 2008-09-12
  • 打赏
  • 举报
回复
根据各位的热心帮助,我找到了问题的原因,
find惹得祸, 原表一共9条记录,8条记录有“经营资产”,当循环至第九次时,已经find不到"分类='经营资产'",指针将跑到eof处,.MoveNext 将使指针越界,出现问题,使用myrst1.filter = "分类='经营资产'"就没有问题了。

可是我还有一个问题,需要在ado中使用变量,发现:VB可以在SQL语句使用变量(excute方法),ado中却不行呀
原来的语句修改成下面的就行了
With myrst4
.Filter = "分类='经营资产'"

Do While Not .EOF
s = s + .Fields("2007年报").Value
.MoveNext
Loop
End With
如果我的程序需要利用变量,发行有问题
X="经营资产" '前面已经定义X为字符串了
With myrst4
.Filter = "分类=X"

Do While Not .EOF
s = s + .Fields("2007年报").Value
.MoveNext
Loop
End With
这段程序为何不行?我需要在ADO中使用变量,可以做到吗?


wwwwb 2008-09-12
  • 打赏
  • 举报
回复
VBA没有VFP的LOCA、CONT组合,用FILTER、SQL语句解决,效率好、结果准确
wwwwb 2008-09-12
  • 打赏
  • 举报
回复
呵呵,还有问题,第二次查找要从第一次查找后的记录开始才行,用FILTER好一点
vbman2003 2008-09-12
  • 打赏
  • 举报
回复
wwwwb 好快哦.............
vbman2003 2008-09-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wwwwb 的回复:]
直接求和用SQL语句就可以,用两个记录集
myrst1.Open "select * from sheet1", mycon, adOpenDynamic, adLockOptimistic
myrst2.Open "select * from sheet1", mycon, adOpenDynamic, adLockOptimistic
do while not myrst1.eof

myrst2.Find "分类='经营资产'"
if not myrst2.eof then
s = s + .Fields("2007年报").Value
end if

myrst1.movenaxt
loop
[/Quote]

恩,这样可以的......
wwwwb 2008-09-12
  • 打赏
  • 举报
回复
上述代码效率比
myrst1.Open "select * from sheet1", mycon, adOpenDynamic, adLockOptimistic
myrst2.Open "select * from sheet1", mycon, adOpenDynamic, adLockOptimistic
do while not myrst1.eof

myrst2.Find "分类='经营资产'"
if not myrst2.eof then
s = s + .Fields("2007年报").Value
end if

myrst1.movenext
loop
高一些
wwwwb 2008-09-12
  • 打赏
  • 举报
回复
如果用filter:
myrst1.Open "select * from sheet1", mycon, adOpenDynamic, adLockOptimistic
myrst1.filter = "分类='经营资产'"
do while not myrst1.eof
s = s + .Fields("2007年报").Value
myrst1.movenaxt
loop
vbman2003 2008-09-12
  • 打赏
  • 举报
回复
但是要注意,以上代码并不是将"分类='经营资产'"全部找出,而是从第一个分类='经营资产'处开始,输出下面的所有记录
如果要只找出所有 "分类='经营资产'"的信息,要用myrst1.filter = "分类='经营资产'"
wwwwb 2008-09-12
  • 打赏
  • 举报
回复
直接求和用SQL语句就可以,用两个记录集
myrst1.Open "select * from sheet1", mycon, adOpenDynamic, adLockOptimistic
myrst2.Open "select * from sheet1", mycon, adOpenDynamic, adLockOptimistic
do while not myrst1.eof

myrst2.Find "分类='经营资产'"
if not myrst2.eof then
s = s + .Fields("2007年报").Value
end if

myrst1.movenaxt
loop
vbman2003 2008-09-12
  • 打赏
  • 举报
回复

with myrst1
if not .bof then
.Find "分类='经营资产'"
while not rs.eof
s = s + .Fields("2007年报").Value
.movenaxt
wend
end if
.Close
wend

wwwwb 2008-09-12
  • 打赏
  • 举报
回复
呵呵,你执行了FIND,应该判断是否找到,再做处理,而不是MoveNext
mylajilaji 2008-09-12
  • 打赏
  • 举报
回复
老大我知道用select做,问题是:我自己的代码问题出在哪里?
WWWWA 2008-09-12
  • 打赏
  • 举报
回复
OK,自行解决更好
mylajilaji 2008-09-12
  • 打赏
  • 举报
回复
我复制粘帖 .Filter = "分类='" & x & "'" 后可行了,我明白了
根据字符串的运算规则"分类='" & x & "'" 等同于 "分类='经营资产'" (在x = "经营资产" 的情形下,)
纠正一个错误:.Filter = "分类=" & X (在ACCESS中不可行,我测试过了,也就是说只有一种正确的表达式 .Filter = "分类='" & x & "'"
WWWWA 2008-09-12
  • 打赏
  • 举报
回复
测试,要用
.Filter = "分类='" & x & "'"
这种方式
WWWWA 2008-09-12
  • 打赏
  • 举报
回复
上传你的MDB到www.access911.net/csdn
只要有问题的表、查询,用WINRAR压缩
WWWWA 2008-09-12
  • 打赏
  • 举报
回复
or
.Filter = "分类=" & X
看来你没有仔细看过我的代码
WWWWA 2008-09-12
  • 打赏
  • 举报
回复
.Filter = "分类='& x&'" ->
.Filter = "分类='" & x & "'"
mylajilaji 2008-09-12
  • 打赏
  • 举报
回复
还是有问题,请wwwwa亲自测试一下
原始数据:test数据库中有个表,sheet1的内容如下,三个字段:分类、项目、2007年报
分类 项目 2007年报
经营资产 应收账款 259323054
经营资产 预付款项 55169003
经营资产 其他应收款 16965952
经营资产 存货 866076352
经营资产 长期股权投资 17763628
经营资产 固定资产 1547259191
经营资产 在建工程 660651564
经营资产 无形资产 175945907
经营资产合计 经营资产合计

我的代码,无参数形式的


Dim mycon As New ADODB.Connection
Dim mystr As String
Dim myrst1 As New ADODB.Recordset
Dim x As String

mycon.Provider = "Microsoft.Jet.OLEDB.4.0"
mycon.Open "Data Source = C:\test.mdb"
myrst1.Open "select * from sheet1", mycon, adOpenKeyset, adLockPessimistic
’x = "经营资产"
With myrst1
‘.Filter = "分类='& x&'"
.Filter = "分类='经营资产'"
Do While Not .EOF
Debug.Print .Fields("2007年报").Value
.MoveNext
Loop
End With
End Sub
可以正确运行,得到结果

下面是用参数形式就不行
Dim mycon As New ADODB.Connection
Dim mystr As String
Dim myrst1 As New ADODB.Recordset
Dim x As String

mycon.Provider = "Microsoft.Jet.OLEDB.4.0"
mycon.Open "Data Source = C:\test.mdb"
myrst1.Open "select * from sheet1", mycon, adOpenKeyset, adLockPessimistic
x = "经营资产"
With myrst1
.Filter = "分类='& x&'"
‘.Filter = "分类='经营资产'"
Do While Not .EOF
Debug.Print .Fields("2007年报").Value
.MoveNext
Loop
End With
End Sub
这段程序没有报错,但是没有结果?
请WWWWA用ACCESS亲自测试一下,谢谢

WWWWA 2008-09-12
  • 打赏
  • 举报
回复
or
.Filter = "分类=" & X
加载更多回复(3)

7,732

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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