Программное обеспечение пункта обмена валюты банка

 TOC o "1-3" Введение                                                                                                                           GOTOBUTTON _Toc378670594   PAGEREF _Toc378670594 5

Назначение проекта                                                                                                  GOTOBUTTON _Toc378670595   PAGEREF _Toc378670595 6

Основные сервисные и информационно-расчетные возможности проектируемой системы                                                                                      GOTOBUTTON _Toc378670596   PAGEREF _Toc378670596 8

Функциональные возможности системы                                                                     GOTOBUTTON _Toc378670597   PAGEREF _Toc378670597 8

Взаимодействие с банковской системой автоматизации                                         GOTOBUTTON _Toc378670598   PAGEREF _Toc378670598 9

Надежность и резервирование                                                                                           GOTOBUTTON _Toc378670599   PAGEREF _Toc378670599 9

Генерация отчетов                                                                                                            GOTOBUTTON _Toc378670600   PAGEREF _Toc378670600 10

Анализ потоков и взаимодействия данных                                           GOTOBUTTON _Toc378670601   PAGEREF _Toc378670601 10

Покупка и продажа наличной иностранной валюты за наличные рубли.            GOTOBUTTON _Toc378670602   PAGEREF _Toc378670602 11

Конверсия наличной иностранной валюты                                                                GOTOBUTTON _Toc378670603   PAGEREF _Toc378670603 13

Формы отчетной документации ОП                                                                             GOTOBUTTON _Toc378670604   PAGEREF _Toc378670604 13

Технические требования к аппаратуре.                                                     GOTOBUTTON _Toc378670605   PAGEREF _Toc378670605 15

Среда выполнения программы.                                                                      GOTOBUTTON _Toc378670606   PAGEREF _Toc378670606 16

Выбор языка программирования для реализации проекта.         GOTOBUTTON _Toc378670607   PAGEREF _Toc378670607 17

Разработка структуры информационных файлов и их связей. GOTOBUTTON _Toc378670608   PAGEREF _Toc378670608 17

Предварительные соображения                                                                                      GOTOBUTTON _Toc378670609   PAGEREF _Toc378670609 17

Окончательный состав и структуры информационных файлов.                           GOTOBUTTON _Toc378670610   PAGEREF _Toc378670610 20

Взаимодействие данных, связи и методы доступа.                                                    GOTOBUTTON _Toc378670611   PAGEREF _Toc378670611 22

Разработка функциональной схемы программы.                              GOTOBUTTON _Toc378670612   PAGEREF _Toc378670612 26

Примерный перечень функций системы.                                                                       GOTOBUTTON _Toc378670613   PAGEREF _Toc378670613 26

Разработка структурной схемы программы.                                         GOTOBUTTON _Toc378670614   PAGEREF _Toc378670614 27

Разработка экранного интерфейса программы                                   GOTOBUTTON _Toc378670615   PAGEREF _Toc378670615 29

Существующие подходы к проектированию экранного интерфейса                    GOTOBUTTON _Toc378670616   PAGEREF _Toc378670616 29

Выбор идеологии экранного интерфейса                                                                    GOTOBUTTON _Toc378670617   PAGEREF _Toc378670617 31

Перечень функций экранного интерфейса                                                                    GOTOBUTTON _Toc378670618   PAGEREF _Toc378670618 32

Проектирование функциональных модулей.                                        GOTOBUTTON _Toc378670619   PAGEREF _Toc378670619 32

Разработка интерфейсных функций                                                                               GOTOBUTTON _Toc378670620   PAGEREF _Toc378670620 33

Функция вывода меню в указанных координатах                                                        GOTOBUTTON _Toc378670621   PAGEREF _Toc378670621 33

Функция вывода окна  в указанных координатах                                                        GOTOBUTTON _Toc378670622   PAGEREF _Toc378670622 35

Вывод строки подсказки                                                                                                    GOTOBUTTON _Toc378670623   PAGEREF _Toc378670623 36

Вывод сообщения с ожиданием реакции или выбора пользователя                           GOTOBUTTON _Toc378670624   PAGEREF _Toc378670624 37

Вывод линейного индикатора процесса и его обновление                                          GOTOBUTTON _Toc378670625   PAGEREF _Toc378670625 39

Вывод транспаранта ожидания                                                                                       GOTOBUTTON _Toc378670626   PAGEREF _Toc378670626 39

Вспомогательные функции                                                                                            GOTOBUTTON _Toc378670627    ПЕРЕКЛЮЧЕНИЯ ВИДА КУРСОРА                                                               GOTOBUTTON _Toc378670628   PAGEREF _Toc378670628 40

ФУНКЦИЯ ПЕРЕВОДА СТРОКИ В ВЕРХНИЙ РЕГИСТР                                                 GOTOBUTTON _Toc378670629   PAGEREF _Toc378670629 40

ФУНКЦИЯ КОНТРОЛЯ ВЫХОДА                                                                                      GOTOBUTTON _Toc378670630   PAGEREF _Toc378670630 40

ФУНКЦИЯ ПЕРЕВОДА ЧИСЛОВОЙ ВЕЛИЧИНЫ В СТРОКУ «СУММА ПРОПИСЬЮ» GOTOBUTTON _Toc378670631   PAGEREF _Toc378670631 41

Разработка головного модуля программы                                                                 GOTOBUTTON _Toc378670632   PAGEREF _Toc378670632 41

СТРУКТУРА ФУНКЦИИ MAIN                                                                                          GOTOBUTTON _Toc378670633   PAGEREF _Toc378670633 41

ФУНКЦИИ ВЫЗОВА МЕНЮ НИЖНИХ УРОВНЕЙ                                                           GOTOBUTTON _Toc378670634   PAGEREF _Toc378670634 44

ФУНКЦИЯ РЕГИСТРАЦИИ ПОКУПКИ ВАЛЮТЫ                                                           GOTOBUTTON _Toc378670635   PAGEREF _Toc378670635 44

ФУНКЦИЯ - ОПРЕДЕЛИТЕЛЬ ТЕКУЩЕГО ПОЛЯ ДЛЯ ПОЛУЧЕНИЯ КОДА И НАИМЕНОВАНИЯ ОБЪЕКТА ИЗ СПРАВОЧНИКА                                                                                                             GOTOBUTTON _Toc378670636   PAGEREF _Toc378670636 46

Тестирование программного обеспечения.                                          GOTOBUTTON _Toc378670637   PAGEREF _Toc378670637 46

Восходящее тестирование.                                                                                              GOTOBUTTON _Toc378670638   PAGEREF _Toc378670638 46

Нисходящее тестирование.                                                                                              GOTOBUTTON _Toc378670639   PAGEREF _Toc378670639 47

Метод сэндвича.                                                                                                                GOTOBUTTON _Toc378670640   PAGEREF _Toc378670640 47

Экономическая часть.                                                                                          GOTOBUTTON _Toc378670641   PAGEREF _Toc378670641 48

Вопросы техники безопасности и охраны труда.                               GOTOBUTTON _Toc378670642   PAGEREF _Toc378670642 52

Заключение                                                                                                                  GOTOBUTTON _Toc378670643   PAGEREF _Toc378670643 56

Приложение                                                                                                                  GOTOBUTTON _Toc378670644   PAGEREF _Toc378670644 57

Интерфейсные функции                                                                                                   GOTOBUTTON _Toc378670645   PAGEREF _Toc378670645 57

ФУНКЦИЯ ВЫВОДА ОКНА                                                                                               GOTOBUTTON _Toc378670646   PAGEREF _Toc378670646 57

ФУНКЦИЯ ВЫВОДА ОКНА С ЭФФЕКТОМ РАСКРЫТИЯ                                              GOTOBUTTON _Toc378670647   PAGEREF _Toc378670647 57

ФУНКЦИЯ ВЫВОДА СИСТЕМНЫХ СООБЩЕНИЙ С ОЖИДАНИЕМ РЕАКЦИИ ПОЛЬЗОВАТЕЛЯ  GOTOBUTTON _Toc378670648   PAGEREF _Toc378670648 59

ФУНКЦИЯ ВЫВОДА ЛИНЕЙНОГО ИНДИКАТОРА ПРОЦЕССА                                  GOTOBUTTON _Toc378670649    РАМКИ ДЛЯ ВСПЛЫВАЮЩЕГО МЕНЮ                                     GOTOBUTTON _Toc378670650   PAGEREF _Toc378670650 61

ФУНКЦИЯ ВЫВОДА СТРОКИ ПОДСКАЗКИ                                                                   GOTOBUTTON _Toc378670651   PAGEREF _Toc378670651 61

ФУНКЦИЯ ВЫВОДА ТРАНСПАРАНТА ОЖИДАНИЯ                                                    GOTOBUTTON _Toc378670652   PAGEREF _Toc378670652 62

ФУНКЦИЯ ВЫБОРА ОПЦИИ ИЗ МЕНЮ С ИСПОЛЬЗОВАНИЕМ  МАНИПУЛЯТОРА "МЫШЬ" ИЛИ КЛАВИАТУРЫ.                                                                                                                    GOTOBUTTON _Toc378670653   PAGEREF _Toc378670653 62

Вспомогательные функции                                                                                            GOTOBUTTON _Toc378670654    ВИДА КУРСОРА                                                              GOTOBUTTON _Toc378670655   PAGEREF _Toc378670655 66

ФУНКЦИЯ  ПЕРЕВОДА СТРОКИ В ВЕРХНИЙ РЕГИСТР                                               GOTOBUTTON _Toc378670656   PAGEREF _Toc378670656 66

ФУНКЦИЯ КОНТРОЛЯ ВЫХОДА                                                                                      GOTOBUTTON _Toc378670657   PAGEREF _Toc378670657 66

ФУНКЦИЯ ПЕРЕВОДА ЧИСЛОВОЙ ВЕЛИЧИНЫ В СТРОКУ «СУММА ПРОПИСЬЮ» GOTOBUTTON _Toc378670658   PAGEREF _Toc378670658 67

ФУНКЦИЯ ПОСТРОЕНИЯ СТРОКИ «СУММЫ ПРОПИСЬЮ»                                        GOTOBUTTON _Toc378670659   PAGEREF _Toc378670659 68

ФУНКЦИЯ ПОЛУЧЕНИЯ ПСЕВДОНИМА ВАЛЮТЫ                                                       GOTOBUTTON _Toc378670660   PAGEREF _Toc378670660 69

Основные функции и процедуры                                                                                    GOTOBUTTON _Toc378670661   PAGEREF _Toc378670661 69

ГОЛОВНОЙ МОДУЛЬ ПРОГРАММЫ                                                                               GOTOBUTTON _Toc378670662   PAGEREF _Toc378670662 69

ФУНКЦИЯ ВЫЗОВА МЕНЮ «ОПЕРАЦИИ»                                                                     GOTOBUTTON _Toc378670663   PAGEREF _Toc378670663 73

ФУНКЦИЯ ВЫЗОВА МЕНЮ ВЕДЕНИЯ СПРАВОЧНИКОВ                                            GOTOBUTTON _Toc378670664   PAGEREF _Toc378670664 73

ФУНКЦИЯ ВЫЗОВА МЕНЮ «ОТЧЕТЫ»                                                                           GOTOBUTTON _Toc378670665   PAGEREF _Toc378670665 74

ФУНКЦИЯ ВЫЗОВА МЕНЮ «РАЗНОЕ»                                                                           GOTOBUTTON _Toc378670666   PAGEREF _Toc378670666 74

ФУНКЦИЯ ВЫЗОВА МЕНЮ «УСТАНОВКИ»                                                                   GOTOBUTTON _Toc378670667   PAGEREF _Toc378670667 75

ФУНКЦИЯ ВЫЗОВА МЕНЮ «КОПИЯ ДАННЫХ»                                                           GOTOBUTTON _Toc378670668   PAGEREF _Toc378670668 76

ФУНКЦИЯ - СЕЛЕКТОР ОПЕРАЦИЙ                                                                                GOTOBUTTON _Toc378670669   PAGEREF _Toc378670669 77

ФУНКЦИЯ РЕГИСТРАЦИИ ПОКУПКИ ВАЛЮТЫ                                                          GOTOBUTTON _Toc378670670   PAGEREF _Toc378670670 77

ФУНКЦИЯ РЕГИСТРАЦИИ ПРОДАЖИ ВАЛЮТЫ                                                          GOTOBUTTON _Toc378670671   PAGEREF _Toc378670671 79

ФУНКЦИЯ РЕГИСТРАЦИИ КОНВЕРСИИ ВАЛЮТЫ                                                      GOTOBUTTON _Toc378670672   PAGEREF _Toc378670672 81

ФУНКЦИЯ - ОПРЕДЕЛИТЕЛЬ ТЕКУЩЕГО ПОЛЯ ДЛЯ ПОЛУЧЕНИЯ КОДА И НАИМЕНОВАНИЯ ОБЪЕКТА ИЗ СПРАВОЧНИКА                                                                                                             GOTOBUTTON _Toc378670673   PAGEREF _Toc378670673 82

ФУНКЦИЯ ВЫВОДА СУММЫ ПОКУПКИ ПРОПИСЬЮ                                                 GOTOBUTTON _Toc378670674   PAGEREF _Toc378670674 83

ФУНКЦИЯ ВЫВОДА СУММЫ ПРОДАЖИ ПРОПИСЬЮ                                                GOTOBUTTON _Toc378670675   PAGEREF _Toc378670675 83

ФУНКЦИЯ ВЫЧИСЛЕНИЯ СУММЫ ОПЕРАЦИИ ПОКУПКИ                                       GOTOBUTTON _Toc378670676   PAGEREF _Toc378670676 83

ФУНКЦИЯ ВЫЧИСЛЕНИЯ СУММЫ ОПЕРАЦИИ ПРОДАЖИ                                       GOTOBUTTON _Toc378670677   PAGEREF _Toc378670677 84

ФУНКЦИЯ ВЫВОДА СПИСКА ДОКУМЕНТОВ ДНЯ                                                      GOTOBUTTON _Toc378670678   PAGEREF _Toc378670678 84

ФУНКЦИЯ ЗАКРЫТИЯ ОПЕРАЦИОННОГО ДНЯ                                                            GOTOBUTTON _Toc378670679   PAGEREF _Toc378670679 86

Литература                                                                                                                     GOTOBUTTON _Toc378670680   PAGEREF _Toc378670680 87

Введение

В начале восьмидесятых годов нашего столетия фирма IBM разработала  и выпустила в продажу свой первый персональный компьютер - IBM PC, который быстро завоевал рынок вычислительной техники благодаря своей невысокой стоимости, универсальности сфер применения, простоте эксплуатации и самое главное, принципу открытой архитектуры, заложенному в конструкцию. Получив название “персональный” он и в действительности оказался таковым.

 РС хорошо зарекомендовал себя в области делового применения. Дешевый и надежный компьютер стал быстро “обрастать” программным обеспечением, многие фирмы стали выпускать клоны IBM-совместимых персональных компьютеров. За РС последовали XT, AT на базе i286, i386, i486 и, наконец, Pentium.

