45936 (665241), страница 6

Файл №665241 45936 (АРМ бухгалтера-расчетчика) 6 страница45936 (665241) страница 62016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 6)

для открытия БД. Здесь проверяется наличие баз на диске и если их нет, то они

создаются с помощью языка SQL, при этом в БД HELP, которая состоит из одного

MEMO-поля, копируются текстовые файлы помощи. Если базы уже созданы ранее, то

они открываются в заданных областях вместе со структурными индексами, которые

содержат TAG’и для связи БД и систематизированного предъявления данных:

БД (База жильцов)

TAG-tab – индексирование по полю табельного номера, для связи с БД ставок

(TABLE_R.DBF).

TAG-fam – индексирование по полю фамилии, для поиска командой SEEK.

TAG-n_lg – индексирование по полю номера льготы (код), для связи с БД льгот

(LGOT.DBF).

TAG-date – индексирование по полям периода действия льготы (dat_c,dat_po), для

расчета сумм по льготникам, рассчитываются только те льготники, у кого период

входит в текущую дату и кто не имеет периода действия льготы.

TAG-lgt – индексирование по полям адреса, с условием, что предъявляться будут

только жильцы, имеющие льготу.

TAG-ord – индексирование по полям адреса, с условием, что предъявляться будут

только те жильцы, кто платит за квартиру.

TAG-adrr – индексирование по полям адреса и табельного номера, для связи с БД

начислений (OPLATA.DBF), а также это главный TAG при просмотре данных.

БД

TAG-tab –индексирование по полю табельного номера.

TAG-adr – индексирование по адресу, для связи с БД жильцов (RABOT.DBF)

БД (БД льгот)

TAG-n_lg – индексирование по полю номера льготы (код), для связи с БД жильцов

(RABOT.DBF).

БД

TAG-tab – индексирование по полю табельного номера, для связи с БД жильцов

(RABOT.DBF).

В том случае, если индексных файлов не обнаружено, то они создаются. Здесь также

устанавливается связь между базами по ключевым полям. Связь между базами имеет

структуру ОДИН КО МНОГИМ, то есть БД жильцов является родительской по отношению

к другим.

Далее объявляются глобальные перемены (PUBLIC)

_PAD_OTCH - которое служит для анализа формирования отчета если ее значение .T.

то отчет формируется, если ее значение .F., которая присваивается в процедуре

дополнения, то при выборе формирования отчета программа просит провести слияние

квартплаты со льготами, где данной переменной присваивается значение .Т.

_REC- запоминает номер текущей записи в БД

_FILTR- имеет числовое значение и в зависимости от значения устанавливает фильтр

предъявления данных в окне “Работа с картотекой”.

Объявляется массив, содержащий имена месяцев и определяются переменные для

хранения нормативных ставок, которые сохраняются в файле M_ZAR.MEM и в

последующем загружаются в память из этого файла.

После этого командой DEFINE WINDOW определяются и описываются окна. В основном в

программе окна создаются в сомой процедуре, для того чтобы можно было

использовать опцию CLOSE то есть возможность закрытия окна с помощью мыши. А

здесь в основном определены окна для вывода подсказок-предупреждений и выбора

дальнейших действий пользователя.

Команды DEFINE MENU, DEFINE POPUP и DEFINE BAR определяют и описывают

расположение на экране и работу основного меню. Командой ON SELECTION PAD (BAR)

определяется реакция пунктов меню при их выборе. Здесь нужно сказать, что

команда ON SELECTION PAD может использоваться в виде ON PAD в этом случае, при

попадании курсора на такой PAD-пункт сразу вызовет действия определенные при

описании этих пунктов, а с добавлением слова SELECTION, чтобы выполнилось

действие нужно непосредственно его выбрать, то есть на соответствующем пункте

нажать клавишу ввода (Enter).

Последней командой в файле MENI.PRG является команда активации меню и вся

дальнейшая работа приложения будет зависеть от выбора пунктов меню.

Любая система работы с базами данных предполагает наличия этих данных, поэтому

работа с программой нужно начинать с дополнения БД информацией. В программе

предусмотрено, что при выборе пункта меню, который предназначен для работы с

данными, а база пуста появится окно с предупреждением дополнить. Рассмотрим

подробней эту процедуру. (см прилож. 1.6 стр.1).

Здесь функцией RECCOUNT() проверяется наличие записей в БД и если значение равно

нулю, то активируется окно VIB в котором при помощи команд ввода-вывода

@…SAY…GET выводится поясняющий текст (SAY) и кнопки для выбора дальнейших

действий (GET), которые активируются командой READ с опцией CYCLE, которая

запрещает выход из окна по достижении курсора последнего GET-объекта .

GET–объекты часто используется в программе, поэтому сейчас разберем их

подробнее.

В данном случае используются кнопки меню, которые определяются в команде

FUNCTION и обработка выбранной кнопки с помощью команды VALID. В процедуре

INS2(), которая описана в приложении 1.2 стр. Эти объекты еще называют как

средства управления в стиле WINDOWS все переменные, определенные командой GET

имеют или числовые значения, тогда переменной присваивается номер объекта в

порядке его расположения в команде, или символьные, тогда переменной

присваивается символьное описание кнопки, а также для кнопок-переключателей и

радио-кнопок возможно логическое значение переменной.

Затем в процедуре с именем определенной командой VALID или WHEN осуществляется в

структуре DO CASE выбор дальнейших действий в зависимости от значенияпеременной.

Например, в данном случае в окне определены две кнопки Дополнить и Отмена

(FUNCTION ‘ * …’), которые при их выборе присваивают числовое значение

переменной ins1 и которая при выборе кнопки анализируется в структуре DO CASE в

процедуре INS2. Eсли выбрана кнопка Дополнить, то переменная ins1 принимает

значение 1 (потому что эта кнопка описана первой в команде FUNCTION ‘* …’),

выполняется условие CASE ins1=1 и следовательно выполняются команды которые

следуют после этого условия (DO INS WITH 1). Если выбор не происходит вообще, то

и процедура игнорируется.

Теперь еще раз пройдемся по пунктам меню, и разберем его работу с точки зрения

языка программирования. Начнем с пункта “СЕРВИС”

“СЕРВИС”-“Дополнение”

Итак чтобы начать с дополнения БД нужно выбрать в меню “СЕРВИС”-“Дополнение” или

в окне кнопку Дополнить. Выбор пункта меню или кнопки вызывает выполнение

процедуры дополнения, которая определяется командой DO INS WITH 1. Здесь

параметр 1 определяет что это процедура дополнения. В программе предусмотрена

процедура Изменения с помощью выполнения этой же процедуры, но с параметром 2.

Разберем эту процедуру. (см. прилож. 1.5 и прилож. 1.2).

В первых строках процедуры определяется имя для параметра, в переменной "ord_a"

запоминается название тега индекса, чтобы после выхода из процедуры восстановить

параметры системы.

Далее закрепляются за клавишами "F1" и "F7" действия вызова помощи и изменения

кода по льготе, глобальной переменной "_PAD_OTCH" присваивается значение ".F.",

определяется POPUP-меню улиц и массив элементы которого в цикле DO WHILE

преобразуются в BAR-пункты меню и с помощью переменной "m" массив

переопределяется, чтобы в меню не было пустых строк. Определяется окно "hp" для

вывода в нем меню кодов и описания льгот их выбора и занесения номера или

описания документа льготы.

Далее в структуре DO CASE анализируется номер параметра. Если параметр равен 1,

то это дополнение и с помощью команды SCATTER MEMVAR BLANK создается массив,

содержащий переменные аналогичные полям БД с пустыми значениями, если параметр

равен 2, то это изменение и массив будет содержать переменные с данными текущей

записи БД (SCATTER MEMVAR) и здесь также определяются переменные, которым

присваиваются значения полей, которые имеют логический формат и отображаются на

экране с помощью GET-объектов это кнопки-переключатели для определения

