Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VisualFoxPro.doc
Скачиваний:
15
Добавлен:
01.07.2025
Размер:
11 Мб
Скачать
☆

3.6. Приоритет выполнения операций

Операции VFP обладают следующим приоритетом:

  1. унарные + и – (имеют наивысший приоритет);

  2. возведение в степень;

  3. умножение и деление;

  4. сложение и вычитание;

  5. операции отношения;

  6. NOT;

  7. AND;

  8. OR.

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

Пример. Вычисляется результат логического выражения

x / a = 1 or b / (a + b) < 1 and not b = a or x != 6

при x = 6.0, a = 2.0 и b = 3.0.

Вычислив результат арифметических операций и операций отношения, получим:

.F. or .T. and not .F. or .F.

Далее выполняем пошагово логические операции с учетом их приоритета. После выполнения NOT .F.:

.F. or .T. and .T. or .F.

После выполнения .T. AND .T.:

.F. or .T. or .F.

Окончательный результат: .T.

3.7. Типы данных Character и Varbinary. Кодовые страницы

3.7.1. Перечень команд

Приведен в табл. 3.23.

Таблица 3.23

Список команд для символьных данных и кодовых страниц

Команда

Описание

Символьные данные

COLLATE

Опция файла конфигурации; употребляется для задания Collate-последовательности

SET ANSI

Определяет, как выполняется сравнение строк разной длины операцией "=" в SQL-командах VFP

SET COLLATE

Задает последовательность сравнения символьных полей при индексировании и сортировке таблиц

SET EXACT

Задает правила сравнения двух строк разной длины

Кодовые страницы

CODEPAGE

Опция файла конфигурации; употребляется для задания кодовой страницы

GETCP( )

Функция.

SET NOCPTRANS

Предотвращает изменение кодовой страницы заданных полей

SET CPCOMPILE

Устанавливает кодовую страницу компилируемым программам

SET CPDIALOG

Управляет появлением диалогом Code Page

Функции для символьных данных и кодовых страниц см. соответственно в табл. 3.25 и 3.32.

3.7.2. Символьные константы

Символьные данные могут храниться в полях типа Character и Memo или Character (binary) и Memo (binary). В binary-полях данные сохраняются без указания кодовой страницы. Memo-поля употребляются для хранения больших порций символьных данных.

Константа типа Character – это последовательность символов, обрамленная кавычками (двойными или одинарными), например (в примерах символьные константы присутствуют в правой части оператора присваивания):

str1 = "Это константа типа Character"

или

str2 = 'Еще одна константа типа Character'

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

str3 = 'Ракета типа "земля – воздух" уничтожена средствами ПВО'

Используя директиву #DEFINE, в программе можно задать именованную константу любого типа данных, например:

#define ERR 'Ошибка!'

Директива #UNDEFINE константу освобождает (удаляет из памяти):

#undefine ERR

3.7.3. Операции для символьных данных

С символьными данными применяются операции: "+", "–" и "$", а также операции отношения.

Операция "+" выполняет объединение (конкатенацию) двух строк, например:

result = str1 + str2

Операндами такого выражения могут быть константы, переменные и поля таблиц, имеющие тип Character или Memo, например:

str1 = "Объединение" + ", или " + "конкатенация"

resultStr = str1 + ' двух строк'

Операция "–", так же как и операция "+", применяется для объединения значений двух строк. Однако при использовании "–" завершающие пробелы первого операнда удаляются, например:

str1 = '123 ' && В конце строки 5 пробелов

? str1 – '45' && Напечатает: 12345

? str1 + '45' && Напечатает: 123 45

Результатом выполнения операции "$" будет .T., если первый символьный операнд имеется во втором, или .F. – в противном случае, например:

? "123" $ "12345" && Напечатает: .T.

? "134" $ "12345" && Напечатает: .F.

Замечание. Операция "$" чувствительна к регистру и рашмор-неоптимизируема.

В выражении с символьными операндами наивысший приоритет имеет операция "+", наименьший – операция "$", например:

str1 = '123 ' && В конце строки 5 пробелов

? '234' $ str1 – '45' && Напечатает: .T.

? '234' $ str1 + '45' && Напечатает: . F.

Вместо операции "$" можно применить встроенную функцию OCCURS( ), возвращающую число вхождений первого своего параметра во второй. Параметры функции должны иметь символьный тип. Например:

str1 = '123 ' && В конце строки 5 пробелов

? Occurs('234', str1 – '45') && Напечатает: 1

? Occurs('234', str1 + '45') && Напечатает: 0

? Occurs('AB', 'abABabAB') && Напечатает: 2

Полную замену операции "$" обеспечивает совместное употребление функции OCCURS( ) и операции отношение ">", например:

? Occurs("123", "12345") > 0 && Напечатает: .T.

С таким же успехом можно использовать встроенную функцию AT( ), возвращающую номер позиции вхождения своего первого символьного параметра во второй. При отсутствии вхождений функция вернет 0. например:

? At("234", "12345") && Напечатает: 2

? At("237", "12345") && Напечатает: 0

? At("234", "12345") > 0 && Напечатает: .T.

В операции отношения строки сравниваются посимвольно. Так,

? 'ac' > 'abcd'

напечатает .T., поскольку код символа "c" больше кода символа "b", а

? 'ab' > 'abcd' && Напечатает: .F.

Важно помнить, что на результаты операции отношения влияет установка команды SET EXACT, например:

set exact off

? 'abcd' = 'ab' && Напечатает: .T.

? 'abcd' > 'ab' && Напечатает: .F.

Результат объясняется тем, что при установке SET EXACT в OFF в сравнении участвуют только 2 символа – по числу символов правого операнда.

VFP увеличит размер короткой строки, добавляя к ней хвостовые пробелы, и станет сравнивать все символы операндов, если установить SET EXACT в ON, например:

set exact on

? 'abcd' = 'ab' && Напечатает: .F.

? 'abcd' > 'ab' && Напечатает: .T.

Исключение составляет операция "==", которая всегда работает, словно SET EXACT установлен в ON (пример см. в разд. 3.5.2 и 3.7.4)

Взамен операции отношения "==" можно употребить встроенную функцию LIKE( ), например

? Like('abcd', 'ab') && Напечатает: .F.

? Like('abcd', 'abcd') && Напечатает: . T.

Возможности функции LIKE( ), правда, несколько шире: в ее аргументы можно подставлять символы "*" и "?", используемые в общепринятом порядке, например:

? Like('ab*, 'abcd') && Напечатает: . T.

? Like('ab??, 'abcd') && Напечатает: . T.

? Like('ab?d, 'abcd') && Напечатает: . T.

? Like('ab*d, 'abcd') && Напечатает: . T.

? Like('ab?, 'abcd') && Напечатает: . F.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]