Шаг 8 - Пишем программу

Настало время написать первую реальную программку на Fox'е. Из-за задачи, которую мы рассмотрим, в выходные мне пришлось прервать загородный отдых и в воскресенье выйти на работу, ну да ладно.

Суть задачи такова: у нас есть три таблицы с одинаковыми полями (номер банковского счета и сумма оборотов за период по счету), но за разное время. Первая таблица (tab1) за первый квартал, вторая (tab2) - за второй, а третья (tab3) - за полугодие. Так вот, теоретически, сложив суммы по счетам за оба квартала, мы должны получить тоже самое, что и за полугодие. Но на практике расчет делался разными алгоритмами и итоги не сошлись, к моему великому сожалению :-( Давайте найдем по каким счетам расчеты не совпали.

Итак, начнем. Запускаем FoxPro, в меню File выбираем New, в появившемся диалоговом окне устанавливаем Program и жмем NewFile.

8_1.gif (6586 b)

Перед нами появляется пустое окно с заголовком 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). Если до этого вы не сохранили программу, то при компиляции появится диалоговое окно с предложением сделать это. Вот собственно и все можно запускать программу ("!" на панели инструментов).


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Клементьев В.А - 25.07.2000