4.3.7. Форма Flat – работа с квартирами

 

Создадим форму, которая полностью обеспечивает все операции по работе с основной таблицей: добавление, удаление и корректировку записей, а также вызов форм продолжения каскада (Поиск – Здание – Квартира – Проживающие – Лицевой счет – Договор приватизации). Применение классов для ее создания не оправдано. Остановимся на уже известных нам Page Frame, Grid, Combo Box и Text Box.

 

 

Рис. 4.25. Работа с квартирами в учебном комплексе Real Estate

 

 Начинать работу с формой Flat можно только после создания временной таблицы-выборки C:\WINNT\TEMP\cFlat.dbf. Добавим ее в окружение данных этой формы. Для этого сделайте щелчок правой кнопки мыши в любом месте окна Form Designer. Появится меню. Выберите в нем третий пункт Data Environment. Еще один щелчок правой кнопкой, но уже в появившемся окне Data Environment активизирует очередное меню. Выберите в нем первый пункт Add. Появится окно Open. Найдите в нем таблицу cFlat. Она находится папке WINNT\TEMP и появилась там в результате обработки события Click кнопки Квартиры второй страницы формы Building. Вид первой страницы формы Flat в процессе работы программного комплекса показан на рис. 4.25. Вторая страница формы, но в конструкторе форм, показана на рис. 4.26.

Код события Init формы Flat:

 

* Создание глобальных переменных

PUBLIC SelectFlat     && Номер выбранной квартиры

SelectFlat=0

PUBLIC SelectAccount  && Номер выбранного счета

SelectAccount=0

PUBLIC IndFlat        && Тип действия с квартирой

IndFlat=0  

 

Код события Activate формы Flat:

 

* Обработка прав доступа к объектам формы

* Гашение кнопки Печать

IF WordExcel=.F.

   ThisForm.PageFrame1.Page1.Command2.Enabled=.F.

ENDIF

* Гашение кнопки Счет

IF AccountWork=.F.

   ThisForm.PageFrame1.Page1.Command5.Enabled=.F.

ENDIF

 

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

 

* Сброс признака выбора квартиры

IndFlat=0

PRIVATE CountFlat,AllSquareFlat,AllDwell

SELECT cFlat

* Подсчет количества квартир в здании

COUNT TO CountFlat ALL

* Подсчет общей площади квартир

SUM cFlat.SquareFlat TO AllSquareFlat

* Подсчет жилой площади квартир

SUM cFlat.Dwell TO AllWwell

* Отображение данных по выборке на первой странице формы

ThisForm.PageFrame1.Page1.Label11.Caption=;

    [Всего квартир  ]+ALLTRIM(STR(CountFlat,4))+[ шт.]

ThisForm.PageFrame1.Page1.Label12.Caption=;

    [Общей площадью ]+ALLTRIM(STR(AllSquareFlat,13,1))+[ кв.м.]

ThisForm.PageFrame1.Page1.Label13.Caption=;

    [Жилая площадь ]+ALLTRIM(STR(AllWwell,13,1))+[ кв.м.]

ThisForm.PageFrame1.Page1.Refresh

 

Код события Click кнопки Добавить первой страницы формы Flat:

 

*- Кнопка Добавить

* Признак занесения данных по новой квартире

IndFlat=1

* Сделать активной вторую страницу формы

ThisForm.PageFrame1.ActivePage=2

 

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

 

DO CASE

   CASE IndFlat=0  

       * Выбор не сделан

       =MESSAGEBOX('Ни одна квартира для просмотра не выбрана! '+;

                'Для выбора - двойной щелчок мышью.',48,'Ошибка!')

       ThisForm.PageFrame1.ActivePage=1

   CASE IndFlat=1

        * Добавить квартиру

        APPEND BLANK

        * Номер квартиры доступен

        ThisForm.PageFrame1.Page2.txtFlat.Enabled=.T.

        * Номер лицевого счета доступен

        ThisForm.PageFrame1.Page2.txtAccount.Enabled=.T.

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

        ThisForm.PageFrame1.Page2.txtFlat.SetFocus

        * Сделать кнопку Жильцы недоступной

        ThisForm.PageFrame1.Page2.Command2.Enabled=.F.

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

        ThisForm.PageFrame1.Page2.Command4.Enabled=.F.

        * Сделать кнопку Счет недоступной

        ThisForm.PageFrame1.Page2.Command5.Enabled=.F.

        * Сделать кнопку Договор приватизации недоступной

        ThisForm.PageFrame1.Page2.Command6.Enabled=.F.

        THIS.Refresh

   CASE IndFlat=2

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

        * Номер квартиры недоступен

        ThisForm.PageFrame1.Page2.txtFlat.Enabled=.F.

        * Номер лицевого счета недоступен

        ThisForm.PageFrame1.Page2.txtAccount.Enabled=.F.

        * Обновить эту страницу формы

        THIS.Refresh

ENDCASE

 


Код события Click кнопки Записать второй страницы формы Flat:

 

*- Кнопка записать

* Проверка введенных значений

IF cFlat.Flat=0

   =MESSAGEBOX('Вы забыли ввести номер квартиры!',48,'Ошибка!')

   ThisForm.PageFrame1.Page2.txtFlat.Setfocus

   RETURN

ENDIF

IF cFlat.SquareFlat=0

         =MESSAGEBOX('Вы забыли про общую площадь!',48,'Ошибка!')

         ThisForm.PageFrame1.Page2.txtSquareFlat.Setfocus

         RETURN

