Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

为什么记录移动代码会出错

悠悠  发表于:2008-06-18 12:39:13  
复制

在某个字段中使用了如下的代码后,如果光标是在最后一个字段,系统就会给出出错信息.为什么呢?有没有办法避免?

DoCmd.GoToRecord , , acNext

 

Top
pc高手 发表于:2008-06-18 13:04:30

凡是出现错误的地方都有错误提示“文字描述和错误代码”。 请提供文字描述和代码(至少文字描述)。

我推测: 你的出错的原因不是由于 “DoCmd.GoToRecord , , acNext”(表面上是因为它), 实际上是因为

该表的关键字段的属性, 由于该属性的设置, 才造成记录出错。 看看全面的设置就一目了然了!



悠悠 发表于:2008-06-18 13:11:03

请看提示信息:

 

点击下载此附件

悠悠 发表于:2008-06-18 13:14:58

关于出现错误信息的运行代码如下(部分代码省略):

 

Private Sub 计算费用_Enter() 

'获得记录数

Dim n As Integer

Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset("qry出口海运费计算")

rs.MoveLast

rs.MoveFirst

n = rs.RecordCount

Set rs = Nothing

'使光标在所有的费用计算字段中遍历一遍

Dim k As Integer 

If Me.CurrentRecord <> acLast Then 

For k = 1 To n  

XXXXXXX 

DoCmd.GoToRecord , , acNext

Next k

End If 

If Me.CurrentRecord = acLast Then

   MsgBox "费用计算完毕!", vbInformation, "系统运行进度"

End If 

End Sub

 



小魏 发表于:2008-06-18 14:22:49

DoCmd.GoToRecord , , acNext 的语句是用来将记录的指针移到下一条记录上。但是,如果当前记录就是最后一条记录了,或者是下一条记录已经不存在,或得是当前记录输入不完整。则就会产生“不能移动到指定记录”的错误。

你针对以上三种情总再排查一下即可。

根据你的代码来看,你的设计意图是想让记录指针在你的窗体上自动走一遍。这本是可以行得通的,但是,当记录指针到最后一条记录时,就应退出程序的运行。而你的指针却向下多走了一条记录,才产生了不能移动到指定记录的错误。



悠悠 发表于:2008-06-18 14:26:54
weizw55: 你好,问题的关键就是如何控制当记录指针到最后一条记录时,就退出程序.该如何写代码呢?谢谢!

小魏 发表于:2008-06-18 15:01:10

'使光标在所有的费用计算字段中遍历一遍

DoCmd.GoToRecord , , acFirst

Dim k As Integer 

If Me.CurrentRecord <> acLast Then 

For k = 1 To n-1  

XXXXXXX 

DoCmd.GoToRecord , , acNext

Next k

 

 



小魏 发表于:2008-06-18 15:07:12


小魏 发表于:2008-06-18 15:09:21


悠悠 发表于:2008-06-18 15:35:50
试过了,还是会出现错误信息,而且程序运行的极慢!

小魏 发表于:2008-06-18 16:13:12


'获得记录数

Dim n As Integer

Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset("qry出口海运费计算")

rs.MoveLast

rs.MoveFirst

n = rs.RecordCount

Set rs = Nothing

'使光标在所有的费用计算字段中遍历一遍

Dim k As Integer

 

For k = 1 To n

If Me.CurrentRecord <> acLast Then

XXXXXXX

DoCmd.GoToRecord , , acNext

Else

MsgBox "费用计算完毕!", vbInformation, "系统运行进度"
Exit Sub

End If

Next k

 

End Function



悠悠 发表于:2008-06-18 16:27:49
不行啊,还是会出现错误信息!

小魏 发表于:2008-06-18 16:42:08

你把你的程序发出来吧。或者是发给我。我来看看。这样可以调试。



悠悠 发表于:2008-06-18 16:50:27

我把数据库发上来了,请帮忙看看!

 

 

点击下载此附件

小魏 发表于:2008-06-18 17:10:02

找到问题了之所在了,你的这段代吗不能放在“计算费用_Enter()”的事件中来运行。这样会走入一个死循环里,造成出错。你原来的代码是要在[计算费用]字段获得焦点进入时执行,而你的代码本身就是要将指针移向下一条记录。所以,代码根本不没有指行,只是移动,并且出错。

我给改成了事件双击事件中,并且把MSGBOX语句放在尾部,就可以实现记录指针移动的效果了。

 

 

 

Private Sub 计算费用_DblClick(Cancel As Integer)

'获得记录数
Dim n As Integer
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("qry出口海运费计算")
rs.MoveLast
rs.MoveFirst
n = rs.RecordCount
Set rs = Nothing
'使光标在所有的计算费用字段中遍历一遍
Dim k As Integer

If Me.CurrentRecord <> acLast Then
For k = 1 To n - 1

'先将EDI费清零
Me.EDI费 = 0
'计算电放费
If Me.出口国家 = "MMX" Then
   Me.EDI费 = Me.大柜 * 30 + Me.小柜 * 30
