我在表单上有一个命令按钮,该按钮将打开一个单独的表单,仅打开一个与当前表单的联系人ID匹配的新记录。第二种形式是存在的,因此我可以在我的联系人和新群组之间建立关系,这是一对多的关系,因为每个联系人可以在多个群组中,但是有些联系人不在任何群组中。>
一些用户将现有的联系人分配到一个新的组,而某些用户将新的联系人添加到一个现有的组,所以我希望建立联系人和组之间关系的表单独立于联系人表单或组而存在形成。这就是为什么我不只是在联系人表单上创建子表单的原因。我不知道用户在编辑关系时将来自哪个方向,并且理想情况下,我想建立一个系统,其中用户来自的表单将使用两个字段之一(联系人和组)将根据“父级”表单自动填充。也就是说,如果我的用户正在从联系人表单访问关系表单,我将看到一个新记录,其中已填写ContactID,并且可以选择一个组。同样,如果用户正在从组表单访问关系表单,则将填写该组,然后用户将选择一个联系人。
在联系人表单上,单击“命令”按钮时,我有以下子例程:
Private Sub CmdAssignContactGroup_Click()
DoCmd.OpenForm "frmContacts_Groups", , , , acFormPropertySettings
[Forms]![frmContacts_Groups]![ContactID] = [Forms]![frmContacts]![ContactID]
End Sub
这适用于任何一个联系人,但是当我移至另一个联系人而不关闭联系人表单时,过滤条件保持不变,并且命令按钮将我带到附加到先前联系人的联系人/组表单中的记录
更改联系表单中的记录后,如何告诉命令按钮重置?
答案 0 :(得分:1)
此答案使用控件的DefaultValue
和Locked
属性来固定ContactID
(如果表单由frmContacts
打开)或GroupID
(如果表单由frmGroups
打开)以打开表单值。
我假设frmContacts_Groups
中有两个组合框绑定到它们的ID
,但是显示了客户端/组的名称,分别为cboContactID
和cboGroupID
。
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条件与要打开的表单无关,而与当前打开的表单有关。即您传递的是当前打开的表单(True
或False
)的比较结果,而不是传递将由打开的表单评估的条件。
您必须通过诸如"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
如果DataEntry
是Yes
,则表单将跳至新记录!
在打开表格之前,您还可以致电
DoCmd.Close acForm, "frmContacts_Groups"
确保以前可能仍处于打开状态的表单的编辑不会干扰新的编辑。