MS Access表单 - 打开和保存记录后的新记录

时间:2014-07-29 20:24:19

标签: forms vba ms-access record

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

MS Access Form where user name is selected from list

我创建了一个用作员工时间表的表单。用户双击此表单,弹出另一个表单,从组合框中选择用户名,主时间表单专门为其用户名加载。他们可以添加新记录,也可以通过滚动浏览"上一页"和"下一步"记录。

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

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

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

enter image description here

这是弹出窗体背后的代码(上图):

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

这是主要数据输入表格[专家 - 时间表输入]:

enter image description here

这是[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"按钮以启动[专家 - 时间表输入]表单。理想情况下,一旦用户从弹出窗口的下拉列表中选择用户名,我希望表单自动关闭并生成[专家 - 时间表条目]表单。

1 个答案:

答案 0 :(得分:2)

我想我在这里有一些东西。

我和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"

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

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

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

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