Вычислительная техника шагает в будущее гигантскими шагами, не оставляя в стороне никого. Невозможно представить область интенсивной деятельности человека, которая могла бы обойтись без вычислительной техники без ущерба для себя. В нашей стране за последние 5-6 лет парк  персональных компьютеров увеличился в сотни раз. Особое значение в такой ситуации имеет наличие программного обеспечения для персональных ЭВМ как общего назначения, так и чисто прикладных программ, решающих специализированные задачи того, или иного предприятия.

Особенно остро встала проблема специализированного ПО для финансовых организаций и, в частности банков, количество которых за последние пять - шесть лет превысило несколько тысяч только в столице. Отсутствие автоматизированных банковских систем не могло не стимулировать многие фирмы - производители программного обеспечения заполнить образовавшийся вакуум. В течение 90-93 г.г. такие фирмы как «Асофт», «Диасофт», «Р-Стайл» и другие выпустили на рынок несколько АБС, ориентированных на российскую банковскую систему. Первый опыт оказался удачным и большинство коммерческих банков обладает на текущий момент довольно приличными системами, реализованными на основе сетевых менеджеров запросов к базам данных, или языках программирования Oracle, Gupta и им подобных. Беда всех АБС в нестабильности законодательства государства, которое вызывает многочисленные корректировки технологии бухгалтерского учета и, следовательно корректировки ПО. Кроме того, первые версии АБС не покрывали всех потребностей банков в автоматизации. Максимально на что мог рассчитывать пользователь, это операционный день банка в рублях и система отчетов. Расширение видов банковской деятельности, работа с валютами иностранных государств, вклады граждан и организаций, развитие рынка ценных бумаг потребовали разработки новых подсистем для существующих АБС.

Наряду с тем, что не все фирмы производители прислушиваются к требованиям пользователей, стоимость новых разработок достаточно велика. В качестве примера можно сказать, что только увеличение документооборота банковской системы с 500 до 2000 документов в день обходится пользователю, имеющему АБС фирмы “Р-Стайл” примерно в 11500 Долларов США. Такие цены, естественно могут заставить любого пользователя пополнять состав программного обеспечения собственными силами.

Назначение проекта

Обменный пункт - подразделение банка и является местом совершения банком валютно-обменных операций. Правила и нормы совершения валютных операций в обменном пункте регламентируются инструкцией Центрального банка Российской федерации №27 от 27 февраля 1995 года.

Комплекс разрабатываемых программных средств предназначен в первую очередь для автоматизации работы кассиров пунктов обмена валют, находящихся как в самом банке, так и вне его территории. Использование программы должно значительно упростить и ускорить работу кассира за счет автоматизации учетно-расчетных операций при обмене валюты. Автоматическое формирование всей сводной отчетности и контроль финансового состояния обменного пункта в любой момент времени также должны повысить эффективность работы кассира.

Технологический процесс работы пункта обмена валюты банка

В процессе работы кассира обменного пункта с использованием автоматизированной системы желательно реализовать как стандартные процедуры, обеспечивающие поддержку операций обменного пункта в течение дня, так и специфические возможности, повышающие производительность труда кассира и облегчающие учетно-расчетные операции и связь обменного пункта с банковской системой автоматизации. Обменный пункт банка при работе с клиентурой совершает следуюшие основные операции:

·      Продажа валюты иностранного государства клиенту за национальную валюту;

·      Покупка у клиента валюты иностранного государства за национальную валюту;

·      Коверсия (обмен) валюты одного иностранного государства на валюту другого иностранного государства.

Каждую из перечисленных операций кассир обменного пункта обязан зафиксировать документально и оформить справку о совершении клиентом валютно-обменной операции на бланке строгой отчетности ф.0406007, с выдачей копии справки клиенту. Для работы ОП, банк обеспечивает  его до начала рабочего дня авансом в наличной иностранной валюте и рублях. Данный аванс необходимо учитывать в документах ОП для последующего отражения в отчетных документах при завершении операционного дня. По завершении рабочего дня (или смены при круглосуточном режиме работы ОП) кассир обязан заполнить приходно-расходную ведомость(реестр сделок) по каждой из валют, подсчитать итоги по всем реестрам и сверить сумму полученного аванса с суммой итогов по реестрам и фактическим остатком ценностей по каждому виду. В соответствии с результатами сверки составляется справка о ежедневных остатках ценностей.

Основные сервисные и информационно-расчетные возможности проектируемой системы

Перед началом проектирования какой-либо системы необходимо в первую очередь определить состав тех операций, которые будут заложены в проектируемый комплекс программных средств и проанализировать необходимость и возможность реализации функций средствами конкретной системы проектирования. Система автоматизации работы пункта обмена валюты предназначена, как уже было сказано выше, в первую очередь для повышения эффективности и скорости работы кассира. Поэтому функциональные возможности программного комплекса должны быть направлены на решение конкретных задач ОП возникающих в процессе работы.

Функциональные возможности системы

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

·      сумм по операциям обмена иностранной валюты;

·      возможность установки автоматического начисления комиссионных вознаграждений (по выбору - комиссия с прихода, расхода и разницы курсов) при обменных операциях;

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

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

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

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

·      архивирование всех данных, обработанных системой с начала ее функционирования на дату операционного дня или интервал дат;

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

Взаимодействие с банковской системой автоматизации

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

·      Независимость от примененной системы автоматизации банковской деятельности;

·      Обмен информацией с банковской системой при помощи общепринятых носителей (магнитные диски, электронная почта и т.п.);

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

Проблема совместимости с различными банковскими системами разрешается путем применения стандартного формата передаваемых данных в виде текстового файла с разделителями информационных полей. Последовательность полей фиксирована, длина данных - переменная. Использование данных фиксированной длины, конечно упрощает их обработку, однако при больших объемах встает проблема величины передаваемого файла. Такой способ обмена может быть реализован практически во всех известных на данное время системах автоматизации банковской деятельности.

Надежность и резервирование

Все данные, проходящие через подсистему, подлежат обязательной фиксации в базах данных или иных информационных структурах. Система должна хранить данные в специальных архивных файлах начиная с момента запуска в эксплуатацию. При закрытии операционного дня все текущие данные должны переносится в архив, а файлы подготавливаться для новой смены (очистка, обнуление и т.п.). При работе ОП в локальном режиме желательно обеспечить возможность создания резервных копий баз данных на магнитных носителях по желанию пользователя. Для варианта ОП работающего в составе ЛВС банка, данная возможность может быть факультативной при размещении информационных файлов на сетевых дисках и ежедневном выполнении процедур резервирования сетевым оборудованием.

Генерация отчетов

Наиболее ответственной и трудоемкой из функций кассира ОП является ежедневное составление и заполнение отчетных документов по итогам работы пункта за смену. Проектируемая система должна предоставить пользователю возможность в любой момент времени получить документы дня (реестры сделок, справки об остатках наличности и пр.) в разрезе любой валюты. Это позволит оперативно иметь картину финансового состояния ОП в целом и осуществить оперативный контроль деятельности кассира. В состав обязательных отчетов необходимо включить:

·      Реестры по покупке и продаже иностранной валюты за наличные рубли;

·      Справку об остатках наличной иностранной и национальной валюты;

·      Акт передачи (для ОП работающих в режиме сменной работы);

·      Препроводительные ведомости к инкассаторским сумкам.

Формы отчетов должны соответствовать предложенным в инструкции ЦБ РФ №27 «О порядке организации работы обменных пунктов...»

Анализ потоков и взаимодействия данных

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

Покупка и продажа наличной иностранной валюты за наличные рубли.

При совершении операции кассир ОП должен выполнить ряд расчетных операций и процедур оформления сделки, к которым относятся:

·      Вычисление клиентской суммы  по текущему курсу покупки (продажи) данной валюты.

       СУММА_В_РУБЛЯХ_ПОКУПКИ =СУММА_ВАЛЮТЫ*КУРС_ПОКУПКИ

или при продаже валюты

     СУММА_В_ВАЛЮТЕ=СУММА_РУБЛЕЙ_КЛИЕНТА/КУРС_ПРОДАЖИ

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

·      Заполнение справки ф. 0406007 и выдача клиенту копии.

Вся информация о сделке и клиенте содержится в данных, предоставляемых клиентом кассиру ОП для заполнения справки. Проанализировав ее содержание можно сделать первоначальный вывод о формате и структуре данных, необходимых для регистрации сделки. Общий вид справки ф.0406007 приведен на рис.1.

Данные справки можно разделить на следующие информационные единицы:

·      Фамилия

·      Имя

·      Отчество

·      Вид документа (паспорт, удостоверение личности и т.п.)

·      Серия документа

·      Номер документа

·      Признак резидент/нерезидент

Рис. 1 Справка о совершении валютно-обменной операции

1-день, 2-месяц, 3-год, 4-фамилия ,имя и отчество клиента, 5-вид документа,

6-номер документа,7-серия документа, 8-отметка резидент/нерезидент, 9,13-код ценности, 10,14-код валюты, 11,15-Сумма, 12,16-сумма прописью

·      Код ценности полученной клиентом

·      Код валюты полученной клиентом

·      Сумма валюты полученной клиентом

·      Код ценности принятой от клиента

·      Код валюты принятой от клиента

·      Сумма валюты принятой от клиента

·      Серия справки

·      Номер справки

·      Дата совершения обменной операции

Конверсия наличной иностранной валюты

Операция конверсии (обмена) наличной иностранной валюты одного государства в наличную иностранную валюту другого государства практически аналогична описанным выше операциям купли/продажи валюты. Отличие состоит в том, что кассиру требуется вычислить сумму валюты, выдаваемую клиенту на основании суммы валюты клиента и кросс-курса. Кросс-курс, или курс пересчета валюты является числовой величиной, определяющей коэффициент пересчета одной валюты в другую.

       СУММА_ВАЛЮТЫ_1=СУММА_ВАЛЮТЫ_2*КРОСС_КУРС

Пример:

Клиент обменивает 100 долларов США на немецкие марки по кросс-курсу USD-DEM 1,51

Клиент получит 100*1,51=151DEM

Так как кросс-курс обычно объявляется для односторонней операции, т.е. к примеру для конверсии USD-DEM, то для обратной операции необходимо применять иную формулу расчета:

       СУММА_ВАЛЮТЫ_2=СУММА_ВАЛЮТЫ_1*(1/КРОСС_КУРС)

Пример:

Клиент обменивает 100 немецких марок на доллары США по кросс-курсу USD-DEM 1,51

Клиент получит 100*(1/1,51)=66,2USD

Документальное оформление операции конверсии в плане клиентских документов аналогично описанному выше.

Формы отчетной документации ОП

Все операции, совершенные в течение операционного дня обменным пунктом, по окончании смены обрабатываются для выдачи итоговых документов работы ОП. К таковым относятся:

·      Реестр наличной иностранной валюты, купленной за наличные рубли;

·      Реестр наличной иностранной валюты, проданной за наличные рубли;

·      Реестр по обмену (конверсии) наличной иностранной валюты;

Ниже приведена форма реестра покупки и правила ее заполнения

наименование уполномоченного

банка (филиала)

