4.2.3. Форма Employee - назначение прав доступа

 

Приступим к разработке формы Employee. Это будет двухстраничная форма, на первой вкладке которой – список работников предприятия, а на второй подробности по выбранному работнику. В окружении данных формы (Data Environment) разместим таблицу User. Вы уже умеете это делать. Добавить объект Page Frame не сложно. Откройте панель Form Controls (элементы управления формы). Она показана на рис. 4.9. Если панель отсутствует на экране – выберите в главном меню Visual FoxPro пункт View, а в открывшемся подменю пункт Toolbars. Откроется окно Toolbars. Сделайте отметку напротив названия панели - Form Controls и щелкните кнопку OK.

Выберите на панели значок Page Frame, а в нужном месте активной области формы при помощи левой кнопки мыши отведите место для этого объекта. Форма Employee с активной первой страницей и окружением данных в конструкторе форм показана на рис. 4.11.

 


Добавим код, который будет запушен на выполнение при наступлении события Load формы:

 

* Описание глобальной переменной IND (Индикатор)

* Признак выбора работника из списка на первой странице формы

PUBLIC IND  

IND=0          && Начальное значение

* Отображение фамилий работников предприятия по алфавиту

SELECT USER

SET ORDER TO TAG LastName

 

Код события Activate первой страницы формы Employee:

 

* Если в процессе работы с формой выбор работника уже был

* сделан, (IND=1 или IND=2)то при наступлении этого события

* значение Индикатора принять равным единице

IF IND>=1

   IND=1

ENDIF

* Сделать активным поле со списком LIST1

THISFORM.PAGEFRAME1.PAGE1.LIST1.SETFOCUS

* Перерисовать форму

THISFORM.PAGEFRAME1.PAGE1.LIST1.REFRESH

 

Событие Interactive Change поля со списком List1:

 

IND=1 && Выбор сделан

* Переход на вторую страницу формы при помощи кода не нужен

 

Событие DblClick поля со списком List1:

 

IND=1  && Выбор в поле List1 сделан

* Перейти на вторую страницу формы

THISFORM.PAGEFRAME1.ACTIVEPAGE=2

 

Событие Click кнопки Добавить:

 

IND=2  && Была выбрана кнопка Добавить

* Перейти на вторую страницу формы

THISFORM.PAGEFRAME1.ACTIVEPAGE=2

 

 


 

Перейдем на вторую страницу Page Frame1 формы Employee и разместим на ней класс Worker. Для размещения класса в форме необходимо проделать следующее. Выберите на панели Form Controls (элементы управления формы) значок View Classes (рис. 4.9). Откроется меню, выберите в нем первый пункт Add. В открывшемся диалоговом окне Open найдите библиотеку классов Worker.vcx и класс Worker. После щелчка по кнопке OK окна Open на панели Form Controls появится пиктограмма класса  Worker, а сама панель станет значительно меньше. Исчезнут стандартные классы (Standard). Новый вид панели показан на рис. 4.12.

Щелкните по пиктограмме класса. В нужном месте активной области формы при помощи левой кнопки мыши отведите место для класса Worker. После того, как вы отпустите левую кнопку мыши, класс появится в форме. Добавим справа от класса четыре кнопки (рис. 4.13) и займемся написанием кода для обработки событий.

 


Код события Activate второй страницы формы Employee:

 

DO CASE

   CASE IND=0          && Выбор не сделан

     =MESSAGEBOX('Ни один работник не выбран! ',;

                48,' Внимание!')

     * Вернуться на первую страницу формы

     THISFORM.PAGEFRAME1.ACTIVEPAGE=1

   CASE IND=1          && Выбор сделан

     * Кнопка Стереть пароль доступна

     THISFORM.PAGEFRAME1.PAGE2.COMMAND2.ENABLED=.T.

     * Надпись на кнопке 3 - Сохранить

     THISFORM.PAGEFRAME1.PAGE2.COMMAND3.CAPTION=[Сохранить]

     * Кнопка Удалить доступна

     THISFORM.PAGEFRAME1.PAGE2.COMMAND4.ENABLED=.T.

     * Создать переменные памяти

     SCATTER MEMVAR

   CASE IND=2         && Занесение нового работника

     * Кнопка Стереть пароль недоступна

     THISFORM.PAGEFRAME1.PAGE2.COMMAND2.ENABLED=.F.

     * Надпись на кнопке 3 - Записать

     THISFORM.PAGEFRAME1.PAGE2.COMMAND3.CAPTION=[Записать]

     * Кнопка Удалить недоступна

     THISFORM.PAGEFRAME1.PAGE2.COMMAND4.ENABLED=.F.

     * Создать переменные памяти с пустыми значениями

     SCATTER MEMVAR BLANK

     THISFORM.PAGEFRAME1.PAGE2.Worker1.TxtLastName.SETFOCUS

