命令按钮的“单击时”事件不会针对相同格式的不同记录进行更新

时间:2018-10-01 14:18:04

标签: vba ms-access access-vba ms-access-2016

我在表单上有一个命令按钮,该按钮将打开一个单独的表单,仅打开一个与当前表单的联系人ID匹配的新记录。第二种形式是存在的,因此我可以在我的联系人和新群组之间建立关系,这是一对多的关系,因为每个联系人可以在多个群组中,但是有些联系人不在任何群组中。

一些用户将现有的联系人分配到一个新的组,而某些用户将新的联系人添加到一个现有的组,所以我希望建立联系人和组之间关系的表单独立于联系人表单或组而存在形成。这就是为什么我不只是在联系人表单上创建子表单的原因。我不知道用户在编辑关系时将来自哪个方向,并且理想情况下,我想建立一个系统,其中用户来自的表单将使用两个字段之一(联系人和组)将根据“父级”表单自动填充。也就是说,如果我的用户正在从联系人表单访问关系表单,我将看到一个新记录,其中已填写ContactID,并且可以选择一个组。同样,如果用户正在从组表单访问关系表单,则将填写该组,然后用户将选择一个联系人。

在联系人表单上,单击“命令”按钮时,我有以下子例程:

Private Sub CmdAssignContactGroup_Click()
    DoCmd.OpenForm "frmContacts_Groups", , , , acFormPropertySettings
    [Forms]![frmContacts_Groups]![ContactID] = [Forms]![frmContacts]![ContactID]
End Sub

这适用于任何一个联系人,但是当我移至另一个联系人而不关闭联系人表单时,过滤条件保持不变,并且命令按钮将我带到附加到先前联系人的联系人/组表单中的记录

更改联系表单中的记录后,如何告诉命令按钮重置?

2 个答案:

答案 0 :(得分:1)

此答案使用控件的DefaultValueLocked属性来固定ContactID(如果表单由frmContacts打开)或GroupID (如果表单由frmGroups打开)以打开表单值。

我假设frmContacts_Groups中有两个组合框绑定到它们的ID,但是显示了客户端/组的名称,分别为cboContactIDcboGroupID

frmContacts_Groups中的代码:

Private Sub Form_Load()
  Dim OpeningID As Long

  Select Case Me.Openargs
    Case "frmContacts"
      OpeningID = Nz(Forms!frmContacts!ContactID,0)  ' Nz to prevent errors on empty opening form
      Me.Filter = "ContactID = " & OpeningID
      Me.cboContactID.DefaultValue = OpeningID
      Me.cboContactID.Locked = True
      Me.cboGroupID.DefaultValue = vbNullString
      Me.cboGroupID.Locked = False
    Case "frmGroups"
      OpeningID = Nz(Forms!frmGroups!GroupID,0)
      Me.Filter = "GroupID = " & OpeningID
      Me.cboContactID.DefaultValue = vbNullString
      Me.cboContactID.Locked = False 
      Me.cboGroupID.DefaultValue = OpeningID
      Me.cboGroupID.Locked =True 
    Case Else
      Me.cboContactID.DefaultValue = vbNullString
      Me.cboContactID.Locked = False 
      Me.cboGroupID.DefaultValue = vbNullString
      Me.cboGroupID.Locked =False
      Me.Filter = vbNullString
   End Select
   Me.FilterOn = Len(Me.Filter) > 0
End Sub

frmContacts中打开的代码:

Private Sub CmdAssignContactGroup_Click()
  If Not CurrentProject.AllForms("frmContacts_Groups").IsLoaded then
    DoCmd.OpenForm FormName:="frmContacts_Groups", OpenArgs:="frmContacts"
  Else
    Msgbox "frmContacts_Groups is allready opened! What should we do?"
  End If
End Sub

答案 1 :(得分:0)

当您将ContactID[Forms]![frmContacts_Groups]![ContactID]一起引用时,您的where条件与要打开的表单无关,而与当前打开的表单有关。即您传递的是当前打开的表单(TrueFalse)的比较结果,而不是传递将由打开的表单评估的条件。

您必须通过诸如"ContactID = 10"之类的文本作为条件。

Dim condition As String

condition = "ContactID = " & Me!ContactID
DoCmd.OpenForm "frmContacts_Groups", WhereCondition:=condition

由于ContactID使用的是同一表格,因此您可以使用Me!ContactID进行访问。看起来您好像错误地将条件作为WindowMode参数传递。

还要确保frmContacts_Groups表单的属性是

AllowEdits = Yes
AllowDeletions = No
AllowAdditions = No

最重要的是!

DataEntry = No

如果DataEntryYes,则表单将跳至新记录!

在打开表格之前,您还可以致电

DoCmd.Close acForm, "frmContacts_Groups"

确保以前可能仍处于打开状态的表单的编辑不会干扰新的编辑。