(код ОКПО уполномоченного

банка (филиала)

(адрес обменного пункта)

(регистрационный номер

обменного пункта, если

обменный пункт уже

зарегистрирован ГУ ЦБ РФ)

(дата заполнения реестра)

(учетный номер реестра)

РЕЕСТР

НАЛИЧНОЙ ИНОСТРАННОЙ ВАЛЮТЫ, КУПЛЕННОЙ ЗА НАЛИЧНЫЕ РУБЛИ

 

Курс покупки на текущую дату ___________________________________________________________

(указывается время в часах и минутах, с которого действует

установленный банком курс покупки)

Курс Банка России на текущую дату ______________________________________________________

1

2

3

4

5

6

7

Итого по реестру (цифрами):

Кассир обменного пункта ____________________________________________(фамилия и инициалы)

(подпись)  

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

·            

·            

·            

·            

·            

·            

·            

На каждый вид наличной иностранной валюты ведется отдельный реестр. 

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

Реестры продажи и конверсии заполняются аналогично.

Технические требования к аппаратуре.

Работа проектируемого программного комплекса должна обеспечиваться наиболее распространенной в настоящее время персональной ЭВМ. Это соображение подразумевает выбор компьютера построенного на платформе INTEL. К таким ПЭВМ относятся различные модификации PC/AT с процессорами  от 386 до Pentium различных фирм изготовителей. Поскольку в настоящее время машины класса PC/ХТ практически не применяются, выдвигать какие-либо особые требования к аппаратуре не имеет смысла, так-как стандартный компьютер на текущий момент имеет достаточную вычислительную мощность и объем оперативной памяти для работы практически любого программного обеспечения. Занимаемое программой дисковое пространство должно быть относительно невелико. Конечно, в процессе работы программы объем данных будет возрастать, но с этой проблемой можно справиться, применяя различные средства сжатия и архивации данных на магнитных носителях к примеру ленточного типа (стриммеры и т.п.) или иных со сменными носителями.

Среда выполнения программы.

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

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

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

·      возможность внесения корректив в программу в процессе эксплуатации;

·      наличие средств проектирования пользовательского интерфейса;

·      скорость выполнения программы;

·      надежность работы программы и защищенность от программных сбоев.

Выбор среды ограничим двумя вариантами - среда DOS и Windows.

При рассмотрении преимуществ и недостатков той и другой платформ мы видим, что и в той и в другой средах имеется большое количество систем разработки программного обеспечения, таких,  как Delphi, Dbase 5, VisualBasic 4 (Windows) и Clipper, Fox Pro, Clarion (DOS). С точки зрения трудоемкости процесса проектирования предпочтение можно отдать среде Windows, поскольку наличие систем визуального проектирования значительно облегчает работу программиста, в то же время надежность работы и защита от программных сбоев с среде DOS значительно выше, как в однозадачной среде.

Скорость обработки данных и собственно скорость выполнения программ также выше у DOS-приложений. Модификация программ, написанных для среды Windows, достаточно сложная задача, т.к. внесение изменений в сложную систему взаимодействия объектов и событий  влечет за собой большое количество исправлений связанных между собой. Переустановка программного обеспечения в среде Windows также не всегда сводится к простому копированию измененных файлов. Кроме всего выше изложенного нужно учитывать возможность того, что DOS-приложения могут быть запущены и в среде Windows без каких-либо затруднений.

Выбор языка программирования для реализации проекта.

Таким образом, исходя из вышеизложенного, оптимальным вариантом для проектируемой системы будет выбор системы разработки работающей в среде DOS. Из имеющихся инструментальных систем наиболее распространенными являются системы проектирования Fox Pro и Clipper.

При сравнении этих двух систем видно, что по формату поддерживаемых баз данных набору операторов и функций для обработки данных они практически ничем друг отдруга не отличаются: и та и другая система поддерживают формат баз данных Dbase IV с комбинированными индексными файлами формата CDX. Наличие большого количества библиотек функций и возможность их создания, пополнения и быстрого подключения к программе делает систему Clipper более приемлемой для реализации данного проекта. Из имеющихся на данное время компиляторов наиболее функциональным является CA-Clipper 5.02 фирмы Computer Associates International, Inc.

Разработка структуры информационных файлов и их связей.

Предварительные соображения

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

Таблица 1

Предварительная структура базы «Операции»

Имя поля

Тип поля

Длина

Дробь

Назначение

FAM

Char

15

Фамилия

NAME

Char

15

Имя

SNAME

Char

15

Отчество

CDOC

Char

10

Вид документа

DSER

Char

7

Серия документа

DNOM

Num

6

0

Номер документа

REZIDENT

Logical

1

Признак резидент/нерезидент

BCODC

Num

3

0

Код ценности полученной клиентом

BNAMEC

Char

20

0

Наименование ценности полученной клиентом

BCODCUR

Num

3

0

Код валюты полученной клиентом

BNAMECUR

Char

20

0

Наименование валюты полученной клиентом

BSUM

Num

15

2

Сумма валюты полученной клиентом

SCODC

Num

3

0

Код ценности принятой от клиента

SNAMEC

Char

20

0

Наименование ценности принятой от клиента

SCODCUR

Num

3

0

Код валюты принятой от клиента

SNAMECUR

Char

20

0

Наименование валюты принятой от клиента

SSUM

Num

15

2

Сумма валюты принятой от клиента

SSER

Num

2

0

Серия справки

SNOM

Num

6

0

Номер справки

DATA

Date

8

Дата совершения обменной операции

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

·      Нет необходимости хранить Фамилию Имя и Отчество клиента в отдельных полях БД, целесообразно объединить их в одно поле, приняв для него приемлемую длину.

·      Для кодов ценностей и валют необходимо предусмотреть специальные базы данных (справочники), в которых должны храниться коды и их расшифровка, поскольку список кодов валют и ценностей, приведенный на обороте справки не включает в себя все возможные коды, а хранение кодов и наименований в основной базе является неоправданным с точки зрения размера записи в БД.Кроме того заполнение граф документа с помощью справочников значительно облегчит и ускорит работу кассира. В системе необходимо предусмотреть специальную процедуру внесения в справочники изменений и дополнений.

·      Хранение в основной БД наименования документа клиента в символьном виде также нецелесообразно.Желательно хранить в базе код предъявленного документа из специального справочника, аналогично описанному выше.

Таким образом определился первоначальный состав информационных файлов. В него войдут:

·      Основная БД «Операции»;

·      Справочник кодов ценностей «Ценности»;

·      Справочник кодов валют «Валюты»;

·      Справочник видов документов «Документы».

 

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

·      Код валюты;

·      Наименование валюты;

·      Краткое наименование валюты;

·      Дата установки курса;

·      Время установки курса;

·      Курс покупки валюты банком за наличные рубли;

·      Курс продажи валюты банком за наличные рубли;

·      Масштаб;

Понятие масштаб используется в том случае, когда курс описываемой валюты относительно базовой меньше единицы. Обычно задают сумму в базовой валюте, которая содержится в единице описываемой валюты, например, 5500 рублей на 1 доллар США. Число МАСШТАБ можно использовать, как количество единиц описываемой валюты, относительно которых пользователь задаст валютный курс в виде суммы в базовой валюте. Например,  для украинского карбованца курс будет равен 1 рубль на 20 карбованцев, если МАСШТАБ принять за 20.

Для удобства работы и повышения скорости обработки данных есть смысл в базе данных «Валюты» хранить кроме кода и наименования валюты, также и некоторве текушие  данные, необходимые при расчетных операциях - краткое наименование, текущий курс покупки и продажи, курс ЦБ России.

Окончательный состав и структуры информационных файлов.

Таким образом мы можем определиться по составу БД проектируемой программы: основная база данных предназначена для хранения данных о совершенных в течение операционного дня (смены) обменных операциях и данных о клиентах, дополнительные БД справочников, в которых содержится информация о кодах и наименованиях ценностей, валют и видах документов и база данных курсов валют на каждую дату. Структуры БД системы приведены в табл. 2-6.

Таблица 2.

Структура базы данных «Операции»

Имя поля

Тип поля

Длина

Дробь

Назначение

FIO

Char

35

Фамилия, Имя, Отчество

CDOC

Num

3

Код вида документа

DSER

Char

7

Серия документа

DNOM

Num

6

0

Номер документа

REZIDENT

Logical

1

Признак резидент/нерезидент

BCODC

Num

3

0

Код ценности полученной клиентом

BCODCUR

Num

3

0

Код валюты полученной клиентом

BSUM

Num

15

2

Сумма валюты полученной клиентом

SCODC

Num

3

0

Код ценности принятой от клиента

SCODCUR

Num

3

0

Код валюты принятой от клиента

SSUM

Num

15

2

Сумма валюты принятой от клиента

SSER

Num

2

0

Серия справки

SNOM

Num

6

0

Номер справки

DATA

Date

8

Дата

Таблица 3

Структура базы данных «Ценности»

 Имя поля

Тип поля

Длина

Дробь

Назначение

COD

Num

3

0

Код ценности

NAME

Char

25

 

Наименование ценности

Таблица 4

Структура базы данных «Валюты»

 Имя поля

Тип поля

Длина

Дробь

Назначение

COD

Num

3

0

Код валюты

NAME

Char

25

 

Наименование валюты

BKURS

Num

10

2

Курс покупки

SKURS

Num

10

2

Курс продажи

CKURS

Num

10

2

Курс ЦБ РФ

SHORT_NAME

Char

3

Краткое наименование валюты

SCALE

Num

4

0

Масштаб

Таблица 5

Структура базы данных «Документы»

 Имя поля

Тип поля

Длина

Дробь

Назначение

COD

Num

3

0

Код документа

NAME

Char

25

 

Наименование документа

Таблица 6

Структура базы данных «Курсы валют по датам»

Имя поля

Тип поля

Длина

Дробь

Назначение

COD

Num

3

0

Код валюты

NAME

Char

25

 

Наименование валюты

BKURS

Num

10

2

Курс покупки

SKURS

Num

10

2

Курс продажи

CKURS

Num

10

2

Курс ЦБ РФ

SHORT_NAME

Char

3

Краткое наименование валюты

SCALE

Num

4

0

Масштаб

DATA

Date

8

Дата установки курса

TIME

Char

5

Время установки курса

Взаимодействие данных, связи и методы доступа.

Надежность и скорость обработки информации программой во многом определяются качеством проектирования методов доступа к данным системы и связей между отдельными информационными единицами. В нашем случае просматривается один тип связей КОД-НАИМЕНОВАНИЕ для справочников кодов и валют. Такой тип связи реализуется штатными средствами Clipper’а, такими, как установка реляционной связи между двумя базами данных (двумя рабочими областями) по значению ключа

или номеру записи при помощи команды SET RELATION.

SET RELATION является командой обработки баз данных, которая связывает родительскую рабочую область с одной или более дочерними областями путем использования ключевого выражения, номера записи или числового выражения.  Каждая родительская рабочая область может быть связана не более, чем с восемью дочерними рабочими областями. Отношение связи заставляет указатель записи перемещаться в дочерней рабочей области в соответствии с перемещением указателя записи в родительской рабочей области. Если в дочерней рабочей области не обнаруживается соответствия, то дочерний указатель записи помещается в позицию «за конец файла», и результат поиска принимает значение "ложь" (.F.).

Способ связывания родительской и дочерней рабочих областей зависит от типа выражения ключа и присутствия активного ведущего индекса в дочерней рабочей области. Если дочерняя рабочая область имеет активный индекс, поиск осуществляется с помощью стандартной команды SEEK. Если же дочерняя рабочая область не имеет активного индекса, а тип выражения ключа числовой, то вместо этого в дочерней рабочей области выполняется команда GOTO.

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

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

·      Уникальность ключа;

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

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

Одним из важных моментов в проектировании информационно-справочных систем является организация ввода данных пользователем и их дальнейшая обработка. При вводе данных, как правило, используются две формы ввода: табличная и бланк. В проектируемой системе ввод данных по обменной операции желательно организовать в форме бланка при оформлении операции и в таблице при корректировке и пополнении справочников. При вводе курсов валют можно применить комбинированную форму ввода: поиск валюты по списку табличной формы, а ввод курса в форме бланка. Основным режимом работы пользователя будет являться ввод данных по операциям обмена, поэтому бланк ввода необходимо спроектировать таким образом, чтобы форма соответствовала стандартной справке. Ввод данных из справочников можно оформить так, чтобы вызов справочника обеспечивался нажатием функциональной клавиши, соответствие справочника текущему полю ввода также должно обеспечиваться автоматически по имени поля ввода. Запись данных в базу должна производиться после подтверждения пользователем правильности всех введенных числовых и символьных данных и расчетных величин.

После ввода данных необходимо дать пользователю возможность распечатки бланка справки и копии клиента. данная операция должна быть выполнена в обязательном порядке. Печать может быть осуществлена на два типа принтеров: ударного действия (матричные) и струйные. Печать справки на лазерных принтерах невозможна из-за повышенных требований к качеству бумаги. При печати справки на матричном принтере можно осуществить печать двух экземпляров (справка+копия) за один проход с применением копировальной бумаги. На струйном принтере необходимо печатать каждый экземпляр отдельно. Таки м образом нужно предусмотреть изменяемый пользователем счетчик числа копий или специальную функцию настройки на тип принтера.

Рис.2  Схема взаимодействия и сязей данных

Разработка функциональной схемы программы.

Функциональный состав программы должен максимально обеспечивать необходимый набор возможностей для выполнения кассиром ОП его должностных обязанностей, связанных с вводом данных, регистрацией сделок и оформлением отчетных документов. Для этого составим примерный перечень функций, которые должны быть реализованы в нашей системе.

Примерный перечень функций системы.

1)          

·                   

·                   

·                   

·                   

2)          

·                   

·                   

3)          

·                   

·                   

·                   

·                   

4)          

·                    Печать реестра наличной иностранной валюты, купленной за наличные рубли;

·                    Печать реестра наличной иностранной валюты, проданной за наличные рубли;

·                    Печать реестра по обмену (конверсии) наличной иностранной валюты;

5)           Прочие функции

·                    Ввод данных в поле ввода из справочника

·                    Перевод числа из цифровой формы в строчную (сумма прописью)

·                    Изменение вида курсора

·                    Сохранение данных в архивных файлах

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

Разработка структурной схемы программы.

Структурная схема программного комплекса определяет в основных чертах и внешний вид проектируемой системы и принципы взаимодействия с пользователем.  Схема проектируемой системы будет представлять собой иерархическую древовидную структуру, описывающую процедуры ввода, обработки и вывода данных. Построение программ информационно-справочного класса по такому принципу позволяет довольно легко производить модификацию системы в целом и облегчает восприятие и понимание принципа работы программы. Для построения структурной схемы необходимо определить иерархию и связь перечисленных выше процедур обработки данных. Естественно установить иерархию процедур в том виде, в каком они были описаны в предыдущей главе, поскольку таковая схема соответствует  схеме «важности» и «употребимости» процедур. Структурная схема программы, с учетом всего вышеизложенного, представлена на рис 2.

Разработка экранного интерфейса программы

Существующие подходы к проектированию экранного интерфейса

Экранный интерфейс программы во многом определяет удобство работы пользователя и является одним из важных факторов, влияющих на эффективность его труда. Программа, выполняющая все возложенные на нее функции, обладающая высоким быстродействием может быть полностью непригодной для работы из-за неприемлемого интерфейса с пользователем. Еще буквально несколько лет назад существовал текстовый редактор, прекрасно иллюстрирующий такой подход к проектированию программного обеспечения. Вряд ли кому-то придется по душе редактор текста, в котором для вставки символа в строку нужно набрать однобуквенный код команды вставки, номер обрабатываемой строки (к счастью не двоичный), номер символа, после которого будет вставлен новый символ и собственно этот символ. Конечно такой подход абсолютно неприемлем.

Рис.4 Система меню операционной оболочки Norton Comander

Наиболее практичными и удобными с точки зрения пользователя можно считать  системы, имеющие экранный интерфейс, построенный на основе системы всплывающих меню. Наиболее распространенными в настоящее время являются две идеологии (имеются в виду DOS-приложения), включающие в себя и определенную форму экранных окон и цветовую гамму и вид всплывающих списков. Это инструментальные Среды фирмы Borland, и операционная оболочка Norton, фирмы Symantec. Обе идеологии предусматривают определенное разбиение экранного пространства на области или зоны, предназначенные для конкретных информационных объектов и действий. Зоны могут быть в некоторой степени переконфигурированы по желанию пользователя: изменены размеры и положение на экране. Команды обработки данных вызываются из системы меню, присутствующего на экране постоянно (Borland), или вызываемого по функциональной клавише (Symantec).

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

Рис 5. Система меню компилятора Borland C++

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

Таким образом, создается система многоуровневого всплывающего меню. Применение такой идеологии обеспечивает удобство ориентировки в системе, имеющей достаточно сложное, многоуровневое меню с множеством выборов. Естественно, что увеличение вложенности и размеров списков выбора, должно иметь разумные границы, которые к счастью имеются в виде ограниченности экранного пространства монитора. В большинстве систем заложена также возможность настройки цветовой палитры по желанию пользователя. В операционной оболочке Norton предлагается выбор гаммы из нескольких стандартных вариантов, в системах фирмы Borland можно создать свою собственную цветовую гамму, вплоть до мельчайших деталей. Примерный вид некоторых экранных объектов приведен на рис.4,5.

Выбор идеологии экранного интерфейса

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

Система проектирования CA-Clipper предоставляет разработчику достаточно обширную гамму функций, позволяющих осуществлять разработку экранного интерфейса, однако программы, в которых используются только штатные  средства системы оказываются довольно сильно загруженными второстепенными операторами, обеспечивающими вывод на монитор экранных объектов, рамок, установку цвета и т.п. Целесообразно разработать комплекс функций экранного интерфейса, выполняющих макрооперации, таких, к примеру, как вывод в заданных координатах рамки с заголовком и тенью в указанной цветовой гамме и сохранение области вывода в буфере для последующего восстановления внешнего вида экрана. Все функции экранного интерфейса можно объединить в библиотеку, с тем, чтобы в последующей работе не загружать исходный код программы их описанием.

Перечень функций экранного интерфейса

Для формирования библиотеки экранных функций, приведем перечень процедур, относящихся к созданию внешнего облика программы и связи программы с конечным пользователем:

·     

·     

·     

·     

·     

·     

