【问题标题】:MS Access form - New record on open and after saving recordMS Access 表单 - 打开和保存记录后的新记录
【发布时间】:2014-07-29 20:24:19
【问题描述】:

关于我在这里发布的问题:

MS Access Form where user name is selected from list

我创建了一个用作员工时间表的表单。用户双击此表单,弹出另一个表单,他们从组合框中选择他们的用户名,主时间表表单专门为其用户名加载。他们可以添加新记录,还可以通过滚动“上一个”和“下一个”记录来查看他们以前提交的内容。

但是,当用户打开表单时,会显示他们的最后一条记录。此外,当保存新记录时,除非用户单击“新建(空白)记录”按钮,否则该新记录会继续显示。

有人可以帮我修改表单中的 VBA 代码以允许:
1) 打开表单时自动加载的空白记录 2) 保存/修改新记录时自动加载空白记录。

这是弹出窗口 - 当您选择主数据输入表单时弹出的表单:

这是弹出表单背后的代码(上图):

Private Sub Form_Current()
If VBA.Strings.Len(txtUN & "") = 0 Then DoCmd.OpenForm "frm_UserName", acNormal, , , , acDialog
If VBA.Strings.Len(txtUsername & "") = 0 Then txtUsername = txtUN
End Sub

 Private Sub Form_BeforeUpdate(Cancel As Integer)


   Dim ctl As Control

   On Error GoTo Err_BeforeUpdate


   If Me.Dirty Then

      If MsgBox("Do you want to save?", vbYesNo + vbQuestion, _
              "Save Record") = vbNo Then
         Me.Undo
      End If
   End If

Exit_BeforeUpdate:
   Exit Sub

Err_BeforeUpdate:
   MsgBox Err.Number & " " & Err.Description
   Resume Exit_BeforeUpdate

End Sub

这是主要的数据输入表单[Specialist - Timesheet Entry]:

这是 [Specialist - Timesheet Entry] 表单背后的代码:

Option Compare Database

Private Sub cboUserName_AfterUpdate()
   Forms![Specialist - Timesheet Entry].txtUN = cbousername
   Forms![Specialist - Timesheet Entry].Filter = "user_full_name = '" & cbousername & "'"
   Forms![Specialist - Timesheet Entry].FilterOn = True
      'Forms![Specialist - Timesheet Entry].Requery
      'DoCmd.Close

End Sub
Private Sub Form_Unload(Cancel As Integer)
  If (VBA.Strings.Len(cbousername & "") = 0) Then
     MsgBox "You must supply a user name before proceeding.", , "ERROR: Missing Info."
     Cancel = True
  End If
End Sub  

一旦选择了 [专家 - 时间表条目],就会弹出 [form_UserName]。您必须从列表中选择一个用户名,然后点击“X”按钮。选择“X”按钮后,将出现数据输入表单 [专家 - 时间表输入],供用户输入必要的字段。 我还希望用户不必点击“X”按钮即可启动 [专家 - 时间表条目] 表单。理想情况下,一旦用户从弹出窗口的下拉列表中选择用户名,我希望表单自动关闭并生成 [Specialist - Timesheet Entry] 表单。

【问题讨论】:

  • 尝试DoCmd.GoToRecord , , acNewRec 获取新记录。把这个On Load 放在那里,如果用户想保存记录,你还需要尝试把那个代码放在那里来处理Yes 部分。我对 Me.Dirty 代码很怀疑。
  • @overmind 如果我添加建议的代码,我会收到运行时错误 2424。“您输入的表达式包含 MS Access 无法找到的字段、控件或属性名称。”如果我单击调试,此代码以红色突出显示If VBA.Strings.Len(txtUsername & "") = 0 Then
  • 我也试过这个代码:DoCmd.RunCommand acCmdRecordsGoToNew 和它同样的问题。
  • @overmind 您在上面提供的代码与您在我问过的另一个问题中给我的代码相同,但由于某种原因,这种情况正在引发运行时间。
  • 尝试调试它。 If VBA.Strings.Len(txtUsername & "") = 0 Then MsgBox("An erorr was caught") End If