ENDCASE       

* Перерисовать вторую страницу формы

This.Refresh

 

Добавим код события Interactive Change переключателя Optiongroup1 класса Worker. В отличие от формы Access форма Employee предназначена не только для просмотра, но и для корректировки прав доступа. Текст этого события будет храниться и работать только в форме Employee.

 

* Общие права доступа для всех категорий работников

ThisForm.PageFrame1.Page2.Worker1.chkAccess01.Value= .T.

ThisForm.PageFrame1.Page2.Worker1.chkAccess02.Value= .T. 

ThisForm.PageFrame1.Page2.Worker1.chkAccess03.Value= .F.  

ThisForm.PageFrame1.Page2.Worker1.chkAccess04.Value= .F.  

ThisForm.PageFrame1.Page2.Worker1.chkAccess05.Value= .T.

ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value= .F.

ThisForm.PageFrame1.Page2.Worker1.chkAccess07.Value= .F. 

ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value= .F. 

ThisForm.PageFrame1.Page2.Worker1.chkAccess09.Value= .F.

ThisForm.PageFrame1.Page2.Worker1.chkAccess10.Value= .F.

ThisForm.PageFrame1.Page2.Worker1.chkAccess11.Value= .F. 

ThisForm.PageFrame1.Page2.Worker1.chkAccess12.Value= .F. 

ThisForm.PageFrame1.Page2.Worker1.chkAccess13.Value= .F. 

ThisForm.PageFrame1.Page2.Worker1.chkAccess14.Value= .F.  

* Индивидуальные права доступа

DO CASE

 CASE THIS.Value=1    && Отдел недвижимости

    * Поиск зданий

    ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value=.T.

    * Добавление зданий

    ThisForm.PageFrame1.Page2.Worker1.chkAccess07.Value=.T. 

    * Работа с квартирами

    ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value=.T. 

    * Работа с отчетами 

    ThisForm.PageFrame1.Page2.Worker1.chkAccess10.Value=.T.

    * Работа с адресным планом

    ThisForm.PageFrame1.Page2.Worker1.chkAccess11.Value=.T. 

    * Работа со справочником материалов

    ThisForm.PageFrame1.Page2.Worker1.chkAccess13.Value=.T. 

 CASE THIS.Value=2   && Отдел платежей

    * Поиск зданий

    ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value=.T.

    * Работа с квартирами

    ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value=.T. 

    * Работа с лицевыми счетами

    ThisForm.PageFrame1.Page2.Worker1.chkAccess09.Value=.T.

 CASE THIS.Value=3   && Дирекция предприятия

    * Поиск зданий

    ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value=.T.

    * Работа с квартирами

    ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value=.T. 

    * Работа с отчетами 

    ThisForm.PageFrame1.Page2.Worker1.chkAccess10.Value=.T.

 CASE THIS.Value=4   && Администратор комплекса

    * Удаленные записи

    ThisForm.PageFrame1.Page2.Worker1.chkAccess03.Value=.T.  

    * Объем базы данных

    ThisForm.PageFrame1.Page2.Worker1.chkAccess04.Value=.T.  

    * Работа с формой прав доступа

    ThisForm.PageFrame1.Page2.Worker1.chkAccess14.Value=.T.  

ENDCASE  

 

 


Особое место среди кнопок, размещенных на второй странице формы, занимает кнопка Стереть пароль. Она нужна только администратору информационной системы в случае, если работник забыл свой пароль. Программный код для этой кнопки предусматривает не только стирание пароля, но и занесение нового (5 нулей рядом) в зашифрованном виде. Это сделано на тот случай, если злоумышленник через ODBC, подключив любого клиента, или установив на рабочей станции Visual FoxPro, получит доступ к таблице User. Уничтожение пароля одного из пользователей ему ничего не даст, так как при регистрации под чужим именем сработает код кнопки Вход формы Login и на экране нарушитель получит сообщение (рис. 4.14).

Попытка подсмотреть пароль в таблице User также ничего не даст. Он хранится там в зашифрованном виде.

Код события Click кнопки Стереть пароль имеет вид:

 

lnMsgResult=MESSAGEBOX('Подтвердите свои действия',;

                       36,' Удаление пароля ')

IF lnMsgResult=6      && Кнопка Да

   * Стереть пароль - занести пять нулей

   M.PassWord=[00000]

   M.PassWord=CrKod(M.PassWord)  && Зашифровка пароля

   M.Inspector=FAMILY            && Фамилия удалившего пароль

   M.Date_Up=DATE()              && Дата удаления пароля

   M.Time_Up=TIME()              && Время удаления пароля

   * Занести значения переменных памяти в поля текущей записи

   GATHER MEMVAR

   * Перейти на первую страницу формы

   THISFORM.PAGEFRAME1.ACTIVEPAGE=1