·     

·     

·     

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

Проектирование функциональных модулей.

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

·     

·     

·     

·     

·     

Создание в первую очередь процедур и функций экранного интерфейса объясняется тем, что эти функции составят “скелет” программы к которому в дальнейшем будут подключаться рабочие процедуры, таким образом мы будем вести разработку методом “Сверху вниз”. Этот метод позволяет в короткие сроки получить работающую систему с ограниченным (и в процессе работы все более полным) набором функциональных возможностей.

Разработка интерфейсных функций

Функция вывода меню в указанных координатах

Для упрощения программы в целом возложим на эту процедуру  следующие задачи:

·     

·     

·     

·     

·     

·     

Определимся с параметрами функции.

1. 

2. 

3. 

4. 

5. 

6. 

7. 

8. 

Дополнительная координата и массив координат выборов будут выполнять двойную роль: при выводе горизонтального меню массив содержит номера колонок для каждого выбора, а дополнительная координата определяет строку вывода, при выводе вертикального меню в массиве будем иметь номера строк для каждого выбора, а дополнительная координата определит столбец вывода. Для  отображения “горячей” клавиши необходимо определить в строке выбора какой-либо маркер, символ, следующий за ним, будет использоваться в качестве “горячей” клавиши и отображаться с  выделением  (рис.6)

Активная опция

Неактивная опция

«Горячая» клавиша

 

Рис.6 Фрагмент меню

Рис 7. Алгоритм функции выбора из меню

Функция вывода окна  в указанных координатах

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

Рис.8  Параметры оконного объекта

оконного объекта. К таким параметрам относятся:

·     

·     

·     

·     

Экранные координаты передаются в виде числовых величин в порядке, принятом для команд BOX, CLEAR  и т.п. YL,XL - левый верхний, YR,XR - правый нижний угол. Символы заполнения передаются в виде строковой переменной, содержащей последовательно символы обрамления, начиная с верхнего левого угла по часовой стрелке. Последним в последовательности является символ заполнения внутренней области окна. Цветовая гамма устанавливается по умолчанию по текущим установкам.

Вывод оконного объекта с эффектом раскрытия осуществляется путем циклического вызова предыдущей функции с задержкой и изменением координат на единицу от Х1=(ХR-XL)/2, Y1=(YR-YL)/2 до переданных в качестве параметра.

Вывод строки подсказки

Особенностью данной функции является необходимость вывода подсказки в виде этикеток к функциональным клавишам в нижнюю строку экрана и фиксация этих данных на время работы какой-либо процедуры, а затем восстановление области экрана, занятой строкой подсказки. Кроме того, необходимо выводить этикетки только для клавиш, задействованных в данной процедуре.

Рис.9  Строка подсказки

Целесообразно в главном модуле программы определить массив с этикетками для каждой функциональной клавиши, а в функцию передавать только номера или позиции подлежащих отображению этикеток. В качестве параметра удобно использовать символьное выражение битовой строки вида “1000001001”,  показывающее, что необходимо вывести в строку подсказки элементы массива с номерами 1, 7 и 10, а в остальных позициях вывести блоки пробелов. Поскольку в строку необходимо выводить десять элементов массива с обозначением номера функциональной клавиши и разделителями, легко подсчитать, что длина одного элемента составит 6 символов. Примерный вид фрагмента строки приведен на рис.

Вывод сообщения с ожиданием реакции или выбора пользователя

Поскольку данные функции, написанные, как самостоятельные модули во многом будут похожи, есть смысл объединить их в одну универсальную процедуру. Условимся обрабатывать максимально три строки сообщения и до трех вариантов выбора. При отсутствии в передаваемых параметрах вариантов выбора, предполагается ожидание нажатия на любую клавишу.

 Таким образом, список параметров функции будет следующим:

·     

·     

·     

·     

·     

а)

·     

·     

б)

в)

Рис.10 Примеры работы функции при передаче различного количества параметров.

а - одна строка сообщения б - две строки сообщения и две строки выбора, в - Одна строка сообщения и три строки выбора.

При вызове функции условимся отсутствующие параметры передавать в виде пустой строки -«», таким образом упростится анализ переданных параметров в функции.

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

Алгоритм функции и исходный текст приведен в приложении.

Вывод линейного индикатора процесса и его обновление

Вид линейного индикатора приведен на рис.   Использование индикатора позволяет визуально оценить процент выполнения какой-либо операции в процессе работы. Для отображения шкалы необходимо иметь следующие данные:

·     

 

Рис.11   Линейный индикатор процесса

·     

·     

Алгоритм функции и исходный текст приведен в приложении.

Вывод транспаранта ожидания

Транспарант ожидания должен выводиться в указанных координатах на время работы процедуры и иметь обязательную строку “Ожидайте окончания операции...”, кроме того, можно в качестве параметра передать дополнительную информацию. Область экрана, занятую сообщением, и ее координаты необходимо  сохранить в переменных для последующего восстановления. Общий вид транспаранта приведен на рис.

Рис.12   Транспарант ожидания

Вспомогательные функции

ФУНКЦИЯ ПЕРЕКЛЮЧЕНИЯ ВИДА КУРСОРА

Данная функция должна обеспечивать отображение курсора ввода в виде линии при режиме «ЗАМЕНА» и в виде блока в режиме «ВСТАВКА». Для отслеживания состояния курсора необходима глобальная переменная, которая принимает значения 1 или 2. Функция должна быть приписана к клавише «Insert» командой SET KEY.

ФУНКЦИЯ ПЕРЕВОДА СТРОКИ В ВЕРХНИЙ РЕГИСТР

Поскольку в составе Clipper 5.02 не имеется функции Upper,  работающей с символами кириллицы, необходимо обеспечить программу эквивалентной процедурой. Наиболее просто реализовать функцию путем объявления двух массивов - исходных символов и символов преобразования с однозначным соответствием. Поиск исходного символа в первом массиве дает нам индекс символа преобразования из второго. При отсутствии эквивалента, символ транслируется без изменения.

ФУНКЦИЯ КОНТРОЛЯ ВЫХОДА

Для корректного закрытия БД и завершения работы необходимо проконтролировать запросом попытку пользователя выйти из программы. Данная функция будет содержать обычный запрос на подтверждение выхода, и при положительном ответе осуществит закрытие всех активных файлов БД и возврат в ДОС.

ФУНКЦИЯ ПЕРЕВОДА ЧИСЛОВОЙ ВЕЛИЧИНЫ В СТРОКУ «СУММА ПРОПИСЬЮ»

Функция небходима для получения строки, содержащей символьное выражение числа. Преобразование должно осуществляться с соблюдением правил грамматики, падежей и склонений. Первая буква строки прописная. Дробная часть не преобразуется. При переводе валюты в функцию должен быть передан в качестве параметра код валюты и строка дополнена псевдонимом валюты. Псевдоним, или краткое наименование извлекается из БД валют по коду валюты, переданному в функцию в качестве параметра.  По умолчанию предполагается валюта - Российский рубль (код 000 или 002)

Пример:

123456 код валюты 048

Сто двадцать три тысячи четыреста пятьдесят шесть DEM

52567478 без параметра

Пятьдесят два миллиона пятьсот шестьдесят семь тысяч четыреста семьдесят восемь руб. 00 коп.

Разработка головного модуля программы

Структура функции MAIN

При написании головной функции необходимо описать  именно в ней все массивы и переменные, имеющие статус глобальных - «Public». В этом случае к ним можно получить доступ из всех процедур и функций системы, использовать их в качестве объектов для неявной передачи  параметров и возврата значений или результатов работы. Кроме того в головном модуле необходимо произвести настройку общих параметров Clipper’а, таких, как формат даты, режим поиска в БД, параметры поиска и сравнения строк и т.п.

Для обеспечения возможности корректировки пользователем цветовой палитры системы следует определить комплекс переменных, в которых будут храниться цветовые установки. Количество переменных определится количеством групп процедур, и числом изменяемых цветов в каждой из них. Распределить функции на группы можно по следующему принципу:

·      Функция главного меню системы

·      Функции меню нижних уровней

·      Функции ввода данных

·      Функции вывода данных

·      Функции запросов

·      Строка подсказки

Набор переменных цвета должен обеспечить хранение цветовых установок для прорисовки окна, нормального текста, выделенных и невыделенных объектов для каждой группы функций. Цветовые установки будут иметь символьное выражение вида «+GR/B», что позволит производить непосредственную подстановку переменных в функцию SETCOLOR. Хранение переменных необходимо осуществить в специальном файле memo - переменных.

Рис.13  Алгоритм головного модуля (Функция MAIN)

ФУНКЦИИ ВЫЗОВА МЕНЮ НИЖНИХ УРОВНЕЙ

Рис.14 Алгоритм процедуры меню нижних уровней

Данные функции в комплексе с функцией главного меню образуют систему всплывающих меню программы. Для организации взаимодействия между процедурами необходимо обеспечить “стыковку” вызывающих и вызываемых функций. Основной проблемой организации стыка функций является их экранное взаимодействие т.е. каждая процедура или функция после окончания работы должна обеспечить восстановление экрана в том состоянии, в каком он был до вызова функции. Можно поступить несколько по другому: вызывающая функция обеспечивает сохранение состояния экрана на время работы вызываемой функции. Функции меню нижних уровней будут построены по одной схеме (Рис. ). Такой подход позволит при необходимости быстро встроить требуемый вызов в систему меню и, в свою очередь, не требует модулей - заглушек для отсутствующих процедур.

ФУНКЦИЯ РЕГИСТРАЦИИ ПОКУПКИ ВАЛЮТЫ

Процедуры регистрации валютно-обменных операций будут использовать одну и ту же форму ввода данных (см. Рис). Редактирование данных будет осуществляться в переменных соответствующих типов и после контрольного

Рис.15  Бланк регистрации валютно-обменной операции и фрагмент справочника ценностей

Рис. 16 Алгоритм (укрупненный) функции регистрации сделки

 запроса заноситься в БД операций.

 Коды справочных данных вводятся двумя способами: непосредственно в поле ввода или через список справочника, вызываемого по клавише F3. Для облегчения работы кассира можно предусмотреть автоматический расчет суммы после ввода суммы основной валюты. Укрупненный алгоритм функции приведен на рис.15 .

ФУНКЦИЯ - ОПРЕДЕЛИТЕЛЬ ТЕКУЩЕГО ПОЛЯ ДЛЯ ПОЛУЧЕНИЯ КОДА И НАИМЕНОВАНИЯ ОБЪЕКТА ИЗ СПРАВОЧНИКА

При организации ввода данных с использованием справочников желательно обеспечить выбор данных из того или иного справочника в одной функции. Для обеспечения вывода необходимого на данный момент списка можно применить функцию GETACTIVE, которая возвращает имя текущего GET-объекта. Анализируя это имя можно организовать примитивный селектор, который будет формировать запросы к той или иной БД справочников. Дальнейший выбор организуется в виде списка с поиском по набору.

Тестирование программного обеспечения.

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

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

·           

·           

·           

Восходящее тестирование.

При восходящем подходе программа собирается и тестируется снизу вверх. Только модули самого нижнего уровня (модули, не вызывающие других модулей) тестируются независимо, автономно. После того как тестирование этих модулей завершено, вызов их должен быть так же надежен, как вызов встроенной функции языка или оператор присваивания. Затем тестируются модули, непосредственно вызывающие уже проверенные. Эти модули более высокого уровня тестируются не автономно, а вместе с уже проверенными модулями более низкого уровня. Процесс повторяется до тех пор, пока не будет достигнута вершина. Здесь завершаются и тестирование модулей, и тестирование сопряжений программы. Для каждого модуля необходимо написать небольшую ведущую программу.

Нисходящее тестирование.

Нисходящее тестирование не является полной противоположностью восходящему, но в первом приближении может рассматриваться как таковое. При нисходящем подходе программа собирается и тестируется сверху вниз. Изолированно тестируется только головной модуль. После того как тестирование этого модуля завершено, с ним соединяются один за другим, модули, непосредственно вызываемые им, и тестируется полученная комбинация. Процесс повторяется до тех пор, пока не будут собраны и проверены все модули. Для имитации функций недостающих модулей программируются модули - ”заглушки”, которые моделируют функции отсутствующих модулей.

Метод сэндвича.

Тестирование методом сэндвича представляет собой компромисс между восходящим и нисходящим подходами. При использовании этого метода одновременно начинают восходящее и нисходящее тестирование, собирая программу как снизу так и сверху и встречаясь в конце концов где-то в середине. Точка встречи зависит от конкретной тестируемой программы и должна быть заранее определена при изучении ее структуры. Если разработчик может представить свою систему в виде уровня прикладных модулей, затем уровня модулей обработки запросов, затем уровня примитивных функций, то он может решить применять нисходящий метод на уровне прикладных модулей, а на остальных уровнях применить восходящий метод.

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

Экономическая часть.

В большинстве случаев внедрение вычислительной техники не приносит прямого экономического эффекта. Это объясняется следующим:

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

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

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

увеличение потребления электроэнергии;

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

Однако, не смотря на выше перечисленные причины, все больше и больше организаций используют вычислительную технику в своей работе. Это можно объяснить косвенным эффектом от внедрения вычислительной техники, который зачастую значительно превышает затраты на приобретение и содержание вычислительной техники.

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

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

Показатели экономической характеристики разработки.

Вопросы техники безопасности и охраны труда.

Персональные ЭВМ являются изделиями сложной вычислительной техники и, как любой прибор требуют при работе с ним соблюдения определенных методов безопасной работы и техники электробезопасности, незнание, или пренебрежение которыми может причинить немало неприятностей.

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

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

Основным источником эргономических проблем, связанных с охраной здоровья людей, использующих в своей работе автоматизированные информационные системы на основе персональных компьютеров, являются дисплеи (мониторы), особенно дисплеи с электронно-лучевыми трубками. Они представляют собой источники наиболее вредных излучений, неблагоприятно влияющих на здоровье операторов.

Результаты, полученные в ходе исследований, носят пока еще преимущественно статистический характер и не имеют адекватного объяснения. Частотный спектр излучения монитора характеризуется наличием рентгеновских, ультрафиолетовых, инфракрасных и других электромагнитных колебаний. Опасность рентгеновского и части других излучений большинством ученых признается пренебрежимо малой, поскольку их уровень достаточно невелик и в основном поглощается покрытием экрана. Наиболее тяжелая ситуация связана, по-видимому, с полями излучений очень низких частот, которые, как выяснилось, способны вызывать биологические эффекты при воздействии на живые организмы. Было обнаружено, что электромагнитные поля  с частотой порядка 60 Гц могут инициировать изменения в клетках животных (вплоть до нарушения синтеза ДНК). Особенно поразительным для исследователей оказался тот факт, что, в отличие, например, от рентгеновского излучения, электромагнитные волны обладают необычным свойством - опасность их воздействия  при снижении интенсивности излучения не уменьшается, мало того, некоторые поля действуют на клетки тела только при малых интенсивностях или на конкретных частотах. Согласно одному из объяснений, сформулированных американскими учеными, переменное электромагнитное поле, совершающее колебания с частотой порядка 60 Гц, вовлекает в аналогичные колебания молекулы любого типа, независимо от того, находятся они в мозге человека или в его теле. Результатом этого является изменение активности ферментов и клеточного иммунитета, причем сходные процессы наблюдаются в организмах и при возникновении опухолей. Специальные измерения показали, что мониторы действительно излучают магнитные волны, по интенсивности не уступающие уровням магнитных полей, способных обуславливать возникновение опухолей у людей.

