Рассказы про язык FoxPro
9 октября 2003
Рубрика: Технологии.
Автор: .

pic

Часть первая, лирическая

Персональные компьютеры оказались источником и движущей силой революционных преобразований последнего времени. Оценить их (преобразования, конечно, а не компьютеры), даже просто окинуть взором — задача непосильная, огромное поле деятельности для историков и публицистов. Сейчас же хотелось бы обратить внимание на одно лишь следствие появления компьютеров в разных организациях лет 14 назад. Народ начал программировать. Технологи и конструкторы, врачи, научные работники, бухгалтеры и военнослужащие осваивали Basic, dBase, Turbo Pascal и создавали программульки, облегчающие работу. Отсутствие знаний о структурном программировании, об объектно-ориентированном программировании, о требованиях к интерфейсу и прочих заумных тонкостях компенсировалось энтузиазмом, упорством и востребованностью результата. Тем более что знания — дело наживное, а уж когда речь идет об изучении любимого предмета, то и любое соприкосновение с ним захватывающе приятно. Есть еще эффект, подмеченный психологами, — приятно даже просто нажимать на кнопки клавиатуры, не говоря уже о щелканьи мышкой по ярким ярлычкам. Поэтому вопрос о том, как писать служебную записку — от руки или в текстовом редакторе, как чертить деталь — на кульмане или в AutoCAD’e, обычно решался в пользу последнего варианта.

Самое же интересное в том, что эти все программисты-любители так и остались программистами, когда по разным причинам многим пришлось менять работу. Появились многочисленные фирмы и бесчисленные одиночки, предлагающие свои доморощенные шедевры типа «расчет зарплаты», «складской учет», «учет ГСМ», «бухгалтерия» и тому подобные. Причем их непотопляемая продукция до сих пор добросовестно работает в огромном количестве кабинетов на нетребовательных 286-х, треща матричными принтерами при печати бесконечных платежек и накладных. А программисты-любители тем временем осваивали сети и Интернет, плавно перетекая в сисадминов и веб-дизайнеров. И долго составляли костяк этого сообщества, постепенно уступая главные роли шустрым и талантливым молодым. Каждый, кто сам не прошел этот путь, обязательно припомнит нескольких знакомых, иллюстрирующих это лирическое вступление.
А сам этот чудесный процесс появления класса новых программистов во многом (если не во всем) обязан необычайно удобным программам по работе с базами данных — сначала dBase и FoxBase, потом Clipper и FoxPro.

Часть вторая, историческая

По способу установления связей между данными различают реляционную, иерархическую и сетевую модели. Реляционная модель представления данных в виде таблицы — привычный и самый быстро работающий вариант. Тем более что после работы доктора Ф. Клодда, предложившего математический аппарат для структуризации данных и управления ими, реляционная модель получила научную поддержку и разработку основных алгоритмов работы. Об этом позже, а пока рассмотрим основные вехи развития Систем управления базами данных (СУБД) в эпоху первой волны появления ПК. Обзор не просто музейно-ознакомительный — наверняка он вызовет у ветеранов теплые воспоминания при упоминании любимых когда-то программ.

Группа реляционных СУБД была представлена на рынке программных продуктов довольно широко. Это такие системы, как Paradox, R:base, Clarion, однако доминирующее положение здесь занимало семейство так называемых dBase-подобных СУБД, родоначальником которого является СУБД dBaseII, предложенная фирмой Ashton-Tate в начале 80-х годов. Система и в особенности следующие ее версии оказались настолько популярными, что появились несколько фирм-последователей, которые позаимствовали не только идеологию Ashton-Tate, но и в значительной степени ее язык. Вместе с тем предлагаемые ими системы являлись лицензионно чистыми, во многом оригинальными и часто более эффективными. В это семейство, кроме самой СУБД dBase, входят СУБД: FoxBase, Clipper, Quick Silver, DBXL, Dbfast. Три последних из перечисленных продуктов не получили широкого распространения на просторах бывшего СССР, зато первые три были популярны и даже русифицированы. Это dBaseIII plus (стала РЕБУС), FoxBase-plus («наш» КАРАТ/М) и Clipper-87 (стала СуперКом-87). В последние годы владычества DOS’a и постепенной сдачи им позиций перед появившейся Windows (речь, конечно, об Windows 95 и следующих версиях, о Windows 3.11 не стоит говорить, как об эпохе в шествии ПК, хотя до сих пор многие успешно работают и в ней) все СУБД-шники перешли на новые, ставшие необычайно популярными версии указанных выше пакетов: dBaseIV, FoxPro и Clipper-5.