начислений услуг, кнопка-переключатель выбора льготы и кнопка-переключатель

выбора плательщика. Также здесь в переменных запоминается текущий адрес

плательщика (yl_ins=yl, dom_ins=dom, k_ins=kw_ra), для анализа изменения адреса.

После того как параметр определен активируется окно INS в котором располагаются

переменные из созданного массива для занесения (изменения) данных (см. рис.19 и

рис 20 прилож. 2)

Схема отображения данных реализовано следующим образом: в первой строке после

активации окна вызывается функция POS_CH2(), в которой содержатся SAY-объекты

комментарии к GET-полям (прилож. 1.2 стр.29). Далее располагаются GET-объекты

полей и выбора кнопок для большинства которых предусмотрена проверка при выходе

(VALID) и входе (WHEN).

Поле-переменная фамилия – при входе выполняется функция =CAPSLOCK(.T.), для

переключения ввода фамилии прописными буквами.

Поле-переменная табельный номер - здесь при выходе из поля выполняется процедура

unic(), которая проверяет уникальность введенного номера (прилож. 1.2 стр. 32).

То есть в структуре DO CASE определяется параметр если он равен 2 то

возвращается значение .Т. и курсор входит в следующее поле, если он равен 1, то

с помощью команды поиска проверяется наличие такого номера в БД и если такой

номер существует, то функция возвращает значение .F., что означает, что выход из

поля невозможен, а также появляется окно vib, в котором с помощью команды SAY

выводится фамилия того жильца, который имеет этот табельный номер.

Поле-переменная улица - при входе выполняется функция yliz_s() (см. прилож. 1.2

стр.29), где вначале выключается клавиша CapLock, а затем проверяется условие,

что записей в БД больше нуля и параметр равен 1 и если это выполняется то

активируется POPUP-меню улиц, для выбора нужной (см. прилож. 1.2 стр. 29), или

закрыть меню и вести улицу вручную.

Переменная or1 - имеет числовое значение и соответствует полю OR_R: 1 – если