Более серьезные результаты были получены при обследовании беременных женщин. Оказалось, что для тех женщин, которые проводили за дисплеем компьютеров не менее 20 часов в неделю, вероятность патологии на 80% выше, чем для выполняющих аналогичные работы без применения компьютера. При исследованиях, связанных с изучением глазных заболеваний, выяснилось, что служащие, работающие за дисплеем по 7 и более часов в день, страдают воспалениями и другими заболеваниями глаз на 70% чаще тех, кто проводит за дисплеем меньше времени.

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

Что касается других функциональных нарушений, то те из них, которые связаны со скелетом человека, обусловлены длительными статическими нагрузками, вызванными  плохой организацией рабочего места пользователя: неудобной или неподходящей по размерам мебелью, неудобным взаимным расположением компонентов системы персонального компьютера или отсутствием достаточного для свободных движений и смены позы места. Неудачная организация клавиатуры, либо неудобная конструкция мыши способны вызвать “накапливание” заболеваний сухожилий, мышц и нервных окончаний. Кроме того, возникновение болезней спины, шеи и рук специалисты объясняют тем, что при работе с клавиатурой компьютера пользователи с высокой скоростью повторяют одни и те же движения (типа быстрых нажатий клавиш, перемещения мыши, наклонов и поворотов головы и т.п.). Каждое нажатие на клавишу, естественно, сопряжено с множественным сокращением мышц, перемещением сухожилий вдоль костей и соприкосновениями их с внутренними тканями. В итоге из-за чрезмерной напряженности работы или увлеченности ею могут развиваться болезненные и воспалительные процессы.

Кожные заболевания (лица) связаны в основном с тем, что наэлектризованный экран дисплея притягивает частицы взвешенной в воздухе пыли, так что вблизи него “качество” воздуха ухудшается и оператор вынужден работать в более запыленной атмосфере.

На основе сказанного можно сформулировать определенные рекомендации для пользователей персональных компьютеров с точки зрения охраны их труда. В принципе, основной подход к решению проблем такого рода сводится к установлению строгого контроля за соответствием аппаратных и программных средств, а также условий их эксплуатации эргономическим требованиям. Приведем некоторые из них:

·     

·     

·     

·     

Рассматривая подробно каждую из них, можно привести рекомендации частного характера:

·     

·     

·     

·     

·     

·     

·     

·     

·     

·     

·     

·     

·     

·      - через каждый час.

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

Нельзя загораживать заднюю стенку системного блока или ставить персональный компьютер вплотную к стене - это приводит к “тяжелому” режиму охлаждения системного блока и его перегреву. То же самое относится к дисплею - нельзя класть на него бумаги, книги и вообще все, что может закрыть его вентиляционные отверстия. Пыль и электроника плохо совместимы друг с другом, поэтому необходимо поддерживать в помещении приемлемый пылевой режим.

Заключение

В процессе работы над дипломным проектом был создан комплекс программных средств для обеспечения работы пункта обмена валюты банка. Кроме того была разработана концепция проектирования информационно - справочных систем с применением функций экранного интерфейса, разработанных в рамках дипломного проекта. Применение специализированных функций позволило сократить время разработки основного модуля программы и обеспечило высвобождение времени на создание процедур обработки данных.  В дипломном проекте представлен один из множества подходов к проектированию программного обеспечения информационного плана, дающий возможность на ранних этапах разработки учесть все нюансы будущей программы, необходимый набор функций, состав и структуру баз данных, что в дальнейшем исключает необходимость переработки уже написанных компонентов программы.

Кроме того в процессе работы были подготовлены рекомендации по оборудованию рабочего места оператора ЭВМ, соблюдению норм и правил ТБ при работе на персональных ЭВМ, подсчитаны экономические характеристики разработки.

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

Приложение

Интерфейсные функции

Функция вывода окна

Параметры:

координаты левого верхнего и правого нижнего угла окна,

[строка символов обрамления]

Function _OPEN_T

parameters Y1,X1,Y2,X2,SBOX

private XT1,XT2,XK2,SBOX

SBOX=iif(empty(SBOX).and.SBOX<>space(9),"é¾ù½û¾ë½ ",SBOX)

XT1=iif(X1+2>79,79,X1+2)

XT2=iif(X2+2>79,79,X2+2)

XK2=iif(X2+1>79,79,X2+1)

@ Y1,X1,Y2,X2 BOX SBOX

shadow(Y2+1,XT1,Y2+1,XT2,0)

shadow(Y1+1,XK2,Y2+1,XT2,0)

return 0

Функция вывода окна с эффектом раскрытия

Параметры:

координаты левого верхнего и правого нижнего угла окна,

[строка символов обрамления],[строка установки цвета]

Function _OPEN_N

parameters Y1,X1,Y2,X2,S1,COLOR

local CL,XT,YT,XC,YC

if pcount()=4

    COLOR=setcolor()

    S1=""

elseif pcount()=5

    COLOR=setcolor()

endif

YC=Y1+int((Y2-Y1)/2)

XC=X1+int((X2-X1)/2)

CL=setcolor()

if Y2-Y1 >= 2

    YC1=YC

    YC2=YC

    XT=XC

    setcolor(COLOR)

    do while .T.

        _open_t(YC1,XT,YC2,2*XC-XT,S1)

        YC1=iif(YC1-2<Y1,Y1,YC1-2)

        YC2=iif(YC2+2>Y2,Y2,YC2+2)

        if XT=X1

            exit

        endif

        XT=iif(XT-3<X1,X1,XT-3)

        inkey()

    enddo

    if YC1<>Y1

        YT=YC1

        do while .T.

            _open_t(YT,X1,2*YC-YT,X2,S1)

            if YT=Y1

                exit

            endif

            YT=iif(YT-2<Y1,Y1,YT-2)

            inkey()

        enddo

    endif

endif

_open_t(Y1,X1,Y2,X2,S1)

setcolor(CL)

return 0

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

Параметры:

координаты левого верхнего угла окна,

строка сообщения 1, строка сообщения 2, строка сообщения 3,

строка выбора 1, строка выбора 2, строка выбора 3,

строка символов обрамления.

Function _ERR

parameters Y1,X1,S1,S2,S3,M1,M2,M3,SB

private CLR,STATS,Y1,X1,S1,S2,S3,M1,M2,M3,SB,STAT,KL1,MM1,MM2

save screen

CLR=setcolor()

STATS=csetall()

if pcount()=8

    SB=""

endif

Y2=Y1+iif(empty(S2),5,iif(empty(S3),6,7))

X2=X1+max(len(S1),max(len(S2),max(len(S3),max(len(M1)+len(M2)+;

len(M3)+5,31))))+4

setcolor(At_E_F)

_open_n(Y1,X1,Y2,X2,SB)

@ Y2-3,X1 SAY "|"+replicate("=",X2-X1-1)+"|"

setcolor(At_E_N)

@ Y1+1,X1+((X2-X1)-len(alltrim(S1)))/2 SAY alltrim(S1)

if .not.empty(S2)

    @ Y1+2,X1+((X2-X1)-len(alltrim(S2)))/2 SAY alltrim(S2)

    if .not.empty(S3)

        @ Y1+3,X1+((X2-X1)-len(alltrim(S3)))/2 SAY alltrim(S3)

    endif

endif

if empty(M1)

    setcolor(At_E_S)

    @ Y2-2,X1+(X2-X1-31)/2 SAY " Нажмите Enter для продолжения "

    setcolor("N"+substr(AT_E_F,at("/",AT_E_F)))

    @ Y2-1,X1+(X2-X1-31)/2+1 SAY "-------------------------------"

    @ Y2-2,X1+(X2-X1-31)/2+31 SAY "-"

    L_showcurs()

    KL1=0

    do while .T.

        KL1=inkey()

        STAT=L_getmstat()

        if KL1<>0.or.STAT<>0

            exit

        endif

    enddo

    L_hidecurs()

    restore screen

    csetall(STATS)

    setcolor(CLR)

    return 0

elseif empty(M3).and..not.empty(M2)

    declare MM1[2],MM2[2]

    MM1[1]=M1

    MM1[2]=M2

    XX=X1+int((X2-X1-len(M1+M2)-1)/2)

    MM2[1]=XX

    MM2[2]=XX+len(M1)+1

    do while .T.

        MM=1

        MM=selopt(MM,MM1,MM2,"",Y2-2,.F.,.F.,At_E_S,At_E_U,At_E_F)

        if MM<>0

            restore screen

            csetall(STATS)

            setcolor(CLR)

            return MM

        endif

    enddo

elseif .not.empty(M1).and..not.empty(M2).and..not.empty(M3)

    declare MM1[3],MM2[3]

    MM1[1]=M1

    MM1[2]=M2

    MM1[3]=M3

    XX=X1+int((X2-X1-len(M1+M2+M3)-2)/2)

    MM2[1]=XX

    MM2[2]=XX+len(M1)+1

    MM2[3]=XX+len(M1+M2)+2

    do while .T.

        MM=1

        MM=selopt(MM,MM1,MM2,"",Y2-2,.F.,.F.,At_E_S,At_E_U,At_E_F)

        if MM<>0

            restore screen

            csetall(STATS)

            setcolor(CLR)

            return MM

        endif

    enddo

endif

csetall(STATS)

setcolor(CLR)

return 0

Функция вывода линейного индикатора процесса

Function _LIN

parameters YCOR,XCOR,LENG,LMAX,LUSE

private YCOR,XCOR,LENG,LMAX,LUSE,STATS,RW,CL

STATS=csetall()

RW=row()

CL=col()

LMAX=iif(LMAX<=0,1,LMAX)

XUSE=int((LENG/LMAX)*LUSE)+XCOR

CLR=setcolor(AT_S_U)

@ YCOR,XCOR,YCOR,XUSE BOX "---------"

setcolor(AT_S_S)

if XUSE<LENG

    @ YCOR,XUSE+1,YCOR,XCOR+LENG BOX "---------"

endif

csetall(STATS)

setcolor(CLR)

@ RW,CL SAY ""

return 0

Функция вывода рамки для всплывающего меню

Function POPMENU

parameters Y1,X1,Y2,X2,OPT,OFFS,COLORF

private Y1,X1,Y2,X2,OPT,OFFS,COLORF,I,CLR

L_hidecurs()

CLR=setcolor(COLORF)

@ Y1,X1 SAY "-"+repl("-",OFFS-1)

@ Y1,X1+OFFS+len(OPT) SAY repl("-",X2-X1-OFFS-len(OPT))+"¬"

shadow(Y1+1,X2+1,Y1+1,X2+2,SHC)

_open_t(Y1+1,X1,Y2,X2,"¦ ¦¦--L¦ ")

setcolor(CLR)

L_showcurs()

return 0

Функция вывода строки подсказки

Function _NORT

static NORTSCR

parameters BINSTR,NUM

private CL,ROW,COL

if pcount()=0

    restscreen(24,0,24,79,NORTSCR)

else

    if pcount()=1

        NUM=0

    endif

    ROW=row()

    COL=col()

    NORTSCR=savescreen(24,0,24,79)

    CL=setcolor(AT_N_I)

    @ 24,00 say space(80)

    for I=0 to 9

        setcolor(AT_N_I)

        @ 24,I*8 say str(I+1,iif(I=9,2,1))

        setcolor(AT_N_S)

        if substr(BINSTR,I+1,1)="1"

            @ 24,I*8+iif(I=9,2,1) say iif(NUM=0,MHP[I+1],MHPA[I+1])

        else

            @ 24,I*8+iif(I=9,2,1) say "      "

        endif

    next

    setcolor(CL)

    @ ROW,COL say ""

endif

return 0

Функция вывода транспаранта ожидания

Function _WAIT

static WAITSCR

parameters STROKE

local CL,ROW,COL,X1,LENM

if pcount()=0

    restscreen(11,0,15,79,WAITSCR)

else

    ROW=row()

    COL=col()

    WAITSCR=savescreen(11,0,15,79)

    CL=setcolor("+BG/B")

    if empty(STROKE)

        _open_n(12,20,14,59)

    else

        LENM=max(len(STROKE),31)

        X1=(74-LENM)/2

        _open_n(11,X1,14,X1+6+LENM)

        setcolor("+BG/B")

        @ 12,X1+3+iif(LENM=31,(31-len(STROKE))/2,0) say STROKE

    endif

    setcolor("+BG/B")

    @ 13,25 say "Ожидайте окончания операции"

    setcolor("+BG/B*")

    @ 13,52 say " ..."

endif

@ ROW,COL say ""

setcolor(CL)

return 0

Функция выбора опции из меню с использованием  манипулятора "Мышь" или клавиатуры.  

Синтаксис:

selopt(expN,arrC,arrN,arrC,expN,expL,expL,expC,expC,expL)

Параметры:

1   номер начальной опции меню

2   массив опций      

3   массив координат опций (строка/столбец)            

4   массив подсказок                                   

5   начальная строка/столбец вывода опций              

6   флаг вывода (.T. вертикально,.F. горизонтально)    

7   флаг вывода подсказок (.T. выводить в 24 строке)   

8   цвет выбранной опции                               

9   цвет невыбранной опции                             

10   флаг прорисовки тени опции (default - none)           

Возврат:

Номер выбранной опции либо 0 при прерывании выбора  

Function SELOPT

parameters NOPT,MO,MC,ME,COLROW,ORIENT,SAYHELP,CLRS,CLRN,CSD

local CL

private NOPT, COUN, INDO, INDM, INDN, MO, MC, ME, COLROW, ORIENT, SAYHELP, CLRS, CLRN, STAT, KL, ROWMO, IN

if pcount()<10

    SHD=.F.

else

    CSD="N"+substr(CSD,at("/",CSD))

    SHD=.T.

endif

keyboard chr(0)

COLORN="R"+substr(CLRN,at("/",CLRN))

COLORS="R"+substr(CLRS,at("/",CLRS))

L_showcurs()

NOPT=iif(NOPT=0,1,NOPT)       && Номер начальной опции меню

COUN=len(MO)                  && Количество опций

store NOPT to INDO,INDN,INDM

CL=setcolor()

