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т сообщение об ошибке.

 

Работа с Recordset

 

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.

 

2. Используем Select Case.

Напишем теперь процедуру, которая основываясь на результате 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 при открытии базы данных

 



© 2018 | Анна Петросян | pashelp@yandex.ru