真的是很怪,我将程序放到另一台电脑中可以正常运行。 我将两台的部件和引用打印出来以后对照了一下完全一致。 楼上兄弟所说的dao我也试过了。现将代码贴出来:Dim WithEvents adoPrimaryRS As Recordset Dim mbChangedByCode As Boolean Dim mvBookMark As Variant Dim mbEditFlag As Boolean Dim mbAddNewFlag As Boolean Dim mbDataChanged As BooleanPrivate Sub Command1_Click() Dim cmd As New ADODB.Command Dim i As Integer i = MsgBox("结束初始化开票收款数据以后,就不准在修改初始数据了?", 33, "程序提示") If i = 1 Then cmd.ActiveConnection = cn cmd.Prepared = True cmd.CommandTimeout = 300 cmd.CommandText = "insert into 销售开票收款结余 select * from 销售开票收款期初" cmd.CommandType = adCmdText On Error Resume Next cmd.Execute Set cmd = Nothing End If End SubPrivate Sub Form_Load()
cn.CursorLocation = adUseClient Set adoPrimaryRS = New Recordset adoPrimaryRS.Open "select 会计年度,会计期间,客户内码,客户代码,客户名称,开票结余,收款结余 from 销售开票收款期初", cn, adOpenKeyset, adLockOptimistic
Set grdDataGrid.DataSource = adoPrimaryRS mbDataChanged = False End SubPrivate Sub Form_Resize() On Error Resume Next '当窗体调整时会调整网格 grdDataGrid.Height = Me.ScaleHeight - 30 - picButtons.Height - picStatBox.Height lblStatus.Width = Me.Width - 1500 cmdNext.Left = lblStatus.Width + 700 cmdLast.Left = cmdNext.Left + 340 End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If mbEditFlag Or mbAddNewFlag Then Exit Sub Select Case KeyCode Case vbKeyEscape cmdClose_Click Case vbKeyEnd cmdLast_Click Case vbKeyHome cmdFirst_Click Case vbKeyUp, vbKeyPageUp If Shift = vbCtrlMask Then cmdFirst_Click Else cmdPrevious_Click End If Case vbKeyDown, vbKeyPageDown If Shift = vbCtrlMask Then cmdLast_Click Else cmdNext_Click End If End Select End SubPrivate Sub Form_Unload(Cancel As Integer) Screen.MousePointer = vbDefault Unload findfrm
End SubPrivate Sub adoPrimaryRS_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) '为这个 recordset 显示当前记录位置 lblStatus.Caption = "Record: " & CStr(adoPrimaryRS.AbsolutePosition) End SubPrivate Sub cmdAdd_Click() On Error GoTo AddErr adoPrimaryRS.MoveLast adoPrimaryRS.AddNew grdDataGrid.SetFocus Exit Sub AddErr: MsgBox err.Description End SubPrivate Sub cmdDelete_Click() On Error GoTo DeleteErr With adoPrimaryRS .Delete .MoveNext If .EOF Then .MoveLast End With Exit Sub DeleteErr: MsgBox err.Description End SubPrivate Sub cmdrefresh_Click() '只有多用户应用程序需要 On Error GoTo RefreshErr Set grdDataGrid.DataSource = Nothing adoPrimaryRS.Requery Set grdDataGrid.DataSource = adoPrimaryRS Exit Sub RefreshErr: MsgBox err.Description End SubPrivate Sub cmdEdit_Click() On Error GoTo EditErr lblStatus.Caption = "编辑记录" mbEditFlag = True SetButtons False Exit SubEditErr: MsgBox err.Description End Sub Private Sub cmdCancel_Click() On Error Resume Next SetButtons True mbEditFlag = False mbAddNewFlag = False adoPrimaryRS.CancelUpdate If mvBookMark > 0 Then adoPrimaryRS.Book = mvBookMark Else adoPrimaryRS.MoveFirst End If mbDataChanged = FalseEnd SubPrivate Sub cmdUpdate_Click() On Error GoTo UpdateErr adoPrimaryRS.UpdateBatch adAffectAll If mbAddNewFlag Then adoPrimaryRS.MoveLast '移到新记录 End If mbEditFlag = False mbAddNewFlag = False SetButtons True mbDataChanged = False Exit Sub UpdateErr: MsgBox err.Description End SubPrivate Sub cmdClose_Click() Unload Me End SubPrivate Sub cmdFirst_Click() On Error GoTo GoFirstError adoPrimaryRS.MoveFirst mbDataChanged = False Exit SubGoFirstError: MsgBox err.Description End SubPrivate Sub cmdLast_Click() On Error GoTo GoLastError adoPrimaryRS.MoveLast mbDataChanged = False Exit SubGoLastError: MsgBox err.Description End SubPrivate Sub cmdNext_Click() On Error GoTo GoNextError If Not adoPrimaryRS.EOF Then adoPrimaryRS.MoveNext If adoPrimaryRS.EOF And adoPrimaryRS.recordcount > 0 Then Beep '已到最后返回 adoPrimaryRS.MoveLast End If '显示当前记录 mbDataChanged = False Exit Sub GoNextError: MsgBox err.Description End SubPrivate Sub cmdPrevious_Click() On Error GoTo GoPrevError If Not adoPrimaryRS.BOF Then adoPrimaryRS.MovePrevious If adoPrimaryRS.BOF And adoPrimaryRS.recordcount > 0 Then Beep '已到最后返回 adoPrimaryRS.MoveFirst End If '显示当前记录 mbDataChanged = False Exit SubGoPrevError: MsgBox err.Description End SubPrivate Sub SetButtons(bVal As Boolean) cmdAdd.Visible = bVal cmdEdit.Visible = bVal cmdUpdate.Visible = Not bVal cmdCancel.Visible = Not bVal cmdDelete.Visible = bVal cmdClose.Visible = bVal cmdRefresh.Visible = bVal cmdNext.Enabled = bVal cmdFirst.Enabled = bVal cmdLast.Enabled = bVal cmdPrevious.Enabled = bVal End Sub
呵呵,怎么全贴出来了。我见过这样的现象。不知是不是和你的一样 正常的代码两个机子上一个能打开,一个不能打开,当时我们两个机子的 VB版本不一样,ADO的版本也不一样,出现这样的情况,把ADO取消了,再 引用一次,编译一次,就能解决。另外为什么不声明成 Dim WithEvents adoPrimaryRS As ADODB.Recordset呢?
要么就是ADO的,那就多了2.0,2.1,2.5,2.6,2.7
我就不信找不到它
我将两台的部件和引用打印出来以后对照了一下完全一致。
楼上兄弟所说的dao我也试过了。现将代码贴出来:Dim WithEvents adoPrimaryRS As Recordset
Dim mbChangedByCode As Boolean
Dim mvBookMark As Variant
Dim mbEditFlag As Boolean
Dim mbAddNewFlag As Boolean
Dim mbDataChanged As BooleanPrivate Sub Command1_Click()
Dim cmd As New ADODB.Command
Dim i As Integer
i = MsgBox("结束初始化开票收款数据以后,就不准在修改初始数据了?", 33, "程序提示")
If i = 1 Then
cmd.ActiveConnection = cn
cmd.Prepared = True
cmd.CommandTimeout = 300
cmd.CommandText = "insert into 销售开票收款结余 select * from 销售开票收款期初"
cmd.CommandType = adCmdText
On Error Resume Next
cmd.Execute
Set cmd = Nothing
End If
End SubPrivate Sub Form_Load()
cn.CursorLocation = adUseClient
Set adoPrimaryRS = New Recordset
adoPrimaryRS.Open "select 会计年度,会计期间,客户内码,客户代码,客户名称,开票结余,收款结余 from 销售开票收款期初", cn, adOpenKeyset, adLockOptimistic
Set grdDataGrid.DataSource = adoPrimaryRS
mbDataChanged = False
End SubPrivate Sub Form_Resize()
On Error Resume Next
'当窗体调整时会调整网格
grdDataGrid.Height = Me.ScaleHeight - 30 - picButtons.Height - picStatBox.Height
lblStatus.Width = Me.Width - 1500
cmdNext.Left = lblStatus.Width + 700
cmdLast.Left = cmdNext.Left + 340
End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If mbEditFlag Or mbAddNewFlag Then Exit Sub Select Case KeyCode
Case vbKeyEscape
cmdClose_Click
Case vbKeyEnd
cmdLast_Click
Case vbKeyHome
cmdFirst_Click
Case vbKeyUp, vbKeyPageUp
If Shift = vbCtrlMask Then
cmdFirst_Click
Else
cmdPrevious_Click
End If
Case vbKeyDown, vbKeyPageDown
If Shift = vbCtrlMask Then
cmdLast_Click
Else
cmdNext_Click
End If
End Select
End SubPrivate Sub Form_Unload(Cancel As Integer)
Screen.MousePointer = vbDefault
Unload findfrm
End SubPrivate Sub adoPrimaryRS_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
'为这个 recordset 显示当前记录位置
lblStatus.Caption = "Record: " & CStr(adoPrimaryRS.AbsolutePosition)
End SubPrivate Sub cmdAdd_Click()
On Error GoTo AddErr
adoPrimaryRS.MoveLast
adoPrimaryRS.AddNew
grdDataGrid.SetFocus Exit Sub
AddErr:
MsgBox err.Description
End SubPrivate Sub cmdDelete_Click()
On Error GoTo DeleteErr
With adoPrimaryRS
.Delete
.MoveNext
If .EOF Then .MoveLast
End With
Exit Sub
DeleteErr:
MsgBox err.Description
End SubPrivate Sub cmdrefresh_Click()
'只有多用户应用程序需要
On Error GoTo RefreshErr
Set grdDataGrid.DataSource = Nothing
adoPrimaryRS.Requery
Set grdDataGrid.DataSource = adoPrimaryRS Exit Sub
RefreshErr:
MsgBox err.Description
End SubPrivate Sub cmdEdit_Click()
On Error GoTo EditErr lblStatus.Caption = "编辑记录"
mbEditFlag = True
SetButtons False
Exit SubEditErr:
MsgBox err.Description
End Sub
Private Sub cmdCancel_Click()
On Error Resume Next SetButtons True
mbEditFlag = False
mbAddNewFlag = False
adoPrimaryRS.CancelUpdate
If mvBookMark > 0 Then
adoPrimaryRS.Book = mvBookMark
Else
adoPrimaryRS.MoveFirst
End If
mbDataChanged = FalseEnd SubPrivate Sub cmdUpdate_Click()
On Error GoTo UpdateErr adoPrimaryRS.UpdateBatch adAffectAll If mbAddNewFlag Then
adoPrimaryRS.MoveLast '移到新记录
End If mbEditFlag = False
mbAddNewFlag = False
SetButtons True
mbDataChanged = False Exit Sub
UpdateErr:
MsgBox err.Description
End SubPrivate Sub cmdClose_Click()
Unload Me
End SubPrivate Sub cmdFirst_Click()
On Error GoTo GoFirstError adoPrimaryRS.MoveFirst
mbDataChanged = False Exit SubGoFirstError:
MsgBox err.Description
End SubPrivate Sub cmdLast_Click()
On Error GoTo GoLastError adoPrimaryRS.MoveLast
mbDataChanged = False Exit SubGoLastError:
MsgBox err.Description
End SubPrivate Sub cmdNext_Click()
On Error GoTo GoNextError If Not adoPrimaryRS.EOF Then adoPrimaryRS.MoveNext
If adoPrimaryRS.EOF And adoPrimaryRS.recordcount > 0 Then
Beep
'已到最后返回
adoPrimaryRS.MoveLast
End If
'显示当前记录
mbDataChanged = False Exit Sub
GoNextError:
MsgBox err.Description
End SubPrivate Sub cmdPrevious_Click()
On Error GoTo GoPrevError If Not adoPrimaryRS.BOF Then adoPrimaryRS.MovePrevious
If adoPrimaryRS.BOF And adoPrimaryRS.recordcount > 0 Then
Beep
'已到最后返回
adoPrimaryRS.MoveFirst
End If
'显示当前记录
mbDataChanged = False Exit SubGoPrevError:
MsgBox err.Description
End SubPrivate Sub SetButtons(bVal As Boolean)
cmdAdd.Visible = bVal
cmdEdit.Visible = bVal
cmdUpdate.Visible = Not bVal
cmdCancel.Visible = Not bVal
cmdDelete.Visible = bVal
cmdClose.Visible = bVal
cmdRefresh.Visible = bVal
cmdNext.Enabled = bVal
cmdFirst.Enabled = bVal
cmdLast.Enabled = bVal
cmdPrevious.Enabled = bVal
End Sub
正常的代码两个机子上一个能打开,一个不能打开,当时我们两个机子的
VB版本不一样,ADO的版本也不一样,出现这样的情况,把ADO取消了,再
引用一次,编译一次,就能解决。另外为什么不声明成
Dim WithEvents adoPrimaryRS As ADODB.Recordset呢?
运行到这个时候又出现了以上问题。用f2查看了一下好像是vba里面的。真的不知道其所以然
Dim WithEvents adoPrimaryRS As Recordset 用的 是dao 的
最好加上前缀 用
Dim WithEvents adoPrimaryRS As adodb.Recordset
可能是你得ADO版本升级过,所以你原来的引用不能正确找到新版本的ADO