Важнейшей характеристикой любой СУБД (повторим — речь идет о программах для DOS’a) является используемый в ней вид транслятора (интерпретатор, обрабатывающий команды построчно, или компилятор, создающий отдельный выполняемый файл). Для выполнения программы, написанной для интерпретатора, необходима система — среда обработки. Это замедляет работу программы, зато дает преимущества при освоении языка и при отладке программ. Из перечисленных выше СУБД dBaseIV и FoxPro являлись интерпретаторами, а Clipper — компилятором.
Фирма Ashton-Tate в свою СУБД dBaseIV внесла радикальные изменения по сравнению с предыдущей версией пакета — добавила много новых команд и функций, в том числе и язык управления запросами SQL, но пакет получился неудачным, и фирма потеряла лидирующее положение на рынке СУБД. Это явилось одной из причин поглощения ее концерном Borland. (Известном нам такими продуктами, как Turbo Basic, Borland Pascal, Delphi и Borland C++). Концерн пытался «оживить» СУБД, выпустил новую версию, но она оказалась медленной.

Первые версии системы Clipper (фирма Nantucket) были просто компиляторами к СУБД dBase. Затем она вместе со своим программным окружением превратилась в независимую и полноценную языковую среду для построения СУБД. После компиляции программ, созданных с помощью Clipper, формируются загрузочные модули типа EXE, которые дальше могут запускаться самостоятельно, без поддержки их родительской СУБД, как это имеет место в системах-интерпретаторах. Недостатком систем-компиляторов являются большие суммарные затраты времени на многократную компиляцию и сборку («линковку») исходных модулей программы при ее отладке, что очень замедляет труд разработчика.

pic

СУБД FoxPro (фирма Fox Software) обладала исключительно высокими скоростными характеристиками и в этом отношении заметно выделялась среди интерпретирующих систем. Сравнительно с dBaseIV ее скорость в несколько раз выше и не уступает скорости систем-компиляторов. Практически по всем показателям Fox-программы работают значительно быстрее Clipper-программ. (Напоминаем — речь пока о версии для DOS’a.) Набор команд и функций, предлагаемых разработчиками FoxPro, по мощи и гибкости отвечает любым требованиям к представлению и обработке данных. Может быть реализован максимально удобный и эффективный пользовательский интерфейс. В FoxPro поддерживаются разнообразные всплывающие и многоуровневые меню, работа с окнами и мышью, реализованы функции низкоуровневого доступа к файлам, управление цветами, настройками принтера, данные могут быть представлены в виде «электронных таблиц» и много еще приятностей и удобностей. В «довиндовскую» эпоху FoxPro был самой быстрой, самой удобной и самой мощной СУБД для компьютеров стандарта IBM PC.
Переломными в коммерческой судьбе dBase-СУБД оказались 1991-1992 годы. Фирмы-разработчики систем dBase, Clipper и FoxPro слились с крупными концернами-изготовителями программной продукции — соответственно Borland, Computer Associated (хорошо известная у нас по электронным таблицам Supercalc) и Microsoft. Причем для фирм Ashton-Tate и Nantucket этот шаг был вынужденным ввиду затруднений при распространении пакетов dBaseIV и Cipper-5 и напряженного финансового положения. В случае с Fox Software ситуация обратная. Компания Microsoft пошла на приобретение Fox Software, учитывая высокий рейтинг и перспективность СУБД FoxPro. В 1993 году продукт уже назывался Microsoft FoxPro, вышли сразу две версии 2.5 — для DOS’a (самая удачная, удобная, быстрая и приятная) и для набирающей силу оболочки Windows 3.11 c графическим интерфейсом, поддержкой векторных шрифтов и прочими известными нововведениями. От слияния двух «брэндов» выиграли в первую очередь разработчики, так как Microsoft, опровергая появившиеся опасения о прекращении поддержки FoxPro, выпустила в 1996 году на редкость удачную пятую версию Microsoft Visual FoxPro. А следующая, шестая, версия любимого многими средства разработки СУБД была включена в «главный инструментарий» разработчиков приложений — пакет Visual Studio 98 наряду с Visual Basic 6.0 и Visual C++ 6.0. Последняя на данный момент, седьмая, версия включена в инструментарий программиста Studio.net.