End If
'计算拼箱操作费
Me.华东拼箱费 = 0
If Me.拼箱托盘数 > 0 Then
   Me.华东拼箱费 = Me.大柜拼 * 250 + Me.小柜拼 * 250 + Me.MCC拼入托盘数 * 2 * 30 + Me.MKC拼出托盘数 * 2 * 30
End If
'先将联单费清零
Me.联单费 = 0
'计算联单费
If Me.报关单张数 >= 2 Then
   Me.联单费 = (Me.报关单张数 - 1) * 50
End If
'填入计算费用时间和费用计算人
Me.计算费用时间 = Now()
Me.计算费用者 = CurrentUser


DoCmd.GoToRecord , , acNext

 

Next k

End If
MsgBox "费用计算完毕!", vbInformation, "系统运行进度"
End Sub



小魏 发表于:2008-06-18 17:25:46

'下面的这段代码就是最保险的了。我经过调试。没有发现出错。至少计算结果问题,那你就自己调试吧。我调试的结果是记录走动是没问题,只是没有计算出任何东西来。

 

Private Sub 计算费用_DblClick(Cancel As Integer)

'获得记录数
Dim n As Integer
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("qry出口海运费计算")
rs.MoveLast
rs.MoveFirst
n = rs.RecordCount
Set rs = Nothing
'使光标在所有的计算费用字段中遍历一遍
Dim k As Integer
Dim int1 As Integer
DoCmd.GoToRecord , , acLast
int1 = Me.CurrentRecord
DoCmd.GoToRecord , , acFirst
For k = 1 To n - 1
'MsgBox
'MsgBox

If Me.CurrentRecord <> int1 Then
'先将EDI费清零
Me.EDI费 = 0
'计算电放费
If Me.出口国家 = "MMX" Then
   Me.EDI费 = Me.大柜 * 30 + Me.小柜 * 30
End If
'计算拼箱操作费
Me.华东拼箱费 = 0
If Me.拼箱托盘数 > 0 Then
   Me.华东拼箱费 = Me.大柜拼 * 250 + Me.小柜拼 * 250 + Me.MCC拼入托盘数 * 2 * 30 + Me.MKC拼出托盘数 * 2 * 30
End If
'先将联单费清零
Me.联单费 = 0
'计算联单费
If Me.报关单张数 >= 2 Then
   Me.联单费 = (Me.报关单张数 - 1) * 50
End If
'填入计算费用时间和费用计算人
Me.计算费用时间 = Now()
Me.计算费用者 = CurrentUser


DoCmd.GoToRecord , , acNext
Else

Exit Sub
End If
Next k
MsgBox "费用计算完毕!", vbInformation, "系统运行进度"
End Sub



悠悠 发表于:2008-06-18 19:12:31
非常谢谢!但是,我想要的效果是记录指针只移动一边,以上的代码运行的结果会出现移动两边的效果.如何保证从第一条记录开始到最后一条记录结束,指针只移动一边的效果呢?

小魏 发表于:2008-06-18 19:26:51

上面的代吗并没有移动两遍,其运行的轨迹是,先跳到最后一条记录,读取最后一条记录的记录号,存入INT1中.然后跳到第一行,从第一行开始进行移动.所以,你会感觉走了两边.其实并没有.

下面这段代码是直接去第一条记录,并开始移动,看看是不是你要的效果.

 


Private Sub 计算费用_DblClick(Cancel As Integer)

'获得记录数
Dim n As Integer
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("qry出口海运费计算")
rs.MoveLast
rs.MoveFirst
n = rs.RecordCount
Set rs = Nothing
'使光标在所有的计算费用字段中遍历一遍
Dim k As Integer
DoCmd.GoToRecord , , acFirst
For k = 1 To n - 1

'先将EDI费清零
Me.EDI费 = 0
'计算电放费
If Me.出口国家 = "MMX" Then
   Me.EDI费 = Me.大柜 * 30 + Me.小柜 * 30
End If
'计算拼箱操作费
Me.华东拼箱费 = 0
If Me.拼箱托盘数 > 0 Then
   Me.华东拼箱费 = Me.大柜拼 * 250 + Me.小柜拼 * 250 + Me.MCC拼入托盘数 * 2 * 30 + Me.MKC拼出托盘数 * 2 * 30
End If
'先将联单费清零
Me.联单费 = 0
'计算联单费
If Me.报关单张数 >= 2 Then
   Me.联单费 = (Me.报关单张数 - 1) * 50
End If
'填入计算费用时间和费用计算人
Me.计算费用时间 = Now()
Me.计算费用者 = CurrentUser


DoCmd.GoToRecord , , acNext

Next k
MsgBox "费用计算完毕!", vbInformation, "系统运行进度"
End Sub



悠悠 发表于:2008-06-19 08:47:28

已经测试通过,不再出现错误信息.非常感谢weizw55!



总记录:18篇  页次:1/1 9 1 :