在MS Access中打开另一个时关闭当前表单

时间:2013-08-14 20:42:12

标签: ms-access error-handling timer

我需要打开另一张表格,然后立即关闭。请注意,我的表单有一个每两秒钟发生一次的onTimer事件过程。我知道以下命令:

    DoCMD Close

    DoCMD OpenForm "frmOnError"

他们都是单独工作,但是当我做以下事情时:

    DoCMD OpenForm "frmOnError"
    DoCMD Close

然后表格只是闪烁,并没有关闭。它打开的表单本身不是,它是我要打开的表单的名称。同样,如果我注释掉这些行中的任何一行,它会执行剩下的行所说的。

接下来,我尝试在第一个窗体上使用DoCMD OpenForm,并且我在另一个窗体中有一个if语句,如果它打开则会关闭第一个窗口。这种情况很混乱,因为两种形式都有相同的命令,无论哪一种都能击败另一种形式的命令都会执行它。这意味着我无法确定哪种形式会关闭。

我的最后一个变体是在button_clicked子句中使用DoCMD OpenForm命令,在代码中较低,在Form_Timer部分中,我有DoCMD关闭命令。一旦加载另一个表单,它就会关闭另一个表单,而不是关闭另一个表单。这更稳定,但仍然很混乱。

有了这个,我就没有想法了。

代码说明:

代码的要点是关闭第一个表单,这取决于链接表和连接丢失时的错误。这将打开第二种形式,它不依赖于链接连接并继续工作。然后,新表单将有一个关闭它的按钮,并尝试再次加载第一个表单。这两种形式都依赖于2秒定时器来模拟来自PLC的恒定随机数据,并将继续无限期地需要定时器。

最后,以下是代码应按顺序执行的部分:

frmLoop:

Public Sub DoSQL4(vFacility As String, vWorkcell As Integer, vStation As Integer, vEventcode As Integer, vFacilityPath, vFacilityID, vFaultCodeID, vStateCode As Integer)

On Error GoTo ErrorHandler4

Const conLINKED_TABLE As String = "tblevent"

'INSERT INTO LINKED TABLE
CurrentDb.TableDefs(conLINKED_TABLE).RefreshLink

DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO tblevent (vchrFacility, intWorkCell, intStn, intEventCode) VALUES ('" & vFacility & "', '" & vWorkcell & "', '" & vStation & "', '" & vEventcode & "');"
DoCmd.RunSQL "INSERT INTO tblfaultdata (vchrFacilityPath, intFacilityID, intFaultCodeID, intWorkcell) VALUES ('" & vFacilityPath & "', '" & vFacilityID & "', '" & vFaultCodeID & "', '" & vWorkcell & "');"
DoCmd.RunSQL "INSERT INTO tblstate (vchrFacility, intWorkCell, intStn, intStateCode) VALUES ('" & vFacility & "', '" & vWorkcell & "', '" & vStation & "', '" & vStateCode & "');"
DoCmd.SetWarnings True

'INSERT INTO LOCAL TABLE

DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO Local_tblevent (vchrFacility, intWorkCell, intStn, intEventCode) VALUES ('" & vFacility & "', '" & vWorkcell & "', '" & vStation & "', '" & vEventcode & "');"
DoCmd.RunSQL "INSERT INTO Local_tblfaultdata (vchrFacilityPath, intFacilityID, intFaultCodeID, intWorkcell) VALUES ('" & vFacilityPath & "', '" & vFacilityID & "', '" & vFaultCodeID & "', '" & vWorkcell & "');"
DoCmd.RunSQL "INSERT INTO Local_tblstate (vchrFacility, intWorkCell, intStn, intStateCode) VALUES ('" & vFacility & "', '" & vWorkcell & "', '" & vStation & "', '" & vStateCode & "');"
DoCmd.SetWarnings True

Exit_theSub:

  DoCmd.OpenForm "frmOnError"

  If CurrentProject.AllForms("frmOnError").IsLoaded And Forms!frmOnError.CurrentView <> acCurViewDesign Then
  DoCmd.Close
  End If

'ERROR HANDLER
ErrorHandler4:

