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

Выражения в Microsoft Visual FoxPro

« Назад

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

Тип выражения определяется типом результата выражения.

Примеры. Выражения присутствуют в правой части оператора присваивания.

x = 2

y = Sin(x)

y = x * Sin(x)

x = (a + b) / (c + d)

flag = (x > y) and Empty(z) && или: x > y and Empty(z)

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

flag = (x > y) ;
and Empty(z)

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

x = 2

y = 3

flag = x > y and SomeFunc(x)

function SomeFunc(x)

                                            ? x

                                            return .T.

endFunc

функция SomeFunc( ) не вызывается, поскольку уже после вычисления подвыражения x > y ясно, что выражение вернет .F. Если же задать, например, x = 5, то функция SomeFunc( ) будет выполнена.

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

В некоторых случаях в командах VFP может употребляться и выражение с именем.

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

var1 = 5

someString = "var1"

? someString                       && Напечатает: var1

&& Используем макроподстановку; пробел после команды & недопустим

? &someString                    && Напечатает: 5

Команда

&VarName[.VarAdd]

выполняет макроподстановку.

Параметры:

VarName – строка или элемент массива, содержащий имя скалярной переменной, адресуемой при макроподстановке. Имя, содержащееся в строке (элементе массива), должно быть правильно построенным именем переменной VFP.

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

store '&gcX' to gcX

? &gcX

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

.VarAdd – дополнительные символы к VarName. Может быть макроподстановкой. Если VarAdd – это имя свойства или поля, то нужно добавить дополнительную точку:

&VarName..PropertyName

Макроподстановка может быть применена в выражении и в любой команде, принимающей символьный литерал.

Пример 1. В качестве VarName используется имя элемента массива.

var1 = 5

declare a[2]

store "var1" to a

? a[2]                                   && Напечатает: var1

&& Используем макроподстановку; пробел после команды & недопустим

? &a[2]                                && Напечатает: 5

Пример 2. Макроподстановка для части имени переменной (употребляется .VarAdd).

&&

vp = 'FoxPro'

varName = 'v'

? &varName.p                    && Напечатает: FoxPro

Пример 3. Макроподстановка для псевдонима таблицы при обращении к ее полю (употребляется .VarAdd).

&&

alias = 'Authors'

select (alias)     && Таблица Authors должна быть открыта

? &alias..InputDate       && Напечатает значение поля Authors.InputDate

Пример 4. Макроподстановка для операции и оператора присваивания.

op = '+'

opResult = 2 &op 5            && 2 + 5

? opResult                           && Напечатает: 7

op = '*'

store '=' to eq

opResult &eq 2 &op 5        && opResult = 2 * 5

? opResult                           && Напечатает: 10

Пример 5. Макроподстановка применяется на месте символьного литерала.

close databases

open database d:\HomeLibrary\HomeLibrary

&&

&& Переменные для макроподстановки

au = 'Authors'

auId = 'AuthorId'

&& Используем две макроподстановки

use &au order &auId          && Вместо: use Authors order AuthorId

Замечание. Везде, где только возможно, используйте вместо макроподстановки выражение с именем или функцию EVALUATE( ), поскольку они работают существенно быстрее.

Пример 6. Макроподстановка, которую нельзя заменить выражением с именем.

store Set('TALK') to oldTalk

set talk off

&&

&& Некоторый код

&&

&& Используем макроподстановку

set talk &oldTalk                && Восстанавливаем установку SET TALK

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

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

Пример. Вместо макроподстановки применяется выражение с именем.

close databases

open database d:\HomeLibrary\HomeLibrary

&&

&& Переменные для выражения с именем

au = 'Authors'

auId = 'AuthorId'

&& Используем 2 выражения с именем

use (au) order (auId)           && Вместо: use Authors order AuthorId

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

Команда

GETEXPR [cCaptionText] TO MemVarName
[TYPE cExpressionType [; cErrorMessageText]]

[DEFAULT cDefaultExpression]

открывает диалог Expression Builder, в котором можно создать и проверить выражение. Полученное выражение хранит переменная MemVarName. Проверка выражения инициируется нажатием на кнопку Verify построителя и выполняется при нажатии на OK.

Опции и параметры:

cCaptionText – заголовок диалога.

TO MemVarName – имя переменной или элемента массива, в который записывается выражение.

Если переменная не существует, то она будет создана. Если построитель выражения закрыт в результате нажатия клавиши Esc или выбора кнопки Cancel, то MemVarName будет хранить выражение cDefaultExpression, если задана опция DEFAULT, или пустую строку – в противном случае.

TYPE cExpressionType [; cErrorMessageText] – тип выражения и сообщение, выводимое, если проверка показала, что выражение содержит ошибку.

Параметр cExpressionType – это символ C, D, T, N, F, I, B, Y или L, задаваемый соответственно для типа Character, Date, DateTime, Numeric, Float, Integer, Double, Currency или Logical.

Если задан параметр cErrorMessageText, то пара cExpressionType; cErrorMessageText должна быть заключена в кавычки, например:

getexpr to var1 type "D; Ошибка в выражении типа Date" default "Date( )"

Сообщение будет выведено, если, например, сформировать выражение, тип которого отличен от Date.

DEFAULT cDefaultExpression – начальное выражение, выводимое в построителе выражений.

Пример. Создается выражение для опции FOR команды LOCATE.

close databases

open database (Home(2) + 'Data\TestData')

use Customer

getexpr 'Формируем условие поиска' to gcTemp type 'L' default 'Company = ""'

&& Используем макроподстановку

locate for &gcTemp

if Found( ) then

? Customer.Address

else

? 'Поиск по условию ' + gcTemp + ' не дал результата'

endif