Как бы ни ругали безответственные журналисты редмондский гигант, мы должны признать, что по удобству работы продукция Билла Гейтса намного опережает творения других фирм-разработчиков ПО. Поэтому и FoxPro, слившись с лидером, приобрел приятный удобный интерфейс, привычный и знакомый по другим приложениям Microsoft. Заметим в скобках, что позже такое же превращение произошло с популярным пакетом деловой графики Visio — он был куплен гигантом, проявляющим чутье на перспективные направления, в результате чего появился необычайно удобный продукт «Microsoft Visio».

Интересна также динамика представления FoxPro в Интернете. В 1998 году я впервые получил доступ к Сети и тогда же разбирался с появившейся шестой версией FoxPro. Так вот — в русскоязычном секторе Интернета не было ни одного сайта, посвященного FoxPro. Поиск выдавал адреса клубов FoxPro в Канаде, Общества любителей FoxPro в Австралии и прочую экзотику. Переломным стал 2000-й год — появились сразу несколько интересных ресурсов, в том числе Клуб фокспрошников (http://www.foxpro.newmail.ru ) с литературой, библиотекой подпрограмм, форумом и регистрацией всех участников с кратким резюме. После регистрации мне неоднократно приходили предложения на разработку программ. Приятным местечком был и новгородский «FoxPro без границ» http://russua.novgorod/profox Если же сейчас вы наберете в любой «искалке» «FoxPro», то на вас вывалится такое обилие адресов, что сориентироваться будет весьма затруднительно. Во всяком случае, на популярных сборниках программной документации http://www.emanual.ru, http://www.infocity.kiev.ua и http://www.rusdoc.ru найдете много книг и статей «про FoxPro». Кстати говоря, сходная ситуация (1998-й — ничего, 2000-й — появились ресурсы по теме, 2003-й — обилие информации, в которой трудно сориентироваться) будет в любой области и отражает рост Сети, но это уже тема отдельного разговора.

Часть третья, теоретическая

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

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

В конце 60-х годов прошлого века появились работы, в которых обсуждались возможности применения различных табличных даталогических моделей данных, т.е. возможности использования привычных и естественных способов представления данных. Наиболее значительной из них была статья сотрудника фирмы IBM доктора Э.Кодда (Codd E.F., A Relational Model of Data for Large Shared Data Banks. CACM 13: 6, June 1970), где, вероятно, впервые был применен термин «реляционная модель данных». Будучи математиком по образованию, Э.Кодд предложил использовать для обработки данных аппарат теории множеств (объединение, пересечение, разность, декартово произведение). Он показал, что любое представление данных сводится к совокупности двумерных таблиц особого вида, известного в математике как отношение — «relation» (англ.). До этого при использовании БД требовалось учитывать конкретные особенности хранения в ней информации. Если внутренняя структура БД изменялась (например, с целью повышения производительности), приходилось перерабатывать прикладные программы, даже если на логическом уровне никаких изменений не происходило. Реляционная модель позволила отделить частные особенности хранения данных от уровня прикладной программы. В самом деле модель никак не описывает способы хранения информации и доступа к ней. Учитывается лишь то, как эта информация воспринимается пользователем. Благодаря появлению реляционной модели качественно изменился подход к управлению данными: из искусства оно превратилось в науку, что привело к революционному развитию отрасли.

Теория реляционной модели подразумевает владение такими понятиями, как кортежи, домены и их атрибуты, условия атомарности доменов плюс операторы реляционной алгебры — объединение, логическое умножение, разность, Декартово произведение, продукция, ограничение, слияние… На самом деле все значительно проще. Создавая базу данных (например, отдел кадров), мы конструируем таблицу, столбцами будут так называемые поля таблицы (фамилия, табельный номер, должность, дата рождения и прочее), а строками или записями таблицы будут некоторые значения полей (в нашем случае разные для каждого работника). Вся изюминка состоит в том, что полям назначается тип данных, размещаемых в этом поле, и их размер. Для текстовых полей (должность) указывается количество символов, для числовых (количество детей) — количество целых и дробных разрядов, для даты и времени также есть определенные форматы. Вот это разграничение полей по типам и позволяет производить над данными таблицы разные процедуры — сравнивать записи по значениям их полей. Ибо мы заранее уверены, что в числовом поле всегда будет числовое значение, в текстовом — текст, и так далее в силу устройства самой таблицы. На этой простой идее — сравнении и операциями с типизированными полями и основана необычайно производительная работа с
табличными или реляционными базами данных.

Продолжая наш пример с отделом кадров (а это одно из плодотворнейших приложений СУБД), покажем, как она будет работать. Выяснив, какие потребуются отчеты, назначаем поля, создаем механизм для добавления (приема на работу) и удаления (увольнения) записей (сотрудников), причем делать это средствами FoxPro — одно удовольствие. Имея же заполненную базу, мы в течение секунд будем получать ответы на такие вопросы: «Сколько женщин имеют детей до трех лет и стаж не менее пяти лет?», «Сколько уволено в течение года по месяцам с выделением проработавших менее года?» и прочие самые замудренные справки. А их у вас потребует начальство, будьте уверены, причем срочно, и если у вас работают пара тысяч сотрудников, то без программы вы потратите на эти справки всю оставшуюся до пенсии жизнь. Именно типизация полей, повторимся, позволяет производить над нашей таблицей самые замысловатые действия, получая сложные отчеты.
В самом простейшем случае можно обойтись одной таблицей, но вообще понятие БД включает в себя совокупность таблиц, объединенных так называемыми связями или отношениями. Различают отношения «все к одному», «один ко всем» и «все ко всем». Первые два отношения переходят друг в друга в зависимости от «направления взгляда» или от очередности рассматривания таблиц.

pic

Приведем пример «все к одному». В том же отделе кадров каждый работник может перемещаться из подразделения в подразделение, повышать разряд, переходить на другую должность. Если мы в основной таблице, где на каждого работника задумана одна запись, будем вносить и изменения должности, то для каждого изменения должности нам придется повторять всю информацию о сотруднике (фамилию, даты рождения, детей, № диплома и т.д.), что, конечно, совершенно расточительно, приведет к катастрофическому росту объема нашей таблицы. Поэтому мы назначения выводим в отдельную таблицу, связанную с основной ключевым полем, в нашем случае табельным номером. Зная фамилию нужного сотрудника, мы запоминаем его табельный номер, переходим к таблице назначений и отфильтровываем ее, оставив только записи с этим табельным номером, а это и будет перечень всех назначений данного работника. Подобным образом создаются отдельные таблицы с отпусками сотрудников, с их больничными листами и прочей меняющейся информацией, и все эти вспомогательные таблицы связаны с основной через табельный номер. Это мы рассмотрели основной закон нормализации таблиц — не должно быть записей с повторяющимися значениями полей. Для иллюстрации отношения «все ко всем» можно привести приятный пример — в отдельной таблице список поощрений работников (путевки, премии, грамоты и пр.). Каждый работник может быть поощрен любой наградой, никаких ограничений на связи не накладывается. Или еще пример — есть база данных с товарами и две таблицы — перечень магазинов и перечень складов. Теоретически каждый товар может находиться на любом складе и продаваться в любом магазине. Повторю, что в FoxPro необычайно удобно разрабатывать программы, все механизмы для построения многоуровневых меню, в том числе и раскрывающихся или падающих, легко устанавливать связи между таблицами, фильтровать, сортировать, добавлять и удалять данные.

Часть четвертая, практическая

Данная статья не ставит задачей научить вас программировать на FoxPro, но для того, чтобы ощутить волнующую мощь языка, предлагаю рассмотреть одну лишь команду BROWSE. Если задать ее без ключей, то на экране появится текущая открытая таблица (база данных). А если с ключами-параметрами, то:

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

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

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

• можно запретить или разрешить редактирование, удаление или дополнение БД или разрешить изменять одно-единственное поле

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

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

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

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

• при выполнении команды можно получить текущее значение колонки/строки относительно окна/экрана, имя текущего поля, номер текущей записи и т.д.

Это не полный перечень возможностей одной лишь команды из сотен команд и функций FoxPro. Практически невозможно придумать задачу, которая оказалась бы не по плечу этому замечательному языку, например была реализована оболочка автоматизированного рабочего места технолога-программиста для станков с ЧПУ или получены рисунки фракталов, не говоря уже о бесчисленных прикладных «молотилках» огромных потоков информации.

Наибольший эффект от применения FoxPro достигается при обработке типовой информации при многообразии входящих параметров. Например, сотрудник отдела программного управления ТАПОиЧ, не программист, мучаясь с постоянными справками по трудоемкости обрабатываемых на станках с ЧПУ деталей, разработал программу. Она давала любые отчеты с учетом степени внедрения обработки, с разбивкой по цехам, по изделиям, по оборудованию, по датам и т.д. Там же, в бюро «Обрабатывающих Центров», была создана экспертная система по выбору инструмента для расточки отверстий. Для этой операции применяются расточные головки, или борштанги, для разных станков схожие, но разные в них вставляются резцы, имеющие разные посадочные места, круглые или квадратные, из быстрорежущей стали или с твердосплавными пластинками, проходные или подрезные. Борштанги бывают станочные или переходные с посадочным конусом или цилиндром, различаются по длине и по жесткости… Даже для опытного технолога процесс выбора инструмента для расточки выливался каждый раз в непростую задачу, непосильную для новичков. Была создана программа, которая по вводимым параметрам (диаметр, глубина, материал, шероховатость…) подбирала оптимальную конфигурацию резца, патрона или борштанги.

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

pic

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

Еще более экзотический пример. Программист из Кишинева предлагает коммерческую программу для клубов собаководов — любителей и профессионалов. СУБД учитывает все аспекты собачьей жизни, включая родословную, параметры породы и оптимальный подбор партнера для случки. Известны также СУБД на животноводческих фермах с отслеживанием всех атрибутов телячьей и коровьей жизни — надоев, прививок, отелов и т.д.
Еще пример удачного использования СУБД FoxPro. Если организация строит какой-либо объект, то в конце каждого месяца заказчик с подрядчиком составляют акт выполненных работ, для чего они в многотомных сметах отыскивают выполненные работы и подсчитывают стоимость с учетом расценок, процента выполнения, коэффициента инфляции и еще десятка тонкостей. Без программы это действие занимает несколько дней листания томов смет и многочисленных вычислений. Программа выполняет это в диалоговом режиме за минуту, причем исключает ошибку — повторную оплату выполненных работ или отсутствие какого-либо этапа в строительстве. Здесь надо отдать должное прозорливости руководителя, ибо далеко не каждому измученному отчетами начальнику придет идея переложить часть хлопот на компьютер.

pic

Есть примеры удачного применения FoxPro в медицинских учреждениях — в обычной районной поликлинике эффект будет внушительным от автоматизации поиска и заполнения анкет, учета рецептов и медикаментов, расписаний, карантинов, прививок, диспансеризаций и отчетов перед бесчисленными проверяющими организациями. Давнишний знакомый по переписке, врач-психиатр из Петербурга создал на FoxPro не только учет больных, но и автоматизацию диагностирования по ответам пациентов на вопросы. Кстати (нет, не к психиатрии, а к отчетам перед вышестоящими организациями), интереснейший вопрос — учет документооборота в организациях. Известно, что вечная борьба с бюрократизмом проиграна навсегда, каждая организация ежедневно получает множество руководящих, запрашивающих, регламентирующих бумаг от вышестоящих, контролирующих, территориальных и прочих ведомств, требующих ответа в указанные сроки. Даже не работа с этими документами, а только их учет представляет серьезную проблему, особенно в организациях, которым «посчастливилось» подчиняться двум министерствам. Здесь придется сослаться на печальный опыт — несмотря на мощь FoxPro, внедрить программу учета документооборота так и не получилось — каждая бумага требует индивидуального подхода, а такая фраза руководителя, как: «Это письмо пока попридержим, но пошлем встречный запрос…», напрочь ломает оговоренные ранее алгоритмы, и так почти с каждым документом. Жизнь богаче и ярче любого алгоритма.

И все-таки главное применение СУБД — это учет движения имущества, учет имущества на складах и учет движения товаров с непременной выдачей сальдовой ведомости за любой период — остаток на начало, приход, расход, остаток на конец периода в количестве и в цене. Программы эти могут создаваться под конкретные особенности заказчика с учетом всех его капризов. А то, что вы не отыщите двух организаций, одинаково считающих, например, ту же амортизацию основных фондов — будьте уверены.
И уж расчет зарплаты — коронный номер FoxPro. Особенно после того, как подоходный налог стал исчисляться в нарастающем итоге с начала года и «ручной» расчет стал очень трудоемким. В общем-то, если у вас маленькая организация и у всех зарплата начисляется одинаково (оклад+премия+отпускные/больничный/проездной), то можно самим и на Excel’e и на Access’e написать. Но если у вас АУП (административно-управляющий персонал), плюс МОП (младший обслуживающий персонал), плюс несколько бригад производства с распределением премии по КТУ, замещениями, совмещениями, надбавками и льготами, то без FoxPro не обойтись. В одной из гостиниц Ташкента — 14 (!) категорий работников (дежурные, горничные, буфетчики, охранники и т.д.) и у каждой категории головоломнейший вариант начисления — самое причудливое сочетание отработанных смен, часов, ночных, дневных, выходных, праздничных, замещений и компенсаций. А если вам бухгалтер скажет, что знает, как удерживать подоходный налог с альтернативщиков — не верьте, это его субъективное толкование, неприемлемое в любой другой организации. А еще есть штуки, которые вряд ли можно представить в виде алгоритма, можно лишь отлаживать варианты годами. Например, врач-инфекционист, совмещающий должность дезинструктора, имеет льготы по подоходному налогу с той части заработка, которая за врача (не более 25%), а с части заработка дезинструктора льгот нет, а как быть с нарастающей суммой, никто не знает, но сделать надо. И вообще заказчики (милые добрые люди) бывают не в состоянии предъявить алгоритм, они хотят, чтобы «компьютер сам посчитал», или даже говорят: «Нам не надо, чтобы компьютер правильно считал, нам надо так, как мы привыкли». И только FoxPro знает, как им всем угодить. Прекращаем трясти бородой и движемся далее.

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

Ну и, конечно же, Visual FoxPro использует всю мощь программирования для Windows — динамический обмен данными (Dynamic Data Exchange — DDE) и механизм работы с составными документами (Object Linking and Embedding — OLE) обеспечивают интеграцию с Excel и Word. Имеется мощный аппарат для работы с Сетью и Интернетом (приложение типа Active Document), можно данные выкладывать в сеть в виде html, можно организовать корпоративную сеть и позволить работать с общей базой данных, удаленных оператором.

Часть пятая, близкородственная

Рассмотрим ближайших родственников FoxPro, схожих с ним по типу решаемых задач. Вообще в прессе высказывались опасения о «смерти» FoxPro, ибо его ниша сжимается под давлением тяжеловесных монстров (Oracle и SQL) сверху и пакетов быстрой разработки СУБД типа Access снизу. Да еще поджимают популярные языки Delphi и Visual Basic, имеющие средства для работы с базами данных. Но популярность, простота и мощь любимого многими языка навсегда развеяли подобные страхи.
Старший брат FoxPro, если так можно выразиться, — это продукт фирмы Oracle — вечный конкурент Microsoft в секторе СУБД. По прессе известно, что продукцию Oracle выбрал, например, такой монстр, как «Мосэнерго» для комплексного управления финансовыми, энергетическими, кадровыми, производственными и прочими потоками. С получением моментальной информации по любому срезу этого многомерного клубка. Задача, схожая с задачами, решаемыми FoxPro, но колоссальные масштабы, конечно, делают такие мощные пакеты специфичными и неэффективными для рассмотренных выше «мелочовок». Хотя FoxPro создан не для мелочей, известно, например, что база данных строящегося под Ламаншем тоннеля была написана на FoxPro и проработала удачно все годы строительства.
Некоторые знакомые программисты перешли на Visual Basic, так как этот приятный и мощный язык имеет возможность создавать и обрабатывать реляционные таблицы. И хотя он содержит большое количество объектов, библиотек, процедур и функций, в нем нет имеющихся в FoxPro специальных команд для обработки СУБД, их приходится писать заново средствами Visual Basic’a. Так что выбор языка написания СУБД определяется решаемой задачей или пристрастиями программиста.
Младшим родственником FoxPro являются средства самостоятельной разработки СУБД, самый яркий представитель которых — популярнейший пакет Access, входящий в Microsoft Office. Дружественная оболочка и наличие подсказок и многочисленных мастеров (Wizard) позволяют неспециалисту в течение нескольких минут создать таблицу или БД и разработать механизм для работы с ней — добавление, удаление, просмотр, сортировка, выборка и разные сложные отчеты. Например, сотрудник набрал в Word’e список имеющихся книг, но ему сказали, что нужна картотека учета книг. В течение секунд список был конвертирован в Access и распечатан в виде карточек. Еще пример: из минского журнала «Радиолюбитель. Ваш компьютер» технологи инструментального цеха разработали систему автоматического получения технологии изготовления инструментальных оправок. Access запрашивает размеры и материал и выдает лист технологии с эскизом, с режущим и мерительным инструментом, с числом проходов резца, с режимами резания и нормами времени. Сложные программы самим создавать, возможно, затруднительно (хотя известны мощные пакеты, созданные крупными фирмами именно на Access), но написать учет личных финансов, например, под силу любому юзеру.
Следующий родственник — SQL — это специализированный непроцедурный язык, позволяющий описывать данные, осуществлять выборку и обработку информации из реляционных СУБД. Специализированность означает, что SQL предназначен лишь для работы с БД; нельзя создать полноценную прикладную систему только средствами этого языка — для этого потребуется использовать другие языки, в которые можно встраивать SQL-команды. А самый популярный ныне собрат SQL — это пакет MySQL, применяющийся в веб-программировании. Он предоставляет всю мощь СУБД для создания, например, форумов, скриптов проверки паролей, динамического построения веб-страниц. Причем MySQL только осуществляет обращение к БД, а результаты запросов обрабатываются языками Perl или PHP, но пусть лучше об этом напишут специалисты. А мы на этом заканчиваем серьезные рассказы про FoxPro.

Часть шестая, развлекательная

— Делу время, потехе час, — сказал робот, закончив решать уравнение 20-й степени, и начал пересчитывать запятые в Большой британской энциклопедии.

Из-за того, что FoxPro всегда под рукой, такой привычный, верный и безотказный, на нем отрабатываются всякие занимательные штуки, не имеющие отношения к служебным и домашним обязанностям. Например, вычисление чисел Фибоначчи, вычисление золотого сечения и числа ПИ, разные алгоритмы рекурсии, простые числа, математические узоры и фракталы, Книга перемен, биоритмы и прочие бесполезные в хозяйстве развлечения. Все эти сиюминутные опыты, когда надо быстренько проверить алгоритм, именно на FoxPro набираются и отлаживаются мгновенно. Известны также и чужие развлечения на любимом языке, в Сети есть страничка, посвященная FoxPro для DOS’a, так на ней среди серьезных статей и готовых программ есть и развлечения, и в их числе — даже тетрис. Кстати, если бы вы писали программу для тетриса, как бы вы проверяли, коснулась ли падающая фигурка нижней преграды? Как бы вы проверяли заполненность ряда? (Наверняка вы предложите самый неоптимальный вариант, подумайте на досуге над его оптимизацией.) Есть алгоритмы, обдумывание которых доставляет удовольствие.
Как пример использования FoxPro «не по назначению» можно привести так называемую «Скатерть Улама». Этот самый Улам, программист, сидя на скучном заседании, стал записывать подряд натуральные числа по спирали и вдруг заметил, что простые числа лежат на прямых линиях. Кстати, попытайтесь выводить символы по раскручивающейся квадратной спирали — прекрасное упражнение для оттачивания сноровки программирования на любом языке. Не менее увлекательна и проверка числа на делимость, то есть определение простых чисел. А уж появление волшебной скатерти на вашем экране доставит вам волнующие минуты от прикосновения к одной из главных тайн устройства мира. На этой высокой ноте и закончим.

Orphus system
Подписывайтесь на канал infoCOM.UZ в Telegram, чтобы первыми узнавать об ИКТ новостях Узбекистана
В Telegram
В WhatsApp
В Одноклассники
ВКонтакте