If Err.Number <> 0 Then
  Select Case Err.Number
    Case 3265
      MsgBox "[" & conLINKED_TABLE & "] does not exist as either an Internal or Linked Table", _
             vbCritical, "Table Missing"
    Case 3011, 3024     'Linked Table does not exist or DB Path not valid
      MsgBox "[" & conLINKED_TABLE & "] is not a valid, Linked Table", vbCritical, "Link Not Valid"
    Case Else
      MsgBox Err.Description & Err.Number, vbExclamation, "Error"
  End Select

Resume Exit_theSub

End If

End Sub

然后是frmOnError:

Private Sub btnRetry_Click()

DoCmd.OpenForm "frmLoop"

End Sub

Private Sub Form_Timer()

  If CurrentProject.AllForms("frmOnError").IsLoaded And Forms!frmOnError.CurrentView <> acCurViewDesign Then
  DoCmd.Close
  End If

他们基本上反弹并且第四。一旦错误处理程序关闭了一个,它就会打开另一个表单,然后自行关闭。如果在另一个表单上按下该按钮,则会打开第一个按钮,然后自行关闭。

这就是理论。我的代码中有些东西是非常错误的,我希望你们中的一个人能够发现它并指出它。谢谢!

编辑:我更新了我的代码以响应用户的回答,并用CurrentDb.Execute,dbfailonerror替换了DoCmd.RunSql。现在我的表单在打开时立即关闭,并且不会返回任何错误。

'INSERT INTO LINKED TABLE
CurrentDb.TableDefs(conLINKED_TABLE).RefreshLink

CurrentDb.Execute "INSERT INTO tblevent (vchrFacility, intWorkCell, intStn, intEventCode) VALUES ('" & vFacility & "', '" & vWorkcell & "', '" & vStation & "', '" & vEventcode & "');", dbFailOnError
CurrentDb.Execute "INSERT INTO tblfaultdata (vchrFacilityPath, intFacilityID, intFaultCodeID, intWorkcell) VALUES ('" & vFacilityPath & "', '" & vFacilityID & "', '" & vFaultCodeID & "', '" & vWorkcell & "');", dbFailOnError
CurrentDb.Execute "INSERT INTO tblstate (vchrFacility, intWorkCell, intStn, intStateCode) VALUES ('" & vFacility & "', '" & vWorkcell & "', '" & vStation & "', '" & vStateCode & "');", dbFailOnError

'INSERT INTO LOCAL TABLE

CurrentDb.Execute "INSERT INTO Local_tblevent (vchrFacility, intWorkCell, intStn, intEventCode) VALUES ('" & vFacility & "', '" & vWorkcell & "', '" & vStation & "', '" & vEventcode & "');", dbFailOnError
CurrentDb.Execute "INSERT INTO Local_tblfaultdata (vchrFacilityPath, intFacilityID, intFaultCodeID, intWorkcell) VALUES ('" & vFacilityPath & "', '" & vFacilityID & "', '" & vFaultCodeID & "', '" & vWorkcell & "');", dbFailOnError
CurrentDb.Execute "INSERT INTO Local_tblstate (vchrFacility, intWorkCell, intStn, intStateCode) VALUES ('" & vFacility & "', '" & vWorkcell & "', '" & vStation & "', '" & vStateCode & "');", dbFailOnError

Exit_theSub:

  DoCmd.Close

'ERROR HANDLER
ErrorHandler4:

If Err.Number <> 0 Then
  Select Case Err.Number
    Case 3265
      MsgBox "[" & conLINKED_TABLE & "] does not exist as either an Internal or Linked Table", _
             vbCritical, "Table Missing"
             DoCmd.OpenForm "frmOnError"
    Case 3011, 3024     'Linked Table does not exist or DB Path not valid
      MsgBox "[" & conLINKED_TABLE & "] is not a valid, Linked Table", vbCritical, "Link Not Valid"
      DoCmd.OpenForm "frmOnError"
    Case Else
      MsgBox Err.Description & Err.Number, vbExclamation, "Error"
      DoCmd.OpenForm "frmOnError"
  End Select

Resume Exit_theSub

End If

End Sub

1 个答案:

答案 0 :(得分:1)

DoCmd.Close语句还可用于指定要关闭的表单:

DoCmd.Close acForm, "frmFormName"

如果您使用它,它应该为您解决此问题。

纯粹作为旁注,我建议使用CurrentDb.Execute“SQL Statement”,dbFailOnError而不是DoCmd.RunSQL。这样你就不必弄乱警告了,当insert语句无法工作时,dbFailOnError标志将返回一个有用的错误代码。