用于为用户分配类别的 ms 访问表单

Posted

技术标签:

【中文标题】用于为用户分配类别的 ms 访问表单【英文标题】:ms access form for allocating categories to a user 【发布时间】:2012-02-21 16:45:58 【问题描述】:

我遇到了一个小问题。我正在使用 MS access 2003(我们的服务器上也是 2010)。

我有一个用户表、一个类别表和一个 user_to_category 表。

我将如何创建一个显示所有类别(带有复选框)的表单,当我单击每个类别时,它会将 categoryID 和 userID(来自会话)添加到 user_to_category 表中。

我创建了单独的复选框并使用了 onClick 事件,但我需要动态加载类别列表,因为人们会添加更多并且我不想手动添加它们。

有什么想法吗?我考虑过使用带有类别的列表框,然后允许用户选择多个条目-然后将其添加到表中..但不确定这是最好的方法吗?

感谢您提供任何信息!

【问题讨论】:

【参考方案1】:

用这个查询创建一个连续的表单作为它的记录源,并将表单命名为frmUsers

SELECT
    u.userID,
    u.user_name
FROM Users AS u
ORDER BY u.user_name;

使用此记录源创建第二个表单,fsubUserCategories

SELECT
    u2c.userID,
    u2c.categoryID,
    cat.category_name
FROM
    user_to_category AS u2c
    INNER JOIN Categories AS cat
    ON u2c.categoryID = cat.categoryID
ORDER BY cat.category_name;

为 category_name 添加一个绑定文本框,以及一个绑定到 categoryID 的组合框 cboCategoryID。将此查询用作组合的行源属性。

SELECT
    cat.categoryID,
    cat.category_name
FROM
    Categories AS cat
    LEFT JOIN (
        SELECT categoryID
        FROM user_to_category
        WHERE userID=Forms!frmUsers!txtUserID
        ) AS sub
    ON cat.categoryID = sub.categoryID
WHERE (((sub.categoryID) Is Null))
ORDER BY cat.category_name;

展开 frmUsers 的页脚部分并将 fsubUserCategories 添加到页脚中的子窗体控件。使用 userID 作为子窗体控件上的链接主/子属性。

通过这种安排,子表单将为与主表单 (frmUser) 中的当前用户关联的每个类别分配显示一行。

使用 frmUsers On Current 事件重新查询子表单组合 --- 因此它被更新为仅包含当前用户的可用(未分配)类别。

Form_frmUsers

Private Sub Form_Current()
    ' Note: fsubUserCategories is the name of the subform control '
    ' my subform control uses the same name as the form it contains '
    ' but beware --- the names don't have to match --- double-check! '
    Me.fsubUserCategories.Form.cboCategoryID.Requery
End Sub

在 fsubUserCategories 中,再次从 After Delete Confirm、After Insert 和 After Update 事件中重新查询 cboCategoryID --- 以便将其更新为仅包含当前用户可用的未分配类别。

Form_fsubUserCategories

Private Sub Form_AfterDelConfirm(Status As Integer)
    Me.cboCategoryID.Requery
End Sub

Private Sub Form_AfterInsert()
    Me.cboCategoryID.Requery
End Sub

Private Sub Form_AfterUpdate()
    Me.cboCategoryID.Requery
End Sub

这种方法将允许您查看每个用户的类别分配。您还可以在子表单中添加或删除行来管理这些分配。

【讨论】:

谢谢。我使用这种方法创建了现在可以使用的表单! :)【参考方案2】:

当您使用 MS Access 时,最简单的方法是创建一个连续表单,并将类别表作为 RecordSource。

您可以通过在表单上放置一个带有 categoryID 的文本框并检查文本框的值(它总是包含当前点击记录的ID)。

【讨论】:

以上是关于用于为用户分配类别的 ms 访问表单的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 表单只读

在一个字段中使用多个参数按表单访问查询

带有所有选项复选框的多对多 MS 访问表单

MS 访问 Not In List 事件和子表单

限制用户对 MS 访问中的表和查询的访问

Symfony2 - 为用户和类别使用控制器安全性