标签: forms vba ms-access record


【解决方案1】:

我想我有东西要给你。

我与 OverMind 有着相同的看法 - 我对 Me.Dirty 代码持怀疑态度。我认为没有必要。您需要做的就是单击下拉列表,选择一个名称并打开一个使用所选名称过滤的表单。 Form_BeforeUpdate 事件也是如此。您实际上并没有修改任何数据,您只是单击并选择。我建议删除这两个事件。

如果您不介意,我会稍微修改一下,因为我面前没有完整的应用程序。尝试以下(有几个部分):

1.) frm_UserName

cboUserName_AfterUpdate 事件中注释您现有的代码并添加以下行:

       DoCmd.OpenForm "Specialist - Timesheet Entry"
        'Open the main timesheet form and set the filter based on the dropdown selection in the previous form.
       Forms![Specialist - Timesheet Entry].Filter = "Username = '" & Forms![frm_UserName].cboUserName.Column(1) & "'"
       'Turn the filter on.
       Forms![Specialist - Timesheet Entry].FilterOn = True
       'Set the username textbox to the selected record.
       Forms![Specialist - Timesheet Entry].txtUN = Me.cboUserName.Column(1)
       'Jump to a new record even though the form is filtered.
       Forms![Specialist - Timesheet Entry].SetFocus
       DoCmd.GoToRecord , , acNewRec
       'Close the previous form - we no longer need it.
       DoCmd.Close acForm, "frm_UserName"

这将从frm_UserName 表单“打开Timesheet 表单时自动加载[空白记录]”打开Timesheet - Specialist Entry,使用选择作为过滤器。

2.) 专家 - 时间表条目

在 Form Open 事件中创建一个新过程并添加以下代码:

Private Sub Form_Open(Cancel As Integer)

    DoCmd.OpenForm "frm_UserName", acNormal, , , , acDialog

End Sub

接下来,在保存按钮Click 事件中创建一个新过程并添加以下代码:

Private Sub cmdSave_Click()

    'Save the record.
    RunCommand acCmdSaveRecord
    'Load a new record after the save.
    DoCmd.GoToRecord , , acNewRec

End Sub

这将在保存/修改新记录时自动加载空白记录。

我希望这会有所帮助。如果您有任何问题,请告诉我。我很乐意提供进一步的帮助。我也有可用的工作副本...

【讨论】:

  • 你知道,我想知道我们是否应该告诉 OP 放弃他的“弹出框”想法。特别是如果他/她不知道它是如何工作的。我在页面上看到了一个用户名组合框。为什么不使用它?我们还可以从时间表输入表单中创建一个子表单,并使用用户名组合框中的参数调用它。
  • 我也有同样的想法,但我尽可能地接近原始 UI 流程 - 不想完全重新设计。他们已经为此付出了很多努力。这也是一种很好的学习体验。
  • @DanRomano 我添加了以上所有内容并进行了一些修改。 form_username 应该称为frm_username,我相信对"Username 的引用应该是txtUserName。如果我进行这些更改并双击Specialist - Timesheet Entry 表单,我会得到一个运行时“MS Access 找不到表单'frm_username'。当我尝试调试时,此代码为黄色:` 表单![专家 - 时间表条目].Filter = "txtUserName = '" & Forms![frm_username].cbousername.Column(1) & "'"`
  • 答案已更新。如果您遇到任何错误,请告诉我。
  • @DanRomano 我进行了更新,一旦我从弹出窗口中选择了一个用户,主窗体就会打开,询问我是否要保存的对话框也会打开。单击“否”后,我会收到运行时错误 2105“您无法转到指定的记录”。此行以黄色突出显示 ` DoCmd.GoToRecord , , acNewRec`
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多