Новостройки и здания, переданные на баланс предприятия,
находятся в ведении специального подразделения. С целью защиты информации от
несанкционированного доступа, функции работы со зданиями в проекте 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
* Копируем структуру во временную таблицу-выборку
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')
ENDIF
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')
ENDIF
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. Для выполнения операций упаковки
объектов требуется исключительно монопольный доступ.