Настало время написать первую реальную программку на Fox'е. Из-за задачи, которую мы рассмотрим, в выходные мне пришлось прервать загородный отдых и в воскресенье выйти на работу, ну да ладно.
Суть задачи такова: у нас есть три таблицы с одинаковыми полями (номер банковского счета и сумма оборотов за период по счету), но за разное время. Первая таблица (tab1) за первый квартал, вторая (tab2) - за второй, а третья (tab3) - за полугодие. Так вот, теоретически, сложив суммы по счетам за оба квартала, мы должны получить тоже самое, что и за полугодие. Но на практике расчет делался разными алгоритмами и итоги не сошлись, к моему великому сожалению :-( Давайте найдем по каким счетам расчеты не совпали.
Итак, начнем. Запускаем FoxPro, в меню File выбираем New, в появившемся диалоговом окне устанавливаем Program и жмем NewFile.
Перед нами появляется пустое окно с заголовком Program1, в котором пишем следующий текст:
* Устанавливаем рабочую директорию, по умолчанию установлен * каталог, от куда был запущен FoxPro set defa to c:\bank * Отключаем безопасность, чтобы не было * запросов на подтверждение перезаписи и т.п. set safety off * Закрываем все открытые нами рабочие области, чтобы * при очередном запуске программы открыть их вновь close data all * Делаем копию таблицы за полугодие, чтобы ничего не испортить :-) select * from tab3 into table tab4 * У нас уже есть поле sald_ - сумма за период * (название не подходящее, сальдо - это остаток, но не я его давал) * Добавим три новых поля в копию полугодовой таблицы: * sald_1 - сумма за первый квартал, * sald_2 - сумма за второй квартал, * saldo - сумма sald_1 + sald_2 alter table tab4; add column sald_1 n(20, 2); add column sald_2 n(20, 2); add column saldo n(20, 2) * Открываем таблицу use tab4 * Перебираем поочередно все записи в таблице, * для которых код валюты = 810 (этого требует ситуация) scan for kod_v_="810" * Записываем текущий счет в переменную cCount=tab4.s_ * Находим сумму по текущему счету за 1-й кв. select sald_ from tab1 into cursor tmp1 where s_=cCount if _tally>0 && Если счет найден в таблице, записываем сумму nSaldo1=tmp1.sald_ else && Иначе записываем в переменную 0 nSaldo1=0 endif * Тоже самое делаем по 2-му кв. select sald_ from tab2 into cursor tmp2 where s_=cCount if _tally>0 nSaldo2=tmp2.sald_ else nSaldo2=0 endif * Делаем текущей нашу изменяемую таблицу select tab4 * Меняем пустые поля для текущего счета replace sald_1 with nSaldo1,; sald_2 with nSaldo2,; saldo with nSaldo1+nSaldo2 endscan * Смотрим на результат select s_, sald_, saldo, sald_1, sald_2 from tab4 where sald_<>saldo * Закрываем таблицу use
По завершению набора кода, можно его скомпилировать (меню Program\Compile). Если до этого вы не сохранили программу, то при компиляции появится диалоговое окно с предложением сделать это. Вот собственно и все можно запускать программу ("!" на панели инструментов).