Создадим форму, которая полностью обеспечивает все операции
по работе с основной таблицей: добавление, удаление и корректировку записей, а также
вызов форм продолжения каскада (Поиск – Здание – Квартира – Проживающие –
Лицевой счет – Договор приватизации). Применение классов для ее создания не
оправдано. Остановимся на уже известных нам 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