for IN=1 to COUN

    setcolor(CLRN)

    @ iif(ORIENT,MC[IN],COLROW),iif(ORIENT,COLROW,MC[IN]) ;

        SAY strtran(MO[IN],"~","")

    if (POS:=at("~",MO[IN]))>0

      setcolor(COLORN)

      @ iif(ORIENT,MC[IN],COLROW),iif(ORIENT,COLROW+POS-1,MC[IN]+POS-1);

           SAY substr(MO[IN],POS+1,1)

      setcolor(CL)

    endif

    if SHD

        setcolor (CSD)

        @ iif(ORIENT,MC[IN]+1,COLROW+1),iif(ORIENT,COLROW+1,MC[IN]+1);

            SAY repl("-",len(strtran(MO[IN],"~","")))

        @ iif(ORIENT,MC[IN],COLROW),iif(ORIENT,COLROW+;

len(strtran(MO[IN],"~","")),MC[IN]+;

len(strtran(MO[IN],"~",""))) SAY "-"

        setcolor(CL)

    endif

NEXT

COLMO=L_getxposn()/8

ROWMO=L_getyposn()/8

setcolor(CLRS)

L_hidecurs()

@ iif(ORIENT,MC[NOPT],COLROW),iif(ORIENT,COLROW,MC[NOPT]);

    SAY strtran(MO[NOPT],"~","")

if (POS:=at("~",MO[NOPT]))>0

    CL= setcolor(COLORS)

    @ iif(ORIENT,MC[NOPT],COLROW),iif(ORIENT,COLROW+POS-1,MC[NOPT]+POS-1) ;

        SAY substr(MO[NOPT],POS+1,1)

    setcolor(CL)

endif

if SAYHELP

    setcolor(At_M0_N)

    @ 24,(80-len(ME[INDN]))/2 SAY ME[INDN]

endif

L_showcurs()

KEYPRESSED=.F.

do while .T.

    COLMN=L_getxposn()/8

    ROWMN=L_getyposn()/8

    STAT=L_getmstat()

    KL=inkey()

    if KL>0

        KEYPRESSED=.T.

    else

        KEYPRESSED=.F.

    endif

    if KL=13

        L_hidecurs()

        return INDN

    endif

    if STAT=2.or.KL=27

        if KL<>27

            for TT=1 to COUN

                if iif(ORIENT,COLMN>=COLROW.and.COLMN<=COLROW+;

                      len(strtran(MO[TT],"~","")).and.ascan(MC,ROWMN)<>0,;

                      ROWMN=COLROW.and.COLMN>=MC[TT].and.COLMN<=MC[TT]+;

                      len(strtran(MO[TT],"~","")))

                    L_hidecurs()

                    return 0

                endif

            next

        else

            L_hidecurs()

            return 0

        endif

    endif

    if iif(ORIENT,(COLMN>=COLROW.AND.COLMN<=COLROW + ;

                   len(strtran( MO[INDN],"~","")) .AND. ;

                  ROWMN<>ROWMO).or.KEYPRESSED,(ROWMN=COLROW.AND.;

                  COLMN<>COLMO).or.KEYPRESSED)

      T1=.F.

      if ORIENT.and.KL=0

         TEST=ascan(MC,ROWMN)

         if TEST<>0

             T1=.T.

         endif

      elseif .not.ORIENT.and.KL=0

         TEST=INDO

         for TT=1 to COUN

             if COLMN>=MC[TT].and.COLMN<=MC[TT]+len(strtran(MO[TT],"~",""))

                 TEST=TT

                 T1=.T.

                 exit

             endif

         next

      elseif KL>0

         T1=.T.

      endif

      if T1

        do case

          case KL=5.or.KL=19

            INDN=iif(INDN=1,COUN,INDN-1)

          case KL=24.or.KL=4

            INDN=iif(INDN=COUN,1,INDN+1)

          case KL>=32.and.KL<=255

            STROKE="~"+chr(KL)+"~"

            for II=1 to COUN

                if at(STROKE,MO[II])<>0

                    INDN=II

                    keyboard chr(13)

                    exit

                endif

            next

          otherwise

            INDN=TEST

        endcase

        setcolor(CLRN)

        L_hidecurs()

        @ iif(ORIENT,MC[INDO],COLROW),iif(ORIENT,COLROW,MC[INDO]);

            SAY strtran(MO[INDO],"~","")

        if (POS:=at("~",MO[INDO]))>0

          CL=setcolor(COLORN)

          @ iif(ORIENT,MC[INDO],COLROW),iif(ORIENT,COLROW+POS-1,MC[INDO]+;

               POS-1) SAY substr(MO[INDO],POS+1,1)

          setcolor(CL)

        endif

        if SAYHELP

            setcolor(At_M0_N)

            @ 24,(80-len(ME[INDN]))/2 SAY ME[INDN]

        endif

        setcolor(CLRS)

        @ iif(ORIENT,MC[INDN],COLROW),iif(ORIENT,COLROW,MC[INDN]);

            SAY strtran(MO[INDN],"~","")

        if (POS:=at("~",MO[INDN]))>0

          setcolor(COLORS)

          @ iif(ORIENT,MC[INDN],COLROW),iif(ORIENT,COLROW+POS-1,MC[INDN]+POS-1)

               SAY substr(MO[INDN],POS+1,1)

        endif

        L_showcurs()

        INDO=INDN

        ROWMO=ROWMN

        COLMO=COLMN

        if STAT=0

            loop

        endif

      endif

    elseif COLMN>=COLROW

      do case

        case STAT=1

            for TT=1 to COUN

                if iif(ORIENT,COLMN>=COLROW.and.COLMN<=COLROW+;

                       len(strtran(MO[TT],"~","")).and.ascan(MC,ROWMN)<>0,;

                       ROWMN=COLROW.and.COLMN>=MC[TT].and.COLMN<=MC[TT]+;

                       len(strtran(MO[TT],"~","")))

                    L_hidecurs()

                    return INDN

                endif

            next

        case STAT=2

            for TT=1 to COUN

                if iif(ORIENT,COLMN>=COLROW.and.COLMN<=COLROW+;

                       len(strtran(MO[TT],"~","")).and.ascan(MC,ROWMN)<>0,;

                       ROWMN=COLROW.and.COLMN>=MC[TT].and.COLMN<=MC[TT]+;

                       len(strtran(MO[TT],"~","")))

                    L_hidecurs()

                    return 0

                endif

            next

      endcase

    endif

enddo

return 0

Вспомогательные функции

Функция переключения вида курсора

Function FINS

FINSERT=.not.FINSERT

readinsert(FINSERT)

if setcursor()<>0

    CUR_STYLE=iif(FINSERT,2,1)

    setcursor(CUR_STYLE)

endif

clear type

return 0

Функция  перевода строки в верхний регистр   

Function UpperR(String)

local SRC:={"а","б","в","г","д","е","ё","ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш","щ","ь","ы","ъ","э","ю","я"," "},;

      DST:={"А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ь","Ы","Ъ","Э","Ю","Я"," "},;

      STR:="",KEY:="",INDEXKEY,I

for I=1 to len(STRING)

    KEY=substr(STRING,I,1)

    if (INDEXKEY:=ascan(SRC,KEY))<>0

        STR=STR+DST[INDEXKEY]

    else

        STR=STR+KEY

    endif

next

return STR

Функция контроля выхода

Function DOORS

private CLR,ME

CLR=setcolor()

clear type

ME=1

ME=_err(07,02,"Вы желаете завершить работу ?","","",;

" ~Y~es "," ~N~o ","")

if ME=1.or.ME=-1

    close databases

    set color to

    clear

    set printer to

    setcursor(1)

    showtime()

    keyboard chr(0)

    L_showcurs()

    return .T.

else

    setcolor(CLR)

    return .F.

endif

return .T.

Функция перевода числовой величины в строку «Сумма прописью»

Function NUMSTRING

parameters NUM1,CODE_CUR

local MR:={.T.,.T.,.F.,.T.},CL,;

MG:={{""          ,""         ,""      ,"" },;

     {"миллиард"  ,"миллион"  ,"тысяча","" },;

     {"миллиарда" ,"миллиона" ,"тысячи","" },;

     {"миллиардов","миллионов","тысяч" ,"" }},;

     SO:=0,DE:=0,ED:=0,TX,NUM,OBL

OBL=select()

if pcount()<2

    CODE_CUR=0

endif

use (DATROAD+"Currency") index (DATROAD+"Currency") alias CUR new

seek CODE_CUR

if found()

    /*MG[1,4]=alltrim(LONG_NAME0)

    MG[2,4]=alltrim(LONG_NAME0)

    MG[3,4]=alltrim(LONG_NAME1)

    MG[4,4]=alltrim(LONG_NAME2)*/

    /*if upperR(substr(trim(LONG_NAME0),len(trim(LONG_NAME0)),1))="А"*/

        MR:={.T.,.T.,.F.,.T.}

    /*endif*/

endif

Man_Woman=.F.

STROK=""

GSTROK=""

for I=12 to 3 step -3

    NUM=val(substr(str(NUM1,12),I-2,3))

    Man_Woman=MR[I/3]

    SO=int(NUM/100)

    DE=int((NUM-SO*100)/10)

    ED=NUM-SO*100-DE*10

    TX=4

    do case

      case ED=1

        TX=2

      case ED>1.and.ED<=4

        TX=3

    otherwise

        TX=4

    endcase

    if (DE*10+ED>4.and.DE*10+ED<21)

        TX=4

    endif

    TITLE=GetShort_Name(CODE_CUR)

    SUBTITLE=MG[TX,I/3]

    STROK=num2str(NUM,Man_Woman,SO,DE,ED)

    GSTROK=iif(!empty(STROK).or.I=12,STROK+" "+SUBTITLE,"")+;

    " "+GSTROK

next

GSTROK=alltrim(strtran(GSTROK,"  "," "))

GSTROK=upperR(substr(GSTROK,1,1))+substr(GSTROK,2)

use

select(OBL)

return GSTROK+" "+TITLE

Функция построения строки «Суммы прописью»

Function NUM2STR

PARAMETERS in_num,Man_Woman,SO,DE,ED

local UNITS[37]

UNITS[ 1] = ""

UNITS[ 2] = iif(Man_Woman,"один","одна")

UNITS[ 3] = iif(Man_Woman,"два","две")

UNITS[ 4] = "три"

UNITS[ 5] = "четыре"

UNITS[ 6] = "пять"

UNITS[ 7] = "шесть"

UNITS[ 8] = "семь"

UNITS[ 9] = "восемь"

UNITS[10] = "девять"

UNITS[11] = "десять"

UNITS[12] = "одиннадцать"

UNITS[13] = "двенадцать"

UNITS[14] = "тринадцать"

UNITS[15] = "четырнадцать"

UNITS[16] = "пятнадцать"

UNITS[17] = "шестнадцать"

UNITS[18] = "семнадцать"

UNITS[19] = "восемнадцать"

UNITS[20] = "девятнадцать"

UNITS[21] = "двадцать"

UNITS[22] = "тридцать"

UNITS[23] = "сорок"

UNITS[24] = "пятьдесят"

UNITS[25] = "шестьдесят"

UNITS[26] = "семьдесят"

UNITS[27] = "восемьдесят"

UNITS[28] = "девяносто"

UNITS[29] = "сто"

UNITS[30] = "двести"

UNITS[31] = "триста"

UNITS[32] = "четыреста"

UNITS[33] = "пятьсот"

UNITS[34] = "шестьсот"

UNITS[35] = "семьсот"

UNITS[36] = "восемьсот"

UNITS[37] = "девятьсот"

STRING = ""

IN_NUM = int(IN_NUM)

SOT=int(In_NUM/100)

DES=int((In_NUM-SOT*100)/10)

EDN=In_NUM-SOT*100-DES*10

IN_STRING = ltrim(str(IN_NUM))

SCAN_ED=.T.

if SOT>0

    STRING=STRING+UNITS[SOT+28]+" "

endif

if DES>1

    STRING=STRING+UNITS[DES+19]+" "

elseif DES=1

    STRING=STRING+UNITS[DES*10+EDN+1]+" "

    SCAN_ED=.F.

endif

if SCAN_ED

    STRING=STRING+UNITS[EDN+1]

endif

return STRING

Функция получения псевдонима валюты

Function GetShort_Name(CODE)

local OBL,MR,ST:="    "

OBL=select()

select CUR

MR=recno()

seek CODE

if found()

    ST=SHORT_NAME

endif

goto MR

select(OBL)

return ST

Основные функции и процедуры

Головной модуль программы

Function MAIN

#Include "Box.ch"

setcursor(0)

if .not.file("V.mem").or..not.file("C.mem")

set curs on

    return 0    // Аварийный выход при отсутствии файлов глобальных переменных

else

                   // Объявление глобальных переменных и считывание их из файла

    public AT_M0_F,AT_M0_N,AT_M0_S,AT_M0_U,AT_M1_F,AT_M1_N,AT_M1_S

    public AT_M1_U,AT_M2_F,AT_M2_N,AT_M2_S,AT_M2_U,AT_E_F,AT_E_N,AT_E_S

    public AT_E_U,AT_G_F,AT_G_N,AT_G_S,AT_G_U,AT_S_F,AT_S_N,AT_S_S,AT_S_U

    public AT_N_I,AT_N_S

    CLFON="N"

    clear

    restore from c.mem addi

endif

                   // Глобальные установки

setcursor(0)

set date german

set century on

set wrap on

set dele off

set bell off

set confirm on

set scoreboard off

set message to 24 center

restore from v.mem addi

public PAROL,DATROAD,USERDSK,PAGELEN,ETLF,UKZGL,UKTXT,ARCROAD

public ZEROPRINT,FPREOBR,PAGESIZ,DUBLDSK,KEYCR,C_H

public FM,FINSERT,CUR_STYLE,M__EN,MDATE,SETNUM

restore from D addi

store 0 to CROW,CCOL

KEYCR="#4_Ж;V*"

PAROL   = uncrpt(KEYCR,P__AROL)

DATROAD = D__ATROAD

ARCROAD = A__RCROAD

DUBLDSK = D__UBLDSK

USERDSK = U__SERDSK

PAGELEN = P__AGELEN

PAGESIZ = P__AGESIZ

ETLF    = E__TLF

UKZGL   = U__KZGL

UKTXT   = U__KTXT

SETNUM  = S__ETNUM

FPREOBR = .F.

release P__AROL,D__ATROAD,U__SERDSK,S__ETNUM,;

        P__AGELEN,P__AGESIZ,E__TLF,U__KZGL,U__KTXT,D__UBLDSK,A__RCROAD

MEN=1

MEN1=1

FINSERT=.F.

CUR_STYLE=1

set key 22 to fins()

declare MMS[ 6],MOP[ 6],MCO[ 6],MNT[12],MHP[10]

       // Массив этикеток строки подсказки

MHP[ 1]="Помощь"

MHP[ 2]="Добав."

MHP[ 3]="Список"

MHP[ 4]="Поиск "

