4.3.6. Занесение нового здания

 

Новостройки и здания, переданные на баланс предприятия, находятся в ведении специального подразделения. С целью защиты информации от несанкционированного доступа, функции работы со зданиями в проекте Real Estate разделены на две группы: занесение нового здания и корректировка информации по уже существующим.

Для занесения нового здания предназначена форма AddBuild (рис. 4.24). Это одностраничная форма на основе класса Building. В окружении данных этой формы только справочники Street, District и Wall. Таблица-выборка создается с одной пустой записью при наступлении события Load (загрузка формы). Буферизация не используется. При закрытии формы выборка удаляется.

 

 


Код события Load формы AddBuild:

 

* Если в папке C:\WINNT\TEMP\ остались файлы-выборки

* Закрыть таблицу, если она открыта

IF USED ('cBuilding')

   USE IN cBuilding

ENDIF  

* Удаление таблицы

IF FILE ('C:\WINNT\TEMP\cBuilding.DBF')

   DELETE FILE 'C:\WINNT\TEMP\cBuilding.DBF'

ENDIF

* Удаление полей Memo

IF FILE ('C:\WINNT\TEMP\cBuilding.FPT')

   DELETE FILE 'C:\WINNT\TEMP\cBuilding.FPT'

ENDIF

* Открываем основную таблицу зданий  

IF .NOT. USED ('Building')

   USE building IN 0

ENDIF  

SELECT Building

* Копируем структуру во временную таблицу-выборку

COPY STRUCTURE TO C:\WINNT\TEMP\cBuilding.DBF

* Закрываем основную таблицу

USE

* Открываем временную таблицу-выборку

IF .NOT. USED ('cBuilding')

   USE 'C:\WINNT\TEMP\cBuilding' IN 0

ENDIF  

SELECT cBuilding

* Добавляем пустую запись

APPEND BLANK

 

Код кнопки Записать формы AddBuild:

 

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

IF cBuilding.Street=0

  =MESSAGEBOX('Вы забыли ввести название улицы!',;

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

  ThisForm.Building1.Combo1.Setfocus

  RETURN

ENDIF

IF LEN(ALLTRIM(cBuilding.House))=0

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

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

  ThisForm.Building1.TxtHouse.Setfocus

  RETURN

ENDIF

* Есть ли уже здание по такому адресу?

IF .NOT. USED ('Building')

   USE Building IN 0

ENDIF

SELECT Building

SET ORDER TO TAG ADDRESS

* Индексированный поиск здания в таблице

* cBuilding.Street - номер улицы, на которой стоит здание

* cBuilding.House - номер дома

SEEK STR(cBuilding.Street)+cBuilding.House

IF FOUND()

  =MESSAGEBOX('Здание по этому адресу уже есть!',;

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

  ThisForm.Building1.Combo1.Setfocus

  SELECT cBuilding

  RETURN

ENDIF

SET DELETED OFF

SEEK STR(cBuilding.Street)+cBuilding.House

SET DELETED ON

IF FOUND()

  =MESSAGEBOX('Здание по этому адресу уже есть среди '+;

              'удаленных! Необходимо выполнить PACK',;

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

  ThisForm.Building1.Combo1.Setfocus

  SELECT cBuilding

  RETURN

ENDIF

SELECT cBuilding

 

IF cBuilding.District=0

  =MESSAGEBOX('В каком районе расположено здание?',;

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

  ThisForm.Building1.Combo2.Setfocus

  RETURN

ENDIF

lnMsgResult=MESSAGEBOX('Сейчас данные о новом здании '+;

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

IF lnMsgResult=6  

   SELECT cBuilding

   SCATTER MEMO MEMVAR

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

   IF .NOT. USED ('Building')

      USE Building IN 0

   ENDIF

   SELECT Building

    APPEND BLANK

   GATHER MEMO MEMVAR

   THISFORM.Release

ENDIF

 

Перед записью в основную таблицу зданий выполняется проверка на наличие в ней объекта, имеющего такой же адрес. Поиск выполняется также и среди записей, помеченных на удаление. Visual FoxPro не производит физического удаления записей из таблиц. Это дает возможность  вернуть ошибочно удаленную запись на место. Для снятия метки с записей выбранной таблицы, помеченных на удаление предназначена команда RECALL [Scope] [FOR lExpression1] [WHILE lExpression2].

Хранение в базе данных удаленной информации требуется не всегда. Существует два способа удаления отмеченных записей. Первый применяется ко всей базе данных целиком. Пусть это будет наша Real Estate. Наберите в командном окне Commmand:

 

OPEN DATABASE "c:\realestate\dbf\real estate.dbc" EXCLUSIVE

MODIFY DATABASE

 

В главном меню Visual FoxPro выберите Database и Clean up Database. Второй применим к одной таблице. Пусть этой таблицей будет Building. Наберите в командном окне Command:

 

USE c:\realestate\dbf\building.dbf EXCLUSIVE

PACK

 

В обоих случаях база данных или таблица должны быть открыты в режиме Exclusive. Для выполнения операций упаковки объектов требуется исключительно монопольный доступ.