ENDIF

IF cFlat.Account=0

         =MESSAGEBOX('Введите номер лицевого счета',48,'Ошибка!')

         ThisForm.PageFrame1.Page2.txtAccount.Setfocus

         RETURN

ENDIF

DO CASE

   CASE IndFlat=1

      * Добавление новой квартиры

      * Есть ли уже квартира с таким номером

      IF .NOT. USED ('Flat')

         USE Flat

      ENDIF

      SELECT Flat        

      SET ORDER TO TAG FlatID

      SEEK STR(SelectStreetAddress)+SelectHouseAddress+;

           STR(cFlat.Flat)

      IF FOUND()

         =MESSAGEBOX('Квартира с таким номером уже есть!',;

                    48,'Ошибка!')

         SELECT cFlat

         ThisForm.PageFrame1.Page2.txtFlat.Setfocus

         RETURN

      ENDIF

      SET DELETED OFF

      SEEK STR(SelectStreetAddress)+SelectHouseAddress+;

           STR(cFlat.Flat)

      SET DELETED ON

      IF FOUND()

         =MESSAGEBOX('Квартира с таким номером уже есть среди '+;

                     'удаленных!',48,'Ошибка!')

         SELECT cFLAT

         ThisForm.PageFrame1.Page2.txtFlat.Setfocus

         RETURN

      ENDIF

      * Есть ли уже квартира с таким лицевым счетом

      IF .NOT. USED ('Flat')

         USE Flat

      ENDIF

      SELECT Flat        

      SET ORDER TO TAG Account

      SEEK cFlat.Account

      IF FOUND()

         =MESSAGEBOX('Квартира с таким номером счета уже есть!',;

               48,'Ошибка!')

         SELECT cFlat

         ThisForm.PageFrame1.Page2.txtAccount.Setfocus

         RETURN

      ENDIF

      SELECT cFlat

      lnMsgResult=MESSAGEBOX('Сейчас данные о новой квартире '+;

               'будут записаны в базу.',52,'Подтвердите!')

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

         SELECT cFlat

         SCATTER MEMO MEMVAR

         M.Street=SelectStreetAddress

         M.House=SelectHouseAddress

         * Запись в основную базу

         IF .NOT. USED ('Flat')

            USE Flat IN 0

         ENDIF

         SELECT Flat

         APPEND BLANK

         GATHER MEMO MEMVAR

         THISFORM.Release

      ENDIF

   CASE IndFlat=2

      * Редактирование квартиры

      lnMsgResult=MESSAGEBOX('Сейчас результаты корректировки '+;

               'будут записаны на диск.',52,'Подтвердите!')

      IF lnMsgResult=6  

         SELECT cFlat

         SCATTER MEMO MEMVAR

         * Корректировка в основной базе

         IF .NOT. USED ('Flat')

              USE Flat IN 0

         ENDIF

         SELECT Flat        

         SET ORDER TO TAG FlatID

         SEEK STR(SelectStreetAddress)+SelectHouseAddress+;

              STR(cFlat.Flat)

         IF FOUND()

              GATHER MEMO MEMVAR

         ELSE

              =MESSAGEBOX('Нет доступа к таблице квартир, '+;

                 'или в таблице отсутствует квартира, '+;

                 ' данные которой Вы редактировали.';

                 ,48,'А вот Вам и проблема!')

         ENDIF

         SELECT cFlat

         THISFORM.Release

      ENDIF

ENDCASE

 

Код события Click кнопки Удалить второй страницы формы Flat:

 

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

lnMsgResult=MESSAGEBOX('Подтвердите!',52,'Удаление!')

IF lnMsgResult=6  

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

  IF .NOT. USED ('Flat')

     USE Flat IN 0

  ENDIF

  SELECT Flat        

  * Индексированный поиск

  SET ORDER TO TAG FlatID

  SEEK STR(SelectStreetAddress)+SelectHouseAddress+;

       STR(cFlat.Flat)

  IF FOUND()

     DELETE     && Удаление

  ELSE

     =MESSAGEBOX('Нет доступа к таблице квартир, '+;

                'или в таблице отсутствует квартира, '+;

                'данные которой Вы хотите удалить.';

                ,48,'А вот Вам и проблема!')

  ENDIF

  THISFORM.Release

ENDIF

 

Код события Click кнопки Жильцы второй страницы формы Flat:

 

*- Кнопка Жильцы

* Номер выбранной квартиры

SelectFlat=cFlat.Flat

* Остальные параметры адреса смотри:

* событие Activate второй страницы формы Building

* SelectStreetAddress - номер улицы

* SelectHouseAddress  - номер дома

SELECT * FROM Owners;

        WHERE Street=SelectStreetAddress;

              AND House=SelectHouseAddress;

              AND Flat=SelectFlat;

        INTO TABLE 'C:\WINNT\TEMP\cOwners.dbf';

        ORDER BY Number

SELECT cOwners

DO FORM Owners

 

Код события Click кнопки Счет  второй страницы формы Flat:

 

*- Кнопка Счет

* Номер выбранного лицевого счета

SelectAccount=cFlat.Account

SELECT * FROM Account;

         WHERE Account=SelectAccount;

         INTO TABLE 'C:\WINNT\TEMP\cAccount.dbf'

SELECT cAccount

DO FORM Account