выбрана ([x], 0 – не выбрана ([ ]) и служит для выбора жильца плательщиком.

Здесь также предусмотрена проверка при выходе. (см. прилож. 1.2 стр. 31 FUNC

O_R()) в структуре DO CASE анализируется выбор кнопки, если она выбрана, то

сначала объявляются переменные из полей-переменных с удалением из них пробелов,

затем ведется поиск в базе жильцов с таким адресом и имеющих поле OR_R со

значением 1. Если поиск удачный и это не текущая запись (например при

изменении), то появляется окно-предупреждение с фамилией жильца, который уже

определен плательщиком за эту квартиру. Переменной or1 присваивается значение 0

и GET-объект обновляется. Если при выборе кнопки (or1=1) поиск неудачный, то

полю-переменной M.OR_R присваивается значение 1 и становятся доступными кнопки

выбора услуг.

Переменная lg_ta – имеет логическое значение и соответствует полю LGOT: .F.-

если не выбрана ([ ]), .T.- если выбрана [x]. Здесь при выходе, если кнопка

выбрана, что проверяется в структуре DO CASE (см. прилож. 2 стр. 30 FUNC

VIB_LG), то активируется окно с полями-переменными кода льготы (M.N_LG) и

описанием (номером) документа (M.N_YD), при этом курсор попадает в поле с

выбором кода, для которого предусмотрено проверка входа, то есть при входе в это

поле выполняется функция LG1 (см. прилож 1.2 стр. 29), в которой определяется

наличие данных в БД льгот и если они имеются определяется и активируется меню из

полей БД льгот. Можно выбрать имеющиеся льготы или добавить новую. Если при

выходе поле кода льготы будет иметь нулевое значение, то переменной lg_ta и

M.LGOT присваивается значение .F., иначе становятся доступные для редактирования

поля с периодом, ставками и описанием льготы, а также становятся доступными

кнопки выбора услуг.

Переменные kw, gw, ks, ot, elc, tl, rd – все эти поля имеют логический тип и

соответствуют полям базы выбора для начисления по услугам. Если это процедура

изменения то они имеют значения этих полей, как описано выше, если дополнение то

все имеют значение .F..При этом они доступны для редактирования, только в том

случае, если жилец является (выбран) плательщиком или (и) льготником. При выходе

выполняется процедура _INS (см. прилож. 1.2 стр. 30-31), где

полю-переменной присваивается значение переменной.

Период льготы, ставки и ее описание – данная группа полей выделена цветом в

зависимости от того доступны, (M.LGOT=.T.) или не доступны (M.LGOT=.F.) для

редактирования. Здесь контроль данных проверяется только в поле-переменной, по

какую дату должна начисляться льгота (M.DAT_PO) то есть она должна быть больше

даты начала даты начисления (см. прилож. 1.5 стр. 2), остальные поля – это поля

БД льгот.

Следующей командой определяющие кнопки, которые имеют числовое значение, в

зависимости их расположения, при описании. 1-“Сохранить\Подтверждаю”, 2-“Выход”,

3-“Удалить”. Обработка выбора этих кнопок осуществляется в процедуре ad_in()

(см. прилож. 1.2 стр. 32-35). В первых строках выполняются действия по удалению

возможных начальных пробелов (LTRIM()) в полях фамилии и адреса, далее

определяется категория жильца и если это не квартиросъемщик, то удаляется не

нужная информация (телефон и кв. метры), и наоборот. После этого определяется

номер выбранной кнопки (pod) и номер параметра входа в это окно.

Кнопка “Сохранить”, параметр 1 (pod=1, red=1) – добавляется новая запись (APPEND

BLANK) и все поля-переменные переносятся в эту запись (GATHER MEMVAR). Далее

выполняются действия по заполнению поля с количеством жильцов. Ищется первая

запись в БД с адресом нового жильца, в любом случае поиск будет удачным, но это

может быть либо добавленная запись, либо другая. Если кроме новой записи больше

не обнаружено, то полю количества жильцов (KOL_VO), присваивается значение 1,

иначе значение найденной записи, и в этом случае сканируется записи с этим

адресом, чтобы увеличить поле-количество на 1. Затем открывается БД, в которой

хранятся информация о ставках по услугам для каждого жильца (TABLE_R) и в нее

добавляется новая запись с копированием табельного номера новой записи из БД

жильцов. Затем ищется в БД жильцов запись с одинаковым адресом и если такая

найдена, то копируются в переменные значения полей из БД ставок (TABLE_R),

которые затем копируются в поля БД ставок новой записи, иначе они имеют нулевые

значения. После этого командой SCATTER MEMVAR BLANK создаются новые переменные

полей, переменным для выбора услуг присваиваются значения .F. GET-поля

обновляются и можно редактировать следующую новую запись.

Кнопка “Подтверждаю”, параметр 2 (pod=1, red=2) – первой командой переменные

переносятся в БД. После этого проверяется изменялся ли адрес, с помощью

переменных определенных ранее (см. выше yl_ins ,dom_ins, k_ins). Если адрес не

изменился, то процедура заканчивается и возвращается в окно изменения, иначе

устанавливается фильтр работы только с жильцами, имеющими текущий (измененный)

адрес, и корректируется поле-количество. Затем аналогичная операция происходит с

жильцами старого адреса.

Кнопка “Выход” – завершает работу процедуры, и выполняются команды следующие за

командой READ, это закрытие окна, переиндексация данных и выход с процедуры.

Кнопка “Удалить” – доступна только в том случае, если это процедура изменения

(см. прилож. 1.2 стр. 35) и будет рассмотрена ниже.

Теперь рассмотрим последнюю команду обновления GET-объектов – это команда-опция

SHOW red(), входящая в команду READ. Она выполняется всегда если в какой-либо

процедуре встретится выражение SHOW GETS, в данном случае в процедурах,

вызываемых в окне Дополнения\Изменения данных, если встречается это выражение

выполняется процедура red() (см. прилож. 1.5 стр.3). здесь в структуре DO CASE

анализируются переменные и в зависимости от их значения выполняются следующие

действия:

если параметр равен 1 (red=1), то кнопка описанная для сохранения новых данных

будет иметь название “Сохранить”, а кнопка удалить будет не доступна

если параметр равен 2 (red=2), то кнопка “Сохранить” изменит свое название на

“Потверждаю”.

Если переменная M.OR_R=0, то кнопки-переключатели выбора услуг будут недоступны.

И наоборот M.OR_R=1, то доступны.

Если переменная M.LGOT=.F., то то кнопки-переключатели выбора услуг и поля

редактирования по льготе будут недоступны. И наоборот.

“СЕРВИС”-“Дополнение льгот”

при выборе данного пункта запускается процедура INS_LG, которая расположена в

файле ADD_DEL.PRG (см. прилож. 1.5 стр. 5) и показана на рис. 17 прилож. 2.

В первых строках выбирается БД, где содержится информация по льготам, затем

определяется окно для работы процедуры и обращение к помощи. Открывается окно

для редактирования льгот, в окне также используются не сами поля, а их

переменные, созданные командой SCATTER MEMEVAR.

После ввода в поле “Код” номера, при его выходе выполняется процедура UNIC_LG

(см. прилож. 1.2 стр. 36), в которой в БД льгот ищется код с веденным кодом и

если найден то переменные обновляются информацией по этому коду, и доступны для

изменения или удаления, если нет то остаются пустыми и готовы к заполнению.

Так как работа происходит с переменными, то для сохранения сделанных изменений

или дополнения, нужно подтвердить, нажав на кнопку “Сохранить”.

Работа кнопок осуществляется в процедуре LG_INS, где в структуре DO CASE

выполняются действия в зависимости от числового значения переменной LG_INS:

LG_INS=1. Из переменной M.INFO (Категория) удаляются возможные начальные

пробелы, затем ищется код-переменная в БД льгот, если найден, то это изменение и

поля переносятся в БД. Если не найден то дополнение и здесь сначала добавляется

запись в БД, а затем в нее переносятся поля. Так как работа на этом не

заканчивается, то создаются новые поля переменные и поля обновляются.

LG_INS=2. Команда CLEAR READ завершает работу с этим окном.

LG_INS=3. Запись помечается на удаление (DELETE) и физически удаляется (PACK),

после этого создаются новые поля, поля обновляются и работа продолжается.

“СЕРВИС”-“Тарифы”

при выборе этого пункта выполняется процедура TARIFS_ZAR, расположенная в файле

FUNC.PRG (см. прилож. 1.2 стрю 55) и показано окно на рис. 18 прилож. 2.

В первых строках командой HIDE POPUP убирается с экрана меню “СЕРВИС”, затем

закрепляется за клавишей Esc процедура выхода по клавише Esc, в переменной _REC

запоминается номер записи в БД жильцов. Выбирается активной БД тарифов и

определяется окно для работы данной процедуры и горизонтальное меню, которое

будет расположено в этом окне и с его помощью будут выполняться действия по

обработке данных.

Данное меню имеет три PAD-пункта.:

PAD-пункт “Просмотр” – активируется POPUP-меню, которое состоит из полей БД

тарифов, и выбор любого BAR-пункта выполняется в процедуре INS_REC, в которую

передаются два параметра это названия тарифа (PROMPT()-mprompt), и номер записи

в БД тарифов (RECNO()-mrecno) (см. прилож. 1.2 стр. 56), в которой в зависимости

от параметра выполняются следующие действия:

если описание пустое (empty(mprompt)), то эта запись помечается на удаление.

Иначе создаются поля-переменные для изменения данной записи (рис. 22 прилож. 2)

так как редактируются переменные, то в окне присутствуют кнопки для сохранения

сделанных изменений кнопка-“Сохранить” (процедура del_rec1, ras_on1=1), где

сначала, в зависимости от значения переменной M.K_CH (.T.,.F.) заполняется

переменная M.INFO и затем переменные переносятся в БД; выхода без изменения

кнопка “Отказ” (процедура del_rec1, ras_on1=2), где командой CLEAR READ

завершается работа с переменными-полями без перенесения их в БД; и удаления

текущей записи (процедура del_rec), текущая запись командой DELETE помечается на

удаление.

PAD-пункт “Дополнить” и PAD-пункт “Выйти” - обрабатываются в процедуре INS_ST, в

которую передаются параметры, содержащие текст-приглашение данных пунктов.

Если выбран пункт “Дополнить”, то в процедуре INS_ST создаются поля-переменные с

пустыми значениями и с помощью кнопок дополняются записи.

Если выбран пункт “Выйти”, то в процедуре INS_ST закрывается окно и

деактивируется меню.

“СЕРВИС”-“Нормы оплаты услуг”

Данный пункт открывает окно M_ZAR, где с помощью команд @…SAY…GET (см. прилож.

1.4 стр. 4) выводятся переменные ставок, определенные в начале программы в файле

MENI.PRG и после их редактирования они сохраняются в файле M_ZAR.MEM. чтобы их

сохранить необходимо выйти из окна по кнопке “Сохранить”, которая запустит

процедуру сохранения (см. прилож. 1.2 стр. 20).

“СЕРВИС”-“Упаковка данных”

Выбор этого пункта запускает процедуру физического удаления данных, помеченных

ранее на удаление (см. прилож. 1.2 стр. 22). В первых строках сканируются

записи, помеченные на удаление в БД жильцов и помечаются записи во

вспомогательной БД ставок, которая связана с основной БД по полю табельного

номера (TAB). Затем снова сканируется БД жильцов с целью проверки недопущения

наличия жильцов без плательщика. Здесь перебираются помеченные записи, и в

переменные заносятся значения адреса для поиска, и фамилии для возможного

предупреждения.

После этого ищется жильцы, проживающие по этому адресу, если такие существуют,

то ищется плательщик и если такого нет выводится окно, показанное на рисунке,

где нужно выбрать одно из трех действий (см. прилож. 1.2 стр. 23, процедура

D_IN).

“Удалить всех” – будут помечены все записи по этому адресу.

“Изменить” – запустится процедура изменения, для найденного жильца.

“Восстановить” - восстановить плательщика, ранее помеченного на удаление, то

есть снимет пометку командой RECALL.

“СЕРВИС”-“Переиндексация”

В этой команде я не пользовался командой REINDEX, а просто удалял все индексы и

создавал новые. Это и проще и времени уходит меньше (см. прилож. 1.2 стр. 23). В

первых строках закрываются все БД и вместе с ними структурные индексы, далее с

помощью команды DOS удаляются все файлы, имеющие расширение .CDX то есть

структурные индексы, потому что другие индексы в программе не используются, и

затем выполняется процедура открытия баз данных (см. прилож. 1.3), где индексы

создаются автоматически. Здесь нужно сказать, что при таком подходе FoxPro может

выдать ошибку, и требование явно указать на БД, которую нужно открыть. Эта

проблема решается с помощью функции ON ERROR DO EROR WITH ERROR(), которая

передает код ошибки в процедуру EROR как параметр (см. прилож. 1.2 стр. 53), и в

ней в зависимости от области открываются нужные базы данных.

Пункт меню – “КАДРЫ”

После того как в базе жильцов имеются записи, можно работать с процедурами,

осуществляющих действия по их обработке. Эти процедуры в основном находятся в

первом пункте меню “КАДРЫ”.

“КАДРЫ”-“Работа с картотекой”

При выборе данного пункта открывается окно, представленное как личная карточка

жильца, в которой отображается необходимая информация и средства по ее обработке

(см. прилож. 1.2 стр. 1-20).

Как уже описывалось в главе 2 с работой в этом окне, вся информация,

расположенная в этом окне делится на две части, поэтому каждую часть разберем по

отдельности. Но прежде рассмотрим заполнение окна информацией и другими

объектами (см. прилож. 1.2 стр. 1-2 и прилож. 2 рис. 2 ).

Итак в первых строках выполняются некоторые технические действия, а именно это

проверка наличия данных, которая описывалась выше, определение и присвоение

переменным “e” и ”b” логических значений для анализа конца и начала БД, и в

зависимости от этого доступность или недоступность кнопок перемещения, клавише

F1 назначается процедура открытия соответствующего окна с помощью, клавише F5

процедура поиска. После этого активируется окно INS и в него выводится следующая

информация: это поля БД, имеющие символьные и числовые данные с помощью команды

GET с опцией, запрещающей редактирование. Это поля фамилии (FAM), табельного

номера (TAB), телефона (TEL), адреса (YL,DOM,KW_RA), квадратных метров (KV_M),

суммы начисленной квартплаты из БД, в которой хранятся все начисления, и

доступные для редактирования GET-поля количества (KOL_VO), код и описание льготы

из БД льгот, периода действия льготы (DAT_C,DAT_PO) и поля выбора услуг, имеющие

логические значения, представленные с помощью переменных: kw (KW_L)-квартплата,

gw (G_W_L)-горячая вода, xw (X_W_L)-холодная вода, ks (K_YS_L)-коммунальные

услуги, ot (OTOP_L)-отопление, elc (EL_C_L)-електричество, tl (TEL_L)-телефон,

rd (RAD_L)-радио, которые затем выводятся на экран с помощью GET-объектов

(кнопки-переключатели). А также другие GET-объекты, которые будут рассмотренны

позже.

Далее идут SAY-объекты, это подписи к GET-полям, а также результаты возвращаемые

функциями, которые выводятся с помощью выполнения функции POS_CH1 (=POS_CH1( ))

(см.прилож. 1.2 стр.3). разберем только выводимые значения, возвращаемые

функциями.

Количество жильцов – выполняется функция KOL (прилож. 1.2 стр. 19), где путем

сканирования формируется переменная k и возвращается ее значение (RETURN k), так

как эта переменная числового типа, а команда SAY выводит только символьный тип

данных, то необходимо преобразовать числовой тип в символьный и убрать первые

пробелы, что позволяет следующие команды: LTRIM(STR(KOL(0))), где KOL(0) –

полученное значение, STR – функция преобразования числовых данных в символьные,

LTRIM – удаление ведущих пробелов.

Количество льготников – аналогичная функция, описанная выше только считает

жильцов, если поле LGOT имеет значение истины (.Т.).

Ставки по которым производится расчет для данного жильца. (см. прилож. 1.2 стр

16-17). Здесь сначала проверяется поле ставок БД ставок, так как связь одна ко

многим то при перемещении курсора в основной базе он перемещается во всех

вспомогательных базах и если поле в БД равно нулю, то параметру, который

является результатом работы функции, присваивается значения нормативной ставки,

иначе значения этого поля. Затем в команде SAY тип возвращаемого результата

преобразуется в символьную форму и после вывода их на экран они накрываются

невидимыми кнопками.

Числовые поля из БД начислений. Здесь эти данные просто преобразуются в нужный

формат и выводятся на экран.

И в этой же процедуре раскрашиваются области внутри окна, для их более

выразительности и выделения. (@ … FILL TO …).

Также необходимость заполнения окна с помощью выполнения функции вызвано тем,

что информация по каждому жильцу является не всегда одинаковой, в окне

предусмотрено перемещение по БД, а значит и обновление выводимой информации. Это

достигается с помощью этой функции и опции обновления GET-объектов SHOW <имя

процедуры>, которая входит в команду READ, которая будет рассмотрена ниже.

Вернемся к окну. Как уже описывалось выше (глава 2 стр. 26) вся основная

информация о жильце содержится в первой части. Рассмотрим работу доступных

GET-объектов в этой части.

Первый GET-объект это поле количества проживающих (@ 5,39 GET kol_vo), при зтом

как бы для проверки рядом выводится SAY-объект количества, рассчитанный

программным путем (см. выше).

Далее SAY-объект “СОСТАВ СЕМЬИ” накрыт невидимой кнопкой (@ 6,27 GET family

FUNCTION ‘*I ‘ VALID FAMILY( ) …).Невидимой она называется потому, что не

формируют никаких текстовых сообщений и только выделяются цветом, и при нажатии

клавиш Ehter/Space могут вызывать функцию через опцию VALID. Здесь при нажатии

этих клавиш происходит процедура FAMILY (прилож. 1.2 стр. 8) в которойв

переменные заносятся данные о текущем TAG’e, и адресе, устанавливается фильтр

доступа к данным, имеющим этот адрес и активируется меню, из полей БД жильцов,

которое определено ранее в файле-процедуре MENI (прилож. 1.1) и пункты которого

состоят из фамилии и двух вспомогательных полей, указывающих на категорию

жильцов (плательщик, льготник). Выбор пункта этого меню отобразит в окне этого

жильца и обновится информация относительно этого жильца, также в зависимости от

категории жильца переменной _FILTR присваивается значение 1-если жилец является

плательщиком, 2- если льготник и 3- если ни тот ни другой (просто проживающий).

Это нужно для того, чтобы при выполнении процедуры обновления (SHOW) в

зависимости от значения этой переменной, будет установлен соответствующий TAG,

влияющий на предъявление данных.

Следующая группа GET-объектов выводит поля выбора услуг с помощью

кнопок-перек-лючателей (@ 10-17,2 GET kw(gw,xw,ks,ot,elc,tl,rd) FUNCTION ‘*C

‘VALID KW( )(GW(),XW()…)). Здесь переменные и поля имеют один и тот

же тип данных, а именно логический и в процедурах, вызываемых при выходе по

опции VALID просто полю присваивается значение переменной (см. прилож. 1.2 стр.

17-18).

Чуть иначе обстоит дела с выбором телефона и радио. Это сделано для того, что

предполагается, что в квартире установлена одна телефонная и(или) одна

радиоточка, поэтому если в квартире живут два или более льготников, которые

пользуются льготными ставками на эти услуги, то при расчете им обоим (или более)

будет убавляться плата по этим услугам, что в конечном итого телефон и(или)

радио будет бесплатно или ЖКХ еще будет доплачивать за пользование этими

услугами, что разумеется недопустимо, вот для этого осуществляется контроль

выбора услуг. По своему содержанию процедуры одинаковы, поэтому разберем одну из

них (см. прилож. 1.2 стр. 18).

Итак при выборе телефона (радио) вызывается процедура TL1(RD1) в которую

передаются три параметра: 1-OR_R (OR-в процедуре), 2-LGOT (LG-в процедуре),

которые имеют значения полей плательщика (0,1) и льготы (.T.,.F.), относительно

жильца которому выбирают услугу, 3-RECNO( ) (R-в процедуре), который имеет

значение номера записи в БД этого жильца и 4-ORDER( ) (ORD-в процедуре), который

имеет символьное значение активного индекса (TAG’a). Далее в процедуре в

переменные заносятся значения адреса, для включения их в SCAN-условие, а также,

только для телефона, в условие поиска, где ищется плательщик и у него

проверяется поле телефона и если оно пустое, то предполагается, что телефона нет

и выбрать эту услугу невозможно.

После этого в структуре DO CASE анализируются переданные параметры:

CASE OR=1.AND.LG=.T. то есть если это плательщик и он также льготник. В первой

строке активируется TAG, при котором доступны все записи в БД, затем сканируется

БД и у всех жильцов, имеющих этот адрес полю выбора телефона(радио)

присваивается значение “Ложь” (.F.) и затем этому жильцу полю выбора

телефона(радио) присваивается значение “Истина” (.Т.). то есть по этому условию

плательщик имеющий льготу имеет преимущество перед другими жильцами, имеющими

льготу, по выбору этих услуг.

CASE OR=1.AND.LG=.F. то есть если это плательщик, не имеющий льготу. Здесь

просто полю выбора телефона(радио) присваивается значение “Истина”.

CASE OR=0.AND.LG=.T. то есть если это не плательщик, а льготник. В этом случае

сканируются записи, имеющие этот адрес и льготу, и если у кого-либо поле выбора

телефона(радио) имеет значение “истины”, то переменной TL(GET-объект)

присваивается значение “Ложь” и после завершения сканирования значение

переменной присваисвается полю выбора телефона(радио).

Следующие GET-объекты, это группа невидимых кнопок, которые накрывают области,

где выводятся значения стоимости услуг (@ 10,28 GET tar_s FUNCTION ‘*I ;;;;;;;’

VALID TARIFS( )…), при выборе которых выполняется процедура TARIFS (см. прилож.

1.2 стр. 11, прилож. 2 рис. 3), где можно выбрать тарифную ставку для услуги на

которой был сделан выбор, из имеющихся в БД тарифов или если нет, то добавить.

При этом можно установить эту ставку всем жильцам дома, или можно установить

норматив по этой услуге жильцу или всему дому. Работа, в окне и с меню во многом

схожа с работой описанной ранее, при описании “СЕРВИС”-“Тарифы”. Рассмотрим

отличия. В первых строках определяется окно и меню для работы процедуры.

Далее с помощью структуры DO CASE определяется на какой услуге был сделан выбор,

и в зависимости от этого устанавливается ограничение на предъявление данных,

например если это горячая вода, то появятся тарифы, имеющие значение .Т. поля

K_CH, (расчет на одного человека) и наоборот, переменной VIB_STAVOK

присваивается имя поля в БД ставок, для того, что в дальнейшем с помощью

макроподстановки (&VIB_STAVOK) этим полям будут присвоены соответствующие

значения. И после этого активируется окно и меню для выбора ставки по этой

услуге, при этом в правом углу появляется системное окно-подсказка, с помощью

команды WAIT, с текстом выбранной услугой.

Пункт “Выбрать” предъявляет POPUP-меню с BAR-пунктами, состоящими из полей БД

тарифов, и при выборе любого пункта появляется меню с выбором установить всем

жильцам дома или квартиры. После этого в процедуре V_ST1 куда передаются

параметры номера BAR-пункта (BAR( )) и номера текущей записи в БД (RECNO( ))

(см. прилож. 1.2 стр.14-15). Здесь в структуре DO CASE определяется номер

выбранного BAR-пункта и для всех жильцов дома (параметр=1(“Установить всем

жильцам дома”) или для данных жильцов квартиры (параметр=2 “Установить данному

жильцу”), в скан- условии, полям БД ставок этих жильцов по выбранной услуге

присваивается значения, которые имеются в поле ST_KA в БД тарифов (REPLACE

&VIB_STAVOK WITH ST, где VIB_STAVOK-это имя поля в БД ставок (см. выше)

ST-ставка из поля ST_KA в БД тарифов (ST=ST_KA))

Здесь также добавлен повый пункт меню “Установить норматив”, при выборе которого

появляется POPUP-меню с двумя BAR-пунктами “Установить всем жильцам дома” и

“Установить данному жильцу” выбор этих пунктов осуществляется в процедуре V_ST2

куда передаются параметры номера BAR-пункта (BAR( )) (см. прилож. 1.2 стр.15).

Здесь в структуре DO CASE определяется номер выбранного BAR-пункта и для всех

жильцов дома (параметр=1(“Установить всем жильцам дома”) или для данных жильцов

квартиры (параметр=2 “Установить данному жильцу”), в скан- условии, полям БД

ставок этих жильцов по выбранной услуге присваивается нулевые значения.

Последние GET-объекты в этой части экрана это кнопки “По льготе” и “По оплате”,

которые доступны если жилец является плательщиком (“По оплате”) и(или)

льготником (“По льготе”).

Кнопка “По льготе” – открывает окно (см. прилож. 2 рис 5), в котором с помощью

команды @…SAY…GET, выводятся поля из базы льгот, по тому коду, который имеет

данный жилец, доступные для редактирования. (см. прилож. 1.2 стр. 9).

Кнопка “По оплате” – открывает окно (см. прилож. 2 стр. 6), в котором с помощью

команды @…SAY…GET, выводятся поля из базы ставок для данного жильца, доступные

для редактирования (см. прилож. 1.2 стр.10). при этом после закрытия этого окна

или после выхода из последнего (первого) GET-объекта все значения полей

заносятся в переменные, появляется это же окно с информацией о количестве

квартир в доме, по адресу которому живет плательщик, и с помощью команды WAIT

будет предложено установить такие ставки всем жильцам дома (WAIT ‘Установить

всем жильцам (Y/N)’ TO Y ) и если будет нажата клавиша Y (Н), то с помощью

фильтра и сканирования эти ставки будут присвоены всем жильцам, проживающих по

этой улице и дому, иначе только жильцам данной квартиры. Это достигается с

помощью команды REPLACE WITH , так как связь одна ко

многим, то перемещения указателя в основной БД вызывает перемещение во

вспомогательной.

В части второй этого окна расположены триггерные кнопки (Push Buttons), которые

при их выборе выполняют определенные действия по обработке данных.

“Изменить”, “Добавить” - запускает процедуру изменения для жильца находящегося в

окне, или процедуру дополнения нового жильца, которая описана выше (см.

“СЕРВИС”-“Добавить” стр. 36).

“Удалить” – запускает процедуру удаления текущей записи (см. прилож. 1.2 стр.35)

здесь вначале проверяется помечена ли запись на удаление и если помечена то

пометка снимается и процедура заканчивается. Это нужно для того, что в окнах

“База жильцов”, “Картотека льготников” также можно удалять записи комбинацией

клавиш , и этой же комбинацией клавиш снимать пометку на удаление. Далее

идет команда переноса переменных в БД, если вызов этой процедуры пришел из

функции изменения, затем в переменные заносится текущий адрес, устанавливается

фильтр по этому адресу и в переменную kol заносится количество записей (COUNT TO

kol), после этого переменная kol уменьшается на одну единицу, полученный

результат присваивается всем записям по полю количества жильцов, затем эта

запись помечается на удаление, и если вызов был с окна INS (“Работа с

картотекой”), то информация и GET-объекты в этом окне обновляются.

“Печать …” – формирует квитанцию, с данными о всех произведенных начислениях,

суммах к оплате, по льготам, дату когда оплачено и остаток (задолженность).выбор

этой кнопки запускает процедуру 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 , содержащая сумму оплаты жильцами и если

она не пуста, то появится дополнительное окно с пунктами-кнопками “Дописать”,

“Переписать”.

Выход с сохранением осуществляется выбором кнопки в этом окне, которая

описана в процедуре 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(,,) – выдает значение ,

если истинно, и - если ложно. В нашем случае первый

множитель – это ставка, и если поле ставки для этого жильца равно нулю, то

применяется нормативная ставка, если же оно имеет значение, то применяется эта

ставка. Второй множитель определяет выбор этой услуги, если поле фиксирующие

выбор услуги равен .Т., то есть она выбрана для начислений, то умножение идет на

квадратные метры(количество человек), иначе на 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(,,). Предъявление данных часть экрана, а на свободной

части, выводятся на экран информация с помощью команд @…SAY…GET остальная

интересующая информация (см. прилож. 2 рис. 9), которая формируется в процедуре

NACH (см. прилож. 1.2 стр. 37) , при этом если при перемещении по БД курсор

находится в поле табельного номера, то эта информация автоматически обновляется

в зависимости от активной записи БД, во всех других полях эту информацию

необходимо выбрать из меню, которое появляется после нажатия клавиши Enter в

любом поле.

Эти действия достигаются путем включения в имена полей ключей, которые выполняют

контроль входа (: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-циклы

контролируют заданные условия, инициализируют, формируют и заносят данные в поля

БД.

Первый WHILE-цикл имеет условие !EOF(), то есть цикл выполняется до тех пор пока

не будет достигнут конец БД. Для этого служит функция EOF(), котороя принимает

значение .F. при попытке указателя записи выйти за предел последней записи БД.

Следующей командой служит определения переменной содержащей имя улицы, для

работы следующего WHILE-цикла.

Также при расчете для баз данных применяются TAG’и, которые позволяют

предъявлять записи в систематизированном виде по адресу, что позволяет

использовать WHILE-циклы, а также SCAN-цикл с включением в него WHILE-условия.

Второй WHILE-цикл предъявляет те записи у которых улица совпадает с переменной

определенной в первом WHILE-цикле, то есть жильцов с одинаковой улицей, а также

здесь определяется переменная, содержащая номер дома, для работы следующего

WHILE-цикла.

Третий WHILE-цикл предъявляет те записи, у которых улица и дом совпадают, то

есть жильцов проживающих в одном доме. И здесь определяется переменная,

содержащая номер квартиры, для работы следующего SCAN-цикла и переменные

помогающие формировать данные, числового типа, которым присваивается значение 0.

Четвертый SCAN-цикл обрабатывает записи для одной квартиры. Внутри этого цикла

используются команды управления (IF…[ELSE]…ENDIF), которые позволяют от

удовлетворяющих условий присваивать переменным нужные значения и затем

переносить их в поля БД. Так в первой команде выявляется, является ли жилец

плательщиком и при истинном значении, переменной it присваивается значение

итоговой суммы по начислению квартплаты, переменной r-номер записи, для

занесения в нее, после окончания цикла, в поля плательщика нужных результатов.

Во второй команде анализируются льготники и с помощью переменных (определенных в

третьем цикле) присваиваются результаты сумм начислений по льготам.

После завершения цикла по квартире указатель записей устанавливается на

следующую запись, которая запоминается в переменной n, затем в переменную os

заносится сумма к оплате, командой GOr указатель переходит на запись плательщика

и в поля для этой записи переносятся полученные результаты. Затем активной

делается БД жильцов и в ней ищется эта запись и в зависимости от условий

корректируются поля по остатку и оплате. Так если оплата не производилась (поле

OPL пусто), то остаток будет рассчитанная сумма к оплате с отрицательным

значением, иначе результат остатка, полученный при вычитании из внесенной суммы

начисления, рассчитанной суммы по оплате. После этого выбирается снова БД

начислений, проверяется условие, при котором если переменная n (номер следующей

записи) больше переменной m (количество записей) то выполняется процедура

просмотра и слияние расчетов заканчивается, иначе расчет продолжается для

следующих записей. Для чего нужно это условие?

Дело в том, что для просмотра и формирования отчетов целеобразно хранить все

данные, относящиеся к начисленным суммам по начислениям квартплаты и льготам в

записи одного жильца, являющегося плательщиком, для чего в цикле осуществляется

переход на эту запись. А так как при начале цикла в первом WHILE-цикле

определено условие окончания, если переменная !EOF() примет значение .F., то при

таком подходе (возврате на нужную запись в процессе цикла) эта переменная

никогда не примет этого значения, так как она изменяет свое значение не тогда

когда указатель записи находится на последней записи, а когда указатель записи

попытается выйти за пределы последней записи, вот для прекращения цикла и

используется это условие. А именно: переменная m хранит число всех записей а n

хранит номер последней записи. И если n будет больше m, то это значит, что все

записи рассчитаны. Единственным недостатком (по моему мнению) такого подхода

является то, что переменная m ранит все записи, включая записи помеченные на

удаление, и в зтом случае расчет для последней записи производится столько раз,

сколько в БД записей на удаление, что не влияет на результат, а только на

скорость обработки, но это ограничение не касается моего расчета, по той

причине, что записи помечаются только в БД жильцов, а в БД начислений их не

существует, так как БД начислений формируется из БД жильцов, для которой

определено игнорирование записей на удаление (SET DELETE ON).

И последняя команда, которая выполняется при истинном условии описанном выше,

это просмотр расчетов. Он осуществляется с помощью команды BROWSE (см. прилож. 2

рис. 16) со следующими полями: фамилия, табельный номер из БД жильцов и

результаты начислений по квартплате, льготам и сумме к оплате из БД начислений,

также используются три вычисляемых поля. Это поле-функция от полей, со значком

“ü”,показывающая жильцов, имеющих льготу и поля со значками: “+”,

“=”,показывающих суть расчета. В нижней части в статус-строке показывается адрес

жильца, количество проживающих и льготников (см. прилож. 1.2 стр. 42). А также

здесь переменной _PAD_OTCH, присваивается значение .Т., которая позволяет

формировать отчеты по выполненным данным.

Функция ПОИСКА

На этом пункты меню по работе с данными заканчиваются и сейчас рассмотрим

функцию поиска, которая выполняется во всех процедурах, предназначенных для

обработки и просмотра данных. Эта процедура закреплена за клавишей F5, а в окне,

которое вызывается при выборе “КАДРЫ”-“Квартиросъемщики”, закреплена за пунктом

в Fox-меню “Поиск”.

Для выполнения этой функции используется:

меню, с пунктами определяющим по каким значениям будет производиться поиск (по

фамилии, по табельному номеру, по адресу и отмена поиска), которое определено в

файле MENI.PRG (см. прилож. 1.1 стр. 4).

Окно для задания критерия поиска, с помощью команды @…GET и переменной “а”,

имеющей тип, в зависимости от выбора пункта меню. Окно также определено в

начальном файле (см. прилож. 1.1 стр. 2).

А также используются разные процедуры. Для поиска по фамилии и табельному номеру

– POISK, по адресу – PO_ADR. Это сделано для того, чтобы при поиске по адресу

возможно оставлять пустыми значения номера дома и(или) квартиры.

Выполнение функции поиска построена таким образом, что при нажатии клавиши

(пункта меню) активируется меню поиска (ON KEY LABEL F5 ACTIVATE POPUP POISK

(ACTIVATE POPUP POISK)) , где нужно выбрать необходимый пункт, как показано на

рис. 13 прилож. 2, где при работе с картотекой льготников нажата клавиша F5 и

выбран пункт “По адресу”. Для пунктов меню POISK’a командой ON SELECTION BAR

определено выполнение процедуры POISK (см. прилож. 1.2 стр. 24)

Здесь в переменной _REC запоминается номер текущей записи, для возврата при

неудачном поиске. Далее в структуре DO CASE анализируется выбранный пункт.

Если PROMPT()=’По фамилии’(‘По табелю’), то главным выбирается TAG fam (tab),

для поиска с помощью команды SEEK(), в команде @…GET определяется переменная “а”

имеющая символьный тип (DEFAULT SPASE(25)) а для табеля числовой тип из четырех

знаков (PICTURE ‘9999’), предъявляется окно POISK в котором расположено поле GET

для занесения ключа поиска. После ввода искомого значения из него удаляются

возможные пробелы (ALLTRIM(a)) для поиска по фамилии, что позволяет вести поиск

и по не полному ключу (фамилии). Также значение переменной “а” запоминается в

переменной “d”, а для табельного номера переменная “а” преобразуется в

символьный тип (d=STR(a,4)), которая нужна для включения ключа поиска в

сообщение WAIT о неудачном поиске. Сам поиск осуществляется после окончания

команды DO CASE в команде IF…ENDIF - IF BAR()#4.AND.!EMPTY(a).AND.!SEEK(a) –

если пункт не отмена и если переменная “а” не пуста и поиск неудачный, то

выводится системное окно с помощью команды WAIT–WAIT ‘Поиск’+PROMPT+’:’+d+’

НЕУДАЧНЫЙ’ WINDOW – которое показано на рисунке:

Которое затем удаляется нажатием любой клавиши, и указатель записей возвращается

на (GO _REC) старое место. Потом происходит возврат в команду из которой был

вызов. Если в результате поиска была найдена нужная запись, то в команде BROWSE,

курсор будет стоять на ней, если в команде READ, то будет переход на эту запись

и обновление информации и GET-объектов для этой записи.

Если PROMPT()=’По адресу’, то выполняется процедура PO_ADR (см. прилож. 1.2 стр.

25). Здесь вначале определяется меню, массив и переменные с помощью которых в

WHILE-цикле будут формироваться BAR-пункты из названий улиц. Затем массив

переопределяется и его элементы – это пункты меню, которое активируется при

входе в поле для ввода улицы и его выбор осуществляется в процедуре YLIZ (см.

прилож. 1.2 стр. 29), где переменной m.yl присваивается значение

параметра-mprompt. (ON SELECTION POPUP YL DO YLIZ WITH PROMPT()), где

передаваемый параметр (PROMPT()) это название BAR-пункта, то есть название

улицы. Работа с окном POISK осуществляется с помощью переменных полей адреса,

которые создаются с помощью команды – SCATTER FIELDS yl, dom, kw_ra MEMVAR

BLANK. После заполнения полей и нажатии клавиши Enter (начать поиск) в структуре

DO CASE анализируется сколько полей заполнено и с помощью команды LOCATE c FOR

условием ведется поиск. Если он удачный то осуществляется переход на найденную

запись, и если это READ-окно то информация о жильце обновляется, иначе указатель

записи возвращается на прежнюю запись.

Пункт меню “ОТЧЕТЫ”

Подготовка и оформление отчетных данных без сомнения являются кульминацией

любого делового приложения. Так что стоит приложить усилия для того, чтобы все

многообразие данных, записанных в БД приложения, нашло достойное отображение в

отчетах, напечатанных на принтере.

FoxPro имеет мощные средства построения отчетов для вывода данных в желательном

для пользователя виде на принтер, экран или в текстовый файл, но в своей

дипломной работе я не пользовался этими средствами, а попытался

программированием вручную создать нужные выводимые данные. Это связано с тем,

что я не преследовал коммерческой цели, создавая приложение, а также для того,

что бы лучше освоить язык программирования и задействовать как можно больше

команд и функций FoxPro.

Все отчеты формируемые с помощью данных баз построены по одной схеме, поэтому я

разберу одну из них более подробно, а в остальных только кратко дам описание.

“ОТЧЕТЫ”-“Списки по начислению”

При выборе этого пункта формируется отчет для каждого жильца с суммами

начислений по каждой услуге и отдельно начисления по льготам, показывается

сколько оплачено и остаток если остаток положительный, то это сумму необходимо

заплатить плательщику за пользование услугами, если отрицательный то эта сумма

должна перейти на следующий месяц в счет будующих платежей за услуги. Также в

шапке по каждому жильцу выводится дата оплаты, количество проживающих, из них

количество льготников, занимаемая площадь. (см. прилож. 3 стр.1). формирование

отчета выполняется в процедуре SP_NACH (см. прилож. 1.7 стр. 1). В первых

строках убирается меню отчетов с экрана (HIDE POPUP VIEV), затем проверяется

значение переменной _PAD_OTCH, она должна иметь значение “Истины” (.T.), если ее

значение “Ложь” (.F.), то значит выполнялась процедура “Дополнения\Изменения” и

появится системное окно, с просьбой сделать слияния расчетов. (см. выше).

Затем переопределяется клавиша F1 для открытия в окне помощь подсказку по этой

процедуре, в переменную “i” заносится номер текущего месяца (MONTH(DATE())), для

включения его в имя файла, чтобы в последующем было легко опознать данные файла

по его имени. Например в переменной формируется имя за март месяц

(T=’NACH-’+ALLTRIM(STR(i)))+’.’+’txt’, где “i” это цифра три и в результате

получится файл NACH-3.TXT, что означает отчет за март (3) по начислениям (NACH).

Эта переменная нужна чтобы после завершения формирования отчета его, с помощью

макроподстановки (EVALUATE(‘T’)или(&T)) , можно было открыть в окне для

просмотра и(или) редактирования. Ниже определяется это окно, оно не определяется

заранее, для того чтобы его можно было закрыть с помощью мыши, щелкнув в левом

углу по прямоугольнику (Опции “SYSTEM CLOSE”).

Далее с помощью команды SET ALTERNATE TO создается альтернативный

файл и командой SET ALTERNATE ON он открывается для внесения в него данных,

одновременно командой SET CONSOLE OFF выдача на экран формируемых данных не

производится.

Формирование отчета выполняется с помощью циклов, а так как некоторые данные

хранятся только в полях плательщика, то используются переменные для хранения

данных которые будут выводится в файл и переменные позволяющие организовать

циклы это:

Определяются два массива и переменные для вывода данных в файл:

NACH(12,1)-для хранения сумм начислений по квартплате каждой услуге, итоговых

сумм и оплаты, LG(9) – для хранения сумм по начислениям по льготам каждой

услуге, PL- содержит количество жильцов, L – количество льготников, FM-фамилия

плательщика, OS-значение поля-OST_K (остатка), TB-табельный номер плательщика,

KV_MET – значение поля KV_M (квадратные метры), DAT_OP – значения поля D_OPL

(дата оплаты).

В циклах определяются переменные для систематизированного предъявления данных:

Y-значение поля YL (улицы), D-значение поля DOM (дома) и K- значение поля KW_RA

(квартира).

В процедуре используются четыре цикла, аналогичных описанным в процедуре слияния

квартплаты с льготами. То есть используются четыре цикла, где первый WHILE-цикл

определяет, что циклы будут работать пока не будет попытки выйти за последнюю

запись в БД (DO WHILE !EOF()). Второй предъявляет записи жильцов, живущих на

одной улице (DO WHILE y=yl). Третий предъявляет записи жильцов (DO WHILE y=yl

AND d=dom). И четвертый SCAN-цикл предъявляет жильцов одной квартиры (SCAN WHILE

yl=y.and.dom=d.and.kw_ra=k), внутри которого, с помощью команды управления

IF…ENDIF в зависимости от категории жильцов, переменным присваиваются

соответствующие значения, которые затем с помощью команды ?\??

[[PICTURE][FUNCTION<формат выводимых

данных>]][АТ][,]…]

заполняют открытый альтернативный файл.

После обработки всех записей БД вывод в альтернативный файл запрещается (SET

ALTERNATE OFF) и он закрывается (SET ALTERNATE TO). И созданный файл открывается

в окне VEDOM для просмотра(редактирования) (MODIFY COMMAND EVALUATE(‘T’) WINDOW

vedom).

После закрытия окна просмотра отчета появляется окно с предложением отправить

документ на печать. В случае согласия (кнопка “Да”) опрашивается готовность

принтера (PRITSTATUS=.T.) и документ распечатывается (TYPE (T) TO PRINT) иначе

(кнопка “Нет”) работа процедуры заканчивается и печать отчета возможна из пункта

меню “Печать”.

“ОТЧЕТ”-“Списки по льготам”

Формирует отчет по льготникам не зависимо от периода действия льготы (см.

прилож. 1.7 стр 3). Здесь переменные почти не используются, в переменные

заносится только фамилия и табельный номер плательщика и переменные для

предъявления данных в циклах. Данные выводятся с помощью полей льготников в БД

жильцов и БД начислений, где хранятся нужные данные. Распечатка отчета показана

в прилож. 3 стр. 4.

“ОТЧЕТ”-“Оплата э\энергии”

Формируется отчет по оплате за электроэнергию, исходя из данных счетчика (см.

прилож 1.7 стр.5). Здесь используются переменные только для систематизированного

предъявления данных в циклах. Данные выводятся из полей плательщиков, так как

льгота по этой услуге не предусмотрена. Распечатка показана в прилож. 3 стр. 5.

“ОТЧЕТ”-“Сальдо по квартиросъемщикам”

Формируется отчет по плательщикам с указанием суммы начислений по квартплате,

сумме к оплате и суммы остатка (см.прилож. 1.7 стр. 7). Здесь также используются

переменные только для систематизированного предъявления данных в циклах.

Распечатка показана в прилож. 3 стр. 6.

“ОТЧЕТ”-“Свод по квартплате за месяц”

Формируется отчет по общим суммам всех начислений по каждой услуге и итоговые

суммы за месяц (см. прилож. 1.7 стр. 8). В этой процедуре не используются циклы.

Данные получаются с помощью команды математической обработки БД: CALCULATE

[][WHILE][FOR][TO /TO

ARRAY ]. Эта команда позволяет вести математические расчеты в БД.

может содержать любую комбинацию внутренних для данной

команды функций, которые также выполняют матаматическую обработку (AVG(),

CNT(), MAX(), MIN(), STD(), SUM(), VAR(), NPV(…)).

Здесь приведена полный перечень возможности для данной команды, а жирным шрифтом

выделены опции, которые используются в процедуре. Так первая команда CALCULATE

подчитывает общие начисления по квартплате (SUM<поле с суммой начислений

квартплаты по услуге>), вторая общие начисления по льготам (SUM<поле с суммой

начислений льготы по услуге>) и полученные результаты заносятся в переменные.

Затем в переменные заносятся общие суммы начислений для получения организацией

за предоставления услуг квартиросъемщикам за месяц. Они рассчитывается путем

вычета из общих начислений квартплаты по услугам начисления льгот по услугам и

полученные результаты выводятся в файл. Распечатка показана в прилож. 3 стр.7).

Пункт меню “ПЕЧАТЬ”

При выборе данного пункта активируется POPUP-меню описанное с опцией PROMPT

FILES [LIKE] – элементами которого будут названия файлов, ограниченных

маской (DEFINE POPUP prin_t FROM 1,31 PROMPT FILES LIKE *-1.TXT см.прилож. 1.1

стр.3), которое формирует меню из имен файлов, созданных при выборе

соответствующего пункта “ОТЧЕТА” и определение реакции меню выполняется в

процедуре print3 (ON SELECTION POPUP prin_t DO print3 WITH PROMPT(),LASTKEY()),

куда передаются два параметра это-имя файла (vv - PROMPT()) и код нажатия

клавиши (lk - LASTKEY()).

В процедуре (см. прилож. 1.2 стр. 28) в структуре DO CASE анализируются

переданные параметры. Если нажата клавиша“Enter” (ВВОД), то код 13 (CASE lk=13)

и осуществляется вызов соответствующего текстового файла в окно VEDOM для

просмотра с возможностью редактирования (MODIFY COMMAND (vv) WINDOW VEDOM).

Если нажата клавиша “Spacebar” (ПРОБЕЛ), тол код 32 (CASE lk=32), происходит

опрос готовности принтера (PRINTSTATUS()) и если он готов, файл печатается (TYPE

(vv) TO PRINT), если нет – выдается соответствующее сообщение. Ниже приводятся

мена файлов:

файл LG_KW-xx.TXT“Списки по льготам”

файл EL_PL-xx.TXT“Оплата электроэнергии”

файл SVOD-xx.TXT“Свод по квартплате за месяц”

Где хх – это номер месяца, за который сформирован отчет.

Пункт меню “ПОМОЩЬ”

Все файлы помощи хранятся в базе данных HELP.DBF, которая имеет только одно

MEMO-поле. И по умолчанию имеет восемь, заполненных информацией, полей.

“ПОМОЩЬ”-“Помощь”

при выборе этого пункта командой ON SELECTION … DO HELP WIHT 6 выполняется

процедура, в которой в окне открывается текст подсказки записанной в 6-ой записи

MEMO-поля. Здесь описывается помощь по пунктам меню. (см прилож. 2 рис. 21)

“ПОМОЩЬ”-“Справка”

при выборе этого пункта командой ON SELECTION … DO HELP WIHT 3 выполняется

процедура, в которой в окне открывается текст подсказки записанной в 3-ей записи

MEMO-поля. Здесь описывается общее назначение и характеристика приложения.

Работа процедуры помощи будет рассмотрена ниже.

Создание контексно-зависимой экранной подсказки.

Каждое MEMO-поле в БД помощи (HELP.DBF), содержит конкретное описание помощи по

работе с отдельными окнами. В начале работы программы, когда баз данных еще нет,

описание помощи хранится в текстовых файлах. И при первом запуске приложения, с

помощью языка SQL (см. прилож. 1.3 стр. 2), они создаются и в БД помощи

последовательно в MEMO-поля переносятся содержимое текстовых файлов (APPEND MEMO

HLP FROM HELP1.TXT).

Для экрана помощи определяется окно также с именем HELP, аклавиша F1 и два

пункта данного меню закрепляются за процедурой с именем HELP, в которую

передается один параметр К (ON KEY LABEL f1 DO help WITH k)

Этот параметр в дальнейшем будет указывать номер записи в файле HELP.DBF, где

содержится нужная подсказка. В самой процедуре (см. прилож. 1.2 стр. 21)

осуществляется перевод указателя записей в области I (в которой открыта БД

помощи) на запись номер К.

Здесь же определяется окно HELP, в которое с помощью команды MODIFY MEMO I.HLP

WINDOW HELP NOEDIT выводится текст подсказки. Чтобы исключить случайную

возможность порчи содержимого HELP пользователем, возможность редактирования

исключена опцией NOEDIT.

В процедурах работы с приложением вначале переопределяется клавиша F1 для

открытия соответствующей подсказки (ON KEY LABEL f1 DO help WITH 1(2,4,5,7,8)),

а по завершении работы с любым окном клавише F1 определяется параметр 6 (…WITH

6). Это позволяет из любого места программы можно вызвать свою помощь нажатием

клавиши F1. Доступ к нужной записи в файле помощи происходит очень быстро,

поскольку ее не приходиться искать. Для этого нужно в соответствующих местах

программы делать присвоения переменной К, то есть указывать номер нужной записи

из файла HELP.DBF. В процедурах, где помощь не предусмотрена, переменной К

задается значение 6, для вывода общей помощи по программе, которая также

закреплена за пунктом меню “Помощь”.

Пункт меню “Выход”

Для корректного закрытия БД и завершения работы необходимо проконтролировать

запросом попытку пользователя выйти из программы. Данная функция будет содержать

обычный запрос на подтверждение выхода, и при положительном ответе (кнопка “Да”)

осуществит закрытие всех активных файлов БД, сохранит в файле M_ZAR.MEM все

переменные начинающиеся с символа “_” (SAVE TO m_zar ALL LIKE _*). В приложении

зти переменные определены как глобальные и переменные нормативных ставок и после

этого происходит выход из приложения (QUIT). При выборе кнопки “Нет” происходит

возврат в приложение.

Заключение

В процессе работы над дипломным проектом был создан комплекс программных средств

для обеспечения работы бухгалтера-расчетчика. Кроме того была разработана

концепция проектирования информационно - справочных систем с применением функций

экранного интерфейса, разработанных в рамках дипломного проекта. Применение

специализированных функций позволило сократить время разработки основного модуля

программы и обеспечило высвобождение времени на создание процедур обработки

данных. В дипломном проекте представлен один из множества подходов к

проектированию программного обеспечения информационного плана, дающий

возможность на ранних этапах разработки учесть все нюансы будущей программы,

необходимый набор функций, состав и структуру баз данных, что в дальнейшем

исключает необходимость переработки уже написанных компонентов программы.

Данный дипломный проект разрабатывался не с коммерческой целью, а с целью

показать возможности СУБД FoxPro, используя в приложении как можно больше команд

и функций данной СУБД. Поэтому работа приложения не предусматривает сохранения и

просмотра раннее сделанных расчетов и работа осуществляется только с текущим

месяцем.

Хотя принцип работы приложения и язык программирования не исключают и

коммерческое распространение. Достаточно лишь добавить модули сохранения данных

при переходе на следующий месяц и просмотра из архивов этих данных.

Характеристики

Тип файла
Документ
Размер
465,29 Kb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6501
Авторов
на СтудИзбе
303
Средний доход
с одного платного файла
Обучение Подробнее