MHP[ 5]="Фильтр"

MHP[ 6]="Сумма "

MHP[ 7]="Печать"

MHP[ 8]="Удал. "

MHP[ 9]="Запись"

MHP[10]="Выход "

       // Массив опций главного меню системы          

MOP[ 1]=" ~О~перации "

MOP[ 2]=" ~С~правочники "

MOP[ 3]=" о~Т~четы "

MOP[ 4]=" ~А~рхив "

MOP[ 5]=" ~Р~азное "

MOP[ 6]=" ~В~ыход "

       // Массив координат главного меню системы   

MCO[ 1]=2

MCO[ 2]=12

MCO[ 3]=25

MCO[ 4]=33

MCO[ 5]=40

MCO[ 6]=48

       // Массив строк помощи

MMS[ 1]="Оформление покупки/продажи валюты"

MMS[ 2]="     Ввод справочных данных      "

MMS[ 3]="         Вывод отчетов           "

MMS[ 4]="       Работа с архивом          "

MMS[ 5]="      Настройки  системы         "

MMS[ 6]="        Выход в MS DOS           "

       // Массив названий месяцев

MNT[ 1]="Января"

MNT[ 2]="Февраля"

MNT[ 3]="Марта"

MNT[ 4]="Апреля"

MNT[ 5]="Мая"

MNT[ 6]="Июня"

MNT[ 7]="Июля"

MNT[ 8]="Августа"

MNT[ 9]="Сентября"

MNT[10]="Октября"

MNT[11]="Ноября"

MNT[12]="Декабря"

setcolor(At_M0_F)

@ 00,00,24,79 BOX "   -   --"

setcolor(At_M0_N)

@ 00,01 SAY "Обменный пункт банка"

       // Проверка пароля пользователя (3 попытки)

for II=1 to 3

    setcursor(CUR_STYLE)

    setcolor(AT_E_F)

    _open_n(07,22,11,57)

    setcolor(AT_E_N)

    _saystr(09,24,"Введите Ваш пароль :")

    KL=0

    TST=""

    do while .T.

        KL=inkey(0)

        do case

          case KL=8

            TST=substr(TST,1,len(TST)-1)

          case KL=13

            exit

          otherwise

            TST=TST+chr(KL)

        endcase

        @ 09,45 SAY repl(" ",len(TST)+1)

        @ 09,45 SAY repl("»,len(TST))

        if len(TST)=10

            exit

        endif

    enddo

    if TST=PAROL

        @ 09,24 SAY «OK                                     «

        exit

    else

        @ 09,24 SAY «Пароль неправильный    «

        tone(1500,2)

        tone(1700,2)

    endif

next

if TST<>PAROL

    setcolor("W/N")

    clear screen

    return

endif

restore screen

       // Настройка принтера

if M__EN=2

    set printer to BUFFER.PRN

else

    M__EN=1

    set printer to

endif

setcursor(0)

FM=.F.

setcolor(At_M0_F)

@ 00,01 SAY space(80)

do while .T.               // Главное меню системы

    if FM

        setcolor(At_M0_F)

        @ 00,00,24,79 BOX "   -   --"

        @ 00,01 SAY space(80)

        FM=.F.

    endif

    setcolor("+W/B,+GR/R,,,+BG/B")

    MEN=selopt(MEN,MOP,MCO,MMS,0,.F.,.T.,At_M0_S,At_M0_U)

    if lastkey()=27.or.MEN=0

        if doors()

            exit

        else

            loop

        endif

    endif

    MSCR=savescreen(0,0,24,79)

    do case

      case MEN=1

          operation()

      case MEN=2

          dictonary()

      case MEN=3

          report()

      case MEN=4

          arch()

      case MEN=5

          system()   

      case MEN=6

          if doors() 

              exit

          endif

    endcase

    restscreen(0,0,24,79,MSCR)

enddo

setcolor()

release all

return 0

Функция вызова меню «Операции»

Function OPERATION

local M1[5],M2[5],M3[5],MENU

M1[1]=" ~П~окупка валюты     "

M1[2]=" п~Р~одажа валюты     "

M1[3]=" ~К~онверсия валюты   "

M2[1]=2

M2[2]=3

M2[3]=4

MENU=1

_open_n(1,0,7,23,B_SINGLE+" ",AT_M1_F)

do while .T.

    MENU=selopt(MENU,M1,M2,M3,2,.T.,.F.,AT_M1_S,AT_M1_U)

    if MENU=0.or.lastkey()=27

        clear type

        exit

    endif

    operCurrency(MENU)

enddo

return 0

Функция вызова меню ведения справочников

Function DICTONARY

local M1[4],M2[4],M3[4],MENU,CL

M1[1]=" ~С~писок валют      "

M1[2]=" ~К~урсоы валют      "

M1[3]=" коды ~Ц~енностей    "

M1[4]=" Коды ~Д~окументов   "

M2[1]=2

M2[2]=3

M2[3]=4

M2[4]=5

MENU=1

_open_n(1,10,6,32,B_SINGLE+" ",AT_M1_F)

do while .T.

    MENU=selopt(MENU,M1,M2,M3,12,.T.,.F.,AT_M1_S,AT_M1_U)

    if MENU=0.or.lastkey()=27

        clear type

        exit

    endif

    dictonEdit(MENU)

enddo

clear type

return 0

Функция вызова меню «Отчеты»

Function REPORT

local M1[4],M2[4],M3[4],MENU,CL

M1[1]=" Реестр по по~К~упке валюты             "

M1[2]=" Реестр по ~П~родаже валюты             "

M1[3]=" Реестр по ~К~онверсии валюты         "

M1[4]=" справка об ~О~статках наличной валюты  "

M2[1]=2

M2[2]=3

M2[3]=4

M2[4]=5

MENU=1

_open_n(1,23,7,64,B_SINGLE+" ",AT_M1_F)

do while .T.

    MENU=selopt(MENU,M1,M2,M3,25,.T.,.F.,AT_M1_S,AT_M1_U)

    if MENU=0.or.lastkey()=27

        clear type

        exit

    endif

    reportOut(MENU)

enddo

clear type

return 0

Функция вызова меню «Разное»

Function SYSTEM

private M1,M2,M3,MENU

declare M1[4],M2[4],M3[4]

M1[1]=" ~У~становки       "

M1[2]=" ~К~опия данных    "

M1[3]=" ~И~ндексные файлы "

M1[4]=" ~С~чета банка     "

M2[1]=2

M2[2]=3

M2[3]=4

M2[4]=5

MENU=1

SCRS=savescreen(0,0,24,79)

_open_n(1,38,6,58,B_SINGLE+" ",AT_M1_F)

do while .T.

    MENU=selopt(MENU,M1,M2,M3,40,.T.,.F.,AT_M1_S,AT_M1_U)

    if MENU=0.or.lastkey()=27

        clear type

        exit

    endif

    do case

        case MENU=1

            setupm(M1[MENU])

        case MENU=2

            dublicat(M1[MENU])

        case MENU=3

        case MENU=4

            GetAccount()

    endcase

enddo

restscreen(0,0,24,79,SCRS)

clear type

return 0

Функция вызова меню «Установки»

Function SETUPM

parameters OPT

private SCR,M1[4],M2[4],M3[4],MENU,OPT,A__RCROAD,P__AROL,D__ATROAD,D__UBLDSK,U__SERDSK,P__AGELEN,P__AGESIZ,E__TLF,U__KZGL,U__KTXT,S__ETNUM,FMOD

ROW=row()

M1[1]=" ~П~ароль             "

M1[2]=" пути к ~Д~анным      "

M1[3]=" ~У~становки принтера "

M1[4]=" ~Ц~вета              "

M2[1]=ROW+2

M2[2]=ROW+3

M2[3]=ROW+4

M2[4]=ROW+5

MENU=1

FMOD=0

SCR=savescreen(0,0,24,79)

do while .T.

    _open_n(ROW+1,38,ROW+6,61,B_SINGLE+" ",AT_M2_F)

    MENU=selopt(MENU,M1,M2,M3,40,.T.,.F.,AT_M2_S,AT_M2_U)

    if MENU=0.or.lastkey()=27

        clear type

        exit

    endif

    if MENU=4

        FM=.T.

    endif

    save screen to SESCR

    FMOD=setup(MENU)

    restore screen from SESCR

enddo

restscreen(0,0,24,79,SCR)

if FMOD=1

    P__AROL   = crpt(KEYCR,trim(P__AROL))

    D__ATROAD = trim(D__ATROAD)

    A__RCROAD = trim(A__RCROAD)

    U__KZGL   = trim(U__KZGL)

    U__KTXT   = trim(U__KTXT)

    if M__EN=2

        set Printer to BUFFER.PRN

    else

        M__EN=1

        set Printer to

    endif

    if Z__PR=2

        ZEROPRINT=.F.

    else

        Z__PR=1

        ZEROPRINT=.T.

    endif

    save all like ?__* to v

    PAROL   =uncrpt(KEYCR,P__AROL)

    DATROAD =D__ATROAD

    ARCROAD =A__RCROAD

    DUBLDSK =D__UBLDSK

    USERDSK =U__SERDSK

    PAGELEN =P__AGELEN

    PAGESIZ =P__AGESIZ

    ETLF    =E__TLF

    UKZGL   =U__KZGL

    SETNUM  =S__ETNUM

    UKTXT   =U__KTXT

endif

clear type

return 0

Функция вызова меню «Копия данных»

Function DUBLICAT

parameters OPT

private M1,M2,M3,MENU,OPT,DSCR,ROW

ROW=row()

declare M1[2],M2[2],M3[2]

M1[1]=" ~С~охранение данных     "

M1[2]=" ~В~осстановление данных "

M2[1]=ROW+2

M2[2]=ROW+3

MENU=1

popmenu(ROW,38,ROW+5,64,OPT,2,AT_M2_F)

do while .T.

    MENU=selopt(MENU,M1,M2,M3,40,.T.,.F.,AT_M2_S,AT_M2_U)

    if MENU=0.or.lastkey()=27

        clear type

        exit

    endif

    save screen to DSCR

    do case

        case MENU=1

            OPT=M1[MENU]

            savedata(OPT)

        case MENU=2

            OPT=M1[MENU]

            restdata(OPT)

    endcase

    restore screen from DSCR

enddo

clear type

return 0

Функция - селектор операций

Function OPERCURRENCY

#Include "Inkey.ch"

#Include "Box.ch"

parameters N_OPER

do case

  case N_OPER=1

      ByeCurrency()

  case N_OPER=2

      SaleCurrency()

  case N_OPER=3

       ConvertCurrency()

endcase

return 0

Функция регистрации покупки валюты

Function ByeCurrency

local SCR

use (DATROAD+"Document") index (DATROAD+"Document") alias DOC new

SCR=savescreen(1,0,23,61)

CLR=setcolor(AT_G_F)

_open_n(1,0,20,59,B_SINGLE+" ",AT_G_F)

@ 08,0 say "+----------------------------------------------------------+"

@ 14,0 say "+----------------------------------------------------------+"

setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U)

set key K_F3 to getcode()

_nort("1010000001")

FINIT=.T.

do while .T.

    if FINIT

        SER    =space(2)

        NUM    =0

        FIO    =space(35)

        DOC    =space(10)

        CDOC   =0

        DSER   =space(10)

        DNUM   =0

        REZ    =space(1)

        NREZ   =space(1)

        BCODC  =10

        BCODCUR=2

        BSUM   =0

        SCODC  =0

        SCODCUR=0

        SSUM   =0

        SSUMS=""

        BSUMS=""

        @ 12,2 say space(57)

        @ 13,2 say space(57)

        @ 18,2 say space(57)

        @ 19,2 say space(57)

        setcolor(AT_G_U)

        @ 11,8 say 0 picture "999999999999"

    endif

    setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U)

    @ 02,17 say "СПРАВКА" get SER picture "XX" valid !empty(SER)

    @ 02,28 say "№" get NUM picture "9999999" valid !empty(NUM)

    @ 03,15 say str(day(date()),2)+" "+MNT[month(date())]+;

                   " "+str(year(date()),4)

    @ 04,02 say "Выдана" get FIO picture "@S30" valid !empty(FIO)

    @ 05,02 say "Предъявлен" get CDOC picture "9999"

    @ 05,29 say "серия" get DSER picture "XXXXXXXXXX"

    @ 05,46 say "№" get DNUM picture "9999999999"

    @ 06,02 say "Резидент [ ]"

    @ 06,12 get REZ Picture "L"

    @ 08,02 say "ПОЛУЧЕНО КЛИЕНТОМ:"

    @ 09,02 say "Код ценности" get BCODC   picture "9999"

    @ 10,02 say "Код валюты  " get BCODCUR picture "9999"

    @ 11,02 say "Сумма"

    @ 14,02 say "ПРИНЯТО ОТ КЛИЕНТА:"

    @ 15,02 say "Код ценности" get SCODC   picture "9999"

    @ 16,02 say "Код валюты  " get SCODCUR picture "9999"

    @ 17,02 say "Сумма" get SSUM picture "999999999999" ;

  valid saysale(SSUM,18,2,52,AT_G_U,@SSUMS,SCODCUR)

    setcursor(CUR_STYLE)

    read

    setcursor(0)

    if lastkey()=K_ESC

        exit

    endif

    if _err(06,40,"Данные введены правильно?","",""," ~Д~а "," ~Н~ет ","")=1

        append blank

        replace field->SER_       with SER    ,;

                field->NUM_       with NUM    ,;

                field->FIO_       with FIO    ,;

                field->DOC_       with DOC    ,;

                field->DSER_      with DSER   ,;

                field->DNUM_      with DNUM   ,;

                field->REZ_       with !empty(REZ),;

                field->BCODC_     with BCODC  ,;

                field->BCODCUR_   with BCODCUR,;

                field->BSUM_      with BSUM   ,;

                field->SCODC_     with SCODC  ,;

                field->SCODCUR_   with SCODCUR,;

                field->SSUM_      with SSUM,;

                field->DATE_      with date(),;

                field->OPERATION_ with 1

        commit

        if _err(06,40,"Печатать справку?","",""," ~Д~а "," ~Н~ет ","")=1

//          printspr()

        endif

        FINIT=.T.

        loop

    else

        FINIT=.F.

    endif

enddo

_nort()

set key K_F3 to

restscreen(1,0,23,61,SCR)

dbcloseall()

return 0

Функция регистрации продажи валюты

Function SaleCurrency

local SCR

use (DATROAD+"Document") index (DATROAD+"Document") alias DOC new

SCR=savescreen(1,0,23,61)

CLR=setcolor(AT_G_F)

_open_n(1,0,20,59,B_SINGLE+" ",AT_G_F)

@ 08,0 say "+----------------------------------------------------------+"

@ 14,0 say "+----------------------------------------------------------+"

setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U)

set key K_F3 to getcode()

_nort("1010000001")

