在表单打开事件中使用查询-MS Access

问题描述 投票:0回答:1

所以我有几种形式。在父表单中,我收集有关用户的信息并包括一个UserID字段。此外,在父表单中,数据输入者可以单击几个按钮来指示几个不同的类别。

[当数据输入者单击类别按钮时,引擎将打开子UserCategory表单。我在按钮的On-Click事件(以及子表单的On-Open事件)中包含了逻辑,以便从父表单记录传递UserID值,并且CategoryID值由按钮确定单击,也将传递给子表单。 UserID和CategoryID的组合对于所涉及的基础UserCategory表是唯一的,并且代表该表的键,但是,主键是另一个字段-UserCategoryID(在UserID和CategoryID的组合之间具有1:1关系) 。

因此,如果表单收到表中已经存在的UserID和CategoryID的组合,则表单应引用该记录。但是,该表单将继续运行,并在已表示其给定值时创建一个新记录。在创建相关表单之前,我曾遇到过此问题,并且出现了该问题,因为该表未遵循相关表的FK和PK之间的1:1关系。在所有情况下,我都可以通过使用关系数据库工具强制1:1关系来解决问题。但是,在这种情况下,一个用户可以属于多个类别,一个类别可以有多个用户-换句话说,UserID字段为1:M,CategoryID字段为1:M,但其组合为1:1。我不知道是否有办法加强这种关系。

我想到的一种可能的解决方案是在表单的On-Open事件中构建查询。它将使用UserID和CategoryID从表中选择UserCategoryID,然后将其输入表单上的字段中。我已经包含了有关查询设计的初步想法。请原谅语法-VBA初学者。

感谢您的任何帮助

编辑-行人侧的逻辑:

Private Sub FLower_Click()
    Dim catType As Integer
    catType = 2

    DoCmd.OpenForm "frm_RespondentUseCat", OpenArgs:=2


End Sub

Passee端的逻辑

Private Sub Form_Open(Cancel As Integer)
    Dim catType As Integer
    catType = Forms.frm_RespondentUseCat!OpenArgs

    Dim userID As Integer
    userID = Forms!Respondent.RespondentID.Value

    Dim strSQL As String
    strSQL = "SELECT * From RespondentUseCategories WHERE RespondentID = " & userID & " AND UseCategoryID = " & catType & ";"

    Dim results As DAO.Recordset
    Set results = CurrentDb.OpenRecordset(strSQL)

    If results.RecordCount > 0 Then
        Set Forms("frm_RespondentUseCat").Recordset = results

    Else
        Me.UseCategoryID.Value = catType
        Me.RespondentID.Value = userID

    End If

End Sub

本质上,传递者(即带有按钮的父表单)将简单地传递反映单击了哪个按钮的类别类型。在passee方面,该表单将在打开时执行一些代码。首先它将收集类别类型,然后将尝试从父表单(Respondent)中读取userID(RespondentID)值。然后它将使用这两个值从UserCategory表(RespondentUseCategories)中获取相关记录。如果此处有任何数据,则将其用作表单的记录集,否则,我们将使用收集的值填充userID和categoryID,并让UserCateogryID自动填充自身。这似乎是正确的方法,但是,当我尝试记录存在的测试用例(例如已经遇到过的User&Category IDS组合)时,子表单仍然没有填充。我猜VBA中存在错误。

vba forms ms-access
1个回答
0
投票

使用UserID和CategoryID在UserCategory表上创建一个双键,如下所示:https://www.access-programmers.co.uk/forums/threads/how-to-put-two-primary-keys-in-one-table.225908/

[现在,如果有人找到尝试添加UserID和CategoryID的非唯一组合的方法,Access将引发错误。接下来,使用设计师,我希望您会得到类似的信息:enter image description here

note文本框已被组合框替换,并且UsersForm都是标头,因为子窗体显示了详细信息。 Userform记录源是Users,子窗体记录源是UserCategory。表单和子表单仅通过UserID链接。此时,如果有人尝试输入用户和类别的非唯一组合,则访问会引发错误,但是我不想输入错误的数据,因此提出了以下建议:在UserCategorysForm的数据属性下,设置允许数据输入和不允许添加,因此数据输入者必须使用按钮添加记录,然后设置按钮以添加用户/类别组合(如果不存在),并删除该组合(如果存在)做。

    Private Sub cmbUserName_AfterUpdate()
Me.Filter = "UserID = " & Me.cmbUserName.Value
Me.FilterOn = True
End Sub

'TODO ADD CODE TO CHANGE BUTTON CAPTION BASED ON WHETHER BUTTON WILL ADD OR REMOVE CATEGORY
Private Sub cmdCommand_Click()
AddRemoveRecordFromUserCategoryTable 1
End Sub
Private Sub cmdScience_Click()
AddRemoveRecordFromUserCategoryTable 2
End Sub
Private Sub AddRemoveRecordFromUserCategoryTable(ID As Integer)
DoCmd.SetWarnings False
If IsNull(DLookup("UserCategoryID", "UserCategory", "UserID = " & Me.cmbUserName.Value & " AND CategoryID = " & ID)) Then
DoCmd.RunSQL ("INSERT INTO UserCategory (UserID, CategoryID) VALUES(" & Me.cmbUserName.Value & ", " & ID & ")")
Else
DoCmd.RunSQL ("DELETE * FROM UserCategory WHERE UserID = " & Me.cmbUserName.Value & " AND CategoryID = " & ID)
End If
DoCmd.SetWarnings True
Me.Refresh
End Sub

现在,表单在添加之前先检查表中是否已存在用户/类别组合,然后删除记录以防止添加重复组合。 hiting命令删除记录(未显示)。击中科学创造了新记录。enter image description hereenter image description here

© www.soinside.com 2019 - 2024. All rights reserved.