“Печать …” – формирует квитанцию, с данными о всех произведенных начислениях, суммах к оплате, по льготам, дату когда оплачено и остаток (задолженность).выбор этой кнопки запускает процедуру PRINT1 (см. прилож. 1.2 стр. 26; прилож. 3 стр. 1; прилож. 2 рис. 7 ), в которой выполняются следующие действия:
сначала переопределяется назначение клавиши F1, затем открывается альтернативный файл, в который будут заноситься формируемые данные и в последующем он будет сохранен на диске для его распечатки. В переменную “Т” заносится будущее имя файла (‘tab’+’.’+’txt’=tab.txt), затем объявляются два массива NACH(12,1)-для данных по начислениям, LG(9)-для данных по льготным начислениям. После этого в сканируется БД с условием только жильцов с одинаковым адресом и в переменные и элементы массивов заносятся необходимые данные, которые будут занесены в файл с помощью команды “?”, “??”. после окончания формирования квитанции этот файл будет открыт в окне VEDOM для его просмотра (редактирования) (см. прилож. 2 рис. 7).и после его закрытия будет предложено распечатать или отказаться (см. прилож. 2 рис. 8)
“Ввод оплаты” – открывает окно для ввода оплаты для одного квартиросъемщика. Выполняется процедура VVV расположенная в файле BAZES.PRG (см. прилож. 1.4 стр. 5).
Вначале переопределяется назначение на клавишу помощи, затем определяется окно для работы, затем анализируется жилец, на котором был вызов этой процедуры и если это не плательщик, то ищется плательщик квартиры и указатель записи переходит на эту запись, и работа будет производится с этим жильцом. Затем определяются переменные для работы это адрес (y,d,kv), текущая дата (dat), переменная для хранения веденой суммы (opl), погсле этого активируется окно (см. прилож. 2 рис.4) и в него выводятся поясняющие записи такие как фамилия, табельный номер, сумма начислений, сумма по льготам, сумма к оплате, остаток и GET-поле для ввода суммы оплаты, которая имеет контроль выхода (см. прилож. 1.2 стр. 40) здесь проверяется поле OPL_TA , содержащая сумму оплаты жильцами и если она не пуста, то появится дополнительное окно с пунктами-кнопками “Дописать”, “Переписать”.
Выход с сохранением осуществляется выбором кнопки <Ok> в этом окне, которая описана в процедуре SV3 (см. прилож. 1.2 стр. 40).
данные кнопки предназначены для выбора фильтра предъявления данных в окне. Их выбор обрабатывается в процедуре FILTR (см. прилож. 1.2 стр. 7), где переменной _FILTR присваиваются числовые значения, в зависимости от которых в процедуре обновления будет установлен соответствующий TAG.
“Вверх”, “Вниз”– данная группа кнопок предназначена для перемещения по БД жильцов. При этом по достижении конца(начала) БД соответствующие кнопки блокируются.. Обработка этих кнопок осуществляется в процедуре PER (см. прилож. 1.2 стр. 6-7) с помощью переменных “e” и “b”, которые определены ранее (см.выше), запоминается факт достижения конца/начала файла. Первоначально они имеют значение .F., если была предпринита попытка продвинуться за пределы БД то одной из них присваивается значение .Т.. В остальных случаях они равны .F. это нужно для восстановления в процедуре tb_l() активности кнопок если указатель записей находиться не на последней/первой записи. Также здесь используется системная переменная _CUROBJ, которая содержит номер GET-объекта. Ее значение изменяется при выборе кнопки и курсор переходит на другой объект. Она служит для того, что бы при перемещении с помощью клавиш Enter/Space курсор не покидал эти кнопки.
“Начало”, “Конец” - служат для быстрого перехода в начало/конец БД, при этом соответствующие кнопки блокируются.
“Расчет” - позволяет рассчитать квартплату на одного жильца, который находится в окне.выбор этой кнопки вызывает процедуру RAS_ON_ONE (см .прилож. 1.2 стр. 53). Здесь определяются переменные для работы это R-номер текущей записи в БД жильцов, Т-табельный номер, ORD_R-активный TAG в БД жильцов, Y- улица, D-дом, K-квартира.
После этого активной выбирается БД начислений и в ней, по табельному номеру, ищется запись, для которой делается расчет (LOCATE FOR t=tab). Если поиск не удачный, то для БД жильцов устанавливается фильтр, при котором доступны только записи с текущим адресом и командой APPEND FROM <БД жильцов> FIELDS <список одинаковых полей в БД жильцов и БД начислений> добавляются записи в БД начислений. Если поик удачный, то разрывается связь между базами, для работы команды обновления, с помощью которой одинаковые поля в БД начислений принимают значения такие какие в БД жильцов: UPDATE ON <ключевое поле> FROM <область БД жильцов> REPLACE <поле БД начислений> WITH <поле БД жильцов>.
Далее текущей выбирается БД начислений и для нее устанавливается связь ОДНА-КО-МНОГИМ с БД ставок и БД льгот, а также фильтр для обработке данных имеющим только адрес, который ранее был сохранен в переменных.
Далее обнуляются все поля начислений по льготам, это сделано для того, что если в окне изменен период или льгота отменена, то при расчете льгот эта запись игнорируется, но старые данные расчета сохраняются и чтобы этого не допустить они обнуляются.
После этого в SCAN-цикле рассчитывается квартплата, с помощью команды REPLACE <поле> WITH <выражение>, то есть <полю> присваивается значение <выражения>. Здесь в выражении используется расчет (REPLACE kw_pl WITH IIF(g.kwp_l=0, kv_pl, g.kwp_l)*IIF(kw_l=.t.,kv_m, 0)..).
Функция IIF(<условие>,<выражение1>,<выражение2>) – выдает значение <выражение1>, если <условие> истинно, и <выражение2> - если ложно. В нашем случае первый множитель – это ставка, и если поле ставки для этого жильца равно нулю, то применяется нормативная ставка, если же оно имеет значение, то применяется эта ставка. Второй множитель определяет выбор этой услуги, если поле фиксирующие выбор услуги равен .Т., то есть она выбрана для начислений, то умножение идет на квадратные метры(количество человек), иначе на 0.
После расчета квартплаты рассчитываются льготы. Здесь в SCAN-цикле предусмотрено условие при котором в расчет попадают только те жильцы, у которых либо не имеется периода действия льготы, либо текущая дата лежит в промежутке между началом и концом действия льготы. Расчет аналогичный описанному выше, различие только в том, что если по услуге расчет идет по квадратным метрам, то но высчитывается на одного человека (kv_m/kol_vo), и все значения умножаются на (-1), чтобы показать льготы с отрицательным знаком.
После окончания расчетов суммируются все начисления по льготам и заносятся в поля жильца, который платит за квартиру, для просмотра их в окнах, и расчета суммы к оплате. Затем разрываются все связи, отменяются фильтры, выполняется процедура открытия баз данных (см. прилож. 1.3 стр. 1), обновляются данные в окне и процедура завершается.
Выйти” – заканчивает работу с этим окном.
И теперь рассмотрим процедуру обновления окна tb_l(), которая включена в команду READ, с помощью опции SHOW (см. прилож. 1.2 стр.5-6). Здесь в нескольких циклах DO CASE анализируются значения переменных, которые в процессе выполнения принимают различные значения, и в зависимости от этих значений выполняются определенные действия.
Анализ переменной _FILTR – имеет числовое значение и служит для фильтра доступа к данным при их просмотре и редактирования. Значение 1 – устанавливается главным TAG ord, при котором доступны жильцы, которые платят за квартиру, 2 - – устанавливается главным TAG lgt, при котором доступны жильцы, которые имеют льготу, 3 - – устанавливается главным TAG adrr, при котором доступны все жильцы. А также на экран выводится строка-подсказка с выбранным фильтром
Далее анализируются категория жильца, и если это плательщик или льготник, то кнопки для выбора услуг – доступны для редактирования, если просто жилец то недоступны, при этом кнопки и область их расположения выделяются цветом.
Далее также анализируются категория жильца, если льготник – доступна кнопка “По льготе”, если плательщик – доступна кнопка “По оплате” и не доступны, если это не выполняется. Анализ выполняется в двух циклах по каждой кнопки, для того, что если плательщик имеет льготу, то ему доступны обе кнопки. Здесь также при анализе категории плательщика выводится разная информация по начислениям льгот (см. прилож. 1.2 стр. 4). Это – если плательщик выполняется процедура OB_NACH, которая выводит на экран общие (суммированные) начисления по льготам, если это жилец то выполняется процедура LG_NACH, которая выводит на экран начисления по льготе для данного жильца.
И последнее это анализ переменных “e” и “b”, которые служат для блокирования кнопок перемещений по БД в процедурах перемещений, при попытке выйти за пределы БД, а здесь они раз блокируются при удовлетворяющем значениии, которые присваиваются в процедурах перемещений.
“КАДРЫ”-“Квартиросъемщики”
При выборе этого пункта выводятся данные из БД жильцов в табличной форме с помощью команды BROWSE. Записи выводятся горизонтально в окне определенном ранее. Формат полей может настраиваться с помощью опции FIELDS <список полей>, а также иметь так называемые вычисляемые поля. Эти поля фактически не являются полями БД, но могут быть их функциями и отображаются на экране наравне с настоящими полями.
В данной процедуре KDR_R (см. прилож. 1.4 стр. 1) в окне KD открывается BROWSE-окно с полями табельного номера (tab), фамилии (fam), вычисляемым полем со значком ‘<’, который появляется у жильца, который является плательщиком и вычисляемым полем со значком ‘-’, который появляется у жильцов, имеющих льготу – эти поля являются функциями от фактических полей, выполняемые с помощью функции IIF(<условие>,<выр1>,<выр2>). Предъявление данных часть экрана, а на свободной части, выводятся на экран информация с помощью команд @…SAY…GET остальная интересующая информация (см. прилож. 2 рис. 9), которая формируется в процедуре NACH (см. прилож. 1.2 стр. 37) , при этом если при перемещении по БД курсор находится в поле табельного номера, то эта информация автоматически обновляется в зависимости от активной записи БД, во всех других полях эту информацию необходимо выбрать из меню, которое появляется после нажатия клавиши Enter в любом поле.