MS Access | Разные группы пользователей — разные праваСкачать пример в zip: DifferentRights.zipСкачать пример в mdb: DifferentRights.mdb |
Решаем на примере: из главного меню (Switchboard) пользователь открывает меню проекта. Одна группа пользователей (DBOperator) имеет доступ ко всем пунктам меню проекта, другая группа (Management) имеет и нуждается только в доступе к отчетам.
Когда пользователь нажмет на кнопку в главном меню: с помощью параметризованного запроса определим группу, к которой относится вошедший пользователь. На основании полученной группы укажем команду для дальнейшего действия.
1. Создадим таблицы пользователей и групп, например Users и UserGroups. Таблица Users должна быть заполнена всеми именами пользователей домена, которые имеют (или не имеют) доступ к проекту. Каждому пользователю присваивается группа:
Заполним группы пользователей: 1 – Management и 2 – DBOperator. Заполним таблицу с пользователями: vpupkin группа 2 и, например director группа 1.
2. Построим запрос qryUserGroup, который отдаст запись о группе пользователя, на основании отобранного имени пользователя. Критерий для отбора UserName в нашем случае не статический (т.к. мы не можем в запросе указать статически, например "vpupkin"), а динамический, т.е. для разного пользователя соответствующий. В подобных случаях, в качестве критерия указывается параметр и в строке Criteria и в Query Parameters (Query|Parameters…). Назовем параметр prmUserName:
Попробуйте выполнить такой запрос. Перед запуском Access попросит ввести параметр (Enter parameter) и только после этого выполнит запрос. Позднее, с помощью VBA мы укажем в качестве значения данного параметра результат функции UserName (логин пользователя).
См. также: Получить логин пользователя
1. Теперь нужна функция, которая, распознав пользователя, отдаст название группы, к которой он принадлежит, либо, если пользователь не внесен в таблицу Users, выдаcт сообщение об ошибке.
QueryDef, Recordset – классы VBA, позволяющие открывать таблицы или выполнять запросы. А также изменять значения полей таблицы (запроса), получать количество строк таблицы (или запроса) и так далее.
На входе функции – строка с именем пользователя, вошедшего в базу (параметр UName); на выходе – строка с названием группы, к которой принадлежит этот пользователь.
Выполняем запрос qryUsers с помощью Recordset, указав, что значением параметра запроса (prmUserName) является значение входящего параметра UName. Из результата выполнения запроса забираем значение поля UserGroup.
Function UserGroup(UName As String) As String Dim Db As Database 'будем работать с базой данных Dim qry As QueryDef 'будем работать с запросом базы данных Dim rst As Recordset 'Recordset – класс, с помощью которого будем выполнять запрос Set Db = CurrentDb() 'указываем текущую базу данных Set qry = Db.QueryDefs("qryUsers") 'qryUsers – имя запроса 'значение параметра запроса (prmUserName) = значение входящего параметра UName qry.Parameters("prmUserName") = UName Set rst = qry.OpenRecordset 'выполняем запрос, получаем Recordset с результатами If rst.EOF = False Then 'EOF – End Of File, BOF – Begin Of File 'EOF = True или BOF = False означает, что Recordset пуст (нет записей) rst.MoveFirst 'перейти на первую запись 'результат функции = значение поля GroupName UserGroup = rst!UserGroup Else 'записей нет MsgBox "Группа пользователя не определена", vbCritical, "Ошибка" UserGroup = "Undefined" 'например Exit Function End If End Function
Результат работы функции UserGroup проверяем в Immediate, в качестве входящей переменной указываем UserName(): ?UserGroup(UserName()) Результатом для vpupkin будет группа DBOperator, а для director – Management.
Напишем теперь процедуру, которая основываясь на результате UserGroup(UserName()), выполнит соответствующие действия. Наш пример: группа DBOperator имеет доступ ко всем пунктам меню проекта, другая группа (Management) имеет и нуждается только в доступе к отчетам. Используем
Sub OpenProject1() Select Case UserGroup(UserName()) Case "Management" DoCmd.OpenForm "frmReportMenu" Case "DBOperator" DoCmd.OpenForm "frmProjectMenu" End Select End Sub
Данную процедуру можно вызвать при нажатии (событие On Click) соответствующего пункта меню Switchboard (Project 1).
3. Создание Switchboard с помощью мастера (Wizard): Tools|DatabaseUtilities|SwitchboardManager… Если SwitchboardManager еще не создавался, получаем следующее сообщение, на которое отвечаем "хотим создать Switchboard" (Yes):
Из следующего окна жмем Edit…
Здесь создаем кнопки меню Switchboard, с помощью New…:
Text – имя кнопки (наш пример Project 1), команду (Command) на кнопку назначаем "Запустить код" (Run Code), имя процедуры OpenProject1:
В результате имеем меню Switchboard из одного проекта, на входе в который программа проверит группу вошедшего пользователя и откроется соответствующее правам пользователя меню. Задача решена.
Скачать пример в zip: DifferentRights.zipСкачать пример в mdb: DifferentRights.mdb
См. также: Показать Switchboard при открытии базы данных
|