ENDIF   

 

Код события Click кнопки Удалить  имеет вид:

 

lnMsgResult=MESSAGEBOX('Подтвердите свои действия',;

            36,' Удаление работника ')

IF lnMsgResult=6      && Кнопка Да

   * Удаление текущей записи

   DELETE

   * Перейти к первой записи в таблице User

   GOTO TOP

   * Перейти на первую страницу формы

   THISFORM.PAGEFRAME1.ACTIVEPAGE=1

ENDIF   

 

Кнопка Сохранить в случае занесения нового работника имеет название Записать (смотри событие Activate второй страницы формы). Для нового работника, кроме учетной информации и прав доступа заносится еще и пароль – опять же 00000 в зашифрованном виде. Смена начального пароля отныне на совести “новичка”.

Код события Click кнопки Сохранить  имеет вид:

 

* Выполнение присваивания значений переменным памяти

* Контроль ввода фамилии

M.LastName=ThisForm.PageFrame1.Page2.Worker1.TxtLastName.Value

IF LEN(ALLTRIM(M.LastName))=0

   =MESSAGEBOX(' Вы забыли про фамилию!',;

            48,' Ошибка')

   ThisForm.PageFrame1.Page2.Worker1.TxtLastName.SetFocus

   RETURN

ENDIF

* Контроль ввода имени

M.FirstName=ThisForm.PageFrame1.Page2.Worker1.TxtFirstName.Value

IF LEN(ALLTRIM(M.FirstName))=0

   =MESSAGEBOX(' Вы забыли про имя работника!',;

            48,' Ошибка')

   ThisForm.PageFrame1.Page2.Worker1.TxtFirstName.SetFocus

   RETURN

ENDIF

* Контроль ввода отчества

M.SecondName=;

           ThisForm.PageFrame1.Page2.Worker1.TxtSecondName.Value

IF LEN(ALLTRIM(M.SecondName))=0

   =MESSAGEBOX(' Вы забыли про отчество работника!',;

            48,' Ошибка')

   ThisForm.PageFrame1.Page2.Worker1.TxtSecondName.SetFocus

   RETURN

ENDIF

* Контроль ввода должности

M.Post=ThisForm.PageFrame1.Page2.Worker1.TxtPost.Value

IF LEN(ALLTRIM(M.Post))=0

   =MESSAGEBOX(' Вы забыли про должность работника!',;

            48,' Ошибка')

   ThisForm.PageFrame1.Page2.Worker1.TxtPost.SetFocus

   RETURN

ENDIF

* Контроль ввода кода доступа

M.Range=ThisForm.PageFrame1.Page2.Worker1.OptionGroup1.Value

IF M.Range=0

   =MESSAGEBOX(' Вы забыли про код доступа!',;

            48,' Ошибка')

   RETURN

ENDIF

lnMsgResult=MESSAGEBOX('Подтвердите свои действия',;

     36,' Запись на сервер ')

IF lnMsgResult=6      && Кнопка Да

 M.Inspector=FAMILY     && Фамилия выполнившего ввод информации

 M.Date_Up=DATE()       && Дата ввода информации

 M.Time_Up=TIME()       && Время ввода информации

 * Права доступа

 M.Access01=ThisForm.PageFrame1.Page2.Worker1.chkAccess01.Value

 M.Access02=ThisForm.PageFrame1.Page2.Worker1.chkAccess02.Value

 M.Access03=ThisForm.PageFrame1.Page2.Worker1.chkAccess03.Value

 M.Access04=ThisForm.PageFrame1.Page2.Worker1.chkAccess04.Value

 M.Access05=ThisForm.PageFrame1.Page2.Worker1.chkAccess05.Value

 M.Access06=ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value

 M.Access07=ThisForm.PageFrame1.Page2.Worker1.chkAccess07.Value

 M.Access08=ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value

 M.Access09=ThisForm.PageFrame1.Page2.Worker1.chkAccess09.Value

 M.Access10=ThisForm.PageFrame1.Page2.Worker1.chkAccess10.Value

 M.Access11=ThisForm.PageFrame1.Page2.Worker1.chkAccess11.Value

 M.Access12=ThisForm.PageFrame1.Page2.Worker1.chkAccess12.Value

 M.Access13=ThisForm.PageFrame1.Page2.Worker1.chkAccess13.Value

 M.Access14=ThisForm.PageFrame1.Page2.Worker1.chkAccess14.Value

   IF THIS.CAPTION=[Записать]

      * При занесении нового работника пароль - пять нулей

      M.PassWord=[00000]

      M.PassWord=CrKod(M.PassWord)

      APPEND BLANK

   ENDIF   

 GATHER MEMVAR

 * Переход на первую страницу формы

 THISFORM.PAGEFRAME1.ACTIVEPAGE=1

ENDIF