Эти действия достигаются путем включения в имена полей ключей, которые выполняют контроль входа (:W), контроль выхода (:V), а также проверку постоянно (:F) здесь:
Для поля табельного номера с помощью ключа - :W=NACH() установлен входной контроль, при котором обязательно - :F выполняется процедура вывода информации по жильцу (выполняется процедура NACH ).
Для остальных полей контроль входа - :W=EN(), которая назначает на выбор клавиши Enter выполнение процедуры POP_VIB и при выходе из поля - :V=NE() это назначение отменяется (см. прилож. 1.2 стр. 38), при чем это выполняется всегда - :F.
Выполнение процедуры POP_VIB предъявляет FOX-меню (см. отличия в описании меню), которое показано на рис. 10 прилож. 2 и описано в прилож. 1.2 стр. 39. Рассмотрим ее.
Сначала объявляется массив, элементы которого и будут пунктами меню, затем каждому элементу присваивается символьный тип с описанием названия, которое будет отображаться в меню. Далее с помощью команды READ оно активируется. После выбора из меню выполняется действие закрепленное за каждым пунктом в цикле DO CASE и оно “умирает”. Все пункты меню рассматривались выше.
“КАДРЫ”-“Картотека льготников”
Выбор зтого пункта также вызывает BROWSE-окно, открытое в окне KD1, которое открывается на весь экран, кроме двух последних строк, и предъявляет тех жильцов, которые имеют льготу (BROWSE FOR LGOT=.T.) Здесь выводятся поля фамилии, табельного номера, адреса, телефона, периода действия льготы, категории и номера удостоверения. При входе в поле выполняется процедура INFO (см. прилож. 1.2 стр. 41) с помощью ключей - :W=INFO() и - :F. Эта процедура выводит в нижних строках следующую информацию: если это плательщик, то суммы к оплате, остатка, количество льготников и количество жильцов, иначе фамилию и табельный номер того жильца, кто является плательщиком.
“КАДРЫ”-“База жильцов”
Работа процедуры, при выборе этого пункта аналогична описанной выше, только предъявляются все жильцы.
“КАДРЫ”-“Ввод данных счетчика”
Открывает в окне KD1 BROWSE-окно с плательщиками и полями табельного номера, фамилии, адреса, данными о старом и новом значениях счетчика и полем суммы начисленной за пользование электроэнергией из БД начислений (см. прилож. 1.4 стр. 3). Поля данных счетчика доступны к редактированию, остальные открыты только для просмотра, что достигается включением в имена полей ключа - :R. Также все поля имеют входной контроль - :W=INFO(), который описан выше, а поля данных счетчика и выходной контроль - :V=R() (см. прилож. 1.2 стр. 42), где при выходе рассчитывается сумма к оплате за электроэнергию и корректируется итоговые суммы.
“КАДРЫ”-“Ввод оплаты”
здесь в начале определяются две переменные, которые нужны для работы, это dat, которая содержит текущую дату (dat=DATE()) и opl, которая имеет нулевое значение и служит для того, чтобы в программе не было ошибки при обновлении полей, потому что используется одна процедура обновления полей с процедурой для ввода оплаты для одного жильца. Затем открывается в окне KD1 BROWSE-окно, в котором предъявляются поля из разных баз, это табельный номер, фамилия, поле для хранения суммы оплаты (OPL_TA), поле для хранения даты оплаты (D_OPL), и поле для хранения остатка(задолженности) (OST_K) из БД жильцов и поле итоговой суммы начислений (ITOG_N), итога начислений по льготам (SUM_IT) и суммы к оплате (ITOG) из БД начислений. (см. прилож. 1.4 стр. 3-4, прилож. 2 рис. 12). Доступные к редактированию является поле суммы оплаты которое имеет выходной контроль - :V=SV3() (см. прилож. 1.2 стр.40) , в которой полю остатка присваивается рассчитанное значение (введенная сумма – сумма к оплате), полю даты значение переменной dat, то есть текущая дата и здесь не используется ключ - :F, это значит, что если в поле, для которого предусмотрен контроль выхода (opl - :V=SV3), данные не изменялись то процедура игнорируется, а выполняется она только в том случае если данные изменялись. Также здесь используется другая информация в статус-строке :W=INFO3() (см. прилож. 1.2 стр. 42), где показывается адрес жильца, количество проживающих и количество льготников.
Пункт меню “РАСЧЕТ”
“РАСЧЕТ”-“Расчет квартплаты”
При выборе этого пункта появляется окно, где нужно подтвердить начало расчета выбором кнопки “Ок” (см. прилож. 1.6 стр.1). В окне выводится текущая дата и строка подсказка за какой месяц будет рассчитываться квартплата. Название месяца достигается с помощью массива и переменной mess, которые объявлены в файле MENI.PRG это массив mes(4,3), элементы которого содержат названия месяца и переменная mess содержит номер текущего месяца (=MONTH(DATE())) и выражение mes(mess) – выведет элемент массива по номеру, который содержится в переменной mess.
При подтверждении расчета выполняется процедура RAS_1 (см. прилож. 1.2 стр. 43-44). В первых строках деактивируется окно, выбирается активной БД начислений и из нее удаляются все записи командой ZAP, затем командой APPEND FROM <БД жильцов> FIELDS <список полей> добавляются все записи из БД жильцов. После этого все БД закрываются (CLOSE DATABASE) и в области “а” открывается БД жильцов, для которой устанавливается фильтр по полю OR_R то есть доступны только плательщики, в области “b” открывается БД начислений. После этого командой JOIN WITH <область> TO <имя новой БД> FOR <условие> FIELDS <список полей>, создается новая БД-RACH.DBF содержащая поля, которые перечислены после опции FIELDS и количеством равным в БД жильцов, что выполняется с помощью условия. Другими словами новая БД расчета содержит только плательщиков, с полями необходимыми для проведения расчета и хранения рассчитанных данных.
Далее снова закрываются все базы данных и в области “а” уже открывается новая БД расчетов, для которой создается структурный индекс для связи с другими БД. Затем устанавливается связь с БД жильцов и БД ставок и производится расчет, который аналогичен описанному, при рассмотрении кнопки “Расчет” в окне “Работа с картотекой” (“КАДРЫ”-“Работа с картотекой”). После завершения расчета, с помощью команды CALCULATE SUM(поле в котором храняться данные расчета) ТО <переменные в которые заносится результат работы команды> создаются переменные со значениями общих сумм начислений для каждой услуге, для формирования статус-строки при просмотре выполненного расчета. Далее с помощью команды @ …SAY они (переменные) выводятся в нижней части экрана и в окне KDR открывается BROWSE-окно с данными расчета и фамилией жильцов.
С помощью ключа входа в поле - :W=INFO1() внизу изменяет цвет сумма, которая относится к данной услуге (к примеру если курсор в поле горячая вода, то внизу окрашена область с общей сумме по горячей воде, как показано на рис. 14 прилож. 2), а с помощью контроля выхода - :V=INFO2() цвет принимает прежний цвет и с помощью ключа - :F выполняется всегда, независимо от изменения, это в основном нужно для ключа :V.
Работа этой процедуры показана на стр. 51 прилож. 1.2. здесь в структуре DO CASE анализируется в какое поле входит курсор (INFO1), и из какого выходит (INFO2) это достигается с помощью применения функции VARREAD()-которая возвращает прописными буквами имя поля(переменной), а с использованием с командой BROWSE/CHANGE возвращает имя поля строчными (кроме первой) буквами (см. также SYS(18)), и в зависимости от названия поля при входе, окрашивается определенная область внизу экрана, с помощью команды @…FILL TO … и цветовой схемы 12, а при выходе с помощью этих же команд этой области возвращается прежний цвет из цветовой схемы 1.
Перед открытием окна просмотра по начислениям, назначаются на клавиши выхода из BROWSE-окна, процедуры выхода (ON KEY LABEL ESC(CTRL+W,CTRL+Q) DO vib8), где активируется окно с кнопками “Сохранить” и “Отмена” (см. прилож. 1.2 стр. 45) и при выборе кнопки “Сохранить” открывается БД начислений, с помощью команды - UPDATE <ключевое поле> FROM <область> REPLACE <поле активной БД начислений> WITH <поле из указанной области (БД расчетов)>, переносятся рассчитанные данные в БД начислений. После этого выбирается активной БД расчетов, закрывается и удаляется с диска вместе со структурным индексом.
“РАСЧЕТ”-“Расчет по льготам”
Все действия, выполняемые при выборе этого пункта аналогичны как описано выше в расчете квартплаты за исключением некоторых отличий, которые не влияют на суть расчета описанного выше (см. прилож. 1.2 стр. 46).
Здесь имеющиеся записи не удаляются из БД начислений, так как предпологается, что расчет льгот производится после расчета квартплаты и все записи находящиеся в БД жильцов имеются в БД начислений (это достигается командой APPEND FROM описанной выше).
Также используется другой TAG при создании новой БД расчетов, а именно TAG date (см. прилож. 1.3 стр. 2) который делает доступными жильцов у которых текущая дата попадает в промежуток периода действия льготы и тех у кого период не определен.
При определении связи новая БД расчетов также имеет связь с БД льгот, для применения в расчете установленные проценты льготы по кодам.
Расчет льгот аналогичен описанному, при рассмотрению расчета на одного жильца в окне “Работа с картотекой” кнопка “Расчет”. (см. прилож. 1.2 стр.53)
И так как имена полей имеют разные имена, то для окрашивания общих сумм внизу экрана, при просмотре расчетов, применяется процедура для входа – INFO4, для выхода – INFO5 (см. прилож. 1.2 стр. 52 и рис. 15 прилож. 2)
“РАСЧЕТ”-“Слияние квартплаты с льготами”
Так как в программе отдельно насчитываются начисления по квартплате и льготам, то необходимо определить сумму к оплате, для чего и служит этот пункт. После выбора кнопки “Ок”, в окне описанном выше, выполняется процедура RAS_3 (см. прилож. 1.2 стр. 49).
Здесь после закрытия всех баз данных в области “а” открывается БД начислений, в области “b” БД жильцов, затем объявляется переменная “m”, для хранения количества записей в БД (m=RECCOUNT()), что необходимо для выхода из цикла. Далее организовываются четыре цикла, из которых только самый внутренний SCAN-цикл осуществляет перемещение указателя записей. Остальные WHILE-циклы контролируют заданные условия, инициализируют, формируют и заносят данные в поля БД.