форма доступа ms для выделения категорий пользователю

Я застрял с небольшой проблемой. Я использую MS Access 2003 (также 2010 на нашем сервере).

У меня есть таблица пользователей, таблица категорий и таблица для user_to_category.

Как мне создать форму, которая показывает все категории (с галочками), и когда я нажимаю на каждую из них, она добавляет этот идентификатор категории и идентификатор пользователя (из сеанса) в таблицу user_to_category.

Я создал отдельные флажки и использовал событие onClick, но мне нужно динамически загружать список категорий, поскольку люди будут добавлять больше, и я не хочу добавлять их вручную.

Любые идеи? Я подумал об использовании списка с категориями, а затем разрешить пользователю выбирать несколько записей - затем это добавляется в таблицу ... но не уверен, что это лучший способ?

спасибо за любую информацию!


person Matt Facer    schedule 21.02.2012    source источник


Ответы (2)


Создайте непрерывную форму с этим запросом в качестве источника записи и назовите форму 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 и поле со списком cboCategoryID, привязанное к categoryID. Используйте этот запрос как свойство источника строки комбо.

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 в элемент управления подчиненной формы в нижнем колонтитуле. Используйте идентификатор пользователя в качестве основных/дочерних свойств ссылки в элементе управления подчиненной формы.

При таком расположении подчиненная форма будет отображать строку для каждой присвоенной категории, связанной с текущим пользователем в основной форме (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 повторно запросите cboCategoryID из событий After Delete Confirm, After Insert и After Update, чтобы он обновлялся и содержал только неназначенные категории, доступные для текущего пользователя.

Форма_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

Этот подход позволит вам просматривать назначения категорий для каждого пользователя. Вы также можете добавлять или удалять строки из подчиненной формы для управления этими назначениями.

person HansUp    schedule 22.02.2012
comment
Спасибо. Я использовал этот метод для создания формы, которая теперь работает! :) - person Matt Facer; 23.02.2012

Поскольку вы используете MS Access, самый простой способ сделать это — создать непрерывную форму с таблицей категорий в качестве RecordSource.

Вы можете проверить в событии onClick флажка, какая категория является текущей (= та, которая была только что нажата), просто поместив текстовое поле с идентификатором категории в форму и проверив значение текстового поля (оно всегда будет содержать идентификатор текущей выбранной записи).

person Christian Specht    schedule 21.02.2012