FINIT=.T.

do while .T.

    if FINIT

        SER    =space(2)

        NUM    =0

        FIO    =space(35)

        DOC    =space(10)

        DSER   =space(10)

        DNUM   =0

        REZ    =space(1)

        NREZ   =space(1)

        CDOC   =0

        BCODC  =0

        BCODCUR=0

        BSUM   =0

        SCODC  =0

        SCODCUR=0

        SSUM   =0

        SSUMS=""

        BSUMS=""

        @ 12,2 say space(57)

        @ 13,2 say space(57)

        @ 18,2 say space(57)

        @ 19,2 say space(57)

        setcolor(AT_G_U)

        @ 11,8 say 0 picture "999999999999"

    endif

    setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U)

    @ 02,17 say "СПРАВКА" get SER picture "XX" valid !empty(SER)

    @ 02,28 say "№" get NUM picture "9999999" valid !empty(NUM)

    @ 03,15 say str(day(date()),2)+" "+MNT[month(date())]+" "+str(year(date()),4)

    @ 04,02 say "Выдана" get FIO picture "@S30" valid !empty(FIO)

    @ 05,02 say "Предъявлен" get CDOC picture "9999"

    @ 05,29 say "серия" get DSER picture "XXXXXXXXXX"

    @ 05,46 say "№" get DNUM picture "9999999999"

    @ 06,02 say "Резидент [ ]"

    @ 06,12 get REZ Picture "L"

    @ 08,02 say "ПРИНЯТО ОТ КЛИЕНТА:"

    @ 09,02 say "Код ценности" get SCODC   picture "9999"

    @ 10,02 say "Код валюты  " get SCODCUR picture "9999"

    @ 11,02 say "Сумма"

    @ 14,02 say "ПОЛУЧЕНО КЛИЕНТОМ:"

    @ 15,02 say "Код ценности" get BCODC   picture "9999"

    @ 16,02 say "Код валюты  " get BCODCUR picture "9999"

    @ 17,02 say "Сумма" get BSUM picture "999999999999" valid saybye(BSUM,17,2,52,AT_G_U,@BSUMS,BCODCUR)

    setcursor(CUR_STYLE)

    read

    setcursor(0)

    if lastkey()=K_ESC

        exit

    endif

    if _err(06,40,"Данные введены правильно?","",""," ~Д~а "," ~Н~ет ","")=1

        append blank

        replace field->SER_       with SER    ,;

                field->NUM_       with NUM    ,;

                field->FIO_       with FIO    ,;

                field->DOC_       with DOC    ,;

                field->DSER_      with DSER   ,;

                field->DNUM_      with DNUM   ,;

                field->REZ_       with !empty(REZ),;

                field->BCODC_     with BCODC  ,;

                field->BCODCUR_   with BCODCUR,;

                field->BSUM_      with BSUM   ,;

                field->SCODC_     with SCODC  ,;

                field->SCODCUR_   with SCODCUR,;

                field->SSUM_      with SSUM,;

                field->DATE_      with date(),;

                field->OPERATION_ with 1

        commit

        if _err(06,40,"Печатать справку?","",""," ~Д~а "," ~Н~ет ","")=1

//          printspr()

        endif

        FINIT=.T.

        loop

    else

        FINIT=.F.

    endif

enddo

_nort()

set key K_F3 to

restscreen(1,0,23,56,SCR)

dbcloseall()

return 0

Функция регистрации конверсии валюты

Function ConvertCurrency

local SCR

use (DATROAD+"Document") index (DATROAD+"Document") alias DOC new

SCR=savescreen(1,0,23,61)

CLR=setcolor(AT_G_F)

_open_n(1,0,20,59,B_SINGLE+" ",AT_G_F)

@ 08,0 say "+----------------------------------------------------------+"

@ 14,0 say "+----------------------------------------------------------+"

setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U)

set key K_F3 to getcode()

_nort("1010000001")

FINIT=.T.

do while .T.

    if FINIT

        SER    =space(2)

        NUM    =0

        FIO    =space(35)

        DOC    =space(10)

        DSER   =space(10)

        DNUM   =0

        REZ    =space(1)

        NREZ   =space(1)

        CDOC   =0

        BCODC  =0

        BCODCUR=0

        BSUM   =0

        SCODC  =0

        SCODCUR=0

        SSUM   =0

        SSUMS=""

        BSUMS=""

        @ 12,2 say space(57)

        @ 13,2 say space(57)

        @ 18,2 say space(57)

        @ 19,2 say space(57)

        setcolor(AT_G_U)

        @ 11,8 say 0 picture "999999999999"

    endif

    setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U)

    @ 02,17 say "СПРАВКА" get SER picture "XX" valid !empty(SER)

    @ 02,28 say "№" get NUM picture "9999999" valid !empty(NUM)

    @ 03,15 say str(day(date()),2)+" "+MNT[month(date())]+" "+str(year(date()),4)

    @ 04,02 say "Выдана" get FIO picture "@S30" valid !empty(FIO)

    @ 05,02 say "Предъявлен" get CDOC picture "9999"

    @ 05,29 say "серия" get DSER picture "XXXXXXXXXX"

    @ 05,46 say "№" get DNUM picture "9999999999"

    @ 06,02 say "Резидент [ ]"

    @ 06,12 get REZ Picture "L"

    @ 08,02 say "ПРИНЯТО ОТ КЛИЕНТА:"

    @ 09,02 say "Код ценности" get SCODC   picture "9999"

    @ 10,02 say "Код валюты  " get SCODCUR picture "9999"

    @ 11,02 say "Сумма"

    @ 14,02 say "ПОЛУЧЕНО КЛИЕНТОМ:"

    @ 15,02 say "Код ценности" get BCODC   picture "9999"

    @ 16,02 say "Код валюты  " get BCODCUR picture "9999"

    @ 17,02 say "Сумма" get BSUM picture "999999999999" valid saybye(BSUM,17,2,52,AT_G_U,@BSUMS,BCODCUR)

    setcursor(CUR_STYLE)

    read

    setcursor(0)

    if lastkey()=K_ESC

        exit

    endif

    if _err(06,40,"Данные введены правильно?","",""," ~Д~а "," ~Н~ет ","")=1

        append blank

        replace field->SER_       with SER    ,;

                field->NUM_       with NUM    ,;

                field->FIO_       with FIO    ,;

                field->DOC_       with DOC    ,;

                field->DSER_      with DSER   ,;

                field->DNUM_      with DNUM   ,;

                field->REZ_       with !empty(REZ),;

                field->BCODC_     with BCODC  ,;

                field->BCODCUR_   with BCODCUR,;

                field->BSUM_      with BSUM   ,;

                field->SCODC_     with SCODC  ,;

                field->SCODCUR_   with SCODCUR,;

                field->SSUM_      with SSUM,;

                field->DATE_      with date(),;

                field->OPERATION_ with 1

        commit

        if _err(06,40,"Печатать справку?","",""," ~Д~а "," ~Н~ет ","")=1

//          printspr()

        endif

        FINIT=.T.

        loop

    else

        FINIT=.F.

    endif

enddo

_nort()

set key K_F3 to

restscreen(1,0,23,56,SCR)

dbcloseall()

return 0

Функция - определитель текущего поля для получения кода и наименования объекта из справочника

Function GETCODE

local CL

AKTIV=getactive()

RS=row()

CS=col()+5

do case

  case AKTIV:name="BCODCUR"

    S=incod(1,@BCODCUR)

  case AKTIV:name="BCODC"

    S=incod(3,@BCODC)

  case AKTIV:name="SCODCUR"

    S=incod(1,@SCODCUR)

  case AKTIV:name="SCODC"

    S=incod(3,@SCODC)

  case AKTIV:name="CDOC"

    S=incod(4,@CDOC)

  otherwise

    S=""

endcase

CL=setcolor(AT_G_N)

@ RS,CS say substr(S,1,30)

if !empty(S)

    keyboard chr(13)

endif

setcolor(CL)

return .T.

Функция вывода суммы покупки прописью

Function SAYB

parameters NUM,Y,X,L,C,S,CC

local CL

S=numstring(NUM,CC)

CL=setcolor(C)

@ Y,X say padr(substr(S,1,L),L)

@ Y+1,2 say padr(substr(S,L+1,57),57)

setcolor(AT_G_U)

@ Y-1,8 say NUM picture "999999999999"

setcolor(CL)

return .T.

Функция вывода суммы продажи прописью

Function SAYS

parameters NUM,Y,X,L,C,S,CC

local CL

S=numstring(NUM,CC)

CL=setcolor(C)

@ Y,X say padr(substr(S,1,L),L)

@ Y+1,2 say padr(substr(S,L+1,57),57)

setcolor(AT_G_U)

@ Y-1,8 say NUM picture "999999999999"

setcolor(CL)

return .T.

Функция вычисления суммы операции покупки

Function SAYBYE

parameters NUM,Y,X,L,C,S,CC

local CL,OBL,RESULT

RESULT=.F.

OBl=select()

use (DATROAD+"currency") index (DATROAD+"currency") new

seek CC

if found()

    BSUM=KURS*NUM

    use

    S=numstring(NUM,CC)

    CL=setcolor(C)

    @ Y,X say padr(substr(S,1,L),L)

    @ Y+1,2 say padr(substr(S,L+1,57),57)

    says(SSUM,12,2,57,AT_G_U,@SSUMS,SCODCUR)

    RESULT=.T.

else

    use

endif

setcolor(CL)

select(OBL)

return RESULT

Функция вычисления суммы операции продажи

Function SAYSALE

parameters NUM,Y,X,L,C,S,CC

local CL,OBL,RESULT

RESULT=.F.

OBl=select()

use (DATROAD+"currency") index (DATROAD+"currency") new

seek CC

if found()

    BSUM=KURS*NUM

    use

    S=numstring(NUM,CC)

    CL=setcolor(C)

    @ Y,X say padr(substr(S,1,L),L)

    @ Y+1,2 say padr(substr(S,L+1,57),57)

    sayb(BSUM,12,2,57,AT_G_U,@BSUMS,BCODCUR)

    RESULT=.T.

else

    use

endif

setcolor(CL)

select(OBL)

return RESULT

ФУНКЦИЯ ВЫВОДА списка документов дня

Function Docrep

local SCR

use (DATROAD+"Currency") index (DATROAD+"Currency") alias CUR new

use (DATROAD+"Document") index (DATROAD+"Document") alias DOC new

set relation to BCODCUR_ into CUR

SCR=savescreen(1,0,23,79)

_open_n(1,0,22,77,B_SINGLE+" ",AT_S_F)

_nort("1000001001")

declare MF[5],MZ[5]

MF[1]={|| SER_+str(NUM_,9)}

MF[2]={|| FIO_   }

MF[3]={|| iif(REZ_,"Р","Н")}

MF[4]={|| CUR->SHORT_NAME+" "+str(BSUM_)}

MF[5]={|| getShort_Name(SCODCUR_)+" "+str(SSUM_)}

MZ[1]="Справка"

MZ[2]="Фамилия Имя Отчество"

MZ[3]="Р/Н"

MZ[4]="Выдано"

MZ[5]="Принято"

TERM=" Проведенные документы дня "

setcolor(AT_M1_S)

@ 01,(70-len(TERM))/2 SAY TERM

setcolor(AT_S_N+","+AT_S_S+",,,"+AT_S_U)

clear type

oBrow := TBrowseDB(2,1,21,76)

oBrow:headSep := "=T="

oBrow:colSep  := " ¦ "

for i := 1 TO len(MF)

    oBrow:addColumn(TBColumnNew(MZ[i], MF[i]))

next

while (!oBrow:stabilize()) ; end

lKeyWaiting := .F.

lBrowse     := .T.

do while (lBrowse)

    if (!lKeyWaiting)

        do while (!oBrow:stabilize())

            // Прервать стабилизацию, если нажата клавиша

            if ((nKey := Inkey()) != 0)

                lKeyWaiting := .T.

                exit

            endif

        enddo

    endif

    // Если нет нажатия, то ждать его

    if (!lKeyWaiting)

        nKey := Inkey(0)

    endif

    do case

        case (nKey == K_DOWN)

            oBrow:down()

        case (nKey == K_UP)

            oBrow:up()

        case (nKey == K_PGDN)

            oBrow:pageDown()

        case (nKey == K_PGUP)

            oBrow:pageUp()

        case (nKey == K_CTRL_PGUP)

            oBrow:goTop()

        case (nKey == K_CTRL_PGDN)

            oBrow:goBottom()

        case (nKey == K_RIGHT)

            oBrow:right()

        case (nKey == K_LEFT)

            oBrow:left()

        case (nKey == K_HOME)

            oBrow:home()

        case (nKey == K_END)

            oBrow:end()

        case (nKey == K_CTRL_LEFT)

            oBrow:panLeft()

        case (nKey == K_CTRL_RIGHT)

            oBrow:panRight()

        case (nKey == K_CTRL_HOME)

            oBrow:panHome()

        case (nKey == K_CTRL_END)

            oBrow:panEnd()

        case (nKey == K_F7)

            // printspr()

        case (nKey == K_ESC).or.(nKey == K_F10)

            lBrowse := .F.

    endcase

    lKeyWaiting := .F.

enddo

restscreen(1,0,23,79,SCR)

dbcloseall()

_nort()

return 0

ФУНКЦИЯ ЗАКРЫТИЯ ОПЕРАЦИОННОГО ДНЯ

Function CloseDay()

if _err(07,05,"Вы действительно желаете закрыть","операционный день ?",""," Да "," Нет ","")<>1

    return 0

endif

ArBase=strtran(str(day(MDATE),2)+str(month(MDATE),2)+substr(str(year(MDATE),4),3,2)," ","0")

use (DATROAD+"Operatio")

copy to (ARCROAD+"Op"+ArBase)

delete all

pack

use (DATROAD+"Document")

copy to (ARCROAD+"Do"+ArBase)

delete all

pack

use (DATROAD+"Currency")

copy to (ARCROAD+"Cu"+ArBase)

use (DATROAD+"Kurses")

copy to (ARCROAD+"Ku"+ArBase)

use (DATROAD+"Codes")

copy to (ARCROAD+"Co"+ArBase)

ODATE=MDATE

SCR=savescreen(07,05,12,47)

_open_n(07,05,10,45,B_SINGLE+" ",AT_G_F)

CL=setcolor(AT_G_U)

@ 08,22 say ODATE

do while(.T.)

    setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U)

    @ 08,07 say "Текущая дата :"

    @ 09,07 say "  Новая дата :" get MDATE

    setcursor(CUR_STYLE)

    read

    setcursor(0)

    if _err(10,15,"Дата введена правильно?","",""," Да "," Нет ","")=1

        save all like MDATE to d

        exit

    endif

enddo

dbcloseall()

restscreen(07,05,12,47,SCR)

setcolor(CL)

return 0

Литература

1.     le>