Распечатать страницу

Вычисления в таблицах Visual FoxPro

« Назад

Вычисления производятся командами AVERAGE, CALCULATE, COUNT и SUM. Для всех перечисленных команд справедливо следующее:

1. Результаты отображаются на экране, если SET TALK установлен в ON. Если SET HEADINGS установлен в ON, то выводятся и вычисляемые выражения, размещаемые над результатами.

2. Записи, имеющие пометку удаления, обрабатываются, если SET DELETED установлен в OFF, и не обрабатываются – в противном случае.

Команды приводятся в алфавитном порядке. Их опции и параметры описаны в табл. 1.7 и 3.13.

Таблица 3.13

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

Опция / параметр

Описание

eExpressionList

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

TO VarList

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

TO ARRAY ArrayName

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

Команда

AVERAGE [eExpressionList] [Scope] [FOR lExpression1]
                 [WHILE lExpression2] [TO VarList | TO ARRAY ArrayName]
                 [NOOPTIMIZE]

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

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

Замечание. Результаты команд AVERAGE и CALCULATE AVG( ) совпадают.

Пример 1. Вычисляется средняя цена книг (поле Price), сведения о которых хранит таблица Books. Вдобавок для демонстрационных целей вычисляется квадрат среднего значения кода книг (поле BookId).

set talk on

set headings on

&& Проверяем, открыта ли таблица Books

if not Used("Books") then

MessageBox("Нужно открыть таблицу Books!")

return

endif

select Books

average Price, BookId**2 to avgPrice, avgBookId

Результат, отображаемый на экране:

Price

BookId**2

194.58

54.17

Пример 2. Вычисляется средняя цена книг, код которых больше среднего значения кода.

&& Находим среднее значение кода книг

average BookId to avgBookId

average Price for BookId > avgBookId to avgPrice

Пример 3. Вычисляется средняя цена книг (поле Price таблицы Books ) авторов, введенных в базу после 1 января 2004 г (поле InputDate таблицы Authors).

close databases

open database D:\HomeLibrary\HomeLibrary.dbc

store {^2004–01–01} to someDate

&&

&& Выбираем необходимые для вычислений данные в таблицу BookPrice

&& Для этой цели нужно привлечь 3 таблицы: Authors, Books и BooksAuthors

select Price;

from Books, Authors, BooksAuthors;

where Books.BookId = BooksAuthors.BookId;

and Authors.AuthorId = BooksAuthors.AuthorId;

and Authors.InputDate > someDate;

into cursor BookPrice

&& После выполнения SELECT выбрана область, в которой открыт курсор BookPrice

&&

&& Получаем и печатаем результат

average Price to avgPrice

? avgPrice

Команда

CALCULATE eExpressionList [Scope] [FOR lExpression1]
                   [WHILE lExpression2] [TO VarList | TO ARRAY ArrayName]
                   [NOOPTIMIZE] [IN nWorkArea | cTableAlias]

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

Таблица 3.14

Функции, употребляемые в eExpressionList команды CALCULATE

Функция

Описание

AVG(nExpression)

Вычисляет среднее арифметическое всех значений nExpression

CNT( )

Возвращает число записей, удовлетворяющих условиям, заданным Scope FOR и WHILE

MAX(eExpression)

Возвращает максимальное из всех значений eExpression. Тип eExpression может быть Character, Date, DateTime, Currency и любой числовой

MIN(eExpression)

Возвращает минимальное из всех значений eExpression. Тип eExpression может быть Character, Date, DateTime, Currency и любой числовой

NPV(nExpression1,
            nExpression2
            [, nExpression3])

Вычисляет величину чистой приведенной стоимости инвестиции, используя ставку дисконтирования nExpression1, а также стоимости (nExpression2) будущих выплат (отрицательные значения) и поступлений (положительные значения).
Ставка дисконтирования nExpression1 задается не в процентах, а в виде числа от 0 до 1.
nExpression2 – задает поле или выражение с именем поля, или числовое выражение, значения которого интерпретируются как будущие выплаты или поступления.
nExpression3 – необязательное начальное вложение капитала. Не включается, если предполагается произвести начальное вложение в конце первого периода; такое начальное вложение задается в первой записи поля причем в виде отрицательного числа

STD(nExpression)

Вычисляет стандартное (среднее квадратичное) отклонение величин, возвращаемых nExpression.
Среднее квадратичное отклонение std величин x1, x2, …, xn от a вычисляется по формуле

 

