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

时间:2012-02-21 16:45:59

标签: forms ms-access ms-access-2003 ms-access-2010

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

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

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

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

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

感谢任何信息!

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

您可以通过在表单上放置一个带有categoryID的文本框并检查文本框的值来检查复选框的onClick事件,该类别是当前的类别(=刚刚单击的那个)(它将始终包含当前点击的记录的ID。)