SUM(nExpression)

Возвращает сумму всех значений выражения nExpression

VAR(nExpression)

Вычисляет дисперсию D величин, возвращаемых nExpression. Она равна квадрату стандартного отклонения:

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

calculate Avg(Sqrt(Price))

однако следующая команда недопустима

calculate Sqrt(Avg(Price))

В результатах, возвращаемых функциями, учитываются только записи, удовлетворяющие условиям, заданным Scope, FOR и WHILE. Поля, содержащие NULL, при вычислениях CALCULATE не учитываются.

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

set talk off

select Books

&& Записываем результаты в массив calcResults

calculate Avg(Price), Max(Price), Std(Price) , Cnt( ) to array calcResults

&& Печать результата

display memory like calcResults

Возможный результат:

calcResults

( 1)            N     195.71    (195.71428571)

( 2)                     N     210.00    (210.00000000)

( 3)            N     10.33      ( 10.32630878)

( 4)            N     14           ( 14.00000000)

Команда

COUNT [Scope] [FOR lExpression1] [WHILE lExpression2]
             [TO VarName] [NOOPTIMIZE]

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

Замечание. Такие же результаты при прочих равных условиях возвращает команда CALCULATE, употребленная с функцией CNT( ).

Команда

SUM eExpressionList [Scope] [FOR lExpression1]
[WHILE lExpression2] [TO VarName | TO ARRAY ArrayName]
[NOOPTIMIZE]

вычисляет суммы значений, возвращаемых выражениями, входящими в eExpressionList. Число сумм равно числу имеющихся в eExpressionList выражений.

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

Замечание. Такие же результаты при прочих равных условиях возвращает команда CALCULATE, употребленная с функцией SUM( ).

Команда

TOTAL TO TableName ON FieldName [FIELDS FieldNameList] [Scope]
[FOR lExpression1] [WHILE lExpression2] [NOOPTIMIZE]

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

Если таблица не существует, то она будет создана, если существует, то перезаписана. Диалог, предупреждающий о существовании таблицы и предоставляющий возможность отказаться от ее перезаписи, появляется, если SET SAFETY установлен в ON.

Опции и параметры (см. также табл. 1.7 и 3.13):

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

FIELDS FieldNameList – список полей, по которым подводятся итоги. Имена полей в списке разделяются запятыми. Если опция опущена, то итоги подводятся по всем полям.

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

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

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

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

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

Пример. Таблица Test.dbf содержит приведенные в табл. 3.15 данные.

Таблица 3.15

Данные таблицы Test.dbf

TestDate

TestFloat

TestCrncy

01/01/04

1.300

600.0000

01/01/04

2.400

600.0000

01/01/04

3.500

600.0000

11/16/04

1.400

100.0000

11/16/04

2.500

200.0000

11/16/04

3.600

300.0000

12/27/04

1.200

400.0000

12/27/04

2.300

500.0000

12/27/04

3.400

500.0000

12/27/04

4.500

500.0000

select Test

&& Создаем индекс с ключевым выражением DTOS(TestDate)

index on Dtos(TestDate) to d:\TestDate

&& Вычисляем итоги по полю TestDate

total to d:\TableOfTotals on TestDate fields TestDate, TestFloat, TestCrncy

&& Просмотр результатов

use d:\TableOfTotals in 0

select TableOfTotals

browse fields TestDate, TestFloat, TestCrncy

Данные таблицы с итогами приведены в табл. 3.16.

Таблица 3.16

Таблица TableOfTotals: итоги по полю TestDate

TestDate

TestFloat

TestCrncy

01/01/04

7.200

1800.0000

11/16/04

7.500

600.0000

12/27/04

11.400

1900.0000

Замечание. Тот же результат получается, если на месте FieldName употребить DTOS(TestDate).

total to d:\tableOfTotals on Dtos(TestDate) fields TestDate, TestFloat, TestCrncy

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

select Test

&& Создаем индекс с ключевым выражением

&& DTOS(TestDate) + TRANSFORM(TestInt),

&& в котором TestDate и TestInt – поля таблицы Test.dbf

index on Dtos(TestDate) + Transform(TestInt) to d:\TestDate

&& Вычисляем итоги по ключевому выражению

total to d:\TableOfTotals on Dtos(TestDate) + Transform(TestInt)

fields TestDate